繁体   English   中英

无法使用 C# UdpClient 使用 Windows Build 1809 发送大于 MTU 的 UDP 数据包

[英]Unable to send UDP packets larger than the MTU with Windows Build 1809 using C# UdpClient

下面的简短版本 - 在运行 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 协议”在事物的接收端。

我在网上做了一些阅读,发现基于 UDP 的 RDP 在 Build 1809 中进行了大修,但我没有看到任何大于 MTU 的 UDP 数据包有问题,我也找不到其他人报告这个特定问题。

很长一段时间以来,我们都没有对这部分代码进行任何代码更改 - 在构建 1809 之前,它适用于 Windows 7、Server 2012R2、Server 2016 和 Windows 10。Build 1809 中是否有一些新的东西需要我们设置一个在某处标记或在网络适配器上配置某些东西? 我不知道 Wireshark 在启动时做了什么,但它似乎以某种方式“修复”了一些东西,所以如果有人知道这可能是什么,这也可能有所帮助。

去年年初,我最终就此事联系了微软,并一直推动直到他们承认这是一个问题。 该问题影响 1809、1903、1909、2004 和 20H2。 他们终于在“2021-03 Windows 10 累积更新”中公开发布了该修复程序。 修复可用于 1903 及更高版本。 我已经确认此更新确实为我们解决了问题。

请参阅: https : //www.catalog.update.microsoft.com/Search.aspx?q=KB5001649

在我可以找到的任何地方都没有在此 KB 中专门提到它,但这是支持人员给我的版本,并且在应用此更新后已修复。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM