use*_*803 5 c udp multicastsocket
我编写了一个带有多播套接字的简单 udp 服务器客户端应用程序。服务器每 6 毫秒向三个客户端发送数据包。数据包大小为 1200 字节。这是每秒 166,66 个数据包。每当客户端检测到丢失的数据包时,它就会通过单播向服务器发送 NACK 数据包。
第一次测试: 服务器和三个客户端通过以太网连接到路由器 TP-Link TL-WDR4300 (dd-wrt),一切正常。
第二次测试: 只有服务器通过以太网连接到路由器,其他客户端通过无线2.4GHz和固定信道连接。无线存在两个问题:第一个问题是数据包丢失,客户端仅收到 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;
}
Run Code Online (Sandbox Code Playgroud)
我还进行了更新以减少流量:数据包大小:800 字节数据包之间的到达时间间隔:10 毫秒 = 每秒 100 个数据包 = 0.076 MB /s
我测量了服务器和客户端的流量:服务器 ~ 10 MB/s 客户端 ~ 5 MB/s
一切看起来都很好
请注意,您正在比较两种不同的接口/媒体。一种是有线接口,另一种是无线接口。
无线网络中的数据包丢失:
这可能是由多种原因造成的。然而,第一个直接检查点应该是 SNR、RSSI 和工作频率/同信道干扰。wifi 分析仪几乎可以带您接近解决方案。
无线路由器位置- 检查无线路由器是否位于需要覆盖的区域的中心位置。确保通过覆盖区域的适当重叠来避免覆盖漏洞。确保避开中间的建筑物以减少干扰。另请注意,距离和用户的数据速率之间存在关系。用户越近,数据速率越高,因为路径损耗减少(因为这反过来又增加了 SNR)。
天线类型- 各向同性天线提供球体形式的覆盖区域。偶极天线以甜甜圈的形式提供覆盖区域。还有各种定向天线。请注意,如果小区尺寸较大,全向天线可能会导致隐藏节点问题。具有聚焦波束的天线会有所帮助。多扇区定向天线可以提供高容量、大范围。天线的类型、位置和天线增益决定了无线电传输范围和覆盖区域。
通信信道/工作频率- 在同一无线电覆盖区域内以相同频率运行的其他 AP 的存在可能会造成干扰。在这种情况下,如果附近只有 802.11 设备,则应相应更改工作信道和信道间隔,以减少干扰。
功率级别- 较高的功率级别可以增加范围,但如果附近有 AP,则可能会导致干扰。为了获得更高的容量,AP 可能会靠近在一起,在这种情况下,优先选择低功率水平以减少干扰。
其他设备- 非 802.11 设备(如微波炉、蓝牙、无绳电话等)也会引入干扰。在这种情况下,最好移除这些设备或对其进行屏蔽以避免干扰。
突发数据包丢失似乎也表明堆栈无法处理突发流量,并且其流量整形策略可能只是丢弃此类突发数据包。仔细检查是否产生了此类流量突发。
NACK 未到达服务器: 同样,这可能是由于与传输介质相关的问题导致 NACK 在空中丢失。如果 NACK 已到达主机但未到达服务器应用程序/未处理,则可能是由于服务器架构或堆栈相关操作系统配置造成的。
分析丢包场景的典型步骤