注意事項(xiàng):
1.TCP發(fā)送窗口是由對(duì)方發(fā)回的報(bào)文段(窗口大小,ack)設(shè)置的但是同一時(shí)刻發(fā)送窗口接收窗口大小未必相等(當(dāng)接收方發(fā)回一個(gè)報(bào)文窗口大小改變但由于網(wǎng)絡(luò)時(shí)延發(fā)送方窗口值可能不變)。
2.接收方應(yīng)該有累計(jì)確認(rèn)功能這樣可以減小傳輸開(kāi)銷。
3.TCP是全雙工通信,所以兩端都有發(fā)送窗口和接收窗口。
3.2、發(fā)送緩沖區(qū)和接收緩沖區(qū)
發(fā)送窗口只是發(fā)送緩沖區(qū)的一部分,發(fā)送緩沖區(qū)通常包括發(fā)送方應(yīng)用程序傳送給發(fā)送方TCP準(zhǔn)備發(fā)送的數(shù)據(jù)。這里面包括已發(fā)送但還未收到確認(rèn)的數(shù)據(jù)和未發(fā)送但在發(fā)送窗口的數(shù)據(jù)以及未發(fā)送但不再發(fā)送窗口的數(shù)據(jù)。
接收緩沖區(qū)包含了按序到達(dá)但尚未被應(yīng)用程序讀取的數(shù)據(jù),不按序到達(dá)以及尚未進(jìn)入接收窗口的數(shù)據(jù)。
4、TCP的流量控制
4.1、流量控制介紹
發(fā)送方一次發(fā)送的字節(jié)數(shù)量不要太多要讓對(duì)方來(lái)的及接收。接收方是通過(guò)調(diào)整滑動(dòng)窗口來(lái)進(jìn)行流量控制的。
?來(lái)看下面這樣一個(gè)實(shí)例A為發(fā)送方,B為接收方。B的接收窗口由400字節(jié)。
?首先A向B發(fā)送了一個(gè)序號(hào)為1的100字節(jié)的數(shù)據(jù)(1~100)。此時(shí)B的接收窗口還剩300字節(jié)。
?然后A向B發(fā)送了序號(hào)為101的100字節(jié)數(shù)據(jù)(101~200).此時(shí)B的接收窗口還剩200字節(jié)。
?然后A向B發(fā)送了序號(hào)為201的100字節(jié)的數(shù)據(jù)(201~300)但是這個(gè)報(bào)文丟失了。
?此時(shí)B向A發(fā)送一個(gè)回復(fù)報(bào)文ACK = 201說(shuō)明我已經(jīng)接收1200字節(jié)的數(shù)據(jù)下一次要從201開(kāi)始發(fā)。同時(shí)進(jìn)行了一次流量控制即rwnd = 300也就是說(shuō)B能接收300字節(jié)。所以A要發(fā)送201500的報(bào)文。
?A已經(jīng)發(fā)送過(guò)201的報(bào)文了所以它連續(xù)發(fā)送301,401的報(bào)文此時(shí)他知道201發(fā)送失敗進(jìn)行超時(shí)重傳。
?這時(shí)A收到了B成功收到401的報(bào)文下一次要從501開(kāi)始發(fā)而且又進(jìn)行了一次流量控制rwnd = 100還能接收100字節(jié)的數(shù)據(jù)。
?然后A又繼續(xù)發(fā)送了一個(gè)序號(hào)為501的報(bào)文,然后A停止發(fā)送。然后收到了B返回的回復(fù)序號(hào)為601滑動(dòng)窗口置為0的報(bào)文。
4.2、死鎖問(wèn)題及解決
接上文,過(guò)了一段時(shí)間后B的接收緩存又有了一些存儲(chǔ)空間。這時(shí)候會(huì)向A發(fā)送一個(gè)報(bào)文下次發(fā)送的序號(hào)為601,rwnd=400滑動(dòng)窗口。但是如果這個(gè)報(bào)文丟失那么就會(huì)造成A不知道B中滑動(dòng)窗口更新的消息那么就永遠(yuǎn)不會(huì)向B發(fā)送報(bào)文。
解決方案:TCP為每個(gè)連接都設(shè)置了一個(gè)持續(xù)計(jì)時(shí)器。只要收到對(duì)方的零窗口通知,就啟動(dòng)該持續(xù)計(jì)時(shí)器:
持續(xù)計(jì)時(shí)器到期發(fā)送一個(gè)零窗口探測(cè)報(bào)文段,對(duì)方再確認(rèn)這個(gè)探測(cè)報(bào)文段時(shí)給出現(xiàn)在的窗口值如果窗口值仍然是0,接收方確認(rèn)報(bào)文方重新設(shè)置持續(xù)計(jì)數(shù)器;若窗口不是0,死鎖的僵局便被打破了。
5、TCP的效率問(wèn)題
5.1、TCP的3種發(fā)送時(shí)機(jī)
1.當(dāng)發(fā)送緩存中達(dá)到雙方約定的MSS時(shí)然后發(fā)送。
2.當(dāng)URG = 1時(shí)立刻發(fā)送。
3.當(dāng)發(fā)送方一個(gè)計(jì)時(shí)器期限到了就把當(dāng)前已有的數(shù)據(jù)裝入報(bào)文段發(fā)送出去(這個(gè)數(shù)據(jù)長(zhǎng)度不能超過(guò)MSS)
5.2、TCP的效率問(wèn)題
舉例:
比如說(shuō)Telnet遠(yuǎn)程終端協(xié)議客戶端A向服務(wù)端B發(fā)送一個(gè)字符需要消耗41字節(jié),B端服務(wù)器向A發(fā)送一個(gè)確認(rèn)報(bào)文40字節(jié),同時(shí)服務(wù)端要向客戶端回顯那一個(gè)字符。又是41字節(jié),A客戶端向B服務(wù)端發(fā)送一個(gè)確認(rèn)報(bào)文40個(gè)字節(jié)我一共要交流2字節(jié)的數(shù)據(jù)我卻用了162字節(jié)的報(bào)文利用率太低了。
解決方案:Nagle算法
發(fā)送方發(fā)送第一個(gè)字節(jié),然后緩存剩下的數(shù)據(jù)字節(jié)。發(fā)送方收到對(duì)方發(fā)送的確認(rèn)報(bào)文以后才把發(fā)送緩存中所有數(shù)據(jù)組裝成一個(gè)報(bào)文段發(fā)送出去。當(dāng)發(fā)送緩存中數(shù)據(jù)達(dá)到對(duì)方接收窗口一半或者達(dá)到MSS時(shí)立刻發(fā)送。
5.3、糊涂窗口綜合癥
當(dāng)接收方緩沖區(qū)已滿會(huì)向發(fā)送方發(fā)送一個(gè)rwnd為0的報(bào)文告訴對(duì)方不要再發(fā)了。當(dāng)應(yīng)用進(jìn)程讀取1字節(jié)接收緩存時(shí),接收方向發(fā)送方發(fā)送rwnd = 1的報(bào)文此時(shí)發(fā)送方將1字節(jié)的數(shù)據(jù)打包成報(bào)文段發(fā)送給接收方。如此循環(huán)往復(fù)每次只能發(fā)一個(gè)字節(jié)。
解決方案:
接收方等待一段時(shí)間,使得接收緩存已有足夠空間容納一個(gè)最長(zhǎng)的報(bào)文段,或者等到接收緩存已有一半空間;只要出現(xiàn)這兩種情況之一,接收方就發(fā)出確認(rèn)報(bào)文,并向發(fā)送方通知當(dāng)前窗口的大小。
-
緩沖區(qū)
+關(guān)注
關(guān)注
0文章
33瀏覽量
9107 -
TCP
+關(guān)注
關(guān)注
8文章
1353瀏覽量
79055 -
UDP
+關(guān)注
關(guān)注
0文章
325瀏覽量
33931
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論