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