对于一个大学电信项目,我和我的合作伙伴使用 C 语言构建了一个简单的命令行消息传递应用程序。该项目的一部分是使用该应用程序来测试通过 TCP 发送的消息的传输时间和传输速率如何变化与消息大小。
为了测试这一点,我们用以太网线将两台计算机直接连接在一起。计算机 A 启动计时器,向计算机 B 发送消息,计算机 B 在收到整个消息后,将消息重新发送回 A,计算机在收到整个消息后停止计时器。第一次测试的消息大小为 3 个字节,然后测试越来越大的消息大小,直到消息大小达到 32MB(2^25 字节)。我们还使用环回 ip 地址运行了相同的测试代码,其中计算机 A 和计算机 B 的角色由一台计算机填充,并且没有发生网络传输:消息只是在内存中移动。这样做是为了测试网络无关计算机处理和我们的软件实现选择对传输时间的影响。这是结果。
一条 3 字节消息的往返传输时间大约为一毫秒,消息大小为 4 或 5 到 1460 字节(TCP 的通常最大段大小,在图例中记为 MSS)大约花费相同的时间,略低于100 毫秒,在传输时间下降两个左右数量级之前,在 MSS 之后,回到一毫秒。然后是一段高波动期(在第三张图中最明显),传输速率增加到大约 2^17 个字节,然后平稳下来。从那时起,往返传输时间以大致线性的方式增加。我应该补充一点,这些结果与操作系统无关:在 windows、mac os x 和 ubuntu 操作系统的任何组合上运行测试对总体趋势没有影响。此外,此处的消息大小仅包括数据,不包括 TCP、IP 或以太网标头。由于环回 IP 地址测试的往返传输时间在几乎所有消息大小上都比 LAN 测试低多个数量级,因此我得出结论,计算机处理时间对 LAN 测试的影响可以忽略不计。
在我看来,MSS 之后的趋势可以解释为,从长远来看,消息字节数与头字节数之间的比率接近某个常数,并且消息大小越大,降低这个比率的方差。可能还有其他恒定时间处理,当发送的字节数和段数较少时,这些处理会对传输时间产生更大的影响。
至于 MSS 之前的趋势,我完全被难住了。我试过在谷歌上搜索这个问题,但没有任何结果;也许我在谷歌上搜索错误的东西。为什么在 MSS 之前传输时间大致恒定,而在 MSS 之后急剧下降?并且,鉴于此,为什么发送 3 个字节比发送 10 个字节或 20 个字节更快?提前致谢。