路由器TCP/IP通訊協(xié)議堵塞
TCP/IP通訊協(xié)議采用了4層的層級(jí)結(jié)構(gòu),每一層都呼叫它的下一層所提供的網(wǎng)絡(luò)來(lái)完成自己的需求。
由于A(yíng)RPNET的設(shè)計(jì)者注重的是網(wǎng)絡(luò)互聯(lián),允許通信子網(wǎng)(網(wǎng)絡(luò)接口層)采用已有的或是將來(lái)有的各種協(xié)議,所以這個(gè)層次中沒(méi)有提供專(zhuān)門(mén)的協(xié)議。
一、TCP 包進(jìn)入和流出這個(gè)盒子。有些時(shí)候進(jìn)入盒子的包被丟失了。因?yàn)榻裉斓臄?shù)字和光媒體上出現(xiàn)比特級(jí)錯(cuò)誤的機(jī)會(huì)非常少,TCP 的設(shè)計(jì)者們就假設(shè)包的丟失很大程度上是因?yàn)槁酚善鞯膿砣?,也即是路由器用?lái)容納進(jìn)入包的緩沖已經(jīng)被填滿(mǎn)了,這樣路由器會(huì)靜默地丟棄接下來(lái)進(jìn)入的包。
二、盡管TCP可以檢測(cè)到TCP包的丟失并且進(jìn)行重傳,但是從TCP處理過(guò)程,重傳過(guò)程和吞吐率下降這些方面看,這個(gè)重傳過(guò)程將會(huì)耗費(fèi)很大,當(dāng)一個(gè)發(fā)送的TCP端節(jié)點(diǎn)檢測(cè)倒一個(gè)包丟失時(shí),可以進(jìn)行快速重傳或者包的重傳計(jì)時(shí)器超時(shí)而重傳。然后該TCP端節(jié)點(diǎn)減小發(fā)送窗口(在等待響應(yīng)之前可以發(fā)送的包數(shù)量),進(jìn)行慢啟動(dòng)和擁塞避免算法(RFC 2001)。這會(huì)立刻降低發(fā)送端的發(fā)送速率,以便路由器來(lái)減輕擁塞。發(fā)送端會(huì)逐漸將發(fā)送窗口恢復(fù)倒擁塞發(fā)生前的大小。
三、盡管因?yàn)槁酚善鲹砣a(chǎn)生的包丟失是偶然發(fā)生的事件,它們并不會(huì)負(fù)面地影響塊數(shù)據(jù)傳輸,只是會(huì)增加一些重傳數(shù)據(jù)包和恢復(fù)發(fā)送速率的時(shí)間。
慢啟動(dòng)和擁塞避免算法對(duì)于時(shí)間敏感的,成塊數(shù)據(jù)流的控制效果非常好。然而,TCP處理丟包的方法對(duì)于交互式的,丟失敏感和時(shí)間敏感的流量來(lái)說(shuō)效果不是很好。
四、當(dāng)路由器開(kāi)始丟棄進(jìn)入的數(shù)據(jù)包時(shí),它一般并不區(qū)分?jǐn)?shù)據(jù)流的不同。當(dāng)多個(gè)TCP數(shù)據(jù)流都產(chǎn)生包丟失時(shí),所有的數(shù)據(jù)流都要減少自身的發(fā)送速率。根據(jù)路由器擁塞減輕的程度,多個(gè)TCP數(shù)據(jù)流將會(huì)逐漸恢復(fù)自身的發(fā)送速率。這會(huì)降低路由器及相關(guān)鏈路的使用率,直到所有的TCP數(shù)據(jù)流恢復(fù)到以擁塞之前的速率進(jìn)行發(fā)送。路由器從擁塞狀態(tài)又進(jìn)入到了低使用狀態(tài)。
五、這種擁塞后因?yàn)橹貍骱偷玩溌肥褂枚鴰?lái)的吞吐量問(wèn)題,是僅僅通過(guò)發(fā)送端來(lái)管理?yè)砣慕Y(jié)果。為了避免因?yàn)槁酚善鲹砣鴰?lái)的丟包而產(chǎn)生的一系列問(wèn)題,TCP/IP的設(shè)計(jì)者們創(chuàng)建了一些用于主機(jī)和路由器的標(biāo)準(zhǔn)。這些標(biāo)準(zhǔn)描述了在IP路由器上進(jìn)行的主動(dòng)隊(duì)列管理算法(AQM)(RFC 2309),使得路由器能夠監(jiān)控轉(zhuǎn)發(fā)隊(duì)列的狀態(tài),以提供一個(gè)路由器向發(fā)送端報(bào)告發(fā)生擁塞的機(jī)制,讓發(fā)送端在路由器開(kāi)始丟包前降低發(fā)送速率。這種路由器報(bào)告和主機(jī)響應(yīng)機(jī)制被稱(chēng)為顯式擁塞通告(ECN)(RFC 3168)。
六、當(dāng)擁塞發(fā)生時(shí),發(fā)送主機(jī)必須仍然在降低它們的發(fā)送速率。然而,通過(guò)避免包的丟失,發(fā)送主機(jī)無(wú)需進(jìn)入重傳過(guò)程,丟失敏感的數(shù)據(jù)包流也不會(huì)因?yàn)閾砣艿胶艽笥绊?,IP和TCP使用包頭中的未使用字段來(lái)支持ECN。
在網(wǎng)絡(luò)層(IP),一個(gè)發(fā)送主機(jī)必須能夠表明自身可以進(jìn)行ECN,路由器在轉(zhuǎn)發(fā)時(shí)必須能夠表明它正在經(jīng)歷擁塞。
七、在傳輸層(TCP),TCP端必須對(duì)對(duì)方表明自身是可以進(jìn)行ECN操作的。接收端必須能夠通知發(fā)送端它收到了一個(gè)來(lái)自路由器的擁塞通告。
發(fā)送端必須能夠通知接收端它受到了來(lái)自接收端的通告并且已經(jīng)降低了發(fā)送速率,IP包頭中的8位的服務(wù)類(lèi)型域(TOS)原先在RFC791中被定義為表明包的發(fā)送優(yōu)先級(jí),時(shí)延,吞吐量,可靠性和消耗等特征。在RFC2474中被重新定義為包含一個(gè)6位的區(qū)分服務(wù)碼點(diǎn)(DSCP)和兩個(gè)未用的位。
八、DSCP值表明一個(gè)在路由器上配置的和隊(duì)列相關(guān)聯(lián)的發(fā)送優(yōu)先級(jí)。IP對(duì)ECN的支持使用到了TOS域中剩下的這兩位,一個(gè)支持ECN的主機(jī)發(fā)送數(shù)據(jù)包時(shí)將ECN設(shè)置為01或者10。
對(duì)于支持ECN的主機(jī)發(fā)送的包,如果路徑上的路由器支持ECN并且經(jīng)歷擁塞,它將ECN域設(shè)置為11。如果該數(shù)值已經(jīng)被設(shè)置為11,那么下游路徑上的路由器不會(huì)修改該值。
TCP是一個(gè)基于連接的協(xié)議,一個(gè)好的軟件工程應(yīng)該將功能與實(shí)現(xiàn)方法區(qū)分開(kāi)來(lái),TCP/IP恰恰沒(méi)有很好地做到這點(diǎn),就使得TCP/IP參考模型對(duì)于使用新的技術(shù)的指導(dǎo)意義是不夠的。TCP/IP參考模型不適合于其他非TCP/IP協(xié)議簇。