連 接 概 述
順著第一篇的思路下來(lái),到最后我們已經(jīng)可以依靠分層達(dá)到兩臺(tái)主機(jī)之間的自由通信,那么問(wèn)題來(lái)了,假設(shè)現(xiàn)在有主機(jī)A(客戶端)及主機(jī)B(服務(wù)端),其中主機(jī)A需要訪問(wèn)主機(jī)B的資源,需要哪幾個(gè)必要條件呢?經(jīng)過(guò)上篇文章可知至少需要四個(gè)條件:
- 主機(jī)A需要具有一個(gè)ip地址
- 主機(jī)B需要具有一個(gè)ip地址
- 主機(jī)A需要具有一個(gè)客戶端端口號(hào)
- 主機(jī)B需要具有一個(gè)服務(wù)端端口號(hào)
具備上述四個(gè)條件后A獲取B的信息是有要求的,根本上的要求是數(shù)據(jù)信道可靠,就是平時(shí)所說(shuō)的可靠連接,那么如何保證連接的可靠性呢,TCP協(xié)議就是靠確認(rèn)應(yīng)答機(jī)制、超時(shí)重傳機(jī)制等保證連接可靠性的,接下來(lái)就通過(guò)TCP協(xié)議的三次握手及四次(三次)揮手來(lái)分析一下A與B建立連接、關(guān)閉連接的技術(shù)細(xì)節(jié)是如何落地實(shí)現(xiàn)的。
三 次 握 手
第一次: 首先客戶端A會(huì)向服務(wù)端B發(fā)送一個(gè)數(shù)據(jù)同步請(qǐng)求,可以稱為建立連接請(qǐng)求syn,同時(shí)客戶端A 的cpu內(nèi)核會(huì)為這個(gè)syn請(qǐng)求生成一個(gè)隨機(jī)的序列號(hào)seq發(fā)送給服務(wù)端。此處整體稱為第一次握手,注意此處為隨機(jī)序列號(hào)。
第二次: 服務(wù)端B接到客戶端A發(fā)送的syn請(qǐng)求后,會(huì)回復(fù)一個(gè)[syn+ack]的響應(yīng),其中syn仍表達(dá)數(shù)據(jù)同步的意思,這個(gè)應(yīng)答seq值由服務(wù)端B的cpu隨機(jī)生成,ack的值為第一次握手seq的值+1,ack表示兩層含義:
- 服務(wù)端B已經(jīng)收到了客戶端A發(fā)過(guò)來(lái)的數(shù)據(jù)同步請(qǐng)求
- 希望客戶端接下來(lái)的應(yīng)答消息的seq的值以ack回復(fù)的值開始傳輸。
這個(gè)稱為第二次握手。
第三次: 客戶端A接收到服務(wù)端B的[syn+ack]應(yīng)答消息會(huì)給B回復(fù)一個(gè)ack應(yīng)答,ack消息中seq值為第二次握手ack的值,而ack則為第二次握手的請(qǐng)求的seq值+1。
三次握手通信釋義圖如上所示,接下來(lái)我們來(lái)通過(guò)抓包的形式來(lái)看一下實(shí)際報(bào)文,印證三次握手的報(bào)文通信。
筆者通過(guò)wireshark(抓包工具)抓取數(shù)據(jù)包,采用打開一個(gè)瀏覽器網(wǎng)頁(yè)的場(chǎng)景模擬對(duì)服務(wù)器B的請(qǐng)求。
第一次握手抓包圖如下:
第二次握手抓包釋義圖如下:
第三次握手抓包釋義圖如下:
通過(guò)三次握手的抓包可以很清晰的展示三次交互流程,可能有人會(huì)有連帶的疑問(wèn),為什么一定是三次,而不是別的次數(shù),這里三次其實(shí)是最優(yōu)的次數(shù),而不是一定的次數(shù),比如如果兩次的話A、B兩方將會(huì)有一方無(wú)法做出信息是否送達(dá)的確認(rèn),而超過(guò)三次則造成了浪費(fèi),因?yàn)槿谓换ブ蠥、B都已經(jīng)對(duì)兩方應(yīng)答一次了。接下來(lái)來(lái)看一下四次揮手的交互流程。
四 次 揮 手
理解三次握手及流程后,四次揮手其實(shí)本質(zhì)和三次握手的確認(rèn)流程基本上是一樣的,下面我們簡(jiǎn)單梳理一下?lián)]手標(biāo)準(zhǔn)流程。
第一次: 當(dāng)A確認(rèn)當(dāng)前連接數(shù)據(jù)已經(jīng)全部發(fā)送完成以后,會(huì)發(fā)起關(guān)閉連接請(qǐng)求,此時(shí)A不再發(fā)送業(yè)務(wù)報(bào)文,發(fā)送的請(qǐng)求標(biāo)志為FIN ,seq為x,此處整體為第一次揮手。
第二次: B收到A發(fā)出的關(guān)閉連接的請(qǐng)求之后,會(huì)給A一個(gè)確認(rèn)響應(yīng),告訴A我收到你關(guān)閉連接的請(qǐng)求了,但是我有可能還有沒(méi)發(fā)完的數(shù)據(jù)需要繼續(xù)給你發(fā)送,響應(yīng)的標(biāo)志為ack,seq為Y,ack為x+1,此處整體為第二次揮手。
第三次: 當(dāng)B把數(shù)據(jù)傳輸完之后會(huì)發(fā)送釋放連接響應(yīng),此處標(biāo)志B釋放連接,不會(huì)再發(fā)送業(yè)務(wù)報(bào)文,此時(shí)請(qǐng)求的標(biāo)志為FIN+ack,seq的值為y,ack的值為x+1,此處整體為第三次揮手。
第四次: A對(duì)B第三次揮手做最后確認(rèn),并釋放連接,此時(shí)請(qǐng)求標(biāo)志為ack,seq為x+1,ack為y+1。
四次揮手通信釋義圖如上所示,由于三次握手的每一次都通過(guò)抓包工具詳細(xì)描述了通信詳情,此處揮手抓一個(gè)整體包截圖,由讀者自行解析分析即可。
四次揮手抓包整體釋義圖如下:
可以看到,這里面的揮手包數(shù)與咱們分析的標(biāo)準(zhǔn)流程不一樣,這里是因?yàn)榈诙魏偷谌螕]手都是B向A發(fā)起確認(rèn)響應(yīng),區(qū)別是第二次只是確認(rèn),因?yàn)榭赡苓€有數(shù)據(jù)沒(méi)有傳完,要繼續(xù)傳,全部數(shù)據(jù)傳完后B才能發(fā)出最后指令進(jìn)行釋放連接,但這時(shí)如果發(fā)第二次揮手的時(shí)候就可以確認(rèn)沒(méi)有數(shù)據(jù)需要再同步給A了,這時(shí)如果按照標(biāo)準(zhǔn)流程,B會(huì)給A發(fā)送兩個(gè)相同的數(shù)據(jù)包,這樣就造成了資源浪費(fèi),故這塊揮手做了優(yōu)化,可以確認(rèn)數(shù)據(jù)的情況下,可以把第二次和第三次揮手合并成一次,所以此處是三次握手。
-
TCP協(xié)議
+關(guān)注
關(guān)注
1文章
91瀏覽量
12070 -
服務(wù)端
+關(guān)注
關(guān)注
0文章
66瀏覽量
7010
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論