iOS 網(wǎng)絡(luò)(一)-TCP、UDP

一款侵、網(wǎng)絡(luò)模型

1.七層模型

網(wǎng)絡(luò)七層由下往上分別為物理層娇哆、數(shù)據(jù)鏈路層湃累、網(wǎng)絡(luò)層勃救、傳輸層、會(huì)話層治力、表示層和應(yīng)用層蒙秒。


2.五層模型

二、TCP

傳輸控制協(xié)議(TCP宵统,Transmission Control Protocol)是一種面向連接的晕讲、可靠的、基于字節(jié)流的傳輸層通信協(xié)議马澈。

1.TCP建立連接

三次握手:為了對(duì)每次發(fā)送的數(shù)據(jù)量進(jìn)行跟蹤與協(xié)商瓢省,確保數(shù)據(jù)段的發(fā)送和接收同步,根據(jù)所接收到的數(shù)據(jù)量而確認(rèn)數(shù)據(jù)發(fā)送痊班、接收完畢后何時(shí)撤消聯(lián)系勤婚,并建立虛連接。

第一次握手:客戶端發(fā)送建立TCP連接的請(qǐng)求報(bào)文涤伐,其中報(bào)文中包含seq序列號(hào)馒胆,是由發(fā)送端隨機(jī)生成的,并且將報(bào)文中的SYN字段置為1凝果,表示需要建立TCP連接祝迂。(SYN=1,seq=x器净,x為隨機(jī)生成數(shù)值)型雳;
第二次握手:服務(wù)端回復(fù)客戶端發(fā)送的TCP連接請(qǐng)求報(bào)文,其中包含seq序列號(hào)山害,是由回復(fù)端隨機(jī)生成的纠俭,并且將SYN置為1,而且會(huì)產(chǎn)生ACK字段粗恢,ACK字段數(shù)值是在客戶端發(fā)送過來的序列號(hào)seq的基礎(chǔ)上加1進(jìn)行回復(fù)柑晒,以便客戶端收到信息時(shí)欧瘪,知曉自己的TCP建立請(qǐng)求已得到驗(yàn)證眷射。(SYN=1,ACK=x+1佛掖,seq=y妖碉,y為隨機(jī)生成數(shù)值)這里的ack加1可以理解為是確認(rèn)和誰建立連接;
第三次握手:客戶端收到服務(wù)端發(fā)送的TCP建立驗(yàn)證請(qǐng)求后芥被,會(huì)使自己的序列號(hào)加1表示欧宜,并且再次回復(fù)ACK驗(yàn)證請(qǐng)求,在服務(wù)端發(fā)過來的seq上加1進(jìn)行回復(fù)拴魄。(SYN=1冗茸,ACK=y+1席镀,seq=x+1)。


2.斷開連接

由于 TCP 連接是全雙工的夏漱,因此每個(gè)方向都必須單獨(dú)進(jìn)行關(guān)閉豪诲。這原則是當(dāng)一方完成它的數(shù)據(jù)發(fā)送任務(wù)后就能發(fā)送一個(gè)FIN來終止這個(gè)方向的連接。收到一個(gè) FIN只意味著這一方向上沒有數(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)閉葵蒂。

第一次揮手:客戶端發(fā)送斷開TCP連接請(qǐng)求的報(bào)文交播,其中報(bào)文中包含seq序列號(hào),是由發(fā)送端隨機(jī)生成的践付,并且還將報(bào)文中的FIN字段置為1秦士,表示需要斷開TCP連接。(FIN=1永高,seq=x伍宦,x由客戶端隨機(jī)生成);
第二次揮手:服務(wù)端會(huì)回復(fù)客戶端發(fā)送的TCP斷開請(qǐng)求報(bào)文乏梁,其包含seq序列號(hào)次洼,是由回復(fù)端隨機(jī)生成的,而且會(huì)產(chǎn)生ACK字段遇骑,ACK字段數(shù)值是在客戶端發(fā)過來的seq序列號(hào)基礎(chǔ)上加1進(jìn)行回復(fù)卖毁,以便客戶端收到信息時(shí),知曉自己的TCP斷開請(qǐng)求已經(jīng)得到驗(yàn)證落萎。(FIN=1亥啦,ACK=x+1,seq=y练链,y由服務(wù)端隨機(jī)生成)翔脱;
第三次揮手:服務(wù)端在回復(fù)完客戶端的TCP斷開請(qǐng)求后,不會(huì)馬上進(jìn)行TCP連接的斷開媒鼓,服務(wù)端會(huì)先確保斷開前届吁,所有傳輸?shù)紸的數(shù)據(jù)是否已經(jīng)傳輸完畢,一旦確認(rèn)傳輸數(shù)據(jù)完畢绿鸣,就會(huì)將回復(fù)報(bào)文的FIN字段置1疚沐,并且產(chǎn)生隨機(jī)seq序列號(hào)。(FIN=1潮模,ACK=x+1亮蛔,seq=z,z由服務(wù)端隨機(jī)生成)擎厢;
第四次揮手:客戶端收到服務(wù)端的TCP斷開請(qǐng)求后究流,會(huì)回復(fù)服務(wù)端的斷開請(qǐng)求辣吃,包含隨機(jī)生成的seq字段和ACK字段,ACK字段會(huì)在服務(wù)端的TCP斷開請(qǐng)求的seq基礎(chǔ)上加1芬探,從而完成服務(wù)端請(qǐng)求的驗(yàn)證回復(fù)齿尽。(FIN=1,ACK=z+1灯节,seq=h循头,h為客戶端隨機(jī)生成)
至此TCP斷開的4次揮手過程完畢。


三炎疆、UDP

UDP 是User Datagram Protocol的簡稱卡骂, 中文名是用戶數(shù)據(jù)報(bào)協(xié)議。

UDP是一個(gè)無連接協(xié)議形入,傳輸數(shù)據(jù)之前源端和終端不建立連接全跨。由于傳輸數(shù)據(jù)不建立連接,因此也就不需要維護(hù)連接狀態(tài)亿遂,包括收發(fā)狀態(tài)等浓若,因此一臺(tái)服務(wù)機(jī)可同時(shí)向多個(gè)客戶機(jī)傳輸相同的消息。

UDP協(xié)議與TCP協(xié)議一樣用于處理數(shù)據(jù)包蛇数,在OSI模型中挪钓,兩者都位于傳輸層,處于IP協(xié)議的上一層耳舅。UDP有不提供數(shù)據(jù)包分組碌上、組裝和不能對(duì)數(shù)據(jù)包進(jìn)行排序的缺點(diǎn),也就是說浦徊,當(dāng)報(bào)文發(fā)送之后馏予,是無法得知其是否安全完整到達(dá)的。

當(dāng)強(qiáng)調(diào)傳輸性能而不是傳輸?shù)耐暾詴r(shí)盔性,如:音頻和多媒體應(yīng)用霞丧,UDP是最好的選擇。在數(shù)據(jù)傳輸時(shí)間很短冕香,以至于此前的連接過程成為整個(gè)流量主體的情況下蛹尝,UDP也是一個(gè)好的選擇。

1.報(bào)文格式

UDP報(bào)頭由4個(gè)域組成暂筝,其中每個(gè)域各占用2個(gè)字節(jié)箩言,具體包括源端口號(hào)、目標(biāo)端口號(hào)焕襟、數(shù)據(jù)包長度、校驗(yàn)值饭豹。

端口

UDP協(xié)議使用端口號(hào)為不同的應(yīng)用保留其各自的數(shù)據(jù)傳輸通道鸵赖。UDP和TCP協(xié)議正是采用這一機(jī)制實(shí)現(xiàn)對(duì)同一時(shí)刻內(nèi)多項(xiàng)應(yīng)用同時(shí)發(fā)送和接收數(shù)據(jù)的支持务漩。UDP端口號(hào)指定有兩種方式:由管理機(jī)構(gòu)指定端口和動(dòng)態(tài)綁定的方式。

長度

數(shù)據(jù)報(bào)的長度是指包括報(bào)頭和數(shù)據(jù)部分在內(nèi)的總字節(jié)數(shù)它褪。因?yàn)閳?bào)頭的長度是固定的饵骨,所以該域主要被用來計(jì)算可變長度的數(shù)據(jù)部分(又稱為數(shù)據(jù)負(fù)載)。

校驗(yàn)值

UDP協(xié)議使用報(bào)頭中的校驗(yàn)值來保證數(shù)據(jù)的安全茫打。校驗(yàn)值首先在數(shù)據(jù)發(fā)送方通過特殊的算法計(jì)算得出居触,在傳遞到接收方之后,還需要再重新計(jì)算老赤。如果某個(gè)數(shù)據(jù)報(bào)在傳輸過程中被第三方篡改或者由于線路噪音等原因受到損壞轮洋,發(fā)送和接收方的校驗(yàn)計(jì)算值將不會(huì)相符,由此UDP協(xié)議可以檢測是否出錯(cuò)抬旺。這與TCP協(xié)議是不同的弊予,后者要求必須具有校驗(yàn)值。

四开财、TCP汉柒、UDP對(duì)比

信息的可靠傳遞方面不同

TCP協(xié)議中包含了專門的傳遞保證機(jī)制,當(dāng)數(shù)據(jù)接收方收到發(fā)送方傳來的信息時(shí)责鳍,會(huì)自動(dòng)向發(fā)送方發(fā)出確認(rèn)消息碾褂;發(fā)送方只有在接收到該確認(rèn)消息之后才繼續(xù)傳送其它信息,否則將一直等待直到收到確認(rèn)信息為止历葛。

UDP協(xié)議并不提供數(shù)據(jù)傳送的保證機(jī)制斋扰。如果在從發(fā)送方到接收方的傳遞過程中出現(xiàn)數(shù)據(jù)包的丟失,協(xié)議本身并不能做出任何檢測或提示啃洋。因此传货,通常人們把UDP協(xié)議稱為不可靠的傳輸協(xié)議。

  • TCP 是面向連接的傳輸控制協(xié)議宏娄,而UDP 提供了無連接的數(shù)據(jù)報(bào)服務(wù)问裕;
  • TCP 具有高可靠性,確保傳輸數(shù)據(jù)的正確性孵坚,不出現(xiàn)丟失或亂序粮宛;
  • UDP 在傳輸數(shù)據(jù)前不建立連接,不對(duì)數(shù)據(jù)報(bào)進(jìn)行檢查與修改卖宠,無須等待對(duì)方的應(yīng)答巍杈,所以會(huì)出現(xiàn)分組丟失、重復(fù)扛伍、亂序筷畦,應(yīng)用程序需要負(fù)責(zé)傳輸可靠性方面的所有工作;
  • UDP 具有較好的實(shí)時(shí)性,工作效率較 TCP 協(xié)議高鳖宾;
  • UDP 段結(jié)構(gòu)比 TCP 的段結(jié)構(gòu)簡單吼砂,因此網(wǎng)絡(luò)開銷也小鼎文;
  • TCP 協(xié)議可以保證接收端毫無差錯(cuò)地接收到發(fā)送端發(fā)出的字節(jié)流渔肩,為應(yīng)用程序提供可靠的通信服務(wù)。對(duì)可靠性要求高的通信系統(tǒng)往往使用 TCP 傳輸數(shù)據(jù)拇惋。

五周偎、TCP/IP

TCP/IP(Transmission Control Protocol/Internet Protocol,傳輸控制協(xié)議/網(wǎng)際協(xié)議)是指能夠在多個(gè)不同網(wǎng)絡(luò)間實(shí)現(xiàn)信息傳輸?shù)膮f(xié)議簇撑帖。TCP/IP協(xié)議不僅僅指的是TCP和IP兩個(gè)協(xié)議蓉坎,而是指一個(gè)由FTP、SMTP磷仰、TCP袍嬉、UDP、IP等協(xié)議構(gòu)成的協(xié)議簇灶平, 只是因?yàn)樵赥CP/IP協(xié)議中TCP協(xié)議和IP協(xié)議最具代表性伺通,所以被稱為TCP/IP協(xié)議。

六逢享、TCP 流量控制

TCP 連接的雙方主機(jī)都會(huì)為該 TCP 連接分配緩存和變量罐监。當(dāng)該 TCP 連接收到正確、按序的字節(jié)后瞒爬,就將數(shù)據(jù)放入接收緩存弓柱。上層的應(yīng)用進(jìn)程會(huì)從該緩存中讀取數(shù)據(jù),但不必是數(shù)據(jù)一到達(dá)就立即讀取侧但,因?yàn)榇藭r(shí)應(yīng)用程序可能在做其他事務(wù)矢空。而如果應(yīng)用層讀取數(shù)據(jù)相對(duì)緩慢,而發(fā)送方發(fā)送得太多禀横、太快屁药,發(fā)送的數(shù)據(jù)就會(huì)很容易地使該連接的接收緩存溢出。

所以柏锄,TCP 為應(yīng)用程序提供了流量控制服務(wù)(flow-control service)酿箭,以消除發(fā)送方使接收方緩存溢出的可能性。
流量控制是一個(gè)速度匹配服務(wù)趾娃,即發(fā)送方的發(fā)送速率與接收方應(yīng)用程序的讀取速率相匹配缭嫡。

作為全雙工協(xié)議,TCP 會(huì)話的雙方都各自維護(hù)一個(gè)發(fā)送窗口和一個(gè)接收窗口(receive window)的變量來提供流量控制抬闷。而發(fā)送窗口的大小是由對(duì)方接收窗口來決定的妇蛀,接收窗口用于給發(fā)送方一個(gè)指示--該接收方還有多少可用的緩存空間。


發(fā)送窗口

發(fā)送方的發(fā)送緩存內(nèi)的數(shù)據(jù)都可以被分為 4 類:

  1. 已發(fā)送,已收到 ACK
  2. 已發(fā)送讥耗,未收到 ACK
  3. 未發(fā)送有勾,但允許發(fā)送
  4. 未發(fā)送疹启,但不允許發(fā)送

則 2 和 3 屬于發(fā)送窗口
發(fā)送窗口只有收到發(fā)送窗口內(nèi)字節(jié)的 ACK 確認(rèn)古程,才會(huì)移動(dòng)發(fā)送窗口的左邊界。

接收窗口

接收方的緩存數(shù)據(jù)分為3類:

  1. 已接收
  2. 未接收但準(zhǔn)備接收
  3. 未接收而且不準(zhǔn)備接收

則 2 屬于接收窗口(這里的接收指接收數(shù)據(jù)并確認(rèn))
接收窗口只有在前面所有的報(bào)文段都確認(rèn)的情況下才會(huì)移動(dòng)左邊界喊崖。當(dāng)在前面還有字節(jié)未接收但收到后面字節(jié)的情況下挣磨,會(huì)先接收下來,接收窗口不會(huì)移動(dòng)荤懂,并不對(duì)后續(xù)字節(jié)發(fā)送 ACK 確認(rèn)報(bào)文茁裙,以此確保發(fā)送端會(huì)對(duì)這些數(shù)據(jù)重傳。

我們定義以下變量:
LastByteRead:接收方應(yīng)用程序讀取的數(shù)據(jù)流的最后一個(gè)字節(jié)編號(hào)节仿∥钭叮可以得知,這是接收緩存的起點(diǎn)
LastByteRcvd:從網(wǎng)絡(luò)中到達(dá)的并且已放入接收緩存中的數(shù)據(jù)流的最后一個(gè)自己的的編號(hào)廊宪。

可以得知:LastByteRcvd - LastByteRead <= RcvBuffer(接收緩存大小)
那么接收窗口 rwnd =RcvBuffer - (LastByteRcvd - LastByteRead)
rwnd 是隨時(shí)間動(dòng)態(tài)變化的矾瘾,如果 rwnd 為 0,則意味著接收緩存已經(jīng)滿了箭启。
接收端在回復(fù)給發(fā)送端的 ACK 中會(huì)包含該 rwnd壕翩,發(fā)送端則會(huì)根據(jù) ACK 中的接收窗口的值來控制發(fā)送窗口。

有一個(gè)問題傅寡,如果當(dāng)發(fā)送 rwnd 為 0 的 ACK 后放妈,發(fā)送端停止發(fā)送數(shù)據(jù)。等待一段時(shí)間后荐操,接收方應(yīng)用程序讀取了一部分?jǐn)?shù)據(jù)芜抒,接收端可以繼續(xù)接收數(shù)據(jù),于是給發(fā)送端發(fā)送報(bào)文告訴發(fā)送端其接收窗口大小托启,但這個(gè)報(bào)文不幸丟失了宅倒,我們知道,不含數(shù)據(jù)的 ACK 是不會(huì)超時(shí)重傳的驾中,于是就出現(xiàn)發(fā)送端等待接收端的 ACK 通知||接收端等待發(fā)送端發(fā)送數(shù)據(jù)的死鎖狀態(tài)唉堪。

為了處理這種問題,TCP 引入了持續(xù)計(jì)時(shí)器(Persistence timer)肩民,當(dāng)發(fā)送端收到對(duì)方的 rwnd=0 的 ACK 通知時(shí)唠亚,就啟用該計(jì)時(shí)器,時(shí)間到則發(fā)送一個(gè) 1 字節(jié)的探測報(bào)文持痰,對(duì)方會(huì)在此時(shí)回應(yīng)自身的接收窗口大小灶搜,如果結(jié)果仍為 0,則重設(shè)持續(xù)計(jì)時(shí)器,繼續(xù)等待割卖。

七前酿、擁塞控制

TCP 除了可靠傳輸服務(wù)外,另一個(gè)關(guān)鍵部分就是擁塞控制鹏溯。
TCP 讓每一個(gè)發(fā)送方根據(jù)所感知到的網(wǎng)絡(luò)擁塞程度來限制其能向連接發(fā)送流量的速率罢维。
可能有三個(gè)疑問:
TCP 發(fā)送方如何感知網(wǎng)絡(luò)擁塞?
TCP 發(fā)送方如何限制其向連接發(fā)送流量的速率丙挽?
發(fā)送方感知到網(wǎng)絡(luò)擁塞時(shí)肺孵,采用何種算法來改變其發(fā)送速率?

這就是 TCP 的擁塞控制機(jī)制颜阐。
前邊說到平窘,TCP 連接的每一端都是由一個(gè)接收緩存、一個(gè)發(fā)送緩存和幾個(gè)變量(LastByteRead凳怨、LastByteRcvd瑰艘、rwnd等)組成。而運(yùn)行在發(fā)送方的 TCP 擁塞控制機(jī)制會(huì)跟蹤一個(gè)額外的變量肤舞,即擁塞窗口 cwnd(congestion window)紫新。它對(duì)一個(gè) TCP 發(fā)送方能向網(wǎng)絡(luò)中發(fā)送流量的速率進(jìn)行了限制。
發(fā)送方中未被確認(rèn)的數(shù)據(jù)量不會(huì)超過 cwndrwnd 的最小值: min(rwnd,cwnd)萨赁。

1.TCP 發(fā)送方如何感知網(wǎng)絡(luò)擁塞

冗余 ACK(duplicate ACK):就是再次確認(rèn)某個(gè)報(bào)文段的 ACK弊琴,而發(fā)送方先前已經(jīng)收到對(duì)該報(bào)文段的確認(rèn)。

冗余 ACK 的產(chǎn)生原因:

  • 當(dāng)接收端接收到失序報(bào)文段時(shí)杖爽,即該報(bào)文段序號(hào)大于下一個(gè)期望的敲董、按序的報(bào)文段,檢測到數(shù)據(jù)流中的間隔慰安,即由報(bào)文段丟失腋寨,并不會(huì)對(duì)該報(bào)文段確認(rèn)。TCP 不使用否定確認(rèn)化焕,所以不能向發(fā)送方發(fā)送顯式的否定確認(rèn)萄窜,為了使接收方得知這一現(xiàn)象,會(huì)對(duì)上一個(gè)按序字節(jié)數(shù)據(jù)進(jìn)行重復(fù)確認(rèn)撒桨,這也就產(chǎn)生了一個(gè)冗余 ACK查刻。
  • 因?yàn)榘l(fā)送方經(jīng)常發(fā)送大量的報(bào)文段,如果其中一個(gè)報(bào)文段丟失凤类,可能在定時(shí)器過期前穗泵,就會(huì)收到大量的冗余 ACK。一旦收到 3 個(gè)冗余 ACK(3 個(gè)以下很可能是鏈路層的亂序引起的谜疤,無需處理)佃延,說明在這個(gè)已被確認(rèn) 3 次的報(bào)文段之后的報(bào)文段已經(jīng)丟失现诀,TCP 就會(huì)執(zhí)行快速重傳,即在該報(bào)文段的定時(shí)器過期之前重傳丟失的報(bào)文段履肃。

將 TCP 發(fā)送方的丟包事件定義為:要么出現(xiàn)超時(shí)仔沿,要么收到來自接收方的 3 個(gè)冗余 ACK。

當(dāng)出現(xiàn)過度的擁塞時(shí)尺棋,路由器的緩存會(huì)溢出封锉,導(dǎo)致一個(gè)數(shù)據(jù)報(bào)被丟棄。丟棄的數(shù)據(jù)報(bào)接著會(huì)引起發(fā)送方的丟包事件陡鹃。那么此時(shí)烘浦,發(fā)送方就認(rèn)為在發(fā)送方到接收方的路徑上出現(xiàn)了網(wǎng)絡(luò)擁塞抖坪。

2.TCP 發(fā)送方如何限制其向連接發(fā)送流量的速率
  • 當(dāng)出現(xiàn)丟包事件時(shí):應(yīng)當(dāng)降低 TCP 發(fā)送方的速率萍鲸。
  • 當(dāng)對(duì)先前未確認(rèn)報(bào)文段的確認(rèn)到達(dá)時(shí),即接收到非冗余 ACK 時(shí)擦俐,應(yīng)當(dāng)增加發(fā)送方的速率脊阴。
3.發(fā)送方感知到網(wǎng)絡(luò)擁塞時(shí),采用何種算法來改變其發(fā)送速率

即 TCP 擁塞控制算法(TCP congestion control algorithm)
包括三個(gè)主要部分:慢啟動(dòng)蚯瞧、擁塞避免嘿期、快速恢復(fù),其中快速恢復(fù)并非是發(fā)送方必須的埋合,慢啟動(dòng)和擁塞避免則是 TCP 強(qiáng)制要求的

(1)慢啟動(dòng)

當(dāng)一條 TCP 連接開始時(shí)备徐,擁塞窗口 cwnd 的值通常置為一個(gè) MSS 的較小值,這就使初始發(fā)送速率大約為 MSS/RTT(RTT:往返時(shí)延甚颂,報(bào)文段從發(fā)出到對(duì)該報(bào)文段的確認(rèn)被接收之間的時(shí)間量)蜜猾。
而對(duì) TCP 發(fā)送方來說,可用帶寬可能比 MSS/RTT 大得多振诬,TCP發(fā) 送方希望迅速找到可用帶寬的數(shù)量蹭睡。因此,在慢啟動(dòng)狀態(tài)赶么,cwnd 以一個(gè)MSS 的值開始并且每當(dāng)收到一個(gè)非冗余 ACK 就增加一個(gè) MSS肩豁。


如圖,最初 cwnd 值為 1MSS辫呻,發(fā)送一個(gè)報(bào)文段 M1清钥。收到 M1 的確認(rèn)后,cwnd 增加為 2MSS放闺,這時(shí)可以發(fā)送兩個(gè)報(bào)文段 M2祟昭,M3。收到這兩個(gè)報(bào)文段的確認(rèn)后雄人,cwnd 則增加為 4MSS从橘,可以發(fā)送四個(gè)報(bào)文段念赶,以此類推...

因此,TCP 雖然發(fā)送速率起始慢恰力,但在慢啟動(dòng)階段以指數(shù)增長叉谜。
這種指數(shù)增長很顯然不是無限制的,那么何時(shí)結(jié)束呢踩萎?
如果出現(xiàn)丟包事件停局,TCP 發(fā)送方將 ssthresh(慢啟動(dòng)閾值)設(shè)置為 cwnd/2

  • 發(fā)生由超時(shí)引起的丟包事件,并將 cwnd 重置為 1MSS香府,重啟慢啟動(dòng)
  • 當(dāng) TCP 發(fā)送方的 cwnd 值達(dá)到或超過 ssthresh董栽,再繼續(xù)翻倍顯然不合適。這時(shí)將結(jié)束慢啟動(dòng)轉(zhuǎn)移到擁塞避免模式企孩。
  • TCP 發(fā)送方檢測到 3 個(gè)冗余 ACK锭碳,會(huì)結(jié)束慢啟動(dòng),并快速重傳勿璃,即在該報(bào)文段的定時(shí)器過期之前重傳丟失的報(bào)文段擒抛。且進(jìn)入快速恢復(fù)狀態(tài)。
(2)擁塞避免

一旦進(jìn)入擁塞避免狀態(tài)补疑,cwnd 的值大約是上次遇到擁塞時(shí)的值的一半歧沪,即距離擁塞并不遙遠(yuǎn)。因此莲组,TCP 無法每過一個(gè) RTT 就將 cwnd 翻倍诊胞。而是每個(gè) RTT 只增加 1MSS,即每收到一個(gè)非冗余 ACK锹杈,就將 cwnd 增加 1/cwnd撵孤。即假如此時(shí) cwnd10MSS,則每收到一個(gè)非冗余 ACK嬉橙,cwnd 就增加 1 /10MSS早直,在 10 個(gè)報(bào)文段都收到確認(rèn)后,擁塞窗口的值就增加了 1MSS市框。

那么何時(shí)結(jié)束擁塞避免的線性增長(每 RTT 1MSS)呢霞扬?
和慢啟動(dòng)一樣,如果出現(xiàn)丟包事件枫振,TCP 發(fā)送方將 ssthresh(慢啟動(dòng)閾值)設(shè)置為 cwnd/2(加法增大喻圃, 乘法減小)

  • 發(fā)生由超時(shí)引起的丟包事件粪滤,擁塞避免和慢啟動(dòng)處理的方式相同斧拍。即 TCP 發(fā)送方將 ssthresh(慢啟動(dòng)閾值)設(shè)置為 cwnd/2,并將 cwnd重置為 1MSS杖小,重啟慢啟動(dòng)
  • TCP 發(fā)送方檢測到 3 個(gè)冗余 ACK肆汹,cwnd 為原來的一半加上 3MSS愚墓,進(jìn)入快速恢復(fù)狀態(tài)。
(3)快速恢復(fù)

快速恢復(fù)是由 3 個(gè)冗余 ACK 引起的昂勉。
在快速恢復(fù)中浪册,對(duì)引起 TCP 進(jìn)入快速恢復(fù)狀態(tài)的缺失報(bào)文段,對(duì)收到的每個(gè)冗余 ACK岗照,cwnd 增加 1 個(gè) MSS村象。最終,當(dāng)對(duì)丟失報(bào)文段的一個(gè) ACK 到達(dá)時(shí)攒至,TCP 在降低 cwnd 后進(jìn)入擁塞避免狀態(tài)厚者。
如果出現(xiàn)超時(shí),和之前一樣迫吐,即 TCP 發(fā)送方將 ssthresh(慢啟動(dòng)閾值)設(shè)置為 cwnd/2库菲,并將 cwnd 重置為 1MSS,重啟慢啟動(dòng)

快速恢復(fù)并非是必須的渠抹。

TCP 的擁塞控制是:每個(gè) RTT 內(nèi) cwnd 線性(加性增)增加 1MSS蝙昙,然后出現(xiàn) 3 個(gè)冗余 ACK 事件時(shí) cwnd 減半(乘性減),因此 TCP 擁塞控制常被稱為加性增梧却,乘性減擁塞控制方式。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末败去,一起剝皮案震驚了整個(gè)濱河市放航,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌圆裕,老刑警劉巖广鳍,帶你破解...
    沈念sama閱讀 207,113評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異吓妆,居然都是意外死亡赊时,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門行拢,熙熙樓的掌柜王于貴愁眉苦臉地迎上來祖秒,“玉大人,你說我怎么就攤上這事舟奠〗叻欤” “怎么了?”我有些...
    開封第一講書人閱讀 153,340評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵沼瘫,是天一觀的道長抬纸。 經(jīng)常有香客問我,道長耿戚,這世上最難降的妖魔是什么湿故? 我笑而不...
    開封第一講書人閱讀 55,449評(píng)論 1 279
  • 正文 為了忘掉前任阿趁,我火速辦了婚禮,結(jié)果婚禮上坛猪,老公的妹妹穿的比我還像新娘歌焦。我一直安慰自己,他們只是感情好砚哆,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評(píng)論 5 374
  • 文/花漫 我一把揭開白布独撇。 她就那樣靜靜地躺著,像睡著了一般躁锁。 火紅的嫁衣襯著肌膚如雪纷铣。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,166評(píng)論 1 284
  • 那天战转,我揣著相機(jī)與錄音搜立,去河邊找鬼。 笑死槐秧,一個(gè)胖子當(dāng)著我的面吹牛啄踊,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播刁标,決...
    沈念sama閱讀 38,442評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼颠通,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了膀懈?” 一聲冷哼從身側(cè)響起顿锰,我...
    開封第一講書人閱讀 37,105評(píng)論 0 261
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎启搂,沒想到半個(gè)月后硼控,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,601評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡胳赌,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評(píng)論 2 325
  • 正文 我和宋清朗相戀三年牢撼,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片疑苫。...
    茶點(diǎn)故事閱讀 38,161評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡熏版,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出缀匕,到底是詐尸還是另有隱情纳决,我是刑警寧澤,帶...
    沈念sama閱讀 33,792評(píng)論 4 323
  • 正文 年R本政府宣布乡小,位于F島的核電站阔加,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏满钟。R本人自食惡果不足惜胜榔,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評(píng)論 3 307
  • 文/蒙蒙 一胳喷、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧夭织,春花似錦吭露、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至弄屡,卻和暖如春题禀,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背膀捷。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評(píng)論 1 261
  • 我被黑心中介騙來泰國打工迈嘹, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人全庸。 一個(gè)月前我還...
    沈念sama閱讀 45,618評(píng)論 2 355
  • 正文 我出身青樓秀仲,卻偏偏與公主長得像,于是被迫代替她去往敵國和親壶笼。 傳聞我的和親對(duì)象是個(gè)殘疾皇子神僵,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評(píng)論 2 344

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