這篇文章,主要是整理一下 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。也就...