形象描繪TCP三次握手和四次揮手

2022-05-15 15:41:42 字數 3646 閱讀 4273

一、tcp三次握手

tcp 三次握手就好比兩個人在街上隔著50公尺看見了對方,但是因為霧霾等原因不能100%確認,所以要通過招手的方式相互確定對方是否認識自己。

形象描繪tcp三次握手和四次揮手

張三首先向李四招手(syn),李四看到張三向自己招手後,向對方點了點頭擠出了乙個微笑(ack)。張三看到李四微笑後確認了李四成功辨認出了自己(進入established狀態)。

但是李四還有點狐疑,向四周看了一看,有沒有可能張三是在看別人呢,他也需要確認一下。所以李四也向張三招了招手(syn),張三看到李四向自己招手後知道對方是在尋求自己的確認,於是也點了點頭擠出了微笑(ack),李四看到對方的微笑後確認了張三就是在向自己打招呼(進入established狀態)。

於是兩人加快步伐,走到了一起,相互擁抱。

形象描繪tcp三次握手和四次揮手

我們看到這個過程中一共是四個動作,張三招手–李四點頭微笑–李四招手–張三點頭微笑。其中李四連續進行了2個動作,先是點頭微笑(回覆對方),然後再次招手(尋求確認),實際上可以將這兩個動作合一,招手的同時點頭和微笑(syn+ack)。於是四個動作就簡化成了三個動作,張三招手–李四點頭微笑並招手–張三點頭微笑。這就是三次握手的本質,中間的一次動作是兩個動作的合併。

我們看到有兩個中間狀態,syn_sent和syn_rcvd,這兩個狀態叫著「半開啟」狀態,就是向對方招手了,但是還沒來得及看到對方的點頭微笑。syn_sent是主動開啟方的「半開啟」狀態,syn_rcvd是被動開啟方的「半開啟」狀態。客戶端是主動開啟方,伺服器是被動開啟方。

syn_sent: syn package has been sent

syn_rcvd: syn package has been received

二、tcp 資料傳輸

tcp 資料傳輸就是兩個人隔空對話,差了一點距離,所以需要對方反覆確認聽見了自己的話。

形象描繪tcp三次握手和四次揮手

張三喊了一句話(data),李四聽見了之後要向張三回覆自己聽見了(ack)。

如果張三喊了一句,半天沒聽到李四回覆,張三就認為自己的話被大風吹走了,李四沒聽見,所以需要重新喊話,這就是tcp重傳。

也有可能是李四聽到了張三的話,但是李四向張三的回覆被大風吹走了,以至於張三沒聽見李四的回覆。張三並不能判斷究竟是自己的話被大風吹走了還是李四的回覆被大風吹走了,張三也不用管,重傳一下就是。

既然會重傳,李四就有可能同一句話聽見了兩次,這就是「去重」。「重傳」和「去重」工作作業系統的網路核心模組都已經幫我們處理好了,使用者層是不用關心的。

形象描繪tcp三次握手和四次揮手

張三可以向李四喊話,同樣李四也可以向張三喊話,因為tcp鏈結是「雙工的」,雙方都可以主動發起資料傳輸。不過無論是哪方喊話,都需要收到對方的確認才能認為對方收到了自己的喊話。

張三可能是個高射炮,一說連說了八句話,這時候李四可以不用一句一句回覆,而是連續聽了這八句話之後,一起向對方回覆說前面你說的八句話我都聽見了,這就是批量ack。但是張三也不能一次性說了太多話,李四的腦子短時間可能無法消化太多,兩人之間需要有協商好的合適的傳送和接受速率,這個就是「tcp視窗大小」。

網路環境的資料互動同人類之間的對話還要複雜一些,它存在資料報亂序的現象。同乙個**發出來的不同資料報在「網際路由」上可能會走過不同的路徑,最終達到同乙個地方時,順序就不一樣了。作業系統的網路核心模組會負責對資料報進行排序,到使用者層時順序就已經完全一致了。

三、tcp 四次揮手

tcp斷開鏈結的過程和建立鏈結的過程比較類似,只不過中間的兩部並不總是會合成一步走,所以它分成了4個動作,張三揮手(fin)——李四傷感地微笑(ack)——李四揮手(fin)——張三傷感地微笑(ack)。

形象描繪tcp三次握手和四次揮手

之所以中間的兩個動作沒有合併,是因為tcp存在「半關閉」狀態,也就是單向關閉。張三已經揮了手,可是人還沒有走,只是不再說話,但是耳朵還是可以繼續聽,李四呢繼續喊話。等待李四累了,也不再說話了,超張三揮了揮手,張三傷感地微笑了一下,才徹底結束了。

形象描繪tcp三次握手和四次揮手

上面有乙個非常特殊的狀態time_wait,它是主動關閉的一方在回覆完對方的揮手後進入的乙個長期狀態,這個狀態標準的持續時間是4分鐘,4分鐘後才會進入到closed狀態,釋放套接字資源。不過在具體實現上這個時間是可以調整的。

它就好比主動分手方要承擔的責任,是你提出的要分手,你得付出代價。這個後果就是持續4分鐘的time_wait狀態,不能釋放套接字資源(埠),就好比守寡期,這段時間內套接字資源(埠)不得**利用。

它的作用是重傳最後乙個ack報文,確保對方可以收到。因為如果對方沒有收到ack的話,會重傳fin報文,處於time_wait狀態的套接字會立即向對方重發ack報文。

同時在這段時間內,該鏈結在對話期間於網際路由上產生的殘留報文(因為路徑過於崎嶇,資料報文走的時間太長,重傳的報文都收到了,原始報文還在路上)傳過來時,都會被立即丟棄掉。4分鐘的時間足以使得這些殘留報文徹底消逝。不然當新的埠被重複利用時,這些殘留報文可能會干擾新的鏈結。

4分鐘就是2個msl,每個msl是2分鐘。msl就是maximium segment lifetime——最長報文壽命。這個時間是由官方rfc協議規定的。至於為什麼是2個msl而不是1個msl,我還沒有看到乙個非常滿意的解釋。

四次揮手也並不總是四次揮手,中間的兩個動作有時候是可以合併一起進行的,這個時候就成了三次揮手,主動關閉方就會從fin_wait_1狀態直接進入到time_wait狀態,跳過了fin_wait_2狀態。

四、總結

tcp狀態轉換是乙個非常複雜的過程,本文僅對一些簡單的基礎知識點進行了模擬講解。關於tcp的更多知識還需要讀者去搜尋相關技術文章進入深入學習。如果讀者對tcp的基礎知識掌握得比較牢固,高階的知識理解起來就不會太過於吃力。

最簡單的理解

一:建立tcp連線:三次握手協議

客戶端:我要對你講話,你能聽到嗎;

服務端:我能聽到;而且我也要對你講話,你能聽到嗎;

客戶端:我也能聽到。

…….互相開始通話

……..    

二:關閉tcp連線:四次握手協議

客戶端:我說完了,我要閉嘴了;

服務端:我收到請求,我要閉耳朵了;

(客戶端收到這個確認,於是安心地閉嘴了。)

…….服務端還沒傾訴完自己的故事,於是繼續嘮嘮叨叨向客戶端說了半天,直到說完為止

…….服務端:我說完了,我也要閉嘴了;

客戶端:我收到請求,我要閉耳朵了;(事實上,客戶端為了保證這個確認包成功送達,等待了兩個最大報文生命週期後,才閉上耳朵。)

(服務端收到這個確認,於是安心地閉嘴了。)

資料慘考:

TCP三次握手和四次揮

一 tcp報文格式 在了解三次握手和四次揮手之前,首先要知道tcp報文內部包含了哪些東西。報文主要段的含義 序號 seq 用來標記資料段的順序,確保tcp傳輸有序。ack 確認 確認序號標誌,ack 1表示確認號字段有效,ack 0表示確認序號無效。syn 同步 連線請求序號標誌,用於建立連線。sy...

三次握手和四次揮手 TCP三次握手和四次揮手的理解

相比較於udp傳輸協議,tcp傳輸協議被認為是安全可靠的,這是由於tcp協議的三次握手和四次揮手保證了資料傳輸的安全性。tcp報文格式簡介 要了解tcp協議的三次握手和四次揮手,需要先了解在tcp協議中請求和響應的資料報報文格式。在報文中有幾個值得注意的字段 1 序號 seq序號,佔32位,用來標識...

結合socket詳解TCP三次握手四次揮手

tcp協議中的三次握手和四次揮手大家應該都至少聽說過了,本人一直覺得理論學習要結合 才能學習的更深刻,當知道東西是這樣,然後再知道為什麼是這樣的時候,領悟往往更加深刻,今天本人就結合socket程式設計中的api來解析一下tcp協議的三次握手和四次揮手過程。那麼tcp協議中的三次握手和四次揮手實際在...