我一直在阅读一些关于 Linux 上的 TCP 实现的文章,我很困惑,它们之间有什么区别net.ipv4.tcp_max_syn_backlog
and net.core.somaxconn
和backlog
作为参数传递给listen()
系统调用,它们之间有什么关系。
附:我想要对内核 4.15 进行解释,因为我发现最旧的内核和较新的内核在这个问题上存在一些差异。
sysctl 是一个 API。所以你可以直接阅读Linux内核适当版本的文档 https://elixir.bootlin.com/linux/v4.15.18/source/Documentation/networking/ip-sysctl.txt#L372:
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握手 https://www.geeksforgeeks.org/tcp-3-way-handshake-process/.. tcp_max_syn_backlog
表示最大连接数SYN_RECV
队列。 IE。当你的服务器收到SYN,发送SYN-ACK,但还没有收到ACK。这是所谓的“请求套接字”的单独队列 -reqsk
在代码中(即不是完全成熟的套接字,“请求套接字”占用较少的内存。在这种状态下,我们可以节省一些内存并且尚未分配完整的套接字,因为如果 ACK 不会到达,将来可能根本不会建立完整的连接)。该队列的值会受到影响(请参阅这个帖子 https://stackoverflow.com/questions/58183847/does-listens-backlog-number-include-syn-received-connections-count-in-case-of-t/58185850) by listen() https://www.man7.org/linux/man-pages/man2/listen.2.html's backlog
论证并受限于tcp_max_syn_backlog
在内核中。
somaxconn
代表最大尺寸ESTABLISHED
队列。这是另一个队列。
回想一下前面提到的SYN_RECV
队列 - 您的服务器正在等待客户端的 ACK。当 ACK 到达时,粗略地说,内核从“请求套接字”创建一个大的成熟套接字,并将其移动到 ESTABLISHED 队列。然后你可以做accept() https://man7.org/linux/man-pages/man2/accept.2.html在这个插座上。该队列还受到listen()
's backlog
论证并受限于somaxconn
在内核中。
有用的链接:1 https://stackoverflow.com/questions/23862410/invalid-argument-setting-key-net-core-somaxconn/25074725#25074725, 2 http://veithen.io/2014/01/01/how-tcp-backlog-works-in-linux.html.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)