¿Qué son los enchufes huérfanos y cómo puedo prevenirlos?

Un “zócalo huérfano” es un registro en la mayoría de los núcleos tipo Unix para un zócalo que ya no está conectado a un descriptor de zócalo en ningún proceso de usuario, pero para el que aún se requiere que el núcleo mantenga el estado para completar el protocolo de transporte. Esto generalmente aparece en los sockets TCP cuando un proceso de usuario cierra un socket mientras todavía hay datos no reconocidos para transmitir al par remoto, y durante un tiempo después de que se intercambian los paquetes FIN / ACK finales para tener en cuenta la vida útil máxima de los paquetes de Internet.

Puede evitarlos al no utilizar TCP. Si eso es desaconsejable, puede solucionarlos realizando un cierre ordenado en la capa de aplicación cerrando el socket solo cuando todos los datos transmitidos hayan sido reconocidos por el par y utilizando la opción de socket para reutilizar los puertos vinculados en los oyentes pasivos. Su núcleo todavía tendrá zócalos huérfanos en el estado de ESPERA DE TIEMPO, pero eso es normal y no debería llevarlo a preguntar cómo puede evitarlo.

Mira una buena explicación aquí:

El error “Memoria fuera de socket”

El enlace anterior ilustra las cosas en un contexto de Linux, pero los principios son válidos para otros sistemas operativos.

En términos simples, las conexiones tcp del estado FIN_WAIT1 y LAST_ACK son enchufes huérfanos, que contaban en

# cat / proc / net / socketstat | grep TCP

TCP: inuse 10 huérfano 0 tw 1 alloc 14 mem 1

PD: El estado FIN_WAIT2 NO está dentro de las estadísticas huérfanas , está dentro del estado tw . Y CLOSE_WAIT está dentro de ninguno de huérfano o tw .

# man tcp

tcp_max_orphans (entero; predeterminado: ver más abajo; desde Linux 2.4)
El número máximo de sockets TCP huérfanos (no conectados a ningún identificador de archivos de usuario) permitidos en el sistema. Cuando
se supera este número, se restablece la conexión huérfana y se imprime una advertencia. Este límite existe solo para
prevenir ataques simples de denegación de servicio.