组合UDP数据包?

组合UDP数据包?,udp,packet-loss,Udp,Packet Loss,与一个接一个地发送多个UDP数据包相比,将多个UDP数据包组合成一个数据包有什么好处?我知道,如果大包裹被弄坏了,那么我就把它们全都弄丢了,但是把它们全部寄到一个包裹里,可能有什么好处吗?例如,大型应用程序丢失的可能性较低?这将由发送应用程序自行决定 请注意,您的大数据包受到底层网络的MTU的限制。e、 g.UDP数据包的理论大小为64k,但以太网帧只有~1500字节。因此,我怀疑这不是一个实用的功能。通常,网络通道将受到每秒可发送数据包速率的限制。因此,如果您希望每秒发送数百万条消息,您通常希

与一个接一个地发送多个UDP数据包相比,将多个UDP数据包组合成一个数据包有什么好处?我知道,如果大包裹被弄坏了,那么我就把它们全都弄丢了,但是把它们全部寄到一个包裹里,可能有什么好处吗?例如,大型应用程序丢失的可能性较低?

这将由发送应用程序自行决定


请注意,您的大数据包受到底层网络的MTU的限制。e、 g.UDP数据包的理论大小为64k,但以太网帧只有~1500字节。因此,我怀疑这不是一个实用的功能。

通常,网络通道将受到每秒可发送数据包速率的限制。因此,如果您希望每秒发送数百万条消息,您通常希望合并成较少数量的数据包,以便在没有重大数据包丢失的情况下运行

作为一种过度概括,Windows不喜欢UDP每秒超过10000个数据包,但您可以使用大型MTU数据包使千兆网络饱和

与一个接一个地发送多个UDP数据包相比,将多个UDP数据包组合成一个数据包有什么好处

可以在UDP报头上保存数据,即每个数据报8字节,从而减少通过线路发送的数据量。只需确保发送的MTU sans IP和UDP报头大小不超过MTU sans IP和UDP报头大小,以避免在IP层上出现碎片

此外,标准POSIX套接字API需要一个
send/sendto/sendmsg()
系统调用来发送或接收一个数据报,因此通过发送更少的数据报,一个人可以执行更少的系统调用,从而减少总延迟(每次调用几微秒)。从3.0开始的Linux内核提供了在一次系统调用中发送和接收多个数据报的功能

我知道如果这个大包被弄坏了,那么我会把所有的东西都弄丢


对。但是,如果协议根本无法处理UDP数据报丢失,那么这可能没什么大不了的——只要有一个数据报丢失,它就会被破坏。

对于数据包大小较小(小于100字节)的情况,这一点很重要。IP/UDP标头至少为28个字节

假设您有到服务器的流连接,每个数据包包含50个字节,您的软件以每秒1000个数据包的速率发送数据包

实际有效负载为
1000*50字节=50000字节。
Headers开销
1000*28=28000字节
总字节数:
50000+28000=87000=>87 KBps

设想您可以将每3个UDP数据包组合成一个数据包:

头开销
1000/3*28=9333
总字节数:
50000+9333===>60kbps


在某些应用程序中,这节省了大部分带宽。

udp是一种“尽力而为”的协议。繁忙的路由器可能会选择丢弃一个大的udp数据包,而一个小的udp数据包可能会在流量中断时漏掉。无论哪种方式都不能保证。如果不是注释,我会给出这个最佳答案。IPv4 UDP数据包有效负载的理论最大大小为65535-20-8,首先减去IP报头,然后减去UDP报头,得到65509字节。