使用C#UdpClient

时间:2019-03-21 15:43:36

标签: c# windows udp windows-10 mtu

下面的简短版本-运行Windows Build 1809时,我们似乎无法成功发送大于1472字节的UDP数据包,尽管在以前的版本中它可以正常工作。

我们有一个在本地有线网络上运行的现有C#应用程序(实际上是一组应用程序),该应用程序定期发送UDP数据包以将状态传达给网络上不同计算机上的其他应用程序。这些数据包有些很小,但有些相当大,接近UDP的64k限制。此应用程序使用.NET 4.5.1用C#编写,并使用UdpClient类广播和接收广播。在使用Windows 10内部版本1809 / Windows Server 2019内部版本1809进行测试之前,一切正常-我们发送并接收了较大的数据包,没有问题。但是,从内部版本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,以查看可能发生的情况。但是,这很奇怪,即使我退出Wireshark,在Build 1809系统上启动Wireshark也会突然使其能够发送数据包。但是,重新引导系统会将其恢复为无法成功发送的原始状态。我应该注意,无论它们是否正常工作,在接收端的Wireshark中我总是会看到这些数据包的“碎片IP协议”。

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

很长一段时间以来,我们都没有对代码的这一部分进行任何代码更改-它在内部版本1809之前的Windows 7,Server 2012R2,Server 2016和Windows 10上都可以运行。内部版本1809是否有新要求?在某处设置标志或在网络适配器上进行配置?我不知道Wireshark在启动时会做什么,但是似乎可以以某种方式“修复”问题,因此,如果有人对这有什么特别的了解也可能会有所帮助。

1 个答案:

答案 0 :(得分:1)

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

见:https://www.catalog.update.microsoft.com/Search.aspx?q=KB5001649

在我可以找到的任何地方都没有在此知识库中特别提及,但这是支持人员给我的版本,并且在应用此更新后已修复。