深入淺出通俗理解 TCP的三次握手 四次分手

2021-10-12 15:04:30 字數 4219 閱讀 3558

運輸連線有三個階段,即:連線建立、資料傳送和連線釋放。

運輸連線的管理就是使運輸連線的建立和釋放都能正常地進行。

連線建立過程中要解決以下三個問題:

要使每一方能夠確知對方的存在

要允許雙方協商一些引數(如最大報文段長度,最大視窗大小,服務質量等)。

能夠對運輸實體資源(如快取大小,連線表中的專案等)進行分配。

舉個栗子:把客戶端比作男孩,伺服器比作女孩。用他們的交往來說明「三次握手」過程:

男孩喜歡女孩,於是寫了一封信告訴女孩:我愛你,請和我交往吧!寫完信之後,男孩焦急地等待,因為不知道信能否順利傳達給女孩。

女孩收到男孩的情書後,心花怒放,原來我們是兩情相悅呀!於是給男孩寫了一封回信:我收到你的情書了,也明白了你的心意,其實,我也喜歡你!我願意和你交往!;

寫完信之後,女孩也焦急地等待,因為不知道回信能否能順利傳達給男孩。

男孩收到回信之後很開心,因為發出的情書女孩收到了,並且從回信中知道了女孩喜歡自己,並且願意和自己交往。然後男孩又寫了一封信告訴女孩:你的心意和信我都收到了,謝謝你,還有我愛你!

女孩收到男孩的回信之後,也很開心,因為發出的情書男孩收到了。由此男孩女孩雙方都知道了彼此的心意,之後就快樂地交流起來了~~

這就是通俗版的「三次握手」,期間一共往來了三封信也就是「三次握手」,以此確認兩個方向上的資料傳輸通道是否正常。

**三次握手

所謂的三次握手,即tcp連線的建立。這個連線必須是一方主動開啟,另一方被動開啟的。

握手之前主動開啟連線的客戶端結束closed階段,被動開啟的伺服器端也結束closed階段,並進入listen階段。隨後開始「三次握手」:

首先客戶端向伺服器端傳送一段tcp報文,其中:

標記位為syn,表示「請求建立新連線」;

序號為seq=x(x一般為1);

隨後客戶端進入syn-sent階段。

伺服器端接收到來自客戶端的tcp報文之後,結束listen階段。並返回一段tcp報文,其中:

標誌位為syn和ack,表示「確認客戶端的報文seq序號有效,伺服器能正常接收客戶端傳送的資料,並同意建立新連線」(即告訴客戶端,伺服器收到了你的資料);

序號為seq=y;

確認號為ack=x+1,表示收到客戶端的序號seq並將其值加1作為自己確認號ack的值;隨後伺服器端進入syn-rcvd階段。

客戶端接收到來自伺服器端的確認收到資料的tcp報文之後,明確了從客戶端到伺服器的資料傳輸是正常的,結束syn-sent階段。並返回最後一段tcp報文。其中:

標誌位為ack,表示「確認收到伺服器端同意連線的訊號」(即告訴伺服器,我知道你收到我發的資料了);

序號為seq=x+1,表示收到伺服器端的確認號ack,並將其值作為自己的序號值;

確認號為ack=y+1,表示收到伺服器端序號seq,並將其值加1作為自己的確認號ack的值;

隨後客戶端進入established階段。

伺服器收到來自客戶端的「確認收到伺服器資料」的tcp報文之後,明確了從伺服器到客戶端的資料傳輸是正常的。結束syn-sent階段,進入established階段。

在客戶端與伺服器端傳輸的tcp報文中,雙方的確認號ack和序號seq的值,都是在彼此ack和seq值的基礎上進行計算的,這樣做保證了tcp報文傳輸的連貫性。一旦出現某一方發出的tcp報文丟失,便無法繼續"握手",以此確保了"三次握手"的順利完成。

三次握手動態過程

舉個栗子:把客戶端比作男孩,伺服器比作女孩。通過他們的分手來說明「四次揮手」過程。

「第一次揮手」:日久見人心,男孩發現女孩變成了自己討厭的樣子,忍無可忍,於是決定分手,隨即寫了一封信告訴女孩。

「第二次揮手」:女孩收到信之後,知道了男孩要和自己分手,怒火中燒,心中暗罵:你算什麼東西,當初你可不是這個樣子的!於是立馬給男孩寫了一封回信:分手就分手,給我點時間,我要把你的東西整理好,全部還給你!男孩收到女孩的第一封信之後,明白了女孩知道自己要和她分手。隨後等待女孩把自己的東西收拾好。

「第四次揮手」:男孩收到女孩第二封信之後,知道了女孩收拾好東西了,可以正式分手了,於是再次寫信告訴女孩:我知道了,這就去拿回來!

這裡雙方都有各自的堅持。

女孩自發出第二封信開始,限定一天內收不到男孩回信,就會再發一封信催促男孩來取東西!男孩自發出第二封信開始,限定兩天內沒有再次收到女孩的信就認為,女孩收到了自己的第二封信;若兩天內再次收到女孩的來信,就認為自己的第二封信女孩沒收到,需要再寫一封信,再等兩天…..
倘若雙方信都能正常收到,最少只用四封信就能徹底分手!這就是「四次揮手」。

**四次分手

所謂的四次揮手即tcp連線的釋放(解除)。連線的釋放必須是一方主動釋放,另一方被動釋放。

揮手之前主動釋放連線的客戶端結束established階段。隨後開始「四次揮手」:

首先客戶端想要釋放連線,向伺服器端傳送一段tcp報文,其中:

標記位為fin,表示「請求釋放連線「;

序號為seq=u;

隨後客戶端進入fin-wait-1階段,即半關閉階段。並且停止在客戶端到伺服器端方向上傳送資料,但是客戶端仍然能接收從伺服器端傳輸過來的資料。

注意:這裡不傳送的是正常連線時傳輸的資料(非確認報文),而不是一切資料,所以客戶端仍然能傳送ack確認報文。

伺服器端接收到從客戶端發出的tcp報文之後,確認了客戶端想要釋放連線,隨後伺服器端結束established階段,進入close-wait階段(半關閉狀態)並返回一段tcp報文,其中:

標記位為ack,表示「接收到客戶端傳送的釋放連線的請求」;

序號為seq=v;

確認號為ack=u+1,表示是在收到客戶端報文的基礎上,將其序號seq值加1作為本段報文確認號ack的值;

隨後伺服器端開始準備釋放伺服器端到客戶端方向上的連線。

客戶端收到從伺服器端發出的tcp報文之後,確認了伺服器收到了客戶端發出的釋放連線請求,隨後客戶端結束fin-wait-1階段,進入fin-wait-2階段

前"兩次揮手"既讓伺服器端知道了客戶端想要釋放連線,也讓客戶端知道了伺服器端了解了自己想要釋放連線的請求。於是,可以確認關閉客戶端到伺服器端方向上的連線了

伺服器端自從發出ack確認報文之後,經過closed-wait階段,做好了釋放伺服器端到客戶端方向上的連線準備,再次向客戶端發出一段tcp報文,其中:

標記位為fin,ack,表示「已經準備好釋放連線了」。注意:這裡的ack並不是確認收到伺服器端報文的確認報文。

序號為seq=w;

確認號為ack=u+1;表示是在收到客戶端報文的基礎上,將其序號seq值加1作為本段報文確認號ack的值。

隨後伺服器端結束close-wait階段,進入last-ack階段。並且停止在伺服器端到客戶端的方向上傳送資料,但是伺服器端仍然能夠接收從客戶端傳輸過來的資料。

客戶端收到從伺服器端發出的tcp報文,確認了伺服器端已做好釋放連線的準備,結束fin-wait-2階段,進入time-wait階段,並向伺服器端傳送一段報文,其中:

標記位為ack,表示「接收到伺服器準備好釋放連線的訊號」。

序號為seq=u+1;表示是在收到了伺服器端報文的基礎上,將其確認號ack值作為本段報文序號的值。

確認號為ack=w+1;表示是在收到了伺服器端報文的基礎上,將其序號seq值作為本段報文確認號的值。

隨後客戶端開始在time-wait階段等待2msl

為什麼要客戶端要等待2msl呢?

後「兩次揮手」既讓客戶端知道了伺服器端準備好釋放連線了,也讓伺服器端知道了客戶端了解了自己準備好釋放連線了。於是,可以確認關閉伺服器端到客戶端方向上的連線了,由此完成「四次揮手」。

與「三次揮手」一樣,在客戶端與伺服器端傳輸的tcp報文中,雙方的確認號ack和序號seq的值,都是在彼此ack和seq值的基礎上進行計算的,這樣做保證了tcp報文傳輸的連貫性,一旦出現某一方發出的tcp報文丟失,便無法繼續"揮手",以此確保了"四次揮手"的順利完成。

深入淺出TCP協議的三次握手過程

tcp是主機對主機層的傳輸控制協議,提供可靠的連線服務,採用三次握手確認建立乙個連線 每一次tcp連線都需要三個階段 連線建立 資料傳送和連線釋放。三次握手 就發生在連線建立階段。所謂的 三次握手 即對每次傳送的資料量跟蹤進行協商使資料段的傳送和接收同步,以及根據所接收到的資料量來確定資料傳送 接收...

深入淺出TCP三次握手和四次分手

有圖可知,由於http只有請求和響應的概念,通道連線需要通過tcp來完成的,因此讓我們先來談談tcp的三次握手和四次分手吧 客戶端首先要syn 1,表示要建立連線 服務端接收到後,要告訴客戶端 我接受到了!所以加個ack 1表示確認跟客戶端建立連線,因為tcp連線是雙向的,然後還需要傳送syn 1表...

《深入淺出TCP之11理解tcp的有序釋放操作》

shutdown呼叫 int shutdown int s,int how how 0 關閉連線的接收端 也適用於udp how 1 關閉連線的傳送端 後繼所有試圖對套接字進行寫操作都會除錯 將傳送緩衝區中所有的資料都傳送出去之後,tcp會向其對等實體傳送乙個fin,通知它沒資料了 how 2 兩端...