【问题标题】:UDP packets lost when using windows but not Linux使用 windows 而不是 Linux 时 UDP 数据包丢失
【发布时间】:2018-07-25 22:25:13
【问题描述】:

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

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

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

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

【问题讨论】:

  • UDP 不是一个可靠的协议,使用它的应用程序应该做好丢包的准备。大容量会溢出缓冲区,然后数据包将被丢弃。
  • 在 Windows 和 Linux 上你用什么来接收数据包?
  • @Barmar OP 似乎意识到了这一点。问题是关于 Windows 和 Linux 之间的损失差异。
  • 可能只是它为 UDP 提供的缓冲区数量不同。可能有一个注册表设置来调整它。
  • @Barmar UDP 的决定是由客户端强加给我们的,但是我预计使用 Linux 和 Windows 之间会出现持续的失败,而不是两者之间的巨大差异。此外,局域网上的数据包丢失应该最小到 0。

标签: linux windows udp


【解决方案1】:

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

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

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

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

您也可以使用getsockopt 来检查大小。

【讨论】:

  • 接收大小设置了足够大的缓冲区,并且在测试 Windows 和 Linux 之间没有变化。我们已将问题隔离在 Windows 系统的发送端。
  • 好的,发送端有 SO_SNDBUF 选项。我不确定它如何与 UDP 一起使用。
【解决方案2】:

经过研究和调查,尽管我努力尝试证明并非如此,但答案似乎是,它只是 Windows。 Windows 网络缓冲导致问题。由于解决此问题超出了此问题的范围,因此我将关闭此问题,并在必要时打开一个新问题,感谢您的帮助。

【讨论】:

    猜你喜欢
    • 2015-06-30
    • 1970-01-01
    • 2018-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多