我一直在阅读一些有关在Linux上实现TCP的文章,但我感到困惑,net.ipv4.tcp_max_syn_backlognet.core.somaxconn与作为参数传递给backlog系统调用的listen()之间有什么区别,以及它们之间的关系是什么。
附言我想对内核4.15进行解释,因为我发现该主题的最旧和更新的内核之间存在一些差异。

最佳答案

sysctl是一个API。因此,您只需阅读Linux内核documentation for appropriate version即可:

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.
让我们考虑一个TCP-handshake .. tcp_max_syn_backlog代表SYN_RECV队列中的最大连接数。即当您的服务器收到SYN时,发送了SYN-ACK,但尚未收到ACK。这是所谓的“请求套接字”的单独队列-代码中的reqsk(即不是完全成熟的套接字,“请求套接字”占用的内存更少。在这种状态下,我们可以节省一些内存,但尚未分配完整的套接字,因为如果ACK不会到达,则将来完全可能无法完全连接)。该队列的值受this postlisten()参数影响(请参阅 backlog ),并受内核中的tcp_max_syn_backlog限制。somaxconn表示ESTABLISHED队列的最大大小。这是另一个队列。
回顾前面提到的SYN_RECV队列-您的服务器正在等待客户端的ACK。当ACK到达时,内核大致说来是将大型成熟的套接字从“请求套接字”中移出,并将其移到已建立队列中。然后,您可以在此套接字上执行 accept() 。此队列还受listen()backlog参数影响,并受内核中的somaxconn限制。
有用的链接:12

08-15 22:45