He estado leyendo algunos artículos sobre la implementación de TCP en Linux y me confundí, cuál es la diferencia entre net.ipv4.tcp_max_syn_backlog y net.core.somaxconn y el backlog pasado como parámetro para la llamada al sistema listen() , y cuál es la relación entre ellos.
PD: Quiero una explicación para el kernel 4.15 porque descubrí que hay algunas diferencias entre los kernels más antiguos y los más nuevos sobre este tema.
sysctl es una API. Entonces, puede leer la documentación del kernel de Linux para la versión adecuada :
tcp_max_syn_backlog - INTEGER Maximal number of remembered connection requests, which have not received an acknowledgment from connecting client. The minimal value is 128 for low memory machines, and it will increase in proportion to the memory of machine. If server suffers from overload, try increasing this number. somaxconn - INTEGER Limit of socket listen() backlog, known in userspace as SOMAXCONN. Defaults to 128. See also tcp_max_syn_backlog for additional tuning for TCP sockets. Consideremos un protocolo de enlace TCP ... tcp_max_syn_backlog representa el número máximo de conexiones en la cola SYN_RECV . Es decir, cuando su servidor recibió SYN, envió SYN-ACK y aún no ha recibido ACK. Esta es una cola separada de los llamados "sockets de solicitud" - reqsk en el código (es decir, no son sockets completos, los "sockets de solicitud" ocupan menos memoria. En este estado, podemos ahorrar algo de memoria y aún no asignar un socket completo porque el la conexión completa puede no ser del todo en el futuro si ACK no llega). El valor de esta cola se ve afectado (consulte esta publicación ) por el argumento de backlog de listen() y está limitado por tcp_max_syn_backlog en el kernel.
somaxconn representa el tamaño máximo de la cola ESTABLISHED . Esta es otra cola.
Recuerde la cola SYN_RECV mencionada anteriormente: su servidor está esperando un ACK del cliente. Cuando llega el ACK, el kernel, en términos generales, crea el gran socket completo desde "solicitar socket" y lo mueve a la cola ESTABLECIDA. Entonces puede hacer accept() en este socket. Esta cola también se ve afectada por el argumento de backlog de listen() y está limitada por somaxconn en el kernel.