多播时通过 WiFi 使用 UDP 丢失数据
Losing data with UDP over WiFi when multicasting
我目前正在使用一个网络协议,其中包括一个客户端到客户端系统,可以在当前本地网络上自动发现客户端。
现在,我定期在 255.255.255.255
上广播,如果客户端在 30 秒内没有发出信号,我认为它已死(然后离线)。目标是保持最新的客户端运行列表。它使用 UDP 运行良好,但 UDP 不能确保数据包已成功传递。因此,当涉及到网络的 WiFi 部分时,我有时会遇到 "false postivives" 死掉的客户端。目前我已经减少了两次广播之间的时间来解决这个问题(仍然没有很好地工作),但我觉得这不太干净。
我可以做些什么来保留 "online" 客户的列表,而不会有 "false positives" 的风险?
你可以把这个翻过来,所以你会广播"ServerIsUp"消息
每个客户端都可以在服务器上注册。当客户端下线时会注销,否则你可以认为它还活着。
为了最大限度地减少误报,由于丢包,您应该稍微改变一下 heartbeat
协议的逻辑。
您可以每隔 N
秒一个接一个地发送 3 个或更多数据包,而不是依赖于每 N
秒广播一个数据包。这是 ping
和 traceroute
工具遵循的方法。使用此方法,您可以显着降低从对等方丢失通知的可能性。
此外,您可以指定您的应用程序可以承受的一定数量的丢失通知。另外,为了尽量减少使用无线网络丢包的可能性,尽量减小广播UDP数据包的大小。
我目前正在使用一个网络协议,其中包括一个客户端到客户端系统,可以在当前本地网络上自动发现客户端。
现在,我定期在 255.255.255.255
上广播,如果客户端在 30 秒内没有发出信号,我认为它已死(然后离线)。目标是保持最新的客户端运行列表。它使用 UDP 运行良好,但 UDP 不能确保数据包已成功传递。因此,当涉及到网络的 WiFi 部分时,我有时会遇到 "false postivives" 死掉的客户端。目前我已经减少了两次广播之间的时间来解决这个问题(仍然没有很好地工作),但我觉得这不太干净。
我可以做些什么来保留 "online" 客户的列表,而不会有 "false positives" 的风险?
你可以把这个翻过来,所以你会广播"ServerIsUp"消息 每个客户端都可以在服务器上注册。当客户端下线时会注销,否则你可以认为它还活着。
为了最大限度地减少误报,由于丢包,您应该稍微改变一下 heartbeat
协议的逻辑。
您可以每隔 N
秒一个接一个地发送 3 个或更多数据包,而不是依赖于每 N
秒广播一个数据包。这是 ping
和 traceroute
工具遵循的方法。使用此方法,您可以显着降低从对等方丢失通知的可能性。
此外,您可以指定您的应用程序可以承受的一定数量的丢失通知。另外,为了尽量减少使用无线网络丢包的可能性,尽量减小广播UDP数据包的大小。