【问题标题】:Multicast sockets packet loss多播套接字丢包
【发布时间】:2014-12-16 08:28:22
【问题描述】:

我用 C 编程语言编写了简单的多播服务器和客户端程序。然后我通过以太网接口将服务器连接到启用多播的路由器(支持dd-wrt)。客户端通过无线接口连接到路由器。我每 10 毫秒从服务器向客户端发送一次数据包。数据包大小为 512 字节。问题是客户端只接收到我在 Wireshark 中也可以看到的 40% 的数据包。这不是无线和丢包的问题,​​而是多播的问题,我不知道问题出在哪里。我还检查了数据速率,一切似乎都很好。有什么建议吗?谢谢

【问题讨论】:

  • 取决于您如何生成数据包。最明显的 UDP 数据包丢失是由于缓冲区溢出造成的。
  • 我能做些什么来修复缓冲区溢出?数据包是 char[512],使用 sendto 函数发送
  • 您需要在接收器套接字中设置 SO_RCVBUF 选项。但是,没有看到代码,我不能确定。
  • 代码很大,但我可以复制你感兴趣的部分,告诉我哪一部分和哪一边:服务器或客户端
  • 我应该在客户端设置 SO_RCVBUF 哪个值?如何计算缓冲区?

标签: c sockets networking multicast


【解决方案1】:

多播通过 UDP 运行。 UDP具有零丢包恢复功能。你所看到的是地方性的。如果您想要可靠性,您必须自己构建它。

【讨论】:

  • 是的,我知道。我还建立了重传机制。但是这个丢包问题不是因为UDP可靠性或无线链路,它可能与缓冲区大小或其他一些参数有关。现在我再次测试了我的系统,当数据包足够小时,丢包也很小,大约 2%。然后我将数据包大小增加到 1400 字节,我得到了 50% 的数据包丢失(1400 字节没有碎片)。然后我使用了 setsockopt 函数并将缓冲区大小设置为 65 000,但我仍然有大约 40% 的数据包丢失,这不是因为 UDP 可靠性。我该如何解决这个问题?
  • 设置更多的 UDP 缓冲区.. 比如 2000 000. 大约 2 MB。
  • 普遍接受的 UDP 有效负载大小限制为 534 字节。那不会被分段,因此数据包只能完整丢失。一旦发生碎片化,任何碎片的丢失都意味着整体的丢失。
  • 我设置 int buffer_size = 4200000;然后在客户端使用带有 SO_RCVBUF 的 setsockopt,但仍然对于像 1400 字节这样的大数据包(没有碎片,我在打开 wireshark 时看到)丢包率约为 50% ....有什么想法吗?
  • 这个想法是使用小于路径 MTU 的数据包。 534 被普遍接受。
猜你喜欢
  • 2012-10-21
  • 1970-01-01
  • 1970-01-01
  • 2013-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-09
相关资源
最近更新 更多