1. 程式人生 > >【計算機網路】【TCP】如何講清楚Tcp的三次握手和四次揮手?

【計算機網路】【TCP】如何講清楚Tcp的三次握手和四次揮手?

每一次TCP連線都需要三個階段:連線建立、資料傳送和連線釋放。

三次握手:

三次握手就發生在連線建立階段。

目的:三次握手的目的是為了防止已失效的連線請求報文段突然又傳送到了服務端,因而產生錯誤(為什麼是三次握手而不是兩次握手的原因)

為什麼TCP協議建立連線要三次握手?

​ 已失效的連線請求報文段的產生在這樣一種情況下:client發出的第一個連線請求報文段並沒有丟失,而是在某個網路結點長時間的滯留了,以致延誤到連線釋放以後的某個時間才到達server。本來這是一個早已失效的報文段。但server收到此失效的連線請求報文段後,就誤認為是client再次發出的一個新的連線請求。於是就向client發出確認報文段,同意建立連線。假設不採用三次握手,那麼只要server發出確認,新的連線就建立了。由於現在client並沒有發出建立連線的請求,因此不會理睬server的確認,也不會向server傳送資料。但server卻以為新的運輸連線已經建立,並一直等待client發來資料。這樣,server的很多資源就白白浪費掉了。採用三次握手的辦法可以防止上述現象發生。例如剛才那種情況,client不會向server的確認發出確認。server由於收不到確認,就知道client並沒有要求建立連線。所以三次通訊是理論上的最小值。所以三次握手不是TCP本身的要求, 而是為了滿足”在不可靠通道上可靠地傳輸資訊”這一需求所導致的.   

四次揮手:

四次揮手發生在連線釋放階段。

為什麼TCP協議終止連結要四次?

  1. 當主機A確認傳送完資料且知道B已經接受完了,想要關閉傳送資料口(當然確認訊號還是可以發),就會發FIN給主機B。
  2. 主機B收到A傳送的FIN,表示收到了,就會發送ACK回覆。
  3. 但這是B可能還在傳送資料,沒有想要關閉資料口的意思,所以FIN與ACK不是同時傳送的,而是等到B資料傳送完了,才會傳送FIN給主機A。
  4. A收到B發來的FIN,知道B的資料也傳送完了,回覆ACK, A等待2MSL以後,沒有收到B傳來的任何訊息,知道B已經收到自己的ACK了,A就關閉連結,B也關閉連結了。

A為什麼等待2MSL,從TIME_WAIT到CLOSE?

​ 在Client傳送出最後的ACK回覆,但該ACK可能丟失。Server如果沒有收到ACK,將不斷重複傳送FIN片段。所以Client不能立即關閉,它必須確認Server接收到了該ACK。Client會在傳送出ACK之後進入到TIME_WAIT狀態。Client會設定一個計時器,等待2MSL的時間。如果在該時間內再次收到FIN,那麼Client會重發ACK並再次等待2MSL。所謂的2MSL是兩倍的MSL(Maximum Segment Lifetime)。MSL指一個片段在網路中最大的存活時間,2MSL就是一個傳送和一個回覆所需的最大時間。如果直到2MSL,Client都沒有再次收到FIN,那麼Client推斷ACK已經被成功接收,則結束TCP連線。

​​​​Tcp協議狀態轉換