为什么UDP中的数据包丢失与数据包数量与带宽利用率相关

时间:2015-04-09 18:00:19

标签: linux sockets iperf

我正在使用iperf测试客户端和主机之间的速度。在我的应用程序中,我需要能够以大约5KHz发送2字节UDP帧。

进行正常的UDP速度测试我可以轻松获得10Mb / s:

 $iperf -uVc some_ip -b 10M
 Interval     Transfer    Bandwidth    Dropped/Sent
 0.0-10.0 sec 11.9 MBytes 10.0Mbit/sec 0 / 8504 (0%)

当我尝试通过以5Hz(相关于80Kb / s)数据报发送2B来镜像我的应用程序时:

 $iperf -l 2 -uVc some_ip -b 80K

服务器端说没有数据包通过我猜测是因为计数器或iperf用于跟踪数据包的任何内容都不适合2B有效负载。这有意义吗?

作为一般的经验法则,发送许多小包而不是几个大包有多糟糕?任何人都可以指出文献,说明等待"打包"之间的权衡。一个大的数据报,一旦你得到它就立即发送出2B的数据?

为了进一步澄清,我感兴趣的是您发送许多小数据包(包括开销,数据包只有大约60B)所付出的代价,而不是发送更少但更大的数据包。在我到目前为止的测试中,数据包丢失显然与带宽使用没有关联,而是与数据包的数量相关,我发现这是违反直觉的!

编辑:

我在最简单的客户端 - 服务器设置上执行此操作,在两台连接在本地网络上的Linux PC之间,它们是网络上唯一的接口,在它们之间有以太网交换机。 / p>

2 个答案:

答案 0 :(得分:1)

您必须意识到您的2个字节是有效负载,网络层将在您的有效负载前添加标头。仅IP标头是20个字节,但UDP或TCP也有它们的标头,当然还有一个以太网标头。

最有可能但不保证网络是以太网网络,这意味着mtu大约是1500.如果包含标头的数据包不是那么大,那么你就没有充分利用网络。

如果您的数据包不适合mtu,IP将进行分段。因此假设mtu是1500并且不同的层不添加任何东西,那么发送2000个字节将在1500和500中分割。或者如果你有1501,它将在1500和1中分割。再次不是最佳的。 IP能够分段高达64K。如果你发送那些大小的东西,那么它当然会被IP分割,你会得到很多最优的包,除了最后一个。

数据包的最佳大小= mtu - 使用的不同层的标头。 这些图层是

  • TCP或UDP
  • IP
  • 以太网

警告说mtu没有保证1492.它可能低于它取决于整个网络。

TCP将为您完成所有这些工作。因为尝试优化使用mtu符合TCP的性质。 Nagle实现为一个连续的50ms计时器,只有当该计时器到期时才会发送一个段,或者如果该对等体期待他自己发送的某些东西的确认。

答案 1 :(得分:0)

你的将军的答案"它有多糟糕"问题在很大程度上取决于正在进行通信的网络拓扑和设备类型。

  1. 如果您通过互联网发送数据报,则大量小数据包不是最佳的。 TCP实现Nagle's Algorithm以避免发送带有1或2字节有效负载的小数据包,这在RFC 896中可能会导致拥塞崩溃。
  2. 如果您通过具有大量跳数的网络发送数据报,则丢弃数据包的可能性将增加,因为每个跃点可能无法处理其队列中相同数量的数据包。
  3. 如果您的来源和目的地位于同一个本地网络网段,那么它就不会那么重要了。由于每个数据包的开销,您将丢失一些带宽。
  4. 根据发送和接收的系统类型,大量小数据包将增加网络堆栈,驱动程序和应用程序的流失。在嵌入式系统中,设备可能会花费更多的CPU周期,通过网络堆栈封送所有数据包而不是处理数据