一款侵、網(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 類:
- 已發(fā)送,已收到 ACK
- 已發(fā)送讥耗,未收到 ACK
- 未發(fā)送有勾,但允許發(fā)送
- 未發(fā)送疹启,但不允許發(fā)送
則 2 和 3 屬于發(fā)送窗口
發(fā)送窗口只有收到發(fā)送窗口內(nèi)字節(jié)的 ACK 確認(rèn)古程,才會(huì)移動(dòng)發(fā)送窗口的左邊界。
接收窗口
接收方的緩存數(shù)據(jù)分為3類:
- 已接收
- 未接收但準(zhǔn)備接收
- 未接收而且不準(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ì)超過 cwnd
和 rwnd
的最小值: 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í) cwnd
為 10MSS
,則每收到一個(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 擁塞控制常被稱為加性增梧却,乘性減擁塞控制方式。