一、舉個例子
圖片來自網絡
類比兩個人初認識的一個過程。比如一個男生初次認識一個女生,男生第一次看到這個女生就一見鐘情,想要認識女生。
男生給女生發了個求交往的消息,“我想要跟你做朋友,可不可以?”給這個求交往的消息打上標簽,比如愛心,代表這個是求交往的消息。
女生回復“我收到你的消息(對收到消息的確認)。我同意跟你做朋友試試看?!边@個是女生的態度。在男生發完求交往后的一個確認消息以及女生同意交往的消息。
這個是消息內容以及消息性質。男生收到女生的消息很開心,再次確認下我確實收到了你的確認消息。也知道了女生同意試試看的態度。
這樣的一個交互之后,確認消息的一個再次確認消息。
結果:確認關系了,可以正式交往了。后面再發送的消息就是他們作為男女朋友之后發的消息內容了。
二、TCP三次握手詳解
1.TCP頭部的重要字段
圖片來自網絡
tcp三次握手跟這個過程就特別像。 現在是個客戶端,這邊是個百度服務器。這個客戶端想像百度服務器去取頁面、資源。首先要發起個tcp的鏈接請求。
首先要發一條請求鏈接的消息。請求鏈接的消息里面要包括一些什么內容呢?這個需要再去詳細的看下tcp頭部了。
圖片來自網絡
要重視的是序號、確認號、6個標志位。
序號
:就是tcp數據包標的編號。tcp數據包過大,tcp數據會在網絡中進行分段。
太大了在網絡中是無法傳輸的,分成一小段一小段進行傳輸。
分段,到達目的主機后進行重組。比如分成了10段,每段要按順序重組,才能組成原來一樣的數據包。如果順序錯了,數據包也不一樣了。
所以這個時候要對它進行一個編號,比如分成10段,分別是1,2,3,4....10,重組的時候,收到1的時候必須等2,收到2的時候必須等3,這個數據包依次過來依次重組,這樣保證數據能夠正確的組合起來。這個就是序號的作用。
確認號
:就是確認的一個序號。當客戶端向服務器發起了一個鏈接的時候,客戶端會發起一個鏈接請求,客戶端發完鏈接請求之后,希望服務器能夠給一些回應。
比如男生給女生發請求交往的消息,內心很忐忑的希望女生也能夠回一個確認消息。確認消息里面會帶一個編號。這個編號就是這里說的確認號。
確認號存在于確認消息里面的。確認號是怎么編號的呢?序號是為了給數據包分段的時候為了方便給后面進行完整的數據重組。
確認號和序號有什么關系?
確認號是依據序號來編得。
一個數據包發送過去,它的序號的編號是1。發到服務器那邊,服務器進行了一個回應,回應包也就是確認包里面有確認號。用ack表示確認號。
確認號是上一個收到的包的序號加上1。表示服務器期望收到你的下一個包的序號。
6個標志位(狀態控制碼)
:目前只需要掌握4個,包括ACK(確認位)、RST(重置)、SYN、FIN。
標志位--信號燈,1--亮,0--滅。表示數據包的類型。標志位就是表示數據包的類型。
2.四個標志位
ACK(確認位)
。=1,表示這個消息是一個確認消息。
什么是確認消息?男生給女生發了一個求交往的消息,女生禮貌性的回了一個確認消息。這個就是一個確認消息,ACK這個標志位就會被置成1。
客戶端收到,就會認識這個包是個確認消息。
RST(重置)
:=1,表示這個消息釋放鏈接。TCP鏈接出現了錯誤--主機服務器崩潰,斷開鏈接,請重新建立鏈接。
SYN
:同步,=1,表示這個消息是:1.一個發起鏈接的消息。男生向女生發起的第一個求交往的消息,就是一個發起鏈接的消息。
2.確認接受鏈接的消息。
如果我這個消息是一個確認接受鏈接的消息,服務器這邊 收到客戶端一個發起鏈接的消息,然后我同意它發起鏈接,所以要進行一個確認。
這兩種情況都需要把SYN位置成1。
FIN
:終止。=1,表示發送報文結束了完畢,釋放這個鏈接。
RST是出現錯誤,不得不釋放鏈接,而FIN是用完了這個鏈接,用完了之后自然要釋放這個鏈接。FIN被置位了就表示TCP四次揮手要開始了。
不管是客戶端還是服務器收到tcp的報文,檢查標記號,標記位是什么狀態,表示當前的報文是一個什么樣的類型。
3.TCP三次握手
圖片來自網絡
客戶端要向服務器端發送一個請求鏈接的消息。標志位SYN=1,表示一個發起鏈接的消息時,這個SYN位一定置成1。
每個包都有一個序號,所以序號用seq來表示,seq=j,表示當前的序號是j。
是一個SYN包,是我要向服務器發起一個鏈接請求。這個是客戶端向服務器發起的第一個數據包。也是三次握手的第一次握手。
服務器收到了客戶端的包,服務器給客戶端回的消息是一個確認消息。
標志位
:ACK位置1,表示它是一個確認消息。SYN位置1,客戶端發起鏈接,服務器確認接受鏈接的消息。
ack(確認號)
:根據序號來進行表示的,序號是1,確認號是1+1,表示服務器期望收到的下一個包的序號。所以確認號是j+1。
表示收到了序為j的這個包,并且希望得到下一個包的序號是j+1。
這個包,自己的序號是seq=k。
客戶端收到服務器的確認消息,需要再次給它發送一個確認消息。
這個確認消息里面,標志位里面:ACK肯定置1。也不是發起請求的一個消息,也不是確認接受請求的一個消息,所以SYN這個位置是不會被置位的。
ack(確認號)=k+1
收到序號為k的這個包,并且進行一個確認,期待下一個包的序號是k+1,到此為止就是tcp三次握手的一個完整過程。
后續才是這個基礎上的數據發送報文。
必須要建立這個三次握手的基礎上才有后續的數據發送報文。
四、總結
服務器和客戶端在握手中的狀態 :首先,三次握手之前,客戶端和服務器端都是處于關閉狀態。
然后客戶端發起了第一個SYN包,想要去跟服務器建立鏈接。
發完SYN包之后就變成syn_sent狀態,就是把syn發完了的狀態。服務器在收到syn包之前變成監聽狀態。
開始聽下誰會給我發送消息。收到客戶端的syn包之后,變成syn_Revd的狀態。
回了一個syn,ack??蛻舳耸盏絪yn,ack之后變成建立鏈接的狀態,它認為我收到之后,我這個鏈接就已經建立好了。并且我給它發送了一個ack包,服務器收到ack包后也建立鏈接了。
-
控制器
+關注
關注
112文章
16339瀏覽量
177853 -
SYN
+關注
關注
0文章
9瀏覽量
8199 -
狀態機
+關注
關注
2文章
492瀏覽量
27533 -
RST
+關注
關注
0文章
31瀏覽量
7394 -
TCP通信
+關注
關注
0文章
146瀏覽量
4222
發布評論請先 登錄
相關推薦
評論