2018-07-19

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)文格式

圖片1.png

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連接建立

image.png

上圖描述了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)閉連接

image.png

上圖展示了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)豌熄。

image.png

如上圖所示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í)例講解

20130923092139371.jpeg

注:圖中窗口的單位都是報(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潭兽。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市斗遏,隨后出現(xiàn)的幾起案子山卦,更是在濱河造成了極大的恐慌,老刑警劉巖诵次,帶你破解...
    沈念sama閱讀 221,635評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件账蓉,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡逾一,警方通過查閱死者的電腦和手機(jī)铸本,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來遵堵,“玉大人箱玷,你說我怎么就攤上這事∧八蓿” “怎么了汪茧?”我有些...
    開封第一講書人閱讀 168,083評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)限番。 經(jīng)常有香客問我,道長(zhǎng)呀舔,這世上最難降的妖魔是什么弥虐? 我笑而不...
    開封第一講書人閱讀 59,640評(píng)論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮媚赖,結(jié)果婚禮上霜瘪,老公的妹妹穿的比我還像新娘。我一直安慰自己惧磺,他們只是感情好颖对,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,640評(píng)論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著磨隘,像睡著了一般缤底。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上番捂,一...
    開封第一講書人閱讀 52,262評(píng)論 1 308
  • 那天个唧,我揣著相機(jī)與錄音,去河邊找鬼设预。 笑死徙歼,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播魄梯,決...
    沈念sama閱讀 40,833評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼桨螺,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了酿秸?” 一聲冷哼從身側(cè)響起灭翔,我...
    開封第一講書人閱讀 39,736評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎允扇,沒想到半個(gè)月后缠局,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,280評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡考润,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,369評(píng)論 3 340
  • 正文 我和宋清朗相戀三年狭园,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片糊治。...
    茶點(diǎn)故事閱讀 40,503評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡唱矛,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出井辜,到底是詐尸還是另有隱情绎谦,我是刑警寧澤,帶...
    沈念sama閱讀 36,185評(píng)論 5 350
  • 正文 年R本政府宣布粥脚,位于F島的核電站窃肠,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏刷允。R本人自食惡果不足惜冤留,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,870評(píng)論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望树灶。 院中可真熱鬧纤怒,春花似錦、人聲如沸天通。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽像寒。三九已至烘豹,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間诺祸,已是汗流浹背吴叶。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留序臂,地道東北人蚌卤。 一個(gè)月前我還...
    沈念sama閱讀 48,909評(píng)論 3 376
  • 正文 我出身青樓实束,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親逊彭。 傳聞我的和親對(duì)象是個(gè)殘疾皇子咸灿,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,512評(píng)論 2 359

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