TCP三次握手、四次揮手

TCP三次握手建立連接,四次揮手斷開連接

1.三次握手建立連接:

在這裏插入圖片描述
先來解釋一下上圖中的幾個大寫字母代表什麼含義:
SYN:同步序列編號(Synchronize Sequence Numbers),代表請求創建連接,所以在三次握手中前兩次要SYN = 1,表示這兩次用於建立連接。
FIN: Finish,表示請求關閉連接。在下述的四次揮手時,FIN發了兩遍,是因爲TCP連接是雙向的,所以一次FIN只能關閉一個方向。
ACK:Acknowledgement,即確認字符,代表確認接受。從圖裏可以看見,不管是三次握手還是四次揮手,在迴應的時候都會加上ACK = 1,這就表示消息接收到了。

我們一起來理一下三次握手建立連接的思路:

  1. 第一次握手:在建立連接時,客戶端發送SYN包(SYN=1)到服務器,並進入了SYN_SENT狀態,等待服務端的確認;
  2. 第二次握手:服務端接收到SYN包後,必須確認客戶端的SYN,同時自己也發送一個SYN包,即SYN+ACK包,此時服務端進入了SYN_RCVD狀態;
  3. 第三次握手:客戶端收到服務端的SYN+ACK包,向服務端發送一個確認包ACK,此包發送完畢後,客戶端和服務端就進入了ESTABLISHDE狀態,完成三次握手。

四次揮手

在這裏插入圖片描述

2.四次揮手斷開連接:

  1. 假設是客戶端主動關閉並停止發送數據,就會向服務端發送一個FIN包,表示要關閉一個方向的連接,此時客戶端進入FIN_WAIT_1狀態;
  2. 服務端接收到後,發出確認報文(ACK=1),這時服務端就進入了CLOSE_WAIT狀態,這時候處於半關閉狀態,即客戶端已經沒有數據要發送了。但是服務端若發送數據,客戶端還會接收。這個狀態要持續一段時間,就是整個CLOSE_WAIT狀態;
  3. 客戶端收到服務端的確認請求後,此時客戶端就進入了FIN_WAIT_2狀態;
  4. 這時服務端也要關閉,服務端會發送一個FIN包,此時服務端就進入了LAST_ACK(最後確認)狀態,等待客戶端的確認;
  5. 客戶端在接收到服務端的關閉請求後,會回覆一個確認ACK。此時客戶端就進入了TIME_WAIT狀態。注意:此時連接並沒有斷開,還要經過2MSL(最大報文生命週期)後才進入CLOSE狀態;
  6. 服務端只要收到了客戶端發出的確認,立即進入CLOSE狀態,就結束了整個連接。

問題:爲什麼需要三次呢(爲什麼不用兩次建立連接呢)?

如果發送兩次就可以建議連接,那麼客戶端只需要發送一個連接請求,服務端接收到連接請求後再回復一個確認消息,就會建立一個連接。但這樣是不安全的。如果SYN請求在網絡中網絡中延遲到達,這時候假如客戶端退出了,服務端收到的第一個SYN請求就無法保證客戶端的數據收發能力,因此兩次握手建立連接是不安全的。

問題:爲什麼需要需要四次呢?

在關閉連接時,當服務端收到客戶端發送的FIN包時,並不會立即關閉SOCKET,所以先回復一個ACK,告訴客戶端已經收到客戶端發的FIN包,只有等服務端所有數據都發送完畢後,服務端纔會給客戶端發送一個FIN包,在收到客戶端回覆的ACK後才能關閉連接,因此是四次。

問題:TIME_WAIT狀態的作用,以及爲什麼要等待2MSL?

假設沒有TIME_WAIT狀態,主動關閉方直接進入CLOSED,如果這時立即重啓客戶端使用相同端口,再最後一次ACK丟失時,服務端重發FIN請求,就會被新客戶端接受到;或者新客戶端向服務端發起請求時,因爲服務端正在等待最後一次ACK,因此新連接請求發送的SYN會被認爲請求碼錯誤,回覆RST重置連接。因此需要主動關閉方發送最後一次ACK之後要進入一個TIME_WAIT狀態等待一段時間,等待這段時間就是爲了若接收到了重發的FIN請求能夠進行最後一次ACK回覆。

所謂的2MSL是兩倍的最大報文生命週期,能夠讓網絡中延遲的FIN/ACK數據都消失在網絡裏,不會對後續的連接造成影響。

問題:如果已經建立連接,但是客戶端突然出現了故障會怎麼辦?

TCP還設有一個保活機制。顯然,如果客戶端出現了故障,服務端不能一直等下去。若等了一段時間還沒有收到客戶端的任何數據,服務端就會發送一個探測報文段,若一連發送10個探測報文段仍然沒有反應,服務端就認爲是客戶端出現了故障,就會關閉連接。

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