1)、某個程序呼叫close函式,主動關閉。該端傳送乙個fin分節,表示資料傳送完畢。
2)、接受到fin分節的對端,被動關閉。
3)、然後一段時間後。 對端也傳送乙個fin分節
4)、主動關閉埠,確定對端傳送而來的fin分節。
如圖所示。
類似syn一樣, fin分節也是佔據1個位元組的子串行空間。因此, 每個fin的ack確認號就是這個fin的序列號加1。
time_wait狀態, 有時候我們稱之為2msl狀態, 因為該端點停留在這個狀態的持續時間是最長分節生命期(maximum segment lifetime,msl)的兩倍,並且只有主動關閉的一方才會進入該狀態。
msl(maximum segment lifetime)表示報文段最大生存時間,它表示任何報文段被丟棄前在網路內的最長時間,實際上這個時間和 ttl 有關(ttl 是 ip 協議中的乙個概念,表示能夠經歷的路由器的跳數,這個跳數是有限制的,最大值為 255)
存在的理由一、
在乙個tcp可靠的實現tcp全雙工連線終止
存在的理由二、
允許老的重複分節在網路消失。
* 等待2msl的原因一
假設最終那個ack丟失。伺服器將會重新傳送他的fin,因此客戶必須維護狀態資訊,以允許它重新傳送最終那個ack
* 等待2msl的原因二
假設在 ip1:port1 和 ip2:port2 建立了乙個連線 a,傳送完資料後關閉連線 a。如果沒有 time_wait 狀態,我們又立即在 ip1:port1 和 ip2:port2 建立了乙個連線 b(雖然這種事情概率很小,但是仍然存在)。
很不幸的是,連線 a 它有乙個重複的 tcp 段被連線 b 收到了,然而連線 b 並不知道這個 tcp 段是連線 a 中的舊報文,這會造成錯誤!
如果有了 time_wait 狀態,等待 2msl,就足以讓連線 a 中重複的報文在網路中消逝;另一方面,tcp 協議規定,處於 time_wait 狀態的埠,是無法建立新的連線的。這樣就保證了每成功建立乙個新連線時,舊連線中的重複 tcp 段都已消逝。
1、了解syn_sent、syn_recv、fin_wait1, fin_wait2, time_wait, close_wait, last_ack、close在的轉化原因。
2、無論客戶端和伺服器端。都要分辨清楚主動關閉和被動關閉的過程中tcp狀態變化。
3、理解time_wait和2msl的含義。
4、time_wait等待兩個2msl的原因。
tcp 四次揮手 TCP四次揮手
tcp斷開連線的過程 客戶端傳送fin報文,表明客戶端將不在傳送資料。具體過程 把fin標誌位改為1,序號seq u,之前傳送的資料加1,這裡規定即使不攜帶資料序號也要 1。該過程中客戶端通過close系統呼叫從established狀態進入fin wait 1狀態。第二次揮手 服務端收到客戶端發來...
TCP四次揮手詳解
1 資料傳輸結束後,通訊的雙方都可以釋放連線。現在a和b都處於established狀態。2 a的應用程式先向其tcp發出連線釋放報文段,並停止再傳送資料,主動關閉tcp連線。a把連線釋放報文段首部的fin置1,其序號seq u,它等於前面已經傳送過的資料的最後乙個位元組的序號加1。這時a進入fin...
TCP四次揮手 wireshark分析
和前面的三次連線一樣,這一次我們來看一下tcp四次揮手的過程,當然了,也可能會失望,因為我捕捉到的只有三次揮手,而不是四次揮手。我們這裡規定ip位址為219.223.247.181是client端,而183.232.250.255是server端,下面就用client端和server端來解釋四次揮手...