通过UDP发送大量数据包会占用更多资源(cpu,zlib压缩等等)。我读here通过UDP发送一个大约65kBYTE的数据包可能会失败所以我认为发送大量较小的数据包会更频繁地成功,但随后会产生使用更多处理能力的计算开销(或者至少那就是我所假设的)。问题基本上是这样的;发送最大成功数据包并将计算量降至最低的最佳方案是什么?是否有特定尺寸可以在大多数时间使用?我使用Erlang作为服务器,使用Enet作为客户端(用c ++编写)。也使用Zlib压缩,我向每个客户端发送相同的数据包(广播就是我猜的那个词)。
答案 0 :(得分:24)
大多数情况下,UDP payload
的最大大小不会导致ip碎片
MTU size of the host handling the PDU (most of the case it will be 1500) -
size of the IP header (20 bytes) -
size of UDP header (8 bytes)
1500 MTU - 20 IP hdr - 8 UDP hdr = 1472 bytes
@EJP讨论了534
字节,但我会将其修复为508
。这是 FOR SURE 不会导致碎片的字节数,因为主机可以设置的最小MTU大小 576 和IP header max size
可以是{{ 1}} (508 = 576 MTU - 60 IP - 8 UDP)
顺便说一句,我尝试使用60 bytes
个字节,因为1472
是一个足够标准的值。
如果您正在通过1500
连接,请使用1492
代替1500
进行计算。
答案 1 :(得分:9)
通过UDP发送大量数据包会占用更多资源吗?
是的,肯定会的!我刚刚用流媒体应用做了一个实验。该应用程序每秒发送2000帧数据,精确定时。每帧的数据有效载荷为24个字节。我使用UDP与 sendto()将此数据发送到另一个节点上的监听器应用程序。
我发现的很有趣。这种程度的活动让我的CPU瘫痪了!我从大约64%的可用CPU时间到大约5%!这对我的申请来说是灾难性的,所以我不得不解决这个问题。我决定尝试各种变化。
首先,我只是注释了 sendto()调用,以查看数据包程序集开销的样子。 CPU时间大约增加1%。不错。好的......必须是 sendto()电话!
然后,我做了一个快速的假冒测试...我每10次迭代只调用一次 sendto() API,但我将数据记录填充到之前长度的10倍,以模拟将较小记录集合组合成较大记录的效果较少发送。结果非常令人满意:7%的CPU命中率,而之前为59%。看起来,至少在类似我类似NIX的系统上,发送数据包的操作在拨打电话的开销上是昂贵的。
如果有人怀疑测试是否正常工作,我通过Wireshark观察实际的UDP传输验证了所有结果,以确认所有测试都正常工作。
结论:它使用较少的CPU时间来较少发送较大的数据包,然后以较小的数据包形式发送相同数量的数据更频繁。不可否认,我不知道如果发生了什么, UDP开始破坏你过大的UDP数据报...我的意思是,我不知道这增加了多少CPU开销。我会试着找出(我想知道自己)并更新这个答案。
答案 2 :(得分:4)
534个字节。这需要在没有碎片的情况下传输。当然,它仍然可以完全丢失。由于重传丢失的数据包和网络开销本身造成的开销比任何CPU成本都高出几个数量级。
答案 3 :(得分:-11)
您可能使用了错误的协议。对于您关心传输的数据,UDP几乎总是一个糟糕的选择。最后在它上面分层排序,重试和完整性逻辑,然后你有TCP。