理解TCP握手過程中建連接的流程和隊列

一、半連接隊列和全連接隊列

服務器綁定、監聽了指定端口後,內核通常會爲每一個LISTEN狀態的socket維護兩個隊列

1.SYN隊列(半連接隊列):長度由tcp_max_syn_backlog決定

2.ACCEPT隊列(全連接隊列):長度由內核硬限制由 net.core.somaxconn 限制,即實際的值由min(backlog,somaxconn) 來決定


二、連接建立的流程

blob.png

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 數值。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章