在 Linux 網(wǎng)絡通信中,backlog、net.core.somaxconn 和 ss 命令中的 Recv-Q/Send-Q 共同影響 TCP 連接的建立
- 全連接隊列(Accept Queue)和半連接隊列(SYN Queue)都是針對服務端(TCP 服務端)的機制,限制請求連接數(shù),不是報文大小
- 客戶端 只需發(fā)起 SYN 并等待 SYN+ACK,然后發(fā)送 ACK 完成握手,不涉及隊列管理
半連接隊列\(zhòng)全連接隊列
半連接隊列 的大小 僅由 tcp_max_syn_backlog 決定,與 somaxconn 無關。
全連接隊列 的大小由 min(somaxconn, 應用程序的 backlog) 決定(例如 Nginx 的 listen backlog=512)。
兩者分工明確:
半連接隊列:處理未完成三次握手的連接(SYN_RECV)。
全連接隊列:處理已建立但待應用程序接受的連接(ESTABLISHED)。
1. backlog(應用層參數(shù))
- 定義:backlog 是應用程序在調用 listen() 時指定的參數(shù),表示 全連接隊列(Accept Queue)的最大長度
- 功能:當服務端完成三次握手后,連接會從 半連接隊列(SYN Queue) 轉移到 全連接隊列(Accept Queue),等待應用調用 accept() 處理
2. net.core.somaxconn(內(nèi)核參數(shù))
- 定義:somaxconn 是 Linux 內(nèi)核參數(shù),表示 所有 TCP 監(jiān)聽套接字(socket)的隊列長度上限,包含全連接。
- 功能:限制所有應用程序的 backlog 最大值。即使應用設置 backlog=1000,若 somaxconn=128,實際隊列長度仍為 128
3. ss 命令中的 Recv-Q 和 Send-Q
- 作用: 通過 ss -ntlp 可查看 TCP 連接狀態(tài)
- 不同狀態(tài)的解讀
狀態(tài) Recv-Q 含義 Send-Q 含義
ESTABLISHED 應用未讀取的字節(jié)數(shù)(堆積數(shù)據(jù)) 已發(fā)送但未收到 ACK 的字節(jié)數(shù)
LISTEN 當前全連接隊列中的連接數(shù) 全連接隊列的最大長度(backlog)
其他狀態(tài) 通常為 0 通常為 0