结合UDP数据包?
将几个UDP数据包组合成一个数据包,而不是一个接一个地发送它们有什么好处?我知道,如果大包被淹没了,那么我就把它们全都放了,但是把它们全部放在一起可能有一些好处吗?例如较大的丢失概率较低?结合UDP数据包?
通常,联网通道将受限于每秒可发送数据包的速率。因此,如果您希望每秒发送数百万条消息,则通常希望将它们合并为更少数量的数据包,以避免重大数据包丢失。
作为一种过度概括,Windows不会像UDP每秒大于10,000个数据包,但是您可以使用大型MTU数据包饱和一个千兆网络。
将几个UDP数据包组合成一个数据包,而不是一个接一个地发送它们有什么好处?
可以保存在每个数据报8字节的UDP报头上,从而减少通过线路发送的数据量。只要确保不发送更多的MTU sans IP和UDP标头大小以避免IP层上的碎片化。另外,标准的POSIX套接字API需要一个send/sendto/sendmsg()
系统调用来发送或接收一个数据报,所以通过发送较少的数据报,一个系统调用减少了总体延迟(每个调用几微秒的顺序),所需的系统调用更少。从3.0开始的Linux内核提供sendmsg()
和recvmmsg()
函数来在一次系统调用中发送和接收多个数据报。
我知道,如果大数据包被courrupted然后我失去所有的
真。但是,如果协议无法应对UDP数据报丢失,那么可能无关紧要 - 只要一个数据报丢失,它就会被破坏。
对于包大小很小(小于100字节)的情况很重要。 IP/UDP标头至少有28个字节。
想象一下,您有流式连接到服务器,每个数据包包含50个字节,并且您的软件以每秒1000个数据包速率发送数据包。
实际的有效载荷是1000 * 50 bytes = 50000 bytes.
头开销1000 * 28 = 28000 bytes
总字节数:50000 + 28000 = 87000 ==> 87 KBps
想象一下,你可以每3个UDP数据包组合成一个包:
页眉开销1000/3 * 28 = 9333
总字节数:50000 + 9333 ===> 60 KBps
这-in一些应用程序 - 节省了很大一部分带宽。
udp是“尽力而为”协议。繁忙的路由器可能会选择丢弃一个较大的udp数据包,而一个小型的路由器可能会通过流量中断。没有任何保证。 –
如果不是评论,我会给这个最好的答案 – Lauer