劍指Offer(網絡)——TCP四次揮手

揮手指的就是終止連接,TCP四次揮手流程圖如下:

客戶端或者服務端觸發close,假設客戶端觸發close
在這裏插入圖片描述

  1. 數據傳輸完畢之後,雙方纔可以釋放連接;
  2. 最開始客戶端和服務端都處於Established狀態,假設客戶端主動關閉;
  3. 首先客戶端發送連接釋放報文並停止發送數據,該數據報報頭中攜帶的flag爲FIN=1,seq=u,u指的是剛纔連接狀態下傳送過來的最後一條信息的最後一個序號加上1,此時客戶端進入了FIN_WAIT-1狀態,第一次揮手;
  4. TCP規定,即使FIN報文段不攜帶任何數據也要消耗一個序號,讓下一步回覆報文的時候能使seq+1,當服務器收到連接釋放報文之後也要發出確認報文,即ACK=1,ack=u+1,自己的序列號sequence=v此時服務端就進入了CLOSE-WAIT狀態,此時服務器處於半關閉狀態,意味着客戶端沒有數據發送但是服務端要發送數據客戶端還是可以接受的,這種狀態持續到CLOSE-WAIT結束,第二次揮手;
  5. 客戶端就進入了FIN-WAIT-2的狀態等待服務器繼續發送釋放連接報文也就是第三次揮手,注意這個時候服務器還是可以繼續發送數據的,此時攜帶的flag爲FIN=1,ACK=1,sequence=w,ack=u+1,當這條報文發送之後就進入了LAST-ACK的狀態,也就是服務端最終確認狀態等待客戶端的最終確認;
  6. 客戶端這個時候收到了服務端最後釋放的報文之後,發送報文ACK=1,sequence=u+1,ack=w+1之後進入TIME_WAIT狀態這時就是第四次揮手;
  7. 等待2MSL(最長報文段壽命)之後TCP Client就進入了關閉狀態。之後當服務端接受到了客戶端的報文之後也會立刻進入到關閉狀態。

爲什麼會有TIME_WAIT狀態???

  1. 確保有足夠的時間使對方收到ACK,如果對方沒收到ACK會重傳FIN,一去一回正好是2MSL;
  2. 防止這個連接和後面的連接混亂在一起,因爲有的路由器會緩存報文數據包。

爲什麼需要四次揮手才能斷開連接???

因爲TCP連接是全雙工的,發送方和接收方都需要FIN報文和ACK報文,簡單說就是傳遞的過程發送方和接收方都要各自發送兩次正好是四次。。

服務器出現大量CLOSE_WAIT的原因???

客戶端發送過來一個FIN報文之後服務器沒有發送ACK或者來確認FIN報文,就是客戶單關閉socket連接但是服務器忙於服務沒有及時關閉連接。這個時候是需要修改程序的。

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