在 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