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