TCP協(xié)議深入
TCP通過檢驗(yàn)和、序列號、確認(rèn)應(yīng)答、重發(fā)控制、連接管理以及窗口控制等機(jī)制實(shí)現(xiàn)可靠性傳輸
1. 序列號+確認(rèn)應(yīng)答
在TCP中,當(dāng)發(fā)送端的數(shù)據(jù)到達(dá)接收主機(jī)時,接收端主機(jī)會返回一個已收到消息的通知,這個消息叫做確認(rèn)應(yīng)答(ACK); 序列號是按照順序給發(fā)送數(shù)據(jù)的每一個字節(jié)都標(biāo)上號碼的編號。 接收端查詢接收數(shù)據(jù)TCP首部中的序列號和數(shù)據(jù)的長度,將自已下一步應(yīng)該接收的序號作為確認(rèn)應(yīng)答返送回去
2. 重發(fā)超時
重發(fā)超時是指在重發(fā)數(shù)據(jù)之前,等待確認(rèn)應(yīng)答到來的那個特定時間間隔,如果超過了這個時間仍未收到確認(rèn)應(yīng)答,發(fā)送端將進(jìn)行數(shù)據(jù)重發(fā)。 理想的重發(fā)超時具體時長是找到一個最小時間,它能保證確認(rèn)應(yīng)答一定能在這個時間內(nèi)返回
數(shù)據(jù)也不會無限、反復(fù)地重發(fā)。 達(dá)到一定重發(fā)次數(shù)后,若仍沒有任何確認(rèn)應(yīng)答返回,就會判斷為網(wǎng)絡(luò)或?qū)Χ酥鳈C(jī)發(fā)生了異常,強(qiáng)制關(guān)閉連接,并通知應(yīng)用通訊異常強(qiáng)行終止
3. 連接管理
為了準(zhǔn)確無誤地將數(shù)據(jù)送達(dá)目標(biāo)處,TCP協(xié)議采用了 三次握手 (three-way handshaking)策略。 用TCP協(xié)議將數(shù)據(jù)包送出去后,TCP一定會向?qū)Ψ酱_認(rèn)是否成功送達(dá)。 若在握手過程中某個階段莫名中斷,TCP協(xié)議會再次以相同的順序發(fā)送相同的順序包。 而 四次揮手 (Four-Way Wavehand)即終止TCP連接,就是指斷開一個TCP連接時,需要客戶端和服務(wù)端總共發(fā)送4個包以確認(rèn)連接的斷開
三次握手,即建立連接
第一次握手:客戶端發(fā)送一個帶SYN標(biāo)志的TCP報文到服務(wù)器。 這是三次握手過程中的段1
第二次握手:服務(wù)器端回應(yīng)客戶端,是三次握手中的第2個報文段,同時帶ACK標(biāo)志和SYN標(biāo)志。 它表示對剛才客戶端SYN的回應(yīng); 同時又發(fā)送SYN給客戶端,詢問客戶端是否準(zhǔn)備好進(jìn)行數(shù)據(jù)通訊
第三次握手:客戶必須再次回應(yīng)服務(wù)器端一個ACK報文,這是報文段3
數(shù)據(jù)傳輸
客戶端發(fā)出段4,包含從序號1001開始的20個字節(jié)數(shù)據(jù)。
服務(wù)器發(fā)出段5,確認(rèn)序號為1021,對序號為1001-1020的數(shù)據(jù)表示確認(rèn)收到,同時請求發(fā)送序號1021開始的數(shù)據(jù),服務(wù)器在應(yīng)答的同時也向客戶端發(fā)送從序號8001開始的10個字節(jié)數(shù)據(jù),這稱為piggyback。
客戶端發(fā)出段6,對服務(wù)器發(fā)來的序號為8001-8010的數(shù)據(jù)表示確認(rèn)收到,請求發(fā)送序號8011開始的數(shù)據(jù)
四次揮手,即關(guān)閉連接
第一次揮手:客戶端發(fā)出段7,F(xiàn)IN位表示關(guān)閉連接的請求
第二次揮手:服務(wù)器發(fā)出段8,應(yīng)答客戶端的關(guān)閉連接請求
第三次揮手:服務(wù)器發(fā)出段9,其中也包含F(xiàn)IN位,向客戶端發(fā)送關(guān)閉連接請求
第四次揮手:客戶端發(fā)出段10,應(yīng)答服務(wù)器的關(guān)閉連接請求
下圖是一次完整的三次握手、數(shù)據(jù)傳輸以及四次揮手的wireshark抓包測試
4. 流控制
在建立TCP連接時,可以確定發(fā)送數(shù)據(jù)包的單位,即最大消息長度(MSS:Maximum Segment Size)。 MSS是在三次握手的時候,在兩端主機(jī)之間被計算得出的。 兩端的主機(jī)在發(fā)出建立連接的請求時,會在TCP首部中寫入MSS選項,告訴對方自已的接口能夠適應(yīng)的MSS大小,然后會在兩者之間選擇一個較小的值投入使用
TCP以一個段為單位,若每發(fā)一個段進(jìn)行一次確認(rèn)應(yīng)答的處理,會導(dǎo)致往返時間較長通信性能較低。 為了解決該問題,引入了窗口這個概念,使得確認(rèn)應(yīng)答不再是以每個分段,而是以更大的單位進(jìn)行確認(rèn)
窗口大小就是指無需等待確認(rèn)應(yīng)答而可以繼續(xù)發(fā)送數(shù)據(jù)的最大值。 這個機(jī)制實(shí)現(xiàn)了使用大量的緩沖區(qū),通過對多個段同時進(jìn)行確認(rèn)應(yīng)答的功能。 在收到確認(rèn)應(yīng)答的情況下,將窗口滑動到確認(rèn)應(yīng)答中的序列號的位置,就可以順序地將多個段同時發(fā)送以提高通信性能。 這種機(jī)制也被稱為滑動窗口控制
上圖就是一個滑動窗口控制實(shí)例,其詳細(xì)流程見如下分析:
發(fā)送端發(fā)起連接,聲明最大段尺寸是1460,初始序號是0,窗口大小是4K,表示“我的接收緩沖區(qū)還有4K字節(jié)空閑,你發(fā)的數(shù)據(jù)不要超過4K”。 接收端應(yīng)答連接請求,聲明最大段尺寸是1024,初始序號是8000,窗口大小是6K。 發(fā)送端應(yīng)答,三方握手結(jié)束。
發(fā)送端發(fā)出段4-9,每個段帶1K的數(shù)據(jù),發(fā)送端根據(jù)窗口大小知道接收端的緩沖區(qū)滿了,因此停止發(fā)送數(shù)據(jù)。
接收端的應(yīng)用程序提走2K數(shù)據(jù),接收緩沖區(qū)又有了2K空閑,接收端發(fā)出段10,在應(yīng)答已收到6K數(shù)據(jù)的同時聲明窗口大小為2K。
接收端的應(yīng)用程序又提走2K數(shù)據(jù),接收緩沖區(qū)有4K空閑,接收端發(fā)出段11,重新聲明窗口大小為4K。
發(fā)送端發(fā)出段12-13,每個段帶2K數(shù)據(jù),段13同時還包含F(xiàn)IN位。
接收端應(yīng)答接收到的2K數(shù)據(jù)(6145-8192),再加上FIN位占一個序號8193,因此應(yīng)答序號是8194,連接處于半關(guān)閉狀態(tài),接收端同時聲明窗口大小為2K。
接收端的應(yīng)用程序提走2K數(shù)據(jù),接收端重新聲明窗口大小為4K。
接收端的應(yīng)用程序提走剩下的2K數(shù)據(jù),接收緩沖區(qū)全空,接收端重新聲明窗口大小為6K。
接收端的應(yīng)用程序在提走全部數(shù)據(jù)后,決定關(guān)閉連接,發(fā)出段17包含F(xiàn)IN位,發(fā)送端應(yīng)答,連接完全關(guān)閉。
下圖是一次完整的滑動窗口控制實(shí)例的wireshark抓包分析:
開啟以socket客戶端,發(fā)送2593個字節(jié)的數(shù)據(jù)到開發(fā)板
使用wireshark抓包工具,抓取完整的收發(fā)過程
-
數(shù)據(jù)傳輸
+關(guān)注
關(guān)注
9文章
2018瀏覽量
66058 -
服務(wù)器
+關(guān)注
關(guān)注
13文章
9792瀏覽量
87931 -
主機(jī)
+關(guān)注
關(guān)注
0文章
1038瀏覽量
35980 -
TCP
+關(guān)注
關(guān)注
8文章
1402瀏覽量
81017 -
TCP協(xié)議
+關(guān)注
關(guān)注
1文章
101瀏覽量
12455
發(fā)布評論請先 登錄
TCP/IP協(xié)議包括哪些協(xié)議 一文詳解TCP/IP協(xié)議

《TCP-IP詳解_卷3_TCP事務(wù)協(xié)議,HTTP,NNTP
TCP/IP詳解,卷3:tcp事務(wù)協(xié)議等(pdf電子書)
tcp ip協(xié)議詳解卷三 下載

tcp ip協(xié)議_什么是tcp ip協(xié)議

TCP-IP詳解卷3:TCP事務(wù)協(xié)議,HTTP,NNTP和UNI
TCP-IP詳解卷2_ARP:地址解析協(xié)議
一文詳解TCP傳輸控制協(xié)議

TCP協(xié)議與UDP協(xié)議的區(qū)別和相同點(diǎn)有哪些 一文看懂TCP協(xié)議與UDP協(xié)議的優(yōu)缺點(diǎn)

Siemens PLC TCP協(xié)議詳解

LwIP協(xié)議棧源碼詳解—TCP/IP協(xié)議的實(shí)現(xiàn)
一文了解TCP/IP協(xié)議

評論