TCP協(xié)議淺析

本文將簡(jiǎn)單介紹tcp協(xié)議的基本內(nèi)容殴玛,主要包括一下四部分:

  • tcp概述
  • TCP可靠數(shù)據(jù)傳輸
  • TCP流量控制
  • TCP連接管理
    讓我們對(duì)tcp有一個(gè)簡(jiǎn)單的回顧總結(jié)

TCP概述

  • tcp是一個(gè)點(diǎn)對(duì)點(diǎn)端到端的傳輸協(xié)議,有一個(gè)發(fā)送方和接收方惑惶。
  • tcp傳輸?shù)氖强煽康陌葱虻竭_(dá)的字節(jié)流
  • tcp采用流水線機(jī)制作烟,提高傳輸?shù)男省CP通過(guò)擁塞控制和流量控制機(jī)制來(lái)控制滑動(dòng)窗口的大小
  • tcp協(xié)議分別設(shè)置了發(fā)送方緩存和接收方緩存
Paste_Image.png
  • tcp采取全雙工(full-duplex)傳輸,也就是傳輸過(guò)程中珍促,同一連接可以傳輸雙向的數(shù)據(jù)流,發(fā)送方可以傳給接收方剩愧,接收方也可以傳給發(fā)送方猪叙。
  • tcp是面向連接的協(xié)議,通信雙方在發(fā)送數(shù)據(jù)之前必須建立連接。連接狀態(tài)只在連接的兩端中維護(hù)穴翩,在沿途節(jié)點(diǎn)中并不維護(hù)狀態(tài)犬第。TCP連接包括:兩臺(tái)主機(jī)上的緩存、連接狀態(tài)變量芒帕、socket等
  • tcp實(shí)現(xiàn)了流量控制機(jī)制

TCP段結(jié)構(gòu)

Paste_Image.png

TCP: 序列號(hào)和ACK

序列號(hào):

  • 序列號(hào)指的是segment中第一個(gè)字節(jié)的編號(hào)歉嗓,而不是segment的編號(hào)
  • 建立TCP連接時(shí),雙方隨機(jī)選擇序列號(hào)

ACKs:

  • 希望接收到的下一個(gè)字節(jié)的序列號(hào)
  • 累計(jì)確認(rèn):該序列號(hào)之前的所有字節(jié)均已被正確接收到

Q: 接收方如何處理亂序到達(dá)的Segment背蟆?

  • A: TCP規(guī)范中沒(méi)有規(guī)定鉴分,由TCP的實(shí)現(xiàn)者做出決策
Paste_Image.png

上圖我們進(jìn)行一個(gè)分析,以便搞清楚tcp序列號(hào)和ack的應(yīng)用
首先带膀,hostA作為發(fā)送方給B發(fā)送數(shù)據(jù)志珍,隨機(jī)選擇一個(gè)序列號(hào)seq = 42,也就是這段segment中的第一個(gè)字節(jié)的編號(hào)垛叨,并且設(shè)置ack=79伦糯,這表示,希望接收方回傳seg=79作為確認(rèn)信號(hào)代表接收方已經(jīng)正確接受了這段數(shù)據(jù)
然后HostB成功接收到數(shù)據(jù)嗽元,想發(fā)送方返回確認(rèn)信息舔株,根據(jù)發(fā)送方的ack,所以確認(rèn)的seg=79还棱,然后通過(guò)ack告知希望接收到的下一個(gè)字節(jié)的序列號(hào)载慈,并同時(shí)表示之前的所有字節(jié)均已被正確接收,所以發(fā)送ack=43告知已經(jīng)接收到43號(hào)之前的字節(jié)珍手,并希望發(fā)送方傳送43號(hào)字節(jié)

TCP可靠數(shù)據(jù)傳輸

具體的可靠傳輸原理在上一篇博文中http://www.reibang.com/p/6a99944bb9fa
接下來(lái)我們看看tcp協(xié)議是如何實(shí)現(xiàn)可靠傳輸?shù)摹?/p>

  • TCP在IP層提供的不可靠服務(wù)基礎(chǔ)上實(shí)現(xiàn)可靠數(shù)據(jù)傳輸服務(wù)
  • 流水線機(jī)制
  • 累積確認(rèn)
  • TCP使用單一重傳定時(shí)器
  • 觸發(fā)重傳的事件:超時(shí)和收到重復(fù)ACK

RTT和超時(shí)

問(wèn)題:如何設(shè)置定時(shí)器的超時(shí)時(shí)間办铡?

  • 大于RTT, 但是RTT是變化的
  • 過(guò)短:不必要的重傳
  • 過(guò)長(zhǎng): 對(duì)段丟失時(shí)間反應(yīng)

問(wèn)題:如何估計(jì)RTT琳要?
SampleRTT: 測(cè)量從段發(fā)出去到收到ACK的時(shí)間忽略重傳
SampleRTT變化,測(cè)量多個(gè)SampleRTT寡具,求平均值,形成RTT的估計(jì)值EstimatedRTT

EstimatedRTT = (1- ?)EstimatedRTT + ?SampleRTT
指數(shù)加權(quán)移動(dòng)平均
典型值:0.125

TCP發(fā)送方事件

從應(yīng)用層收到數(shù)據(jù)后稚补,會(huì)進(jìn)行以下幾個(gè)步驟:

  • 創(chuàng)建segment
  • 序列號(hào)是segment第一個(gè)字節(jié)的編號(hào)
  • 開(kāi)啟計(jì)時(shí)器
  • 設(shè)置超時(shí)時(shí)間TimeOutInterval

如果發(fā)生超時(shí)事件:

  • 重傳引起超時(shí)的segment
  • 重啟計(jì)時(shí)器

收到ACK:

  • 如果確認(rèn)此前未確認(rèn)的Segment童叠,更新SendBase,如果窗口中還有未被確認(rèn)的分組课幕,重新啟動(dòng)定時(shí)器

發(fā)送端偽碼

NextSeqNum = InitialSeqNum
SendBase = InitialSeqNum
loop (forever) {
switch(event)
event: data received from application above
create TCP segment with sequence number NextSeqNum
if (timer currently not running)
start timer
pass segment to IP
NextSeqNum = NextSeqNum + length(data)
event: timer timeout
retransmit not-yet-acknowledged segment with
smallest sequence number
start timer
event: ACK received, with ACK field value of y
if (y > SendBase) {
SendBase = y
if (there are currently not-yet-acknowledged segments)
start timer
}
} /* end of loop forever */

TCP重傳示例

Paste_Image.png
Paste_Image.png
Paste_Image.png

快速重傳機(jī)制

TCP的實(shí)現(xiàn)中厦坛,如果發(fā)生超時(shí),超時(shí)時(shí)間間隔將重新設(shè)置乍惊,即將超時(shí)時(shí)間間隔加倍杜秸,導(dǎo)致其很大,重發(fā)丟失的分組之前要等待很長(zhǎng)時(shí)間.
通過(guò)重復(fù)ACK檢測(cè)分組丟失,Sender會(huì)背靠背地發(fā)送多個(gè)分組,如果某個(gè)分組丟失,可能會(huì)引發(fā)多個(gè)重復(fù)的ACK.
如果sender收到對(duì)同一數(shù)據(jù)的3個(gè)ACK润绎,則假定該數(shù)據(jù)之后的段已經(jīng)丟失.
快速重傳:在定時(shí)器超時(shí)之前即進(jìn)行重傳
算法

event: ACK received, with ACK field value of y
if (y > SendBase) {
SendBase = y
if (there are currently not-yet-acknowledged segments)
start timer
}
else {
increment count of dup ACKs received for y
if (count of dup ACKs received for y = 3) {
resend segment with sequence number y
}

TCP流量控制

接收方為TCP連接分配buffer

Paste_Image.png

上層應(yīng)用可能處理buffer中數(shù)據(jù)的速度較慢

流量控制:發(fā)送方不會(huì)傳輸?shù)奶嗲说⑻煲灾劣谘蜎](méi)接收方(buffer溢出)

(假定TCP receiver丟棄亂序的segments)
Buffer中的可用空間(spare room)
= RcvWindow
= RcvBuffer-[LastByteRcvd -LastByteRead]

Receiver通過(guò)在Segment的頭部字段將RcvWindow 告訴Sender诞挨。 Sender限制自己已經(jīng)發(fā)送的但還未收到ACK的數(shù)據(jù)不超過(guò)接收方的空閑RcvWindow尺寸。

Receiver告知SenderRcvWindow=0,會(huì)出現(xiàn)什么情況呢蛤?
會(huì)出現(xiàn)卡死惶傻,發(fā)送方不發(fā)數(shù)據(jù)了。關(guān)于這些問(wèn)題具體會(huì)在tcp擁塞控制里面討論其障。

TCP連接管理

TCP sender和receiver在傳輸數(shù)據(jù)前需要建立連接达罗。

三次握手機(jī)制

Step 1: client host sends TCP SYN
segment to server
? specifies initial seq #
? no data
Step 2: server host receives SYN, replies
with SYNACK segment
? server allocates buffers
? specifies server initial seq. #
Step 3: client receives SYNACK, replies
with ACK segment, which may
contain data

Paste_Image.png

四次握手機(jī)制

TCP連接管理:關(guān)閉

Step 1: client向server發(fā)送TCP FIN 控制segment
Step 2: server 收到FIN, 回復(fù)ACK. 關(guān)閉連接, 發(fā)送
FIN.
Step 3: client 收到FIN, 回復(fù)ACK.
? 進(jìn)入“等待” –如果收到FIN,會(huì)重新發(fā)送ACK
Step 4: server收到ACK. 連接關(guān)閉.

Paste_Image.png

由于TCP連接是全雙工的静秆,因此每個(gè)方向都必須單獨(dú)進(jìn)行關(guān)閉粮揉。這原則是當(dāng)一方完成它的數(shù)據(jù)發(fā)送任務(wù)后就能發(fā)送一個(gè)FIN來(lái)終止這個(gè)方向的連接。收到一個(gè) FIN只意味著這一方向上沒(méi)有數(shù)據(jù)流動(dòng)抚笔,一個(gè)TCP連接在收到一個(gè)FIN后仍能發(fā)送數(shù)據(jù)扶认。首先進(jìn)行關(guān)閉的一方將執(zhí)行主動(dòng)關(guān)閉,而另一方執(zhí)行被動(dòng)關(guān)閉殊橙。
》觥(1) TCP客戶端發(fā)送一個(gè)FIN,用來(lái)關(guān)閉客戶到服務(wù)器的數(shù)據(jù)傳送(報(bào)文段4)膨蛮。
〉啤(2) 服務(wù)器收到這個(gè)FIN,它發(fā)回一個(gè)ACK敞葛,確認(rèn)序號(hào)為收到的序號(hào)加1(報(bào)文段5)誉察。和SYN一樣,一個(gè)FIN將占用一個(gè)序號(hào)惹谐。
〕制(3) 服務(wù)器關(guān)閉客戶端的連接,發(fā)送一個(gè)FIN給客戶端(報(bào)文段6)氨肌。
『韪选(4) 客戶段發(fā)回ACK報(bào)文確認(rèn),并將確認(rèn)序號(hào)設(shè)置為收到序號(hào)加1(報(bào)文段7)怎囚。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末卿叽,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子恳守,更是在濱河造成了極大的恐慌考婴,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,383評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件井誉,死亡現(xiàn)場(chǎng)離奇詭異蕉扮,居然都是意外死亡整胃,警方通過(guò)查閱死者的電腦和手機(jī)颗圣,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門喳钟,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人在岂,你說(shuō)我怎么就攤上這事奔则。” “怎么了蔽午?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,852評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵易茬,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我及老,道長(zhǎng)抽莱,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,621評(píng)論 1 284
  • 正文 為了忘掉前任骄恶,我火速辦了婚禮食铐,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘僧鲁。我一直安慰自己虐呻,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,741評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布寞秃。 她就那樣靜靜地躺著斟叼,像睡著了一般。 火紅的嫁衣襯著肌膚如雪春寿。 梳的紋絲不亂的頭發(fā)上朗涩,一...
    開(kāi)封第一講書(shū)人閱讀 49,929評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音绑改,去河邊找鬼馋缅。 笑死,一個(gè)胖子當(dāng)著我的面吹牛绢淀,可吹牛的內(nèi)容都是我干的萤悴。 我是一名探鬼主播,決...
    沈念sama閱讀 39,076評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼皆的,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼覆履!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起费薄,我...
    開(kāi)封第一講書(shū)人閱讀 37,803評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤硝全,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后楞抡,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體伟众,經(jīng)...
    沈念sama閱讀 44,265評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,582評(píng)論 2 327
  • 正文 我和宋清朗相戀三年召廷,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了凳厢。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片账胧。...
    茶點(diǎn)故事閱讀 38,716評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖先紫,靈堂內(nèi)的尸體忽然破棺而出治泥,到底是詐尸還是另有隱情,我是刑警寧澤遮精,帶...
    沈念sama閱讀 34,395評(píng)論 4 333
  • 正文 年R本政府宣布居夹,位于F島的核電站,受9級(jí)特大地震影響本冲,放射性物質(zhì)發(fā)生泄漏准脂。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,039評(píng)論 3 316
  • 文/蒙蒙 一檬洞、第九天 我趴在偏房一處隱蔽的房頂上張望意狠。 院中可真熱鬧,春花似錦疮胖、人聲如沸环戈。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,798評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)院塞。三九已至,卻和暖如春性昭,著一層夾襖步出監(jiān)牢的瞬間拦止,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,027評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工糜颠, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留汹族,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,488評(píng)論 2 361
  • 正文 我出身青樓其兴,卻偏偏與公主長(zhǎng)得像顶瞒,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子元旬,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,612評(píng)論 2 350

推薦閱讀更多精彩內(nèi)容

  • 個(gè)人認(rèn)為榴徐,Goodboy1881先生的TCP /IP 協(xié)議詳解學(xué)習(xí)博客系列博客是一部非常精彩的學(xué)習(xí)筆記,這雖然只是...
    貳零壹柒_fc10閱讀 5,051評(píng)論 0 8
  • 1.這篇文章不是本人原創(chuàng)的匀归,只是個(gè)人為了對(duì)這部分知識(shí)做一個(gè)整理和系統(tǒng)的輸出而編輯成的坑资,在此鄭重地向本文所引用文章的...
    SOMCENT閱讀 13,053評(píng)論 6 174
  • 計(jì)算機(jī)網(wǎng)絡(luò)七層模型中,傳輸層有兩個(gè)重要的協(xié)議:(1)用戶數(shù)據(jù)報(bào)協(xié)議UDP (User Datagram Proto...
    Q南南南Q閱讀 1,709評(píng)論 0 3
  • 傳輸層-TCP穆端, TCP頭部結(jié)構(gòu) 袱贮,TCP序列號(hào)和確認(rèn)號(hào)詳解 TCP主要解決下面的三個(gè)問(wèn)題 1.數(shù)據(jù)的可靠傳輸...
    抓兔子的貓閱讀 4,512評(píng)論 1 46
  • 18.1 引言 TCP是一個(gè)面向連接的協(xié)議。無(wú)論哪一方向另一方發(fā)送數(shù)據(jù)之前体啰,都必須先在雙方之間建立一條連接攒巍。本章將...
    張芳濤閱讀 3,351評(píng)論 0 13