【发布时间】:2019-08-12 12:45:04
【问题描述】:
以下的简短版本 - 在运行 Windows 的 Build 1809 时,我们似乎无法成功发送大于 1472 字节的 UDP 数据包,尽管它在以前的版本中运行良好。
我们有一个现有的 C# 应用程序(实际上是一组应用程序),它在本地有线网络上运行,它定期发送 UDP 数据包以将状态传达给网络上不同计算机上的其他应用程序。其中一些数据包很小,但有些相当大,接近 UDP 的 64k 限制。此应用程序使用 .NET 4.5.1 用 C# 编写,并使用 UdpClient 类来广播和接收广播。在使用 Windows 10 build 1809 / Windows Server 2019 build 1809 进行测试之前,一切正常 - 我们发送和接收更大的数据包没有问题。但是,从 build 1809 开始,我们似乎无法再成功发送大数据包。以下是我们进行的一些测试:
系统 1:Windows 10 Build 1803(MTU 为 1500)
系统 2:Windows 10 Build 1809(MTU 为 1500)
我编写了一个测试程序,它使用 UdpClient 发送一个小的(200 字节左右)和一个大的(8000 字节左右)UDP 数据包,同时还监听这些数据包。以下是我从每个系统发送时发生的情况:
-从系统 1 发送:
-System 1 sees both packets
-System 2 sees both packets
-从系统 2 发送:
-System 1 sees only the small packet
-System 2 sees both packets
这种情况每次都会发生 - 大数据包永远不会成功到达。进一步的测试表明,幻数是 1472 字节。那或更少的工作,而且更多的是失败。这就是为什么我怀疑带有碎片/MTU 的东西不能正常工作的原因。我们以前没有遇到过这个问题,所以我启动了 Wireshark 来看看可能发生了什么。然而,这就是奇怪的地方,在 Build 1809 系统上启动 Wireshark 突然使它能够发送数据包,即使我退出 Wireshark。但是,重新启动系统会将其恢复到无法成功发送的原始状态。我应该注意,无论它们是否正常工作,我总是在 Wireshark 中看到这些数据包的“分段 IP 协议”。
我在网上做了一些阅读,发现 RDP over UDP 在 Build 1809 中进行了大修,但我没有看到任何关于大于 MTU 的 UDP 数据包有问题的信息,我也找不到其他人报告这个问题问题。
很长一段时间以来,我们都没有对这部分代码进行任何代码更改 - 它在构建 1809 之前的 Windows 7、Server 2012R2、Server 2016 和 Windows 10 上运行。在 Build 1809 中是否有新的东西需要我们在某处设置标志或在网络适配器上配置某些内容?我不知道 Wireshark 在启动时会做什么,但它似乎以某种方式“修复”了一些事情,所以如果有人知道这可能是什么具体的可能也有帮助。
【问题讨论】:
-
这听起来像是驱动程序问题。请参阅:wiki.wireshark.org/WinPcap。它可能需要更新。和osqa-ask.wireshark.org/questions/55441/…。试试 NCAP
-
虽然这是可能的,但我们的系统上通常根本没有 Wireshark(我只是放在那里进行测试)。此外,我有一个运行 1803 的系统运行良好,然后当我安装 1809 更新时,它开始运行不佳,所以我怀疑网络驱动程序是问题所在。
-
wireshark 启动时会替换 PCAP/NCAP,所以我认为它是驱动程序。当 wireshark 运行时你就开始工作了。
-
我仔细检查了驱动程序的更新,它们是最新的。一些测试是使用运行 1803 或 1809 的虚拟机完成的,我在 1809 机器上看到了问题,但在 1803 机器上没有看到问题(都具有相同的驱动程序)。此外,仅运行 Wireshark 并退出似乎可以“修复”问题直到重新启动,所以我认为它可能是一些设置的更改会有所帮助(尽管我不知道这可能是)。
-
我用 Windows Server 2019 做了一些进一步的测试(一切都更新到了最新的),我在那里看到了同样的问题。我也尝试使用 Packet Sender(刚刚下载),这也显示了问题。
标签: c# windows udp windows-10 mtu