1

我正在使用 Netkit 玩各种 TCP 算法。

有两台机器c1c2由路由器连接,强制延迟为 200 毫秒。c1上的程序每 1ms 向c2发送 100 字节的数据包(TCP_NODELAY 已打开)。Reno 被用作两台机器上的拥塞控制。

根据 tcpdump,只有前 2 个数据包立即发送(200 字节),然后c1停止发送并等待 ACK。接收方的窗口大约是 2MSS(MSS=1460),所以我猜是 CWND 阻止了c1发送更多数据包。

根据 Reno 规范,初始 CWND 为 1MSS。我在那里遗漏了什么吗?.. 即使发送 1 字节的数据包也会给出相同的图片,发送 2 个数据包,然后发送方等待 ACK。可能是初始 CWND 大小是由初始段大小而不是 MSS 决定的吗?

ip route show cache显示类似

cache mtu 1500 rtt 361ms rttvar 360ms cwnd 5 advmss 1460 hoplimit 64

我想知道这是否意味着CWND = 5MSS?

4

3 回答 3

1

来自RFC 2581

IW,cwnd 的初始值,必须小于或等于 2*SMSS 字节,并且不得超过 2 个段。

我们注意到非标准的实验性 TCP 扩展允许 TCP 可以使用更大的初始窗口 (IW),如等式 1 [AFP98] 中所定义:

  IW = min (4*SMSS, max (2*SMSS, 4380 bytes))           (1)

有了这个扩展,TCP 发送方可以使用 3 或 4 段的初始
窗口,只要段的组合大小不超过 4380 字节。我们不允许将此更改作为本文档定义的标准的一部分。但是,我们在本文档的其余部分中包含对 (1) 的讨论,作为那些尝试更改的指南,而不是遵守当前的 TCP 拥塞控制标准。

SENDER MAXIMUM SEGMENT SIZE (SMSS): SMSS 是发送方可以传输的最大段的大小。该值可以基于网络的最大传输单元、路径 MTU 发现 [MD90] 算法、RMSS(见下一项)或其他因素。该大小不包括 TCP/IP 标头和选项。

您可能想检查您的实现如何计算 SMSS。

于 2010-12-13T15:09:55.223 回答
0

据我所知,在这种情况下,Linux 在“段”中测量 cwnd - 因此,一旦您将两个段发送到飞行中,那么您的 cwnd 就会关闭以获取新数据。

于 2011-02-14T09:39:34.380 回答
0

初始窗口为 2。它不是 1 的原因与延迟确认有关。接收方通常在发送 ack 之前等待两个数据包。如果初始窗口为 1,则将在默认时间后发送 ack,该时间通常远大于必要的时间。这增加了不必要的延迟并与 ack-clocking 混淆。

于 2017-08-09T08:02:30.400 回答