搬運一個在某乎的回答,水一篇文章吧。
TCP四次揮手
(資料圖片)
正常情況下。只要數據傳輸完了,不管是客戶端還是服務端,都可以主動發起四次揮手,釋放連接。
就跟上圖畫的一樣,假設,這次四次揮手是由客戶端主動發起的,那它就是主動方。服務器是被動接收客戶端的揮手請求的,叫被動方。
客戶端和服務器,一開始,都是處于ESTABLISHED狀態。
第一次揮手:一般情況下,主動方執行close()?或shutdown()?方法,會發個FIN報文出來,表示"我不再發送數據了"。第二次揮手:在收到主動方的FIN?報文后,被動方立馬回應一個ACK,意思是"我收到你的FIN了,也知道你不再發數據了"。上面提到的是主動方不再發送數據了。但如果這時候,被動方還有數據要發,那就繼續發。注意,雖然第二次和第三次揮手之間,被動方是能發數據到主動方的,但主動方能不能正常收就不一定了,這個待會說。
第三次揮手:在被動方在感知到第二次揮手之后,會做了一系列的收尾工作,最后也調用一個close()?, 這時候就會發出第三次揮手的FIN-ACK。第四次揮手:主動方回一個ACK,意思是收到了。其中第一次揮手和第三次揮手,都是我們在應用程序中主動觸發的(比如調用close()方法),也就是我們平時寫代碼需要關注的地方。
第二和第四次揮手,都是內核協議棧自動幫我們完成的,我們寫代碼的時候碰不到這地方,因此也不需要太關心。
另外不管是主動還是被動,每方發出了一個FIN?和一個ACK?。也收到了一個FIN?和一個ACK。
回到題主的問題。
TCP四次揮手中如果服務端沒收到第四次揮手請求,服務端會一直等待嗎?第四次揮手是第三次揮手觸發的。如果第四次揮手服務端一直沒收到,那服務端會認為是不是自己的第三次揮手丟了,于是服務端不斷重試發第三次揮手(FIN).重發次數由系統的tcp_orphan_retries參數控制。重試多次還沒成功,服務端直接斷開鏈接。所以結論是服務端不會一直等待第四次揮手。
TCP第四次揮手丟失
# cat /proc/sys/net/ipv4/tcp_orphan_retries0
另外,你會發現tcp_orphan_retries參數是0,但其實并不是不重試的意思。為0時,默認值為8. 也就是重試8次。
/* Calculate maximal number or retries on an orphaned socket. */static int tcp_orphan_retries(struct sock *sk, int alive){ int retries = sysctl_tcp_orphan_retries; /* May be zero. */ /* We know from an ICMP that something is wrong. */ if (sk->sk_err_soft && !alive) retries = 0; /* However, if socket sent something recently, select some safe * number of retries. 8 corresponds to >100 seconds with minimal * RTO of 200msec. */ if (retries == 0 && alive) retries = 8; return retries;}
當然如果服務端重試發第三次揮手FIN的過程中,還是同樣的端口和IP,起了個新的客戶端,這時候服務端重試的FIN被收到后,客戶端就會認為是不正常的數據包,直接發個RST給服務端,這時候兩端連接也會斷開。
X 關閉
X 關閉
- 1亞馬遜開始大規模推廣掌紋支付技術 顧客可使用“揮手付”結賬
- 2現代和起亞上半年出口20萬輛新能源汽車同比增長30.6%
- 3如何讓居民5分鐘使用到各種設施?沙特“線性城市”來了
- 4AMD實現連續8個季度的增長 季度營收首次突破60億美元利潤更是翻倍
- 5轉轉集團發布2022年二季度手機行情報告:二手市場“飄香”
- 6充電寶100Wh等于多少毫安?鐵路旅客禁止、限制攜帶和托運物品目錄
- 7好消息!京東與騰訊續簽三年戰略合作協議 加強技術創新與供應鏈服務
- 8名創優品擬通過香港IPO全球發售4100萬股 全球發售所得款項有什么用處?
- 9亞馬遜云科技成立量子網絡中心致力解決量子計算領域的挑戰
- 10京東綠色建材線上平臺上線 新增用戶70%來自下沉市場