網路程式設計 TCP的四次揮手

2021-10-03 02:47:13 字數 2571 閱讀 3467

這篇文章,主要是整理一下 tcp 的四次揮手。在網路程式設計-從tcp三次握手說起介紹了關於tcp的三次握手。

四次揮手

四次揮手的流程在網上有很多**,這裡簡略介紹一下,其最常見流程如下圖所示,先來看看如何建立連線的:

其大體流程如下:

1、客戶端發其結束請求,傳送seq=u,處於fin-wait-1狀態

2、服務端收到結束請求,傳送應答ack=u+1,處於close_wait狀態

3、客戶端收到u的應答後,處於fin_wait_2狀態,此時還可以接收來自服務端的資料

4、服務端沒有資料要傳送,也傳送結束請求,seq=w,處於last_ack狀態

5、客戶端又收到服務端的結束請求,客戶端回應ack,此時處於time_wait狀態,確保ack能夠到達服務端;服務端收到客戶端最終ack,關閉連線。

6、2msl時間結束後,無論服務端是否收到最終ack,客戶端完全結束連線。

四次揮手需要注意的問題?

time_wait的目的?

time_wait發生在tcp揮手的第四次揮手之後,這個狀態的主要目的在於,客戶端要確認最後乙個ack能夠順利的傳送到服務端,當服務端沒有收到ack確認報文,那麼一定是會重傳這個fin包。

time_wait為什麼是2倍的msl?

msl(maximum segment lifetime)是報文段的最大生存時間。

當第四次揮手傳送完乙個ack報文的時候,它到達服務端的最大報文段傳輸時間為msl,在極端情況下,剛好乙個msl的時候ack報文段丟失,那麼服務端就會重傳乙個fin,那麼它傳送到客戶端的時間就又是乙個msl,那麼這種情況是極端的情況,也就是最大會有2倍的msl時間間隔,當丟失後重傳的fin到達客戶端的時候,那客戶端就會重新設定為2倍的msl,並且重傳ack。

可以借助netstat命令nc命令通過下面的方式觀察到。在終端1監聽8080埠:

終端1

nc -l 8080
終端2

nc 127.0

.0.1

8080

終端3

通過netstat命令觀察:

netstat -anpoc|grep :

8080

然後在終端1按ctrl+c,終止連線,立刻觀察終端3的結果:

可以觀察到,服務端當前處於time_wait,且有乙個timewait的定時器,為1分鐘。

close-wait得目的?

close-wait發生在第二次揮手後:當客戶端第一次揮手,傳送乙個fin報文,然後服務端不會立即傳送fin關閉連線的請求,而是傳送乙個ack確認客戶端關閉,這個時候客戶端無法再向服務端傳送資料,但是服務端會有乙個close-wait,在這close-wait期間將未傳送完的資料全部傳送給客戶端,當資料傳送完了以後呢,就開始第三次揮手,傳送乙個fin確認關閉連線。

什麼是tcp半關閉

客戶端在收到第乙個fin的ack響應後,會進入fin_wait2 狀態時,此時伺服器處於 close_wait狀態,這種狀態就稱之為半關閉。

什麼是tcp半關閉

如果一方已經關閉或異常終止連線,而另一方卻不知道。 我們將這樣的tcp連線稱為半開啟。

為什麼要四次揮手?

這是因為tcp半關閉造成的。由於乙個tcp連線是全雙工的,在兩個方向上都能傳輸資料,因此兩個方向就需要單獨關閉。所以這個流程是這樣的:

傳送fin的一方就是主動關閉(客戶端),而另一方則為被動關閉(伺服器)。

當一方傳送了fin,則表示在這一方不再會有資料的傳送。

其中當被動關閉方受到對方的fin時,此時往往可能還有資料需要傳送過去,因此無法立即傳送fin(也就是無法將fin與ack合併傳送),

而是在等待自己的資料傳送完畢後再單獨傳送fin,因此整個過程需要四次互動。

tcp 工作流程

那麼,乙個tcp 正常的通訊流程,會包含建鏈(建立連線)、傳輸資料、拆鏈(關閉連線),如下圖所示:

三次握手建立連線執行資料傳輸、雙方讀寫四次揮手釋放連線。

參考:《unix網路程式設計》

《tcp/ip協議詳解》

tcp 四次揮手 TCP四次揮手

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

網路 TCP四次揮手 (再見)

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

網路協議 TCP 四次揮手

有握手就有揮手,上篇講了 tcp的三次握手,這裡就聊聊四次揮手過程。是有連線的,當建立握手完成後,雙方就建立連線,並且雙方只能建立乙個連線,這是因為對於tcp協議,要成功建立乙個新的鏈結,需要保證新連線四個要素,組合體的唯一性 客戶端的ip 客戶端的port 伺服器端的ip 伺服器端的port。也就...