当多个侦听器实例 运行 时,多播中的数据包丢失
Packet drops in multicast when multiple instance of listner are running
我有一个不断发送多播数据包的多播服务器。有一个侦听器正在同一台机器上侦听此数据(环回多播)。当只有一个侦听器实例是 运行ning 时,我没有看到任何数据包丢失,但是一旦我 运行 多个实例,我看到数据包被两个侦听器实例丢弃。有人可以解释为什么会发生这种情况以及是否有任何开源解决方案来解决这个问题?
提前致谢!
UDP 不提供任何可靠性机制。这意味着如果第 3 层数据包丢失,将无法恢复。
在本地主机连接上,数据包可能会因队列溢出而丢失。如果应用程序暂时写入数据的速度快于 OS 可以为队列服务的速度,则传输队列可能会溢出。同样,如果应用程序读取数据的速度不够快,接收队列可能会溢出。有两个侦听器,系统会做更多的工作,因此更有可能发生溢出。
在Linux中,netstat -su 将显示 RcvbufErrors 和 SndbufErrors。您可以使用 setsockopt SO_SNDBUF 和 SO_RCVBUF 增加这些缓冲区的大小。这些值受限于 /proc/sys/net/core/wmem_max 和 rmem_max。
在 Windows 中,似乎可以使用相同的 socktops,并且可以像完成时那样更改默认值 here。
我有一个不断发送多播数据包的多播服务器。有一个侦听器正在同一台机器上侦听此数据(环回多播)。当只有一个侦听器实例是 运行ning 时,我没有看到任何数据包丢失,但是一旦我 运行 多个实例,我看到数据包被两个侦听器实例丢弃。有人可以解释为什么会发生这种情况以及是否有任何开源解决方案来解决这个问题? 提前致谢!
UDP 不提供任何可靠性机制。这意味着如果第 3 层数据包丢失,将无法恢复。
在本地主机连接上,数据包可能会因队列溢出而丢失。如果应用程序暂时写入数据的速度快于 OS 可以为队列服务的速度,则传输队列可能会溢出。同样,如果应用程序读取数据的速度不够快,接收队列可能会溢出。有两个侦听器,系统会做更多的工作,因此更有可能发生溢出。
在Linux中,netstat -su 将显示 RcvbufErrors 和 SndbufErrors。您可以使用 setsockopt SO_SNDBUF 和 SO_RCVBUF 增加这些缓冲区的大小。这些值受限于 /proc/sys/net/core/wmem_max 和 rmem_max。
在 Windows 中,似乎可以使用相同的 socktops,并且可以像完成时那样更改默认值 here。