我想了解接收器窗口如何影響吞吐量較高延遲連接。TCP接收窗口
我有兩臺機器的簡單客戶端 - 服務器對應用的,相隔甚遠,與兩個250毫秒的等待時間RTT的之間的連接。我跑這個測試與Windows(XP,7)和Linux(Ubuntu的10.x的),有相同的結果,所以爲了簡單起見,我們假設的情況下: 客戶端接收數據:WinXP的臨 服務器發送數據:Win7的臨 同樣,延遲是250mSec RTT。
我跑我的TCP測試在不改變客戶端上的接收緩衝區大小(默認爲8KB),我在電線上看到(使用Wireshark的):
- 客戶端發送ACKS到服務器和TCP數據包包含RWIN = 65K
- 服務器發送數據,並報告RWIN = 65K
在跟蹤我看到3-4的分組的突發(具有1460個字節的有效負載)尋找,隨後立即ACK從客戶端機器發送到服務器,然後約250毫秒沒有然後是從服務器到客戶端的新數據包突發。
所以,結論看來,它填補了接收器的窗口,甚至在服務器不發送新數據。爲了做更多的測試,我這次也運行了相同的測試,改變客戶端機器上的接收器緩衝區大小(在Windows上,更改接收器的緩衝區大小最終影響了機器宣傳的RWIN)。我希望在阻塞ACK之前看到大量的數據包......並且至少有更高的吞吐量。
在這種情況下,我設置的recv緩衝區大小100,000,000。從客戶端到服務器的數據包現在有一個RWIN = 99,999,744(很好,這很好),但不幸的是,從服務器發送到客戶端的數據模式仍然是一樣的:短時間爆發,然後等待很長時間。 爲了確認我在網絡上看到的內容,我還測量了從服務器向客戶端發送一大塊數據的時間。我沒有看到使用大型RWIN或使用默認設置的任何更改。
任何人可以幫助我理解爲什麼改變RWIN並沒有真正影響產量?
幾點注意事項: - 服務器作爲快速發送數據的8Kb 塊中可能使用write() - 正如我以前說過,我看到使用Linux以及類似的效果。更改接收緩衝區大小會影響節點使用的RWIN,但吞吐量保持不變。 - 我分析了數百個數據包之後的跟蹤,給予TCP慢啓動機制足夠的時間來放大CWIN大小。
至於建議,我加入金屬線軌跡的一小快照這裏
No. Time Source Destination Protocol Length Info
21 2.005080 CCC.CCC.CCC.CCC sss.sss.sss.sss TCP 60 57353 > 21500 [ACK] Seq=1 Ack=11681 Win=99999744 Len=0
22 2.005109 sss.sss.sss.sss CCC.CCC.CCC.CCC TCP 1514 21500 > 57353 [ACK] Seq=19305 Ack=1 Win=65536 Len=1460
23 2.005116 sss.sss.sss.sss CCC.CCC.CCC.CCC TCP 1514 21500 > 57353 [ACK] Seq=20765 Ack=1 Win=65536 Len=1460
24 2.005121 sss.sss.sss.sss CCC.CCC.CCC.CCC TCP 1514 21500 > 57353 [ACK] Seq=22225 Ack=1 Win=65536 Len=1460
25 2.005128 sss.sss.sss.sss CCC.CCC.CCC.CCC TCP 946 21500 > 57353 [PSH, ACK] Seq=23685 Ack=1 Win=65536 Len=892
26 2.005154 CCC.CCC.CCC.CCC sss.sss.sss.sss TCP 60 57353 > 21500 [ACK] Seq=1 Ack=14601 Win=99999744 Len=0
27 2.007106 CCC.CCC.CCC.CCC sss.sss.sss.sss TCP 60 57353 > 21500 [ACK] Seq=1 Ack=16385 Win=99999744 Len=0
28 2.007398 sss.sss.sss.sss CCC.CCC.CCC.CCC TCP 1514 21500 > 57353 [ACK] Seq=24577 Ack=1 Win=65536 Len=1460
29 2.007401 sss.sss.sss.sss CCC.CCC.CCC.CCC TCP 1514 21500 > 57353 [ACK] Seq=26037 Ack=1 Win=65536 Len=1460
30 2.007403 sss.sss.sss.sss CCC.CCC.CCC.CCC TCP 1514 21500 > 57353 [ACK] Seq=27497 Ack=1 Win=65536 Len=1460
31 2.007404 sss.sss.sss.sss CCC.CCC.CCC.CCC TCP 1514 21500 > 57353 [ACK] Seq=28957 Ack=1 Win=65536 Len=1460
32 2.007406 sss.sss.sss.sss CCC.CCC.CCC.CCC TCP 1514 21500 > 57353 [ACK] Seq=30417 Ack=1 Win=65536 Len=1460
33 2.007408 sss.sss.sss.sss CCC.CCC.CCC.CCC TCP 946 21500 > 57353 [PSH, ACK] Seq=31877 Ack=1 Win=65536 Len=892
34 2.007883 CCC.CCC.CCC.CCC sss.sss.sss.sss TCP 60 57353 > 21500 [ACK] Seq=1 Ack=19305 Win=99999744 Len=0
35 2.257143 CCC.CCC.CCC.CCC sss.sss.sss.sss TCP 60 57353 > 21500 [ACK] Seq=1 Ack=22225 Win=99999744 Len=0
36 2.257160 CCC.CCC.CCC.CCC sss.sss.sss.sss TCP 60 57353 > 21500 [ACK] Seq=1 Ack=24577 Win=99999744 Len=0
37 2.257358 sss.sss.sss.sss CCC.CCC.CCC.CCC TCP 1514 21500 > 57353 [ACK] Seq=32769 Ack=1 Win=65536 Len=1460
38 2.257362 sss.sss.sss.sss CCC.CCC.CCC.CCC TCP 1514 21500 > 57353 [ACK] Seq=34229 Ack=1 Win=65536 Len=1460
39 2.257364 sss.sss.sss.sss CCC.CCC.CCC.CCC TCP 1514 21500 > 57353 [ACK] Seq=35689 Ack=1 Win=65536 Len=1460
40 2.257365 sss.sss.sss.sss CCC.CCC.CCC.CCC TCP 1514 21500 > 57353 [ACK] Seq=37149 Ack=1 Win=65536 Len=1460
正如你看到的,服務器停在包#33發送數據。
客戶端在舊分組的分組#34發送ACK(seq = 19305,在分組#20上發送,此處未顯示)。 RWIN爲100Mb,我希望服務器不要阻塞一段時間。
20-30個數據包後,服務器端的擁塞窗口應該足夠大,可以發送比我看到的數據包更多的數據包...... 我假設擁塞窗口最終會長到RWIN ......但即使經過數百個數據包之後,模式也是一樣的:數據數據然後被阻塞爲250mSec ...
無論是機器無線?你能打印出在服務器/客戶端發送的數據包和消息中的順序號嗎?客戶端或服務器端可能會有很多噪音導致數據丟失。 – JustinDanielson 2012-04-23 23:44:20