为什么当消息大小超过最大段大小时,TCP 消息的往返时间会减少 100 倍?

网络工程 通讯协议
2021-07-05 02:17:00

对于一个大学电信项目,我和我的合作伙伴使用 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 个字节更快?提前致谢。

2个回答

我将从您的问题标签中假设您正在使用 TCP。

确实需要对您的代码进行一些假设的一个可能的解释是,它是 Nagle 算法(一种旨在防止不合理的小数据包的算法)和 TCP 延迟确认(一种旨在避免在 ack 可以共享数据包时发送不合理的裸确认的算法)之间的交互与应用程序数据)。

假设您的应用程序将数据分为两个(或更多)部分发送到操作系统,首先它发送一个标头,然后发送实际数据。我不确定这就是你在做什么,但这对我来说似乎是最合理的解释。对于小消息,会发生以下事件序列。

  1. 客户端应用程序将标头发送到客户端操作系统。
  2. 客户端操作系统将标头发送到服务器。
  3. 客户端应用程序将正文发送到操作系统
  4. 由于存在未确认的数据,因此 Nagle 的算法会启动,操作系统会阻止数据,希望获得更多数据。
  5. 服务器操作系统接收标头,因为它是一个单独的数据包,它会阻止 ack 希望应用程序响应或第二个数据包从客户端到达。
  6. 我们现在陷入了僵局。客户端不想发送另一个小数据包,因为已经有未确认的数据在传输。服务器不想发送 ack,因为没有应用程序响应。
  7. 最终超时打破僵局。

在更大的消息大小时,交互会发生变化。根据服务器用于延迟确认的确切规则,有时仍然会出现延迟,但在您的情况下它们似乎并不太重要。

此问题的可能修复包括使用 TCP_NODELAY 套接字选项和/或重新编写应用程序代码以构建完整的数据包,然后将其一次性发送到操作系统。

很明显,如果大小低于MSS,整个消息在一个帧中发送,你测量的是发送该帧所花费的时间,单帧中的数据量影响很小(特别是在很少的情况下)数据,其中数据大小远小于标题大小)。

TCP 三向握手是在实际数据传输之前执行的,增加了大约 436 个字节。连接终止四次握手,如果发生(取决于您使用的软件)也可能会增加大量开销。

因此,综合起来,在 MSS 以下,与整个过程相比,数据大小可以忽略不计。

当数据大小大于 MSS 时,消息被拆分成几个数据包(封装在几个帧中),因此您期望有一种阶梯效应(在每个 MSS 倍数处跳跃)。

TCP卸载引擎也可能有影响,你应该检查它是否启用并比较有/没有它的结果。

您还应该捕获两台机器上的流量(使用诸如wireshark之​​类的工具),这将为您提供有关发生了什么的更多线索。