我正在使用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>
答案 0 :(得分:1)
您必须意识到您的2个字节是有效负载,网络层将在您的有效负载前添加标头。仅IP标头是20个字节,但UDP或TCP也有它们的标头,当然还有一个以太网标头。
最有可能但不保证网络是以太网网络,这意味着mtu大约是1500.如果包含标头的数据包不是那么大,那么你就没有充分利用网络。
如果您的数据包不适合mtu,IP将进行分段。因此假设mtu是1500并且不同的层不添加任何东西,那么发送2000个字节将在1500和500中分割。或者如果你有1501,它将在1500和1中分割。再次不是最佳的。 IP能够分段高达64K。如果你发送那些大小的东西,那么它当然会被IP分割,你会得到很多最优的包,除了最后一个。
数据包的最佳大小= mtu - 使用的不同层的标头。 这些图层是
警告说mtu没有保证1492.它可能低于它取决于整个网络。
TCP将为您完成所有这些工作。因为尝试优化使用mtu符合TCP的性质。 Nagle实现为一个连续的50ms计时器,只有当该计时器到期时才会发送一个段,或者如果该对等体期待他自己发送的某些东西的确认。
答案 1 :(得分:0)
你的将军的答案"它有多糟糕"问题在很大程度上取决于正在进行通信的网络拓扑和设备类型。
根据发送和接收的系统类型,大量小数据包将增加网络堆栈,驱动程序和应用程序的流失。在嵌入式系统中,设备可能会花费更多的CPU周期,通过网络堆栈封送所有数据包而不是处理数据