通过UDP发送大量的小数据包会占用更多的资源(cpu、zlib压缩等)。我在这里读到,通过UDP发送一个大的~65kBYTEs数据包可能会失败,所以我认为发送许多较小的数据包会更频繁地成功,但是随之而来的是使用更多处理能力的计算开销(或者至少这是我假设的)。问题基本上是这样的:发送最大成功数据包并将计算保持在最低限度的最佳方案是什么?有没有一个特定的尺寸在大部分时间都有效?我使用Erlang作为服务器,使用Enet作为客户端(用c编写)。使用Zlib压缩也和我发送相同的数据包到每个客户端(广播是术语我猜)。
534字节。要求无碎片传输的。当然,它仍然可能完全丢失。由于丢失数据包的重新传输而产生的开销以及网络开销本身比任何CPU成本都要大几个数量级。
通过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开销。我会尝试找出(我想了解我自己)并更新这个答案。
在大多数情况下不会导致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
。这是FOR SURE不会导致碎片的字节数,因为主机可以设置的最小MTU大小是576,并且IP头最大大小
可以是60字节
(508=576 MTU-60 IP-8 UDP)
顺便说一下,我会尝试使用
1472
字节,因为1500
是一个足够标准的值。
如果要通过
PPPoE
连接,请使用1492
而不是1500
进行计算。
我一直在写一个程序,它使用UDP上的停止和等待协议通过局域网和广域网发送数据包。我最近一直在测试我的程序,并注意到较大的数据包(接近64k字节)的丢包率更高。直觉上这是有道理的,但实际原因是什么?
在实验运行在esp32上的UDP服务器时,我发现接收到的数据包的大小限制在1500字节: 20(IP头)8(UDP头)1472(数据),(尽管理论上UDP好像可以支持数据包64K)。这意味着,为了传输更大量的数据,客户端必须将其拆分成若干块并依次发送,而在服务器端,这些数据将需要恢复。我认为这种解决方案的管理费用将相当高。我还知道TOIT提供TCP/IP连接。自然,分组大小在TCP/IP的情况下也
我正在使用在我的客户端应用程序中执行以及 最大数据包大小限制也存在于中,即?但是我可以使用中的发送大于最大数据包大小的数据块 这是怎么运作的?这是因为是基于流的,负责在较低层创建数据包吗?有什么方法可以增加UDP中的最大数据包大小吗? 当我在客户端读取时,我从服务器端发送的UDP数据包的一些字节是否可能丢失?如果是,那么有没有办法只检测UDP客户端的损失?
好的,我正在为我的网络课程编程,我必须使用UDP在Java中实现一个项目。我们正在实现一个HTTP服务器和客户端以及一个“gremlin”函数,该函数以指定的概率破坏数据包。HTTP服务器必须在应用层将一个大文件分成多个段,然后通过UDP发送到客户端。客户端必须在应用层重新组装接收到的段。然而,我想知道的是,如果UDP根据定义是不可靠的,为什么我必须在这里模拟不可靠? 我的第一个想法是,也许这仅仅
我正在使用python来接收来自FPGA的UDP数据包流,试图尽可能少地丢失数据包。数据包速率从大约5kHz到某些MHz,我们希望在特定的时间窗口(代码中的acq_time)内获取数据。我们现在有了这个代码: