将多个 UDP 数据包组合成一个而不是一个接一个地发送它们有什么好处?我知道如果大包损坏了,那么我会丢失所有这些,但是将它们全部一起发送是否可能有一些好处?例如大的丢失的机会较低?
4 回答
将多个 UDP 数据包组合成一个而不是一个接一个地发送它们有什么好处?
可以节省每个数据报 8 个字节的 UDP 标头,从而减少通过线路发送的数据量。只要确保您发送的内容不超过 MTU 没有 IP 和 UDP 标头大小,以避免在 IP 层上出现碎片。
此外,标准 POSIX 套接字 API 需要一个send/sendto/sendmsg()
系统调用来发送或接收一个数据报,因此通过发送更少的数据报,一个系统调用更少,从而降低了整体延迟(每次调用大约几微秒)。从 3.0 开始的 Linux 内核提供了在一个系统调用中发送和接收多个数据报的功能sendmsg()
。recvmmsg()
我知道如果大数据包损坏了,那么我会丢失所有的
真的。但是,如果协议根本无法处理 UDP 数据报丢失,那可能就没那么重要了——只要一个数据报丢失,它就会被破坏。
这对于数据包大小很小(小于 100 字节)的情况很重要。IP/UDP 报头至少为 28 个字节。
想象一下,您有到服务器的流式连接,每个数据包包含 50 个字节,您的软件以每秒 1000 个数据包的速率发送数据包。
实际有效负载是1000 * 50 bytes = 50000 bytes.
Headers 开销1000 * 28 = 28000 bytes
Total bytes :50000 + 28000 = 87000 ==> 87 KBps
想象一下,您可以将每 3 个 UDP 数据包合并为一个数据包:
标头开销1000 / 3 * 28 = 9333
总字节数:50000 + 9333 ===> 60 KBps
这 - 在某些应用程序中 - 节省了很大一部分带宽。
通常,网络通道将受到每秒可发送数据包速率的限制。因此,如果您想每秒发送数百万条消息,您通常希望组合成较少数量的数据包来运行而不会出现重大数据包丢失。
概括地说,Windows 不喜欢 UDP 每秒超过 10,000 个数据包,但您可以用大型 MTU 数据包使千兆网络饱和。
这将由发送应用程序自行决定。
请注意,您的大数据包受底层网络的 MTU 限制。例如,UDP 数据包的理论大小是 64k,但以太网帧只有 ~1500 字节。所以我怀疑这不是一个实用的功能。