最可靠、最高效的udp数据包大小?

最可靠、最高效的udp数据包大小?,udp,processing-efficiency,packet-loss,Udp,Processing Efficiency,Packet Loss,通过UDP发送大量小数据包会占用更多资源(cpu、zlib压缩等)。我读到,通过UDP发送一个约65KB的大数据包可能会失败,因此我认为发送大量较小的数据包会更频繁地成功,但随之而来的是使用更多处理能力的计算开销(至少我是这么认为的)。问题基本上是这样,;发送最大成功数据包并将计算量降至最低的最佳方案是什么?是否有一种在大多数情况下都有效的特定尺寸?我使用Erlang作为服务器,使用Enet作为客户端(用c++编写)。同时使用Zlib压缩,我向每个客户端发送相同的数据包(我猜广播是一个术语)。5

通过UDP发送大量小数据包会占用更多资源(cpu、zlib压缩等)。我读到,通过UDP发送一个约65KB的大数据包可能会失败,因此我认为发送大量较小的数据包会更频繁地成功,但随之而来的是使用更多处理能力的计算开销(至少我是这么认为的)。问题基本上是这样,;发送最大成功数据包并将计算量降至最低的最佳方案是什么?是否有一种在大多数情况下都有效的特定尺寸?我使用Erlang作为服务器,使用Enet作为客户端(用c++编写)。同时使用Zlib压缩,我向每个客户端发送相同的数据包(我猜广播是一个术语)。

534字节。要求无碎片传输的。当然,它仍然可能完全丢失。由于重新传输丢失的数据包而产生的开销和网络开销本身比任何CPU成本都要大几个数量级。

您可能使用了错误的协议。对于您关心传输的数据,UDP几乎总是一个糟糕的选择。最后,在其上分层排序、重试和完整性逻辑,然后就是TCP。

在大多数情况下不会导致ip碎片的
UDP有效负载的最大大小是

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
。这是肯定不会导致碎片的字节数,因为主机可以设置的最小MTU大小是576,
IP头最大大小可以是
60字节
(508=576 MTU-60 IP-8 UDP)

顺便说一下,我会尝试使用
1472
字节,因为
1500
是一个足够标准的值

如果要通过
PPPoE
连接,请使用
1492
而不是
1500
进行计算。

通过UDP发送大量小数据包会占用更多资源吗

是的,肯定会的!我刚刚用一个流媒体应用做了一个实验。该应用程序每秒发送2000帧数据,精确定时。每个帧的数据有效负载为24字节。我使用UDP和sendto()将此数据发送到另一个节点上的侦听器应用程序

我发现很有趣。这一级别的活动让我的发送CPU崩溃了!我从大约64%的空闲CPU时间变成了大约5%!这对我的申请来说是灾难性的,所以我不得不修正它。我决定尝试变化

首先,我只是注释掉了sendto()调用,以查看数据包组装开销是什么样子的。大约1%的CPU时间命中率。不错。好啊必须是sendto()调用

然后,我做了一个快速的伪装测试。。。我每10次迭代只调用一次sendto()API,但我将数据记录的长度增加到以前的10倍,以模拟将较小的记录集合组装成较大的记录集合(发送频率较低)的效果。结果非常令人满意:CPU命中率为7%,而之前为59%。看起来,至少在我的*NIX系统上,发送数据包的操作成本很高,只不过是呼叫的开销

为了防止任何人怀疑测试是否正常工作,我通过Wireshark对实际UDP传输的观察来验证所有结果,以确认所有测试都正常工作


结论:它使用更少的CPU时间发送更大的数据包,然后以更小的数据包的形式发送相同数量的数据更频繁。无可否认,我不知道如果UDP开始破坏您过大的UDP数据报会发生什么情况。。。我的意思是,我不知道这会增加多少CPU开销。我将尝试找出(我想了解我自己)并更新此答案。

“重试”?但我认为这就是tcp的目的…重新发送数据包以完成任务。我这样做是为了一个在线游戏,所以tcp很可能会太慢,或者其他人都这么说,“每个人”通常都是错的。如果您担心数据可能无法到达,则需要TCP。对于TCP,您不选择数据包大小。您只需将字节写入套接字的一端,它们就会从另一端出来。另一方面,如果您不关心数据包是否到达或到达顺序(即大多数流数据协议),则UDP是最佳选择。我在相机应用程序中使用UDP作为取景器。UDP在这种情况下是完美的。TCP是不必要的,而且速度很慢。您在实际项目中直接使用TCP的次数是多少?也不多。HTTP可能是最常用的。最小IP MTU为576。它不包括以太网报头,所以实际上是548。你是对的。。。考虑到IP报头的最大大小可以达到60字节,我修正了这个计算。1500这个数字是从哪里来的?我想知道碎片对数据包的直接影响是什么。在我的应用程序中,当我从508转到509时,似乎在第二个数据包的末尾追加了一个“\0”。我想知道它是依赖于我的特定实现还是一个trule?@mavErick尾部的null来自您的代码,或者被您的代码错误地观察到。UDP不能做到这一点。我已经读到,使用sento而不是使用连接的UDP套接字可能会产生一些开销,因为内核在sendto期间临时连接套接字。如果您处于单播场景中,这应该根本不是问题。虽然我自己没有测试过,但是使用连接的udp套接字测试您的场景会很有趣。资料来源: