理解TCP握手過程中建連接的流程和隊列
服務器綁定、監聽了指定端口後,內核通常會為每一個LISTEN狀態的socket維護兩個隊列
1.SYN隊列(半連接隊列):長度由tcp_max_syn_backlog決定
2.ACCEPT隊列(全連接隊列):長度由內核硬限制由 net.core.somaxconn 限制,即實際的值由min(backlog,somaxconn) 來決定
二、連接建立的流程
1.當client通過connect()向server發出SYN包時,server收到syn後,把相關信息放到半連接隊列(syns queue)中,同時回復syn+ack。
2.Client返回ACK後,如果全連接隊列(accept queue)沒滿,那麽Server從半連接隊列拿出相關信息放入到全連接隊列。
3.否則按照tcp_abort_on_overflow配置參數執行操作
1)0 表示直接丟丟棄該ACK
2)1 表示發送RST
三、查看隊列情況
如果應用處理全連接隊列(accept queue)過慢 socket overflow,影響半連接隊列(syn queue)溢出socket dropped
# netstat -s|grep -i listen
8692 times the listen queue of a socket overflowed
8692 SYNs to LISTEN sockets ignored
四、命令 ss -tln
1.LISTEN 狀態:
Recv-Q 表示的當前等待服務端調用 accept 完成三次握手的 listen backlog 數值,也就是說,當客戶端通過 connect() 去連接正在 listen() 的服務端時,這些連接會一直處於這個queue裏面直到被服務端 accept();
Send-Q表示的則是最大的listen backlog數值,這就就是上面提到的 min(backlog, somaxconn) 的值。
2.非 LISTEN 狀態
Recv-Q 表示 receive queue 中的 bytes 數量
Send-Q 表示 send queue 中的 bytes 數值。
理解TCP握手過程中建連接的流程和隊列