TCP四次揮手

2022-07-01 18:45:13 字數 1425 閱讀 9182

目錄established:代表乙個開啟的連線,資料可以傳給使用者

fin-wait-1:等待遠端tcp的連線中斷請求,或先前的連線中斷請求的確認

fin-wait-2:從遠端tcp等待連線中斷請求

closed-wait:等待從本地使用者發來的連線中斷請求

closing:等待遠端tcp對連線中斷的確認

last-ack:等待原來發向遠端tcp的連線中斷請求的確認

time-wait:等待足夠的時間以確保遠端tcp接收到連線中斷請求的確認

closed:沒有任何連線狀態

剛開始客戶端和服務端都處於established的狀態(可以進行資料傳輸),假如是客戶端先發起斷開連線請求,則:

在這四次揮手的過程中,ack標誌一直等於1

過程解析:

對於建立連線時的三次握手的過程中:因為當服務端收到客戶端的syn連線請求報文後,服務端返回syn+ack報文。其中ack報文是用來應答的,syn報文是用來同步的,這兩個tcp報文可以直接一起返回

對於關閉連線時:當服務端收到fin報文時,僅僅表示客戶端不能傳送資料了,但還能接收資料,服務端這邊也未必將全部資料都傳送給客戶端了,所以不會立即關閉scoket,所以只能先回覆乙個ack報文,告訴客戶端,"你發的fin報文我收到了"。只有等到我(服務端)所有報文都傳送完了,我才能傳送fin報文,因此不能將兩個報文一起傳送,所以需要四步握手

主要目的是:確保服務端已經收到客戶端傳送的ack報文,如果沒有收到的話,服務端會重新傳送fin+ack報文(重新進入第三次揮手狀態),客戶端再次收到fin報文,就知道傳送給服務端的ack報文丟失了,然後再次傳送ack報文

如果客戶端不等待一段時間,而是發完ack立即釋放連線,則無法收到服務端重傳的fin+ack報文,也不會重傳ack報文,這樣服務端無法正常進入closed狀態

msl最長報文段壽命maximum segment lifetime, msl = 2

客戶端一般會設定乙個計時,如果超過了這個時間沒有再次收到fin+ack報文,則代表服務端已經成功接收了ack報文,然後客戶端可以直接進入closed狀態

設定這個等待時間的原因:

1)保證客戶端傳送的最後乙個ack報文能夠達到服務端

這個ack報文有可能會丟失,使得處於服務端收不到對已傳送的ack+fin報文的確認,服務端超時重傳fin+ack報文,這樣服務端能在2msl的時間內收到這個重傳的fin+ack報文,然後客戶端重傳一次ack報文,再重新啟動2msl計時器,最後客戶端和服務端都進入closed狀態

2)防止已經失效的請求報文段出現在新連線中

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.伺服器收到連線釋...