【发布时间】:2014-12-21 04:16:52
【问题描述】:
我用多播套接字编写了一个简单的 udp 服务器客户端应用程序。服务器每 6 毫秒向三个客户端发送数据包。包 大小为 1200 字节。这是每秒 166,66 个数据包。每当其中一个客户端检测到丢失的数据包时,它都会通过单播向服务器发送一个 NACK 数据包 .
第一次测试: 服务器和三个客户端通过以太网连接到路由器 TP-Link TL-WDR4300 (dd-wrt),一切正常。
第二次测试: 只有服务器通过以太网连接到路由器,其他客户端通过无线 2.4 GHz 和固定信道连接。两个问题来了 使用无线:第一个问题是丢包,客户端只接收到 50% 的数据包。并且丢失出现在突发中,例如接收到400个数据包, 200 丢失等。第二个问题 是当客户端将 NACK 数据包发送回服务器时,我可以在 wireshark 上看到,但我的应用程序无法接收它们。 这很奇怪,因为代码与客户端通过以太网连接时的代码相同。那么,有什么想法吗?我会很感激的
服务器代码:
while (1) {
FD_ZERO(&readfds);
FD_SET(sd, &readfds);
tv.tv_sec = 0;
tv.tv_usec = 0;
rv = select(sd + 1, &readfds, NULL, NULL, &tv);
while (rv == 1) {
nack_processing(sd);
rv = select(sd + 1, &readfds, NULL, NULL, &tv);
}
}
return 0;
}
我还进行了更新以减少流量: 数据包大小:800 字节 数据包之间的到达时间:10 ms = 每秒 100 个数据包 = 0.076 MB /s
我测量了服务器端和客户端的流量: 服务器 ~ 10 MB/s 客户端 ~ 5 MB /s
一切正常
【问题讨论】:
-
数据包是否通过相同的路径?否则可能是路径中某些 n/w 元素的多播配置问题
-
UDP 不是一种可靠的传输方式,因此可能会丢弃数据包。其次,在大多数情况下,UDP 广播受到网络节点的限制,因此广播仅在位于同一电缆或无线路由器同一侧的设备的特定子网内可见。
-
丢弃 UDP 数据包的原因有很多,其中之一是网络堆栈耗尽了可用的网络数据包缓冲区。因此,如果您的流量很大并且网络节点无法在更多数据进入之前传输已经接收到的数据,则数据包将被丢弃。
-
我不确定我是否理解路径...所有数据包都发送到多播 IP 地址。什么是 n/w 路径以及在哪里检查它?
-
我知道 UDP 不可靠,而且我可以预料到损失,但是这种突发非常奇怪且不常见,我认为问题出在其他地方。 Richard 我发送的流量减少了,但问题仍然存在。你还有其他建议吗?顺便说一句,客户端位于无线路由器的同一侧
标签: c udp multicastsocket