TCP的三次握手和四次揮手

2021-08-16 09:52:29 字數 2458 閱讀 2380

在tcp/ip模型中的傳輸層,有乙個協議,叫做tcp協議,tcp協議的特點是面向連線的,通訊是雙向的,也就是通訊雙方都可以進行收發資料,tcp協議可以保證資料收發的可靠性和有序性。

tcp的三次握手:

既然是面向連線,那麼在雙方通訊之前,就要建立連線,tcp的連線是通過三次握手來進行的,**如下:

第一次握手:client發起連線請求,向server傳送syn包,傳送之後將自己的狀態置為:syn_send狀態

第二次握手:server收到client的請求之後,立馬進行響應,也就是向client傳送syn+ack包,server傳送的ack包的序號等於傳送方的syn包的序號+1,傳送完成之後,server進入syn_recv狀態。

第三次握手:client收到server傳送的響應之後,再向server傳送乙個確認包:ack,此時ack確認包的序號是上一次server傳送的syn包的序號+1,傳送完成之後,client和server都進入established狀態。

這個時候連線就建立了,雙方就可以進行通訊,這就是tcp的三次握手。

為什麼是三次握手,不是兩次或者更多次?

現在我們假設a是客戶端client,b是服務端server,既然是面向連線的協議,那麼一次肯定是不行的,那麼兩次為什麼不行呢? 現在假設現在a向b傳送訊息,但是由於網路延遲的原因,b沒有收到訊息,然後a就會重新傳送syn包,進行新的請求連線,此時b收到了第二次的連線請求,進行了響應,但是現在第一次的syn在響應了第二次的請求之後也到了,此時伺服器就會認為這是a新發起的請求,那麼也會對這個syn進行一次響應,但是此時a認為b對第一次的響應是無效的,就不會去處理,此時b就會一直為a的第乙個syn保留相關資源,就造成了資源的浪費。

而不是四次的原因就是,三次就可以保證連線的建立,四次以上就會把過程變得複雜和繁瑣。

tcp的四次揮手

四次揮手的**:

因為client和server都有可能發起關閉的請求,所以我們現在以client發起請求為例學習

第一次揮手:client發起關閉請求,向server傳送fin包,將自己的狀態置為fin_wait_1,意思就是:告訴server我沒有資料向你傳送了,我要關閉了。

第二次揮手:server收到client傳送的fin包之後,向client傳送ack包,然後將自己的狀態置為close_wait,此時ack包的序號和握手序號規則一樣,是發起請求端的序號+1,意思就是:我知道你的資料傳送完成了,但是我的資料還沒有傳送完成,所以我還不著急關閉連線,當client收到ack確認之後將自己的狀態置為:fin_wait_2。

第三次揮手:當server的資料傳送完成之後,server也要發起關閉的請求,向client傳送fin包,然後講自己置為last_wait狀態,告訴client,我的資料也傳送完成了,現在我也要關閉連線了

第四次揮手:當client收到server傳送的fin包,然後將自己的狀態置為time_wait,然後給server傳送ack確認包,此時的ack確認包是server傳送的fin包的序號+1,意思就是告訴server。我知道你要結束了,現在斷開吧。當serve收到client的確認之後,將自己的狀態置為:closed,最後一次client傳送完ack確認之後,等待2msl,如果沒有收到server的訊息,那麼就認為連線已經成功斷開了,講自己置為closed狀態。

tip:msl,任何報文在被丟棄前在網路中的最長時間,

為什麼揮手是四次不是三次呢?

因為當client傳送fin之後,得到了確認,此時的client的狀態是fin_wait_2,此時client不能傳送資料,但是可以接收資料。當client第一次傳送fin包的時候,server的資料不一定也傳送完了,所以server暫時還不能關閉,此時就讓client處於乙個fin_wait_2狀態,讓其繼續接收server沒有傳送完成的資料。

為什麼在client響應了server傳送的fin之後沒有直接進入closed狀態呢?

因為在client響應了server發出的fin請求之後,回應以ack確認,如果此時client直接進入closed狀態,那麼萬一這個ack包因為網路的原因沒有即使的到達server,server就會再次的傳送fin包,請求關閉,但是此時client已經關閉了,那麼server收到的就是rst,並會報告錯誤,此時就不復合tcp的可靠性原則。所以,綜上所述,在client響應了server的fin之後,狀態只能是time_wait,等2msl之後,client的狀態才能置為closed。

tcp 四次揮手 TCP的三次握手和四次揮手

三次握手 第一次握手 客戶端傳送syn包 syn x 到伺服器,並進入syn send狀態,等待伺服器確認 第二次握手 伺服器收到syn包,必須確認客戶的syn ack x 1 同時自己也傳送乙個syn包 syn y 即syn ack包,此時伺服器進入syn recv狀態 第三次握手 客戶端收到伺服...

TCP三次握手和四次揮手

一 tcp三次握手 three way handshake 1 tcp三次握手的作用 三次握手的目的是連線伺服器指定埠,建立tcp連線,並同步連線雙方的序列號和確認號並交換 tcp 視窗大小資訊。在socket程式設計中,客戶端執行connect 時,將觸發三次握手。2 tcp三次握手過程 第一步 ...

TCP三次握手和四次揮手

三次握手 四次揮手 需四次揮手原因 由於tcp的半關閉特性,tcp連線時雙全工 即資料在兩個方向上能同時傳遞 因此,每個方向必須單獨的進行關閉。這個原則就是 當一方完成它的資料傳送任務後就能傳送乙個fin來終止這個方向上的連線。當一端收到乙個fin後,它必須通知應用層另一端已經終止了那個方向的資料傳...