TCP之四次揮手

2021-10-02 03:58:33 字數 1084 閱讀 7020

為啥需要4次揮手

因為tcp的連線是全雙工的,所以,每一段都需要對讀寫部分分別進行關閉

第一次關閉的是關閉主動方的寫端(傳送端),關閉被動方的讀端(接收端)

第二次關閉的是被動方的寫端(傳送端),關閉主動方的讀端(接收端)

一般來說都是客戶端作為主動方來斷開連線

四次揮手的步驟

1.客戶端呼叫close等函式主動關閉,並向服務端傳送fin報文

(當乙個連線被建立或者被終止的時候,交換的報文當只包含tcp頭部,而沒有資料)

狀態變為fin-wait-1(一般不存在,因為服務端很快就響應),等待服務端的響應

2.服務端的接收到後,立刻返回ack,服務端的狀態變為close-wait(此時處於半關閉狀態)

只關閉了客戶端寫,服務端讀的方向的資料傳輸,服務端還可以給客戶端發資料,等到服務端處

理完資料,把沒有發完的資料發完

3.客戶端接收到服務短的應答,狀態變為fin-wait-2,服務端把要發的資料發完了,會給服務端發

乙個fin報文請求關閉,然後服務端的狀態變為lack-ack

4客戶端接收到報文後,傳送ack,然後狀態變為time-wait(等待2msl(兩個報文週期)中)

服務端收到ack後,就立刻變為closed

客戶端在時間到了之後,變為closed

這才是真正的關閉

為啥要等待2msl

因為如果主動方傳送的ack丟失了,服務端會在2msl的時間內再次傳送fin

等待2msl的目的就是確認ack肯定到達時服務端

1.因為無法保證客戶端傳送的最後一次ack一定被服務端收到,因此對方處於last-ack狀態下的

socket可能會因為超時未收到ack報文,而重發fin報文,所以這個time-wait狀態的作用就是用

來重發可能丟失的ack報文

2.如果不存在2msl的時間,則應用程式能夠立馬建立乙個和剛關閉的連線相似的連線,因為他們的

ip和埠號都相同,這個連線盡可能收到屬於原來連線的應用層資料的tcp報文

因為需要等待2msl的時間,所以主動關閉方的埠需要等待2msl後才能被重新使用,

如果是服務端先主動關閉的,則一段時間內伺服器將無法重啟

tcp 四次揮手 TCP四次揮手

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

TCP四次揮手

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

TCP四次揮手

四次揮手 1.客戶端程序發出連線釋放報文,並且停止傳送資料。釋放資料報文首部,fin 1,其序列號為seq u 等於前面已經傳送過來的資料的最後乙個位元組的序號加1 此時,客戶端進入fin wait 1 終止等待1 狀態。tcp規定,fin報文段即使不攜帶資料,也要消耗乙個序號。2.伺服器收到連線釋...