TCP 流量控制與擁塞控制

TCP的特點(diǎn)

TCP(Transmission Control Protocol 傳輸控制協(xié)議)是一種面向連接的瓶珊、可靠的、基于字節(jié)流的。為了通過(guò)IP數(shù)據(jù)報(bào)實(shí)現(xiàn)可靠性傳輸蔑歌,需要考慮很多事情,側(cè)如數(shù)據(jù)的破壞揽碘、丟包次屠、重復(fù)以及分片順序混亂等問(wèn)題园匹。如不能解決這些問(wèn)題,也就無(wú)從談起可靠傳輸劫灶。TCP通過(guò)校驗(yàn)和裸违、序列號(hào)、確認(rèn)應(yīng)答本昏、重發(fā)控制供汛、連接管理、以及窗口控制等機(jī)制來(lái)實(shí)現(xiàn)可靠性傳輸凛俱。TCP建立連接的實(shí)質(zhì)是紊馏,主機(jī)A和主機(jī)B告知彼此的第一個(gè)發(fā)送字節(jié)的初始序列號(hào),建立連接后對(duì)每一個(gè)發(fā)送的字節(jié)都需要以初始序列號(hào)為基點(diǎn)進(jìn)行編號(hào)蒲犬,需要對(duì)方來(lái)確認(rèn)每一個(gè)字節(jié)編號(hào)都已經(jīng)成功接收朱监,雙方初始序列號(hào)是由操作系統(tǒng)動(dòng)態(tài)生成的隨機(jī)的值,一般每個(gè)TCP 會(huì)話都會(huì)有不一樣的初始序列號(hào)原叮,占四個(gè)字節(jié)赫编。

TCP.png

ACK

TCP通過(guò)肯定的確認(rèn)應(yīng)答(ACK) 實(shí)現(xiàn)可靠的數(shù)據(jù)傳輸。當(dāng)發(fā)送端將數(shù)據(jù)發(fā)出之后會(huì)等待對(duì)端的確認(rèn)應(yīng)答奋隶。如果有確認(rèn)應(yīng)答擂送,說(shuō)明數(shù)據(jù)已經(jīng)成功到達(dá)對(duì)端。反之唯欣,則數(shù)據(jù)丟失的可能性很大嘹吨。在一定時(shí)間內(nèi)沒有等到確認(rèn)應(yīng)答,發(fā)送端就可以認(rèn)為數(shù)據(jù)已經(jīng)丟失境氢,并進(jìn)行重發(fā)由此蟀拷,即使產(chǎn)生了丟包,仍然能夠保證數(shù)據(jù)能夠到達(dá)對(duì)端萍聊,實(shí)現(xiàn)可靠傳輸问芬。如果數(shù)據(jù)被重發(fā)之后若還是收不到確認(rèn)應(yīng)答,則進(jìn)行再次發(fā)送寿桨。此時(shí)確認(rèn)應(yīng)答的時(shí)間將會(huì)以2倍此衅、4信的指數(shù)函數(shù)延長(zhǎng)。達(dá)到一定次數(shù)后亭螟,如果任沒有任何確認(rèn)應(yīng)答返回挡鞍,就會(huì)判斷為網(wǎng)絡(luò)發(fā)生異常,強(qiáng)制關(guān)閉連接预烙,并且通知應(yīng)用通信異常強(qiáng)行終止匕累。

流控制

發(fā)送端根據(jù)自己的實(shí)際情況發(fā)送數(shù)據(jù)。但是默伍,接收端可能收到的是一個(gè)毫無(wú)
關(guān)系的數(shù)據(jù)包又可能會(huì)在處理其他問(wèn)題上花費(fèi)一些時(shí)間欢嘿。因此在為這個(gè)數(shù)據(jù)包做其他處理時(shí)會(huì)耗費(fèi)一些時(shí)間衰琐,甚至在高負(fù)荷的情況下無(wú)法接收任何數(shù)據(jù)。如此一來(lái)炼蹦,如果接收端將本應(yīng)該接收的數(shù)據(jù)丟棄的話羡宙,就又會(huì)觸發(fā)重發(fā)機(jī)制,從而導(dǎo)致網(wǎng)絡(luò)流量的無(wú)端浪費(fèi)掐隐。為了防止這種現(xiàn)象的發(fā)生狗热,TCP 提供一種機(jī)制可以讓發(fā)送端根據(jù)接收端的實(shí)際接收能力控制發(fā)送的數(shù)據(jù)量。這就是所謂的流控制虑省。它的具體操作是匿刮,接收端主機(jī)向發(fā)送端主機(jī)通知自己可以接收數(shù)據(jù)的大小,于是發(fā)送端會(huì)發(fā)送不超過(guò)這個(gè)限度的數(shù)據(jù)探颈。該大小限度就被稱作窗口大小熟丸。在前面6.4.6 節(jié)中所介紹的窗口大
小的值就是由接收端主機(jī)決定的。TCP 首部中伪节,專門有一個(gè)字段用來(lái)通知窗口大小光羞。接收主機(jī)將自己可以接收的緩沖區(qū)大小放人這個(gè)字段中通知給發(fā)送端。這個(gè)字段的值越大怀大,說(shuō)明網(wǎng)絡(luò)的吞吐量越高纱兑。不過(guò),接收端的這個(gè)緩沖區(qū)一旦面臨數(shù)據(jù)溢出時(shí)化借,窗口大小的值也會(huì)隨之被設(shè)置為一個(gè)更小的值通知給發(fā)送端潜慎,從而控制數(shù)據(jù)發(fā)送量。也就是說(shuō)蓖康,發(fā)送端主機(jī)會(huì)根據(jù)接收端主機(jī)的指示勘纯,對(duì)發(fā)送數(shù)據(jù)的量進(jìn)行控制。這也就形成了一個(gè)完整的TCP 流控制(流量控制)钓瞭。

擁塞控制

因?yàn)?TCP 的窗口控制,收發(fā)主機(jī)之間即使不再以一個(gè)數(shù)據(jù)段為單位發(fā)送確認(rèn)應(yīng)答淫奔,也能夠連續(xù)發(fā)送大量數(shù)據(jù)包山涡。然而,如果在通信剛開始時(shí)就發(fā)送大量數(shù)據(jù)唆迁,也可能會(huì)引發(fā)其他問(wèn)題鸭丛。一般來(lái)說(shuō),計(jì)算機(jī)網(wǎng)絡(luò)都處在一個(gè)共享的環(huán)境唐责。因此也有可能會(huì)因?yàn)槠渌鳈C(jī)之間的通信使得網(wǎng)絡(luò)擁堵鳞溉。在網(wǎng)絡(luò)出現(xiàn)擁堵時(shí),如果突然發(fā)送一個(gè)較大量的數(shù)據(jù)鼠哥,極有可能會(huì)導(dǎo)致整個(gè)網(wǎng)絡(luò)的癱瘓熟菲。TCP 為了防止該問(wèn)題的出現(xiàn)看政,在通信一開始時(shí)就會(huì)通過(guò)一個(gè)叫做慢啟動(dòng)的算法得出的數(shù)值,對(duì)發(fā)送數(shù)據(jù)量進(jìn)行控制抄罕。首先允蚣,為了在發(fā)送端調(diào)節(jié)所要發(fā)送數(shù)據(jù)的量,定義了一個(gè)叫做“擁塞窗口”的概念呆贿。于是在慢啟動(dòng)的時(shí)候嚷兔,將這個(gè)擁塞窗口的大小設(shè)置為1個(gè)數(shù)據(jù)段發(fā)送數(shù)據(jù),之后每收到一次確認(rèn)應(yīng)答(ACK)做入,擁塞窗口的值就加1MSS冒晰。在發(fā)送數(shù)據(jù)包時(shí),將擁塞窗D的大小與接收端主機(jī)通知的窗口大小做比較,然后按照它們當(dāng)中較小那個(gè)值,發(fā)送比其還要小的數(shù)據(jù)量饿敲。如果重發(fā)采用超時(shí)機(jī)制铝耻,那么擁塞窗口的初始值可以設(shè)置為1以后再進(jìn)行慢啟動(dòng)修正。有了上述這些機(jī)制盏缤,就可以有效地減少通信開始時(shí)連續(xù)發(fā)包導(dǎo)致的網(wǎng)絡(luò)擁堵,還可以避免網(wǎng)絡(luò)擁塞情況的發(fā)生。

慢啟動(dòng)

慢啟動(dòng)算法的基本思想是當(dāng)TCP開始在一個(gè)網(wǎng)絡(luò)中傳輸數(shù)據(jù)或發(fā)現(xiàn)數(shù)據(jù)丟失并開始重發(fā)時(shí)恕出,首先慢慢的對(duì)網(wǎng)路實(shí)際容量進(jìn)行試探,避免由于發(fā)送了過(guò)量的數(shù)據(jù)而導(dǎo)致阻塞违帆。主機(jī)發(fā)送了一個(gè)報(bào)文后就要停下來(lái)等待應(yīng)答浙巫,每收到一個(gè)應(yīng)答,擁塞窗口就增加一段長(zhǎng)度刷后,直至等于設(shè)定的閾值的畴。比如我們可以先讓發(fā)送方發(fā)一個(gè)包,等這個(gè)包被 ack 之后尝胆,我們?cè)侔l(fā) 2 個(gè)包丧裁,這 2 個(gè)被 ack 之后再發(fā) 4 個(gè)包,以此類推含衔,讓一次所發(fā)的包數(shù)量慢慢增加煎娇,這就是慢啟動(dòng)。

Window

談 TCP 離不開 窗口的概念贪染,有 congestion window缓呛,receive window,sliding window 等等杭隙。window 是以 tcp segment 數(shù)量為單位哟绊,我們可以說(shuō)當(dāng)前 window 值由幾個(gè) tcp 包構(gòu)成,而當(dāng)我們說(shuō) window size 的時(shí)候痰憎,又是在說(shuō)一個(gè) window 所包含的字節(jié)數(shù)票髓。window size 除了和 tcp segment 的數(shù)量有關(guān)之外攀涵,還和單個(gè) tcp segment 的最大 size 有關(guān),即 MSS 值炬称。發(fā)送方的 Window 大小稱之為 CWND(congestion window)汁果,接收方的 Window 大小稱之為 RWND(receiver window,或 advertised window)玲躯。CWND 表示當(dāng)前發(fā)送方可以發(fā)送多少個(gè) TCP 包据德,而 RWND 表示當(dāng)前接收方還能接收多少個(gè) TCP 包。值得注意的是跷车,CWND 是一個(gè)發(fā)送方本地的值棘利,并不會(huì)在網(wǎng)絡(luò)上傳輸。而 RWND 則是由接收方告知發(fā)送方的朽缴,是存在于 TCP 包的協(xié)議中善玫,會(huì)通過(guò)網(wǎng)絡(luò)傳輸。比如密强,A主機(jī)發(fā)送給B window 大小為8192茅郎,意思是:B主機(jī)最多可以連續(xù)發(fā)送8192 字節(jié)給A主機(jī)(一般來(lái)說(shuō),8192字節(jié)就是A主機(jī)的接收緩沖區(qū)大谢虿场)系冗,如果B主機(jī)不小心發(fā)送超過(guò)8192字節(jié),如果application 沒有及時(shí)取走薪鹦,則超過(guò) 8192 自己數(shù)據(jù)可能會(huì)因?yàn)锳主機(jī)的接收緩沖區(qū)滿而被丟棄掌敬,所以B主機(jī)會(huì)嚴(yán)格遵守A的 RWND 的大小,如果A主機(jī)通告它的window大小為 0池磁,則B主機(jī)一定不會(huì)發(fā)送數(shù)據(jù)奔害。TCP首部中 Window Size 占兩個(gè)byte,最大值為65535地熄。

TCP首部.jpg

MTU

MTU: Maximum Transmit Unit华临,最大傳輸單元,即物理接口(數(shù)據(jù)鏈路層)提供給其上層(通常是IP層)最大一次傳輸數(shù)據(jù)的大卸丝肌雅潭;以普遍使用的以太網(wǎng)接口為例,缺省MTU=1500 Byte跛梗,這是以太網(wǎng)接口對(duì)IP層的約束,如果IP層有<=1500 byte 需要發(fā)送棋弥,只需要一個(gè)IP包就可以完成發(fā)送任務(wù)核偿;如果IP層有> 1500 byte 數(shù)據(jù)需要發(fā)送,需要分片才能完成發(fā)送顽染,這些分片有一個(gè)共同點(diǎn)漾岳,即IP Header ID相同轰绵。

MSS

MSS:Maximum Segment Size ,TCP提交給IP層最大分段大小尼荆,不包含TCP Header和 TCP Option左腔,只包含TCP Payload ,MSS是TCP用來(lái)限制application層最大的發(fā)送字節(jié)數(shù)捅儒。如果底層物理接口MTU= 1500 byte液样,則 MSS = 1500- 20(IP Header) -20 (TCP Header) = 1460 byte,如果application 有2000 byte發(fā)送巧还,需要兩個(gè)segment才可以完成發(fā)送鞭莽,第一個(gè)TCP segment = 1460,第二個(gè)TCP segment = 540麸祷。

Persist Timer

Persist Timer: 用于周期探測(cè)對(duì)方receiver window size 是否依然為0的定時(shí)器澎怒。比如,A主機(jī)通告它的window大小為 0阶牍,則B一定不會(huì)發(fā)送數(shù)據(jù)喷面。B主機(jī)也不會(huì)一直等下去,如果一直等下去則會(huì)發(fā)生死鎖走孽。為了防止這種情況的死鎖發(fā)生惧辈,發(fā)送者使用了一個(gè)持續(xù)計(jì)時(shí)器(persiet timer)來(lái)周期性的詢問(wèn)接收者是否已增加了窗口。從發(fā)送者發(fā)出的這些段稱為窗口探測(cè)(window probes)融求。

tcpdump

在iOS設(shè)備上抓包比較方便咬像,除了常用的,如:Charles生宛、Paw 等軟件外县昂,我們還可以使用tcpdump。以下是抓包的步驟:

  • 1陷舅、先將iPhone用數(shù)據(jù)線連到你的Mac設(shè)備倒彰;

  • 2、通過(guò)各類助手或者iTunes獲取iPhone的UDID莱睁;

  • 3待讳、通過(guò)Mac上的rvictl程序,創(chuàng)建一個(gè)虛擬網(wǎng)卡仰剿,然后通過(guò)這個(gè)虛擬網(wǎng)卡監(jiān)聽設(shè)備上所有的網(wǎng)絡(luò)流量创淡。終端命令 rvictl -s udid

  • 啟動(dòng)tcpdump。終端命令:sudo tcpdump -i rvi0 -AAl ( rvi0 為創(chuàng)建的虛擬網(wǎng)卡)南吮。



(待續(xù))

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末琳彩,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌露乏,老刑警劉巖碧浊,帶你破解...
    沈念sama閱讀 218,941評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異瘟仿,居然都是意外死亡箱锐,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門劳较,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)驹止,“玉大人,你說(shuō)我怎么就攤上這事兴想〈鄙冢” “怎么了?”我有些...
    開封第一講書人閱讀 165,345評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵嫂便,是天一觀的道長(zhǎng)捞镰。 經(jīng)常有香客問(wèn)我,道長(zhǎng)毙替,這世上最難降的妖魔是什么岸售? 我笑而不...
    開封第一講書人閱讀 58,851評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮厂画,結(jié)果婚禮上凸丸,老公的妹妹穿的比我還像新娘。我一直安慰自己袱院,他們只是感情好屎慢,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著忽洛,像睡著了一般腻惠。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上欲虚,一...
    開封第一講書人閱讀 51,688評(píng)論 1 305
  • 那天集灌,我揣著相機(jī)與錄音,去河邊找鬼复哆。 笑死欣喧,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的梯找。 我是一名探鬼主播唆阿,決...
    沈念sama閱讀 40,414評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼锈锤!你這毒婦竟也來(lái)了驯鳖?” 一聲冷哼從身側(cè)響起饰躲,我...
    開封第一講書人閱讀 39,319評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎臼隔,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體妄壶,經(jīng)...
    沈念sama閱讀 45,775評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡摔握,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了丁寄。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片氨淌。...
    茶點(diǎn)故事閱讀 40,096評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖伊磺,靈堂內(nèi)的尸體忽然破棺而出盛正,到底是詐尸還是另有隱情,我是刑警寧澤屑埋,帶...
    沈念sama閱讀 35,789評(píng)論 5 346
  • 正文 年R本政府宣布豪筝,位于F島的核電站,受9級(jí)特大地震影響摘能,放射性物質(zhì)發(fā)生泄漏续崖。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評(píng)論 3 331
  • 文/蒙蒙 一团搞、第九天 我趴在偏房一處隱蔽的房頂上張望严望。 院中可真熱鬧,春花似錦逻恐、人聲如沸像吻。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)拨匆。三九已至,卻和暖如春昏名,著一層夾襖步出監(jiān)牢的瞬間涮雷,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工轻局, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留洪鸭,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,308評(píng)論 3 372
  • 正文 我出身青樓仑扑,卻偏偏與公主長(zhǎng)得像览爵,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子镇饮,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評(píng)論 2 355

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

  • 個(gè)人認(rèn)為蜓竹,Goodboy1881先生的TCP /IP 協(xié)議詳解學(xué)習(xí)博客系列博客是一部非常精彩的學(xué)習(xí)筆記,這雖然只是...
    貳零壹柒_fc10閱讀 5,054評(píng)論 0 8
  • 1.這篇文章不是本人原創(chuàng)的,只是個(gè)人為了對(duì)這部分知識(shí)做一個(gè)整理和系統(tǒng)的輸出而編輯成的俱济,在此鄭重地向本文所引用文章的...
    SOMCENT閱讀 13,069評(píng)論 6 174
  • 六嘶是、TCP可靠傳輸?shù)膶?shí)現(xiàn) 首先介紹以字節(jié)為單位的滑動(dòng)窗口。為了講述可靠傳輸原理的方便蛛碌,假定數(shù)據(jù)傳輸只在一個(gè)方向進(jìn)行...
    dmmy大印閱讀 1,699評(píng)論 0 1
  • TCP/IP協(xié)議 作者:xinyuans 本文為參考TCP/IP詳解卷一聂喇,某些知識(shí)點(diǎn)加上了作者自己的理解,如有錯(cuò)誤...
    xinyuans閱讀 811評(píng)論 0 1
  • 21.1 引言 TCP提供可靠的運(yùn)輸層蔚携。它使用的方法之一就是確認(rèn)從另一端收到的數(shù)據(jù)希太。但數(shù)據(jù)和確認(rèn)都有可能會(huì)丟失。T...
    張芳濤閱讀 3,005評(píng)論 0 8