TCP知識(shí)點(diǎn)總結(jié)
TCP概述
a. TCP提供的是面向連接的全雙工服務(wù)
TCP所有的數(shù)據(jù)會(huì)匹配到由源地址听盖、目的地址胀溺、源端口、目的端口構(gòu)成的一個(gè)TCP連接之上皆看。TCP連接是一中需要建立的資源仓坞,可以握手機(jī)制來完成。UDP是一種基于盡力而為機(jī)制的協(xié)議腰吟,不存在UDP連接資源的建立无埃,資源的處理往往由應(yīng)用層協(xié)議代勞。
b. TCP可供可靠的服務(wù)
TCP有確認(rèn)機(jī)制來保證數(shù)據(jù)包的可靠到達(dá)
TCP有CRC校驗(yàn)機(jī)制來保證數(shù)據(jù)包的無差錯(cuò)性毛雇,UDP的CRC是可選的
TCP會(huì)重新排序亂序的數(shù)據(jù)包和丟棄重復(fù)的數(shù)據(jù)
TCP能夠提供流量控制機(jī)制嫉称,使用滑動(dòng)窗口算法
TCP能夠提供擁塞控制器與恢復(fù)機(jī)制,存在多種TCP擁塞控制模型
TCP能協(xié)商發(fā)送的數(shù)據(jù)報(bào)文長(zhǎng)度
TCP報(bào)文格式
TCP報(bào)文段各個(gè)部分的格式如上圖所示灵疮。下面解釋一下各個(gè)字段的含義:
端口號(hào)
1)源端口:源端口和IP地址的作用是標(biāo)識(shí)報(bào)文的返回地址织阅。
2)目的端口:端口指明接收方計(jì)算機(jī)上的應(yīng)用程序接口。
TCP報(bào)文中的源端口號(hào)和目的端口號(hào)同IP數(shù)據(jù)報(bào)中的源IP和目的IP唯一確定一條TCP連接
序號(hào)和確認(rèn)號(hào)
序號(hào)和確認(rèn)號(hào)是TCP可靠傳輸?shù)年P(guān)鍵部分震捣。序號(hào)是本報(bào)文段發(fā)送的數(shù)據(jù)組的第一個(gè)字節(jié)的序號(hào)荔棉。在TCP傳送的流中,每一個(gè)字節(jié)一個(gè)序號(hào)蒿赢。例如润樱,一個(gè)報(bào)文段的序號(hào)為300,此報(bào)文段數(shù)據(jù)部分共有100字節(jié)羡棵,則下一個(gè)報(bào)文段的序號(hào)為400壹若。所以序號(hào)確保了TCP傳輸?shù)挠行蛐浴4_認(rèn)號(hào),即ACK舌稀,指明下一個(gè)期待收到的字節(jié)序號(hào)啊犬,表明該序號(hào)之前的所有數(shù)據(jù)已經(jīng)正確無誤的收到。確認(rèn)號(hào)只有當(dāng)ACK標(biāo)志為1時(shí)才有效壁查。比如建立連接時(shí)觉至,SYN報(bào)文的ACK標(biāo)志位為0。
數(shù)據(jù)偏移/首部長(zhǎng)度
占用4bits睡腿,由于首部可能含有可選項(xiàng)內(nèi)容语御,因此TCP報(bào)頭的長(zhǎng)度是不確定的,報(bào)頭不包含任何選字段則長(zhǎng)度為20字節(jié)席怪,4位首部長(zhǎng)度字段所能表示的最大值位1111应闯,轉(zhuǎn)化為10進(jìn)制為15,15*4=60,故報(bào)頭最大長(zhǎng)度為60字節(jié)挂捻。首部長(zhǎng)度也叫數(shù)據(jù)偏移碉纺,是因?yàn)槭撞块L(zhǎng)度實(shí)際上指示了數(shù)據(jù)區(qū)在報(bào)文段中的起始偏移值。
保留
為將來定義新的用途保留刻撒,現(xiàn)在一般置0骨田。
控制位
URG、ACK声怔、PSH态贤、RST、SYN醋火、FIN共6個(gè)悠汽,每一個(gè)標(biāo)志位表示一個(gè)控制功能。
1)URG: 緊急指針標(biāo)志芥驳,為1時(shí)表示確認(rèn)號(hào)有效柿冲,為0則忽略緊急指針。
2)ACK: 確認(rèn)序號(hào)標(biāo)志兆旬,為1時(shí)表示確認(rèn)號(hào)有效姻采,為0時(shí)表示報(bào)文中不含確認(rèn)信息,忽略確認(rèn)號(hào)字段爵憎。
3)PSH: push標(biāo)志,為1表示是帶有push標(biāo)志的數(shù)據(jù)婚瓜,指示接收方在接收到該報(bào)文段后宝鼓,盡快將這個(gè)報(bào)文段交給應(yīng)用程序,而不是在緩沖區(qū)排隊(duì)巴刻。
4)RST:重置連接標(biāo)志愚铡,用于重置由于主機(jī)崩潰或其他原因而出現(xiàn)錯(cuò)誤的連接。或者用于拒絕非法的報(bào)文段請(qǐng)求和拒絕連接請(qǐng)求沥寥。
5)SYN:同步序列號(hào)碍舍,用于建立連接過程,在連接請(qǐng)求中邑雅,SYN=1和ACK=0表示該數(shù)據(jù)段沒有使用捎帶的確認(rèn)域片橡,而連接應(yīng)答捎帶一個(gè)確認(rèn),即SYN=1和ACK=1淮野。
6)FIN: finish標(biāo)志捧书,用于釋放連接,為1時(shí)表示發(fā)送方已經(jīng)沒有數(shù)據(jù)發(fā)送了骤星,即關(guān)閉本方數(shù)據(jù)流经瓷。
窗口
滑動(dòng)窗口大小,用來告知發(fā)送端接收端的緩存大小洞难,以此控制發(fā)送端發(fā)送數(shù)據(jù)的速率舆吮,從而達(dá)到流量控制。窗口大小是一個(gè)16bit字段队贱,因而窗口大小最大為65535色冀。
校驗(yàn)和
奇偶校驗(yàn),此校驗(yàn)和是對(duì)整個(gè)的TCP報(bào)文段露筒,包括TCP頭部和TCP數(shù)據(jù)呐伞,以 16位字進(jìn)行計(jì)算所得。由發(fā)送端計(jì)算和存儲(chǔ)慎式,并由接收端進(jìn)行驗(yàn)證伶氢。
緊急指針
只有當(dāng)URG標(biāo)置為1時(shí)緊急指針才有效。緊急指針是一個(gè)正的便宜量瘪吏,和順序號(hào)字段中的值相加表示緊急數(shù)據(jù)最后一個(gè)字節(jié)的序號(hào)癣防。TCP的緊急方式是發(fā)送端向另一端發(fā)送緊急數(shù)據(jù)的一種方式。
選項(xiàng)和填充
最常見的可選字段是最長(zhǎng)報(bào)文大小掌眠,又稱為MSS蕾盯,每個(gè)連接方通常都在通信的第一個(gè)報(bào)文段(為建立連接而設(shè)置SYN標(biāo)志位1的那個(gè)段)中指明這個(gè)選項(xiàng),它表示本端所能接收的最大報(bào)文段的長(zhǎng)度蓝丙。選項(xiàng)長(zhǎng)度不一定是32位的整數(shù)倍级遭,所以要加填充位,即在這個(gè)字段中加入額外的零渺尘,以保證TCP頭是32的整數(shù)倍挫鸽。
數(shù)據(jù)部分
TCP報(bào)文段的數(shù)據(jù)部分是可選的。在一個(gè)連接建立和一個(gè)連接終止時(shí)鸥跟,雙方交換的報(bào)文段僅有TCP首部丢郊。如果一方?jīng)]有數(shù)據(jù)要發(fā)送盔沫,也使用沒有任何數(shù)據(jù)的首部來確認(rèn)收到的數(shù)據(jù)。在處理超時(shí)的許多情況中枫匾,也會(huì)發(fā)送不帶任何數(shù)據(jù)的報(bào)文段架诞。
TCP連接建立
上圖描述了TCP建立連接的過程。假定主機(jī)A運(yùn)行的是TCP客戶端程序干茉,主機(jī)B運(yùn)行的是TCP服務(wù)器程序谴忧。最初兩端的TCP進(jìn)程都處于CLOSED狀態(tài)。當(dāng)A主動(dòng)打開連接等脂,B被動(dòng)打開連接俏蛮。B的TCP服務(wù)器進(jìn)程先創(chuàng)建傳送控制塊TCB(存儲(chǔ)每一個(gè)連接中的重要信息,如TCP連接表上遥,到發(fā)送和接收緩存的指針搏屑,到重傳隊(duì)列的指針,當(dāng)前的發(fā)送和接收序列號(hào)等等)粉楚,準(zhǔn)備接受客戶端的連接請(qǐng)求辣恋。然后服務(wù)器進(jìn)程就處于LISTEN狀態(tài),等待客戶的連接請(qǐng)求模软。如有伟骨,立即做出響應(yīng)。A的TCP客戶端程序也是首先創(chuàng)建傳送控制塊TCB燃异,然后向B發(fā)出連接請(qǐng)求報(bào)文段携狭,這時(shí)首部中的同步位SYN=1,同時(shí)選擇一個(gè)初始序號(hào)seq=x回俐。TCP規(guī)定逛腿,SYN報(bào)文段(即SYN=1的報(bào)文段)不能攜帶數(shù)據(jù),但要消耗掉一個(gè)序號(hào)仅颇。這時(shí)单默,TCP客戶端進(jìn)入SYN-SENT(同步已發(fā)送)狀態(tài)。
B收到連接請(qǐng)求后忘瓦,如同意建立連接搁廓,則向A發(fā)送確認(rèn)。在確認(rèn)報(bào)文段中應(yīng)把SYN位和ACK位都置1耕皮,確認(rèn)號(hào)是ack=x+1境蜕,同時(shí)也為自己選擇一個(gè)初始序號(hào)seq=y。請(qǐng)注意凌停,這個(gè)報(bào)文段也不能攜帶數(shù)據(jù)汽摹,但同樣要消耗掉一個(gè)序號(hào)。這時(shí)TCP服務(wù)器進(jìn)入SYN-RCVD(同步收到)狀態(tài)苦锨。
TCP客戶端收到B的確認(rèn)后,還要向B給出確認(rèn)。確認(rèn)報(bào)文段的ACK置1舟舒,確認(rèn)號(hào)ack=y+1拉庶,而自己的序號(hào)seq=x+1。TCP的標(biāo)準(zhǔn)規(guī)定秃励,ACK報(bào)文段可以攜帶數(shù)據(jù)氏仗。但如果不攜帶數(shù)據(jù)則不消耗序號(hào),在這種情況下夺鲜,下一個(gè)報(bào)文段的序號(hào)仍是seq=x+1皆尔。這時(shí),TCP連接已經(jīng)建立币励,A進(jìn)入ESTABLISHED(已建立連接)狀態(tài)慷蠕。當(dāng)B收到A的確認(rèn)后,也進(jìn)入ESTABLISHED狀態(tài)食呻。
為什么建立連接時(shí)三次握手而不是兩次
三次握手是為了防止失效的連接請(qǐng)求報(bào)文段突然又傳到了服務(wù)端流炕,因而產(chǎn)生錯(cuò)誤。所謂“已失效的連接請(qǐng)求報(bào)文段”是這樣產(chǎn)生的仅胞∶勘伲考慮正常情況,A發(fā)出連接請(qǐng)求干旧,但因連接請(qǐng)求報(bào)文段丟失而未收到確認(rèn)渠欺。于是A再重傳一次連接請(qǐng)求。后來A收到了確認(rèn)椎眯,建立了連接挠将。數(shù)據(jù)傳輸完畢后,就釋放了連接盅视。A共發(fā)送了兩個(gè)連接請(qǐng)求報(bào)文段捐名,其中第一個(gè)丟失,第二個(gè)到達(dá)了B闹击。沒有”已失效的連接請(qǐng)求報(bào)文段“镶蹋。
現(xiàn)假定出現(xiàn)一種異常,即A發(fā)送的第一個(gè)連接請(qǐng)求報(bào)文段并沒有丟失赏半,而是再某些網(wǎng)絡(luò)結(jié)點(diǎn)長(zhǎng)時(shí)間滯留了贺归,以致延誤到連接釋放以后的某個(gè)時(shí)間才到達(dá)B。本來這是一個(gè)早已失效的報(bào)文段断箫,但B收到此失效的報(bào)文段后就誤認(rèn)為是A又發(fā)出一次新的連接請(qǐng)求拂酣。于是就向A發(fā)出確認(rèn)報(bào)文段,同意建立連接仲义。假定不采用三次握手婶熬,那么只要B發(fā)出確認(rèn)剑勾,新的連接就建立了。由于A并沒有發(fā)出連接的請(qǐng)求赵颅,因此不會(huì)理睬B的確認(rèn)虽另,也不會(huì)向B發(fā)送數(shù)據(jù)。但B卻以為新的傳輸連接已經(jīng)建立了饺谬,并一直等待A發(fā)來數(shù)據(jù)捂刺。B的許多資源就這樣被白白消耗掉了。采用三次握手的辦法可以防止上述現(xiàn)象的發(fā)生募寨。
SYN攻擊是典型的DDOS攻擊族展,簡(jiǎn)述其原理
在三次握手的過程種,服務(wù)器發(fā)送SYN和ACK之后拔鹰,收到客戶端的ACK之前的連接稱為半連接仪缸。此時(shí)服務(wù)器處于SYN_RCVD狀態(tài),收到客戶端的ACK之后進(jìn)入ESTABLISHED狀態(tài)格郁。SYN攻擊就是利用這個(gè)時(shí)間間隔偽造大量不存在的IP地址向服務(wù)器不斷發(fā)送SYN包腹殿,服務(wù)器回復(fù)確認(rèn)包,并等待客戶的確認(rèn)例书。由于源地址不存在锣尉,服務(wù)器需要不斷地重發(fā)直至超時(shí),這些偽造的SYN包將長(zhǎng)時(shí)間占用未連接隊(duì)列决采,而正常的SYN請(qǐng)求被丟棄自沧,目標(biāo)系統(tǒng)運(yùn)行緩慢,引起網(wǎng)絡(luò)的嚴(yán)重癱瘓树瞭。因此大多數(shù)操作系統(tǒng)都限制半連接的數(shù)量拇厢。
TCP關(guān)閉連接
上圖展示了TCP連接釋放的過程。數(shù)據(jù)傳輸結(jié)束后晒喷,通信的雙方都可以釋放連接⌒①耍現(xiàn)在A和B都處于ESTABLISHED狀態(tài)。A的應(yīng)用進(jìn)程先向其TCP發(fā)出連接釋放報(bào)文段凉敲,并停止再發(fā)送數(shù)據(jù)衣盾,主動(dòng)關(guān)閉TCP連接。A把連接釋放報(bào)文段首部的終止控制位 FIN置1爷抓,其序號(hào)seq=u势决,它等于前面已經(jīng)傳送過的數(shù)據(jù)的最后一個(gè)字節(jié)的序號(hào)加1。這時(shí)A進(jìn)入FIN-WAIT-1狀態(tài)蓝撇,等待B的確認(rèn)果复。請(qǐng)注意,TCP規(guī)定渤昌,F(xiàn)IN報(bào)文段即使不攜帶數(shù)據(jù)虽抄,它也小號(hào)一個(gè)序號(hào)走搁。
B收到連接釋放報(bào)文段后發(fā)出確認(rèn),確認(rèn)號(hào)是ack=u+1迈窟,而這個(gè)報(bào)文段自己的序號(hào)是v朱盐,等于B前面已經(jīng)傳送過的數(shù)據(jù)的最后一個(gè)字節(jié)的序號(hào)加1。然后B進(jìn)入CLOSE-WAIT狀態(tài)菠隆。TCP服務(wù)器進(jìn)程這時(shí)應(yīng)通知高層應(yīng)用進(jìn)程,因而從A到B這個(gè)方向的連接就釋放了狂秘,這時(shí)的TCP連接處于半關(guān)閉狀態(tài)骇径,即A已經(jīng)沒有數(shù)據(jù)要發(fā)送了,但B若發(fā)送數(shù)據(jù)者春,A仍要接收破衔。也就是說,從B到A這個(gè)方向的連接并未關(guān)閉钱烟,這個(gè)狀態(tài)可能會(huì)持續(xù)一段時(shí)間晰筛。
A收到來自B的確認(rèn)后,就進(jìn)入FIN-WAIT-2狀態(tài)拴袭,等待B發(fā)出的連接釋放報(bào)文段读第。若B已經(jīng)沒有要向A發(fā)送的數(shù)據(jù),其應(yīng)用進(jìn)程就通知TCP連接釋放拥刻。這時(shí)B發(fā)出的連接釋放報(bào)文段必須使FIN=1×鳎現(xiàn)假定B的序號(hào)為w(在半關(guān)閉狀態(tài)可能又發(fā)送了一些數(shù)據(jù))。B還必須重復(fù)上次已發(fā)送過的確認(rèn)號(hào)ack=u+1般哼。這時(shí)B就進(jìn)入LAST-ACK(最后確認(rèn))狀態(tài)吴汪,等待A的確認(rèn)。
A在收到B的連接釋放報(bào)文后蒸眠,必須對(duì)此發(fā)出確認(rèn)漾橙。在確認(rèn)報(bào)文段中把ACK置1,確認(rèn)號(hào)ack=w+1楞卡,而自己的序號(hào)是seq=u+1霜运。然后進(jìn)入到TIME-WAIT狀態(tài)。請(qǐng)注意,現(xiàn)在TCP連接還沒有釋放掉养渴,必須經(jīng)過時(shí)間等待計(jì)時(shí)器設(shè)置的時(shí)間2MSL后愤惰,A才進(jìn)入到CLOSED狀態(tài)。時(shí)間MSL叫做最長(zhǎng)報(bào)文段壽命(Maximum Segment Lifetime)案淋。RFC793建議設(shè)為2分鐘。但這完全是從工程上考慮险绘,對(duì)于現(xiàn)在的網(wǎng)絡(luò)踢京,MSL=2分鐘可能太長(zhǎng)了誉碴。因此TCP允許不同的實(shí)現(xiàn)可根據(jù)具體情況使用更小的MSL值。因此瓣距,從A進(jìn)入到TIME-WAIT狀態(tài)后黔帕,要經(jīng)過四分鐘才進(jìn)入到CLOSED狀態(tài),才能開始建立下一個(gè)新的連接蹈丸。當(dāng)A撤銷相應(yīng)的傳輸控制塊TCB后成黄,就結(jié)束了這次的TCP連接。
為什么需要TIME-WAIT狀態(tài)逻杖,即為什么需要等待2MSL?
MSL是一個(gè)報(bào)文段在網(wǎng)絡(luò)上的最大的生存時(shí)間奋岁。
這里有兩個(gè)原因需要等待2MSL:
第一,為實(shí)現(xiàn)TCP這種全雙工連接的可靠釋放荸百。如何客戶端在發(fā)完ACK之后直接進(jìn)入CLOSED狀態(tài)闻伶,若由于某種原因這個(gè)ACK丟失,那么服務(wù)器由于超時(shí)將重傳FIN包够话,而此時(shí)客戶端已經(jīng)關(guān)閉連接蓝翰,就找不到與重發(fā)的FIN包對(duì)應(yīng)的連接,最后服務(wù)器收到的將是RST而不是ACK女嘲,服務(wù)器以為是連接錯(cuò)誤而把問題上報(bào)給上層畜份。這樣的情況雖然不會(huì)導(dǎo)致數(shù)據(jù)丟失,但是卻導(dǎo)致TCP協(xié)議不可靠澡为。因此漂坏,客戶端發(fā)完ACK后必須維護(hù)這條連接直至2MSL的時(shí)間結(jié)束。
第二媒至,若不存在TIME-WAIT階段顶别,若有一個(gè)新的四元組建立一條新的TCP連接。由于TCP協(xié)議棧無法區(qū)分前后兩條連接是否相同拒啰,在它看來驯绎,這條連接跟上一個(gè)關(guān)閉的連接使用的端口完全相同。而等待2MSL的時(shí)間谋旦,保證網(wǎng)絡(luò)中舊的數(shù)據(jù)包已經(jīng)完全消失剩失,這樣建立新的連接時(shí)可以使用舊的端口號(hào),避免兩次連接數(shù)據(jù)錯(cuò)亂的情況册着。
為什么TCP建立連接時(shí)是三次握手拴孤,而關(guān)閉連接時(shí)是四次揮手?
這是由于TCP傳輸協(xié)議是全雙工的原因造成的甲捏。
在建立連接時(shí)演熟,服務(wù)器收到客戶端的SYN包后,可以將應(yīng)答的ACK包和同步的SYN包放在同一個(gè)報(bào)文段里發(fā)送給客戶端。但在關(guān)閉連接時(shí)芒粹,當(dāng)收到對(duì)方的FIN包后兄纺,僅僅表示對(duì)方?jīng)]有數(shù)據(jù)傳給你了,并不表示你的所有數(shù)據(jù)都已經(jīng)傳送給了對(duì)方化漆,因此不必馬上關(guān)閉SOCKET估脆,先發(fā)送一個(gè)ACK包確認(rèn)已收到對(duì)方的關(guān)閉請(qǐng)求。然后等你的所有數(shù)據(jù)都發(fā)送完了再發(fā)送一個(gè)FIN包給對(duì)方表示同意關(guān)閉連接座云,因此ACK和FIN需要分開發(fā)送疙赠,故此連接多了一個(gè)交互過程。
TCP的流量控制
如果發(fā)送的太快朦拖,而接收方來不及接收棺聊,這樣的情況就有可能導(dǎo)致數(shù)據(jù)丟失。所謂流量控制就是控制發(fā)送方的速率贞谓,不要讓其發(fā)送的太快,使接收方來得及接收葵诈。TCP利用滑動(dòng)窗口協(xié)議實(shí)現(xiàn)流量控制裸弦。
滑動(dòng)窗口協(xié)議允許發(fā)送方和接收方各自設(shè)置自己的緩存區(qū)大小,并且發(fā)送方在停止等待確認(rèn)前可以連續(xù)發(fā)送多個(gè)分組作喘。由于發(fā)送方不必每發(fā)一個(gè)分組就停下來等待確認(rèn)理疙,因此可以提高傳輸效率。
1. 可變滑動(dòng)窗口
設(shè) A向B發(fā)送數(shù)據(jù)泞坦,B告知A當(dāng)前我的rwnd=400窖贤,那么發(fā)送方A得發(fā)送窗口不能超過接收方得接收窗口大小。注意贰锁,窗口大小得單位是字節(jié)赃梧,ACK是卻認(rèn)為,ack是確認(rèn)號(hào)豌熄。
如上圖所示A向B發(fā)送數(shù)據(jù)授嘀。在連接建立時(shí),B告訴A接收窗口rwnd(receiver window)= 400锣险,單位字節(jié)蹄皱,因此發(fā)送方A的發(fā)送窗口不能400。
可以看出芯肤,B向A發(fā)送的三個(gè)報(bào)文段都設(shè)置了 ACK = 1以保證字段有效巷折,后面的rwnd值就是接收方對(duì)發(fā)送方的三次流量控制。
第一次把窗口設(shè)置為300 崖咨,第二次100 锻拘,最后一次為 0,即不允許發(fā)送方再發(fā)送數(shù)據(jù)的狀態(tài)掩幢。
但是當(dāng)某個(gè)ACK報(bào)文丟失了逊拍,就會(huì)出現(xiàn)A等待B確認(rèn)上鞠,并且B等待A發(fā)送數(shù)據(jù)的死鎖狀態(tài)。為了解決這種問題芯丧,TCP引入了持續(xù)計(jì)時(shí)器(Persistence timer)芍阎,當(dāng)A收到rwnd=0時(shí),就啟用該計(jì)時(shí)器缨恒,時(shí)間到了則發(fā)送一個(gè)1字節(jié)的探測(cè)報(bào)文谴咸,詢問B是很忙還是上個(gè)ACK丟失了,然后B回應(yīng)自身的接收窗口大小骗露,返回仍為0(A重設(shè)持續(xù)計(jì)時(shí)器繼續(xù)等待)或者會(huì)重發(fā)rwnd=x岭佳。
2. 擁塞控制
2.1 慢開始和擁塞避免
2.1.1 慢開始原理
(1)在主機(jī)剛剛開始發(fā)送報(bào)文段時(shí)可先將擁塞窗口 cwnd 設(shè)置為一個(gè)最大報(bào)文段 MSS 的數(shù)值。
(2)在每收到一個(gè)對(duì)新的報(bào)文段的確認(rèn)后萧锉,將擁塞窗口增加至多一個(gè) MSS 的數(shù)值珊随。
(3)用這樣的方法逐步增大發(fā)送端的擁塞窗口 cwnd,可以使分組注入到網(wǎng)絡(luò)的速率更加合理柿隙。
2.1.2 實(shí)例講解
注:圖中窗口的單位都是報(bào)文段
(1)當(dāng) TCP 連接進(jìn)行初始化時(shí):
發(fā)送窗口:swnd = 1
慢開始閾值:ssthresh = 16
(2)發(fā)送端收到 ACK1 (確認(rèn) M0叶洞,期望收到 M1)后,將 cwnd 從 1 增大到 2禀崖,于是發(fā)送端可以接著發(fā)送 M1 和 M2 兩個(gè)報(bào)文段(指數(shù)增長(zhǎng))
(3)接收端發(fā)回 ACK2 和 ACK3衩辟。發(fā)送端每收到一個(gè)對(duì)新報(bào)文段的確認(rèn) ACK,就把發(fā)送端的擁塞窗口加 1〔ǜ剑現(xiàn)在發(fā)送端的 cwnd 從 2 增大到 4艺晴,并可發(fā)送 M4 ~ M6共 4個(gè)報(bào)文段。(指數(shù)增長(zhǎng))
(4)當(dāng)swnd >= ssthresh掸屡,swnd執(zhí)行擁塞避免算法封寞,swnd窗口按線性規(guī)律增長(zhǎng)。 (加法增大)
(5)當(dāng)發(fā)送 超時(shí)仅财,此時(shí)swnd = 24 :
ssthresh = swnd/2 = 12钥星;(乘法減小)
swnd = 1
(6)重復(fù)地2步满着。
2.2 快重傳和快恢復(fù)
2.2.1 快重傳
發(fā)送端只要一連收到三個(gè)重復(fù)的 ACK 即可斷定有分組丟失了谦炒,就應(yīng)立即重傳丟失的報(bào)文段而不必繼續(xù)等待為該報(bào)文段設(shè)置的重傳計(jì)時(shí)器的超時(shí)
2.2.2 快恢復(fù)
(1) 當(dāng)發(fā)送端收到連續(xù)三個(gè)重復(fù)的 ACK 時(shí),就重新設(shè)置慢開始門限 ssthresh风喇。
(2) 與慢開始不同之處是 swnd 不是設(shè)置為 1宁改,而是設(shè)置為 ssthresh + 3 * MSS。
(3) 若收到的重復(fù)的 ACK 為 n 個(gè)(n > 3)魂莫,則將 cwnd 設(shè)置為 ssthresh + n * MSS还蹲。
(4) 若發(fā)送窗口值還容許發(fā)送報(bào)文段,就按擁塞避免算法繼續(xù)發(fā)送報(bào)文段。
(5) 若收到了確認(rèn)新的報(bào)文段的 ACK谜喊,就將 swnd 縮小到 ssthresh潭兽。