我想了解接收器窗口如何影响吞吐量较高延迟连接。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