我一直使用 UDP/WiFi 在嵌入式设备(ESP32 充当 UDP 服务器)和我的 Windows 机器之间传输数据。我的目标是尽可能频繁地发送尽可能多的短数据包(8-64 字节有效负载),以便通过 WiFi 进行实时控制和遥测。我的一个应用是机器人的远程操作,这需要非常频繁地传输重复的短数据帧。
在测试期间,我注意到,如果我仅从 Windows 客户端向 ESP32 服务器发送数据,每秒会经历几次数据包传输的高延迟(~300 毫秒)。我可以通过不使用广播 IP(即直接将数据包发送到我的服务器)来减少这种延迟,但 300 毫秒的延迟仍然存在,只是频率降低了(大约每秒一次)。但是,我可以通过反复将虚拟数据从服务器传回 Windows 客户端来几乎完全消除这些延迟。数据甚至不需要实际读取(即没有 recvfrom() 调用),似乎只是向客户端发送任何数据的行为都会导致 Windows 优先传输到服务器。我在 Windows 上的 C++ 和 Python UDP 客户端实现中都观察到了这种行为。事实上,ESP32 似乎从未出现过此问题(即,网络上以非常一致的速率出现重复的高频传输),而且我在三个不同的路由器和两台不同的 Windows 机器(来自不同的制造商)上观察到了这种行为,这使我得出结论,是 Windows 导致了这个问题。
这(发送垃圾数据)是减少延迟和数据包延迟变化的有效技术吗?我怀疑 Windows 是造成这些延迟的罪魁祸首,对吗?这是 Windows 的已知行为吗?我是否可以采用其他更适合我的应用程序的技术或策略?