首页 > 解决方案 > 使用 windows 而不是 Linux 时 UDP 数据包丢失

问题描述

我正在尝试找出可能导致我在测试系统时观察到的奇怪问题的原因。

被测系统通过 UDP 从外部源接收 HTTP 请求。为了进行测试,我使用 Python 通过本地网络发送 UDP 数据包来模拟这个源,以进行测试,我发送 1、20、133 和 1000 条消息。

当我在本地 Windows 机器上运行测试时,我经常会丢失 UDP 数据包,有时甚至无法接收到单个消息。但是,当我使用 Virtual Box 创建一个虚拟 Linux Box (Centos) 并从那里运行相同的测试时,我 100% 的时间获得了 100% 的成功率。

从 Windows 发送 UDP 消息是否有任何已知问题,我可以在我的机器上调整 Windows 和 Linux 之间的任何奇怪的缓冲差异?

标签: linuxwindowsudp

解决方案


如果传入的数据包不适合接收缓冲区,则操作系统的 UDP 堆栈通常会丢弃接收到的 UDP 数据包。如果接收应用程序没有足够快地读取它(=套接字),则接收缓冲区可能是“满的”。

Windows 的默认接收缓冲区大小可能比 Linux 中的要小。

为了更好地处理传入 UDP 数据包的突发,您可以增加接收缓冲区的大小:

sock.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, 65536)

您也可以getsockopt用于检查大小。


推荐阅读