当多个listner实例正在运行时,多播中的数据包丢失

Posted

技术标签:

【中文标题】当多个listner实例正在运行时,多播中的数据包丢失【英文标题】:Packet drops in multicast when multiple instance of listner are running 【发布时间】:2015-08-23 21:23:03 【问题描述】:

我有一个多播服务器,它不断地发送多播数据包。有一个侦听器正在同一台机器上侦听此数据(环回多播)。当只有一个侦听器实例正在运行时,我看不到数据包丢失,但是一旦我运行多个实例,我看到两个侦听器实例都丢弃了数据包。有人可以解释为什么会发生这种情况以及是否有任何开源解决方案来解决这个问题? 提前致谢!

【问题讨论】:

由于组播是基于UDP的,所以默认传输是不可靠的。 【参考方案1】:

UDP 不提供任何可靠性机制。这意味着如果第 3 层数据包丢失,则无法恢复。

在本地主机连接上,数据包可能会因队列溢出而丢失。如果应用程序临时写入数据的速度快于操作系统为队列提供服务的速度,则传输队列可能会溢出。同样,如果应用程序读取数据的速度不够快,接收队列可能会溢出。如果有两个侦听器,系统会做更多的工作,因此更有可能发生溢出。

在 Linux 中,netstat -su 将显示 RcvbufErrors 和 SndbufErrors。您可以使用 setsockopt SO_SNDBUF 和 SO_RCVBUF 增加这些缓冲区的大小。这些值受 /proc/sys/net/core/wmem_max 和 rmem_max 的限制。

在 Windows 中,似乎可以使用相同的 socktopts,并且可以像 here 那样更改默认值。

【讨论】:

以上是关于当多个listner实例正在运行时,多播中的数据包丢失的主要内容,如果未能解决你的问题,请参考以下文章

为啥 java 多播接收器无法在 Windows XP 上接收数据包?

Go:如何为多个包运行测试?

TCP/IP详解 笔记九

如何为我的应用程序选择多播地址?

当其他包中有Java文件时,如何编译多个Java文件?

Rxjs: 单播和多播