網路協議 TCP 四次揮手

2021-10-10 08:28:03 字數 2613 閱讀 4507

有握手就有揮手,上篇講了

tcp的三次握手,這裡就聊聊四次揮手過程。

tcp 是有連線的,當建立握手完成後,雙方就建立連線,並且雙方只能建立乙個連線,這是因為對於tcp協議,要成功建立乙個新的鏈結,需要保證新連線四個要素,組合體的唯一性:客戶端的ip、客戶端的port、伺服器端的ip、伺服器端的port。也就是說,伺服器端的同乙個ip和port,可以和同乙個客戶端的多個不同埠成功建立多個tcp鏈結(與多個不同的客戶端當然也可以),只要保證【server ip + server port + client ip + client port】這個組合唯一不重複即可,但是正常我們使用的客戶端都是乙個埠建立連線,且是全雙工的,任何乙個方向都可向對端傳送資料。如果在使用完成後不進行揮手,兩端會保持連線狀態,並且為了保持連線做各種包的檢測等,且不能再發起連線,一直占用客戶端和服務端的資源,且連線數過多直接導致服務端連線佇列爆滿,無法再連線新的客戶端,且資源消耗嚴重。揮手是雙方的乙個約定,雙方揮手完成後,對端將不會收到訊息,連線資源釋放。

那麼正常時候當tcp連線建立起來後,就可以在兩個方向傳輸資料流,當tcp 的網路應用程序在沒有資料要傳送時,就可以發出關閉連線的命令,釋放連線,tcp是通過fin 識別符號,置1 的資料段來作為關閉傳輸連線的命令,從而關閉本端資料流的,但是本端仍然可以繼續接收來自對端的資料段,直到對端也使用了同樣的方法關閉那個方向的資料流為止,這時整個雙方傳輸連線就徹底關閉了。

相對tcp 連線的三次握手過程,tcp 傳輸鏈結的釋放需要經過四次握手或者說4次揮手。這是由tcp 的半關閉特性造成的,因為tcp連線是全雙工的(即資料在兩個方向上能同時傳遞,就像一條雙向通行的公路一樣,兩端車輛都可以通行,再抽象點就是類似於打**一樣,你即可以聽到對方的說話,本身也可以說話,對方同樣也是這樣)每個方向上必須單獨關閉,比如說關閉雙向公路的一端的乙個方向。

tcp 傳輸連線的關閉的原則是:當一端完成他的資料傳送任務後就可以傳送乙個fin 欄位置 1 資料段來終止那個方向的資料傳送,當另一端收到這個fin 資料段後,必須通知他的應用層「對端已經終止了那個方向的資料傳送」,具體有四部組成。

1. 雙方都處於established(連線建立狀態) ,如果客戶端認為資料全部傳送完成,要結束本次傳輸,則由應用層的對應應用程序呼叫close服務原語,然後向伺服器發出乙個fin 欄位置1 seq=m的資料段,傳送後狀態為: fin wait 1

2. 服務端收到 fin=1 seq=m ,向客戶端傳送 確認訊息 ack=1 seq=n ack=m+1,狀態變為:close wait,同時伺服器的tcp 實體通知對應的應用程序,釋放從客戶端到伺服器方向的傳輸連線,進入半關閉狀態(半雙工),但此時伺服器仍可以向客戶端傳送資料段,客戶端也可以接收來自服務端的資料。

3. 當客戶端收到伺服器的ack 資料段後,進入到fin wait 2 狀態,進一步等待伺服器發出連線釋放的資料段。

4. 服務端傳送完確認訊息後,如果有未傳送的訊息段,等待繼續將未傳送的資料段傳送完成,然後向客戶端傳送fin=1 ack=1,seq=w ack=m+1 ,由於在半關閉狀態,伺服器很可能又傳送了一些資料,假定此時的序列號為seq=w發出連線釋放的資料段訊息後,狀態變為:last ack .

5. 當客戶端收到服務端fin =1 + ack 釋放連線的訊息後,向服務端傳送乙個ack =1 ack=w+1 seq = m + 1的資料段,狀態變為:time wait 狀態,但此時tcp的連線還沒有釋放,必須等待2msl (rfc793建議設定msl 為2分鐘) 後,客戶端進入到closed狀態,徹底釋放tcp 連線。

6. 服務端在收到客戶端傳送的確認關閉資料段後,進入closed 狀態,徹底釋放連線,此時完成整個tcp 傳輸連線的釋放過程。

這是四次握手詳細**:

需要注意的是服務端的兩次握手訊息,中間的一段間隔時間,不光是用來釋放了客戶端到服務端的連線,還等待將未傳送完成的訊息傳送完成,然後才傳送fin斷開連線的訊息段。

1.按照上邊的邏輯,如果服務端在收到客戶端fin 後在自身條件允許的情況下,其實可以直接傳送乙個 fin 和 ack 包的,就是將第二次和第三次握手合併為一次,這樣可以實現三次握手。

2.當客戶端和服務端同時發起fin 情況是什麼樣?

下面是摘錄書上的圖:

當同時發起關閉連線訊息fin=1 時,a b 同時進入fin wait 1(主動關閉,主機已經傳送關閉連線請求,等待對方確認) 狀態,當收到對方發來的fin 訊息後都進入 closing(雙方同時嘗試關閉連線)狀態,

向對方傳送ack 確認訊息後,雙方進入到 time wait (完成雙向連線關閉,等待所有分組消失)狀態,等待2ms 後進入到 closed 釋放連線。這樣的話就是兩次握手,每個方向都是兩次。

msl(maximum segment lifetime),tcp允許不同的實現可以設定不同的msl值。

保證客戶端傳送的最後乙個ack報文能夠到達伺服器,因為這個ack報文可能丟失,站在伺服器的角度看來,我已經傳送了fin+ack報文請求斷開了,客戶端還沒有給我回應,應該是我傳送的請求斷開報文它沒有收到,於是伺服器又會重新傳送一次,而客戶端就能在這個2msl時間段內收到這個重傳的報文,接著給出回應報文,並且會重啟2msl計時器。

tcp 四次揮手 TCP四次揮手

tcp斷開連線的過程 客戶端傳送fin報文,表明客戶端將不在傳送資料。具體過程 把fin標誌位改為1,序號seq u,之前傳送的資料加1,這裡規定即使不攜帶資料序號也要 1。該過程中客戶端通過close系統呼叫從established狀態進入fin wait 1狀態。第二次揮手 服務端收到客戶端發來...

網路 TCP四次揮手 (再見)

四次揮手即終止tcp 連線,就是指斷開乙個tcp 連線時,需要客戶端和服務端總共傳送4 個包以確認連線的斷開。在socket 程式設計中,這一過程由客戶端或服務端任一方執行close 來觸發。由於tcp 連線是全雙工的,因此,每個方向都必須要單獨進行關閉,這一原則是當一方完成資料傳送任務後,傳送乙個...

TCP四次揮手

純給自己看的 發起關閉的一方是客戶端,被動關閉的一方是伺服器。1 客戶端a傳送乙個fin 1,用來關閉客戶a到伺服器b的資料傳送。圖上畫的對,還有乙個seq n 2 伺服器b收到這個fin,它發回乙個ack 1,確認序號ack為收到的序號加1。3 伺服器b關閉與客戶端a的連線,傳送乙個fin 1給客...