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