tcp四次揮手,爲什麼是四次?

  上一篇博客說了三次握手爲什麼是是三次(點這裏),那麼現在就介紹一下四次揮手。大家都知道TCP是全雙工的,再建立連接時的三次握手中的SYN和ACK一起發送,這裏就會有疑問,爲什麼在四次揮手的時候沒有將SYN和ACK一起發送呢?帶着這個問題繼續向下看,答案就在其中。
  說到四次揮手,顧名思義,就是在關閉連接的時候雙方一共要操作四次,來看一下這四次都是怎麼操作的:
在這裏插入圖片描述
  從圖中可以看出來,在四次揮手的時候雙方一共進入了六種狀態,這六種狀態就是理解四次揮手的關鍵所在,我們來看一下

四次揮手的狀態

  1. FIN_WAIT_1:這個狀態和FIN_WAIT_2狀態都在再等待對方的回覆,但是這兩種狀態是有區別的,FIN_WAIT_1就是主動方在ESTABLISHED狀態的時候,想要主動關閉連接,向對方發送FIN報文,這時候就進入了FIN_WAIT_1狀態。當他收到對方回覆的ACK報文後,就進入了FIN_WAIT_2狀態。 但是在實際操作中是很難遇到FIN_WAIT_1狀態的,因爲無論對方是什麼情況都應該立刻迴應ACK報文,但是FIN_WAIT_2狀態還是可以在主動方中用netstat看到的。

  2. FIN_WAIT_2:上面已經對FIN_WAIT_2講解過了,當主動方進入FIN_WAIT_2時,就表示着半連接狀態,也就是主動方還有數據要發給對方,這個數據就是之後的ACK,所有他要等一會兒才關閉連接。

  3. CLOSE_WAIT:這個狀態從表面也可以看出它的作用,就是等待關閉。當被動方接收到FIN時,會立刻回覆一個ACK給對方,接下來就是進入CLOSE_WAIT狀態。在這個狀態中,被動方需要考慮自己還有沒有數據要發送給對方,如果有可以繼續發送,如果沒有了就可以關閉連接了,發送一個FIN給對方。 這個狀態其實也就是給自己一個緩衝的時間,讓自己處理完需要處理的事,然後去關閉連接。

  4. TIME_WAIT:這個狀態就是一段時間後進行一些操作。當主動方收到了對方發來的FIN報文,併發出ACK報文,接下來就等2MSL就可以進入CLOSED狀態了。其實,如果主動方在FIN_WAIT_1狀態下,收到了對方的FIN+ACK標誌的報文,就可以跳過FIN_WAIT_2狀態直接進入TIME_WAIT狀態了。

  5. LAST_ACK:這個狀態從表面不難不理解他的意思,這個狀態就是被動方發送了FIN報文後,最後等待對方的ACK報文,收到ACK報文後就可以進入CLOSED狀態了。

  6. CLOSED:上面提到了幾次這個狀態,相比也猜出來了,這個狀態表示的就是連接中斷,已經關閉。

  在上面的TIME_WAIT狀態中有提到過2MSL,那麼什麼是2MSL呢?那麼來詳細說一下TIME_WAIT狀態和裏面的2MSL。

爲什麼需要TIME_WAIT?

  TIME_WAIT在四次揮手中有着不可替代的位置,如果沒有TIME-WAIT,主動方就會直接進入CLOSED狀態,(假設主動方時客戶端,被動方時服務端)這時候如果立即重啓客戶端使用相同的端口,如果因爲網絡中種種原因最後一次ACK丟失了,服務端就會重複FIN請求,這時這個FIN就會被重新啓動的客戶端接收到,或者新啓動的客戶端向服務端發起請求的時候,因爲服務端正在等待最後一次ACK,因此新連接請求發送的SYN就會被服務端認爲時請求碼錯誤,服務端就會回覆RET重置連接。所以就需要主動方發送最後一次ACK之後進入TIME_WAIT狀態,等待2MSL(兩個報文最大生命週期),等待這段時間就是爲了如果接收到了重發的FIN請求能夠進行最後一次ACK回覆,讓在網絡中延遲的FIN/ACK數據都消失在網絡中,不會對後續連接造成影響

那麼爲什麼TIME_WAIT的時間是2MSL呢?

  MSL是TCP報文的最大生命週期,因爲TIME_WAIT持續在2MSL就可以保證在兩個傳輸方向上的尚未接收到或者遲到的報文段已經消失,否則服務器立即重啓,可能會收到來自上一個進程遲到的數據,但是這種數據很可能是錯誤的,同時也是在理論上保證最後一個報文可靠到達,假設最後一個ACK丟失,那麼服務器會再重發一個FIN,這是雖然客戶端的進程不在了,但是TCP連接還在,仍然可以重發LAST_ACK。

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