多个内核参数与半连接队列/全连接队列有关:
net.ipv4.tcp_max_syn_backlog:控制收到 SYN 报文时,尚未完成三次握手因而还未建立的 TCP 连接请求可以被放到半连接队列中的最大数量(半连接队列长度)。
net.core.somaxconn: 已经完成三次握手,但是尚未被应用程序调用 accept() 获取的最大连接数量(全连接队列长度)。
net.ipv4.tcp_syncookies: SYN Cookie 机制,启用后当前连接收到 SYN 包后不进入半连接队列,而是根据时间戳,四元组信息计算出一个 Cookie 信息作为
ISN 返回给客户端,等收到了 ACK 包时从序号里反算出当时信息。
配置为 0 时不启用;配置为 1 时当半连接队列满时启用;配置为 2 时无条件启用。不同的内核版本对于半连接队列/全连接队列的长度计算有些许差异(尤其半连接队列的限制在历史上经过了很多次变化调整),
vm-1/vm-2 使用的 5.10.134-16 版本的内核计算方法是:
# 半连接队列当前长度(backlog 是调用 listen() 时的 backlog 参数,下同)
min(backlog, net.core.somaxconn, net.ipv4.tcp_max_syn_backlog)
# 全连接队列最大长度min(backlog, net.core.somaxconn)
很多资料里提到的早先那个 roundup_pow_of_two 的计算方法在 v4.4 开始的一个提交中修改了。
说不准你在实验的时候,更高版本内核的某些行为就和这篇文章里的实验结果不太一致了。这也很正常,要学会研究方法而不是记住数字。