TCP连接队列

在 Linux 网络通信中,backlog、net.core.somaxconn 和 ss 命令中的 Recv-Q/Send-Q 共同影响 TCP 连接的建立

  • 全连接队列(Accept Queue)和半连接队列(SYN Queue)都是针对服务端(TCP 服务端)的机制,限制请求连接数,不是报文大小
  • 客户端 只需发起 SYN 并等待 SYN+ACK,然后发送 ACK 完成握手,不涉及队列管理
半连接队列\全连接队列
  • 半连接队列 的大小 仅由 tcp_max_syn_backlog 决定,与 somaxconn 无关。

  • 全连接队列 的大小由 min(somaxconn, 应用程序的 backlog) 决定(例如 Nginx 的 listen backlog=512)。

  • 两者分工明确:
    半连接队列:处理未完成三次握手的连接(SYN_RECV)。
    全连接队列:处理已建立但待应用程序接受的连接(ESTABLISHED)。

1. backlog(应用层参数)
  • 定义:backlog 是应用程序在调用 listen() 时指定的参数,表示 全连接队列(Accept Queue)的最大长度
  • 功能:当服务端完成三次握手后,连接会从 半连接队列(SYN Queue) 转移到 全连接队列(Accept Queue),等待应用调用 accept() 处理
2. net.core.somaxconn(内核参数)
  • 定义:somaxconn 是 Linux 内核参数,表示 所有 TCP 监听套接字(socket)的队列长度上限,包含全连接。
  • 功能:限制所有应用程序的 backlog 最大值。即使应用设置 backlog=1000,若 somaxconn=128,实际队列长度仍为 128
3. ss 命令中的 Recv-Q 和 Send-Q
  • 作用: 通过 ss -ntlp 可查看 TCP 连接状态
  • 不同状态的解读
状态                           Recv-Q 含义                     Send-Q 含义
ESTABLISHED          应用未读取的字节数(堆积数据)    已发送但未收到 ACK 的字节数
LISTEN               当前全连接队列中的连接数          全连接队列的最大长度(backlog)
其他状态              通常为 0                         通常为 0 
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容