未接收大于 1472 的 UDP 数据包

未接收大于 1472 的 UDP 数据包

我有 1 个# 客户端应用程序。它使用 UDP 将数据发送到我的服务器。

但是,在我升级到 Windows 2019 Server 后,它就停止工作了。

它停止工作的原因包含在此链接中:

https://social.technet.microsoft.com/Forums/Windows/en-US/965e107e-d9b0-4240-ac3f-74797c91b476/unable-to-send-udp-packets-larger-than-the-mtu-with-windows-build-1809-using-c-udpclient?forum=win10itpronetworking

本质上,它说的是:

我的结论是,此优化(UDP 校验和卸载)在 1809 版本中已损坏,并且在 1903 版本中仍然损坏。要暂时解决此问题,需要禁用此优化(默认情况下似乎已启用)。这可以在设备管理器中完成。在列表中找到您的网络适配器卡,然后进入“高级”选项卡。我们只处理 IPv4,但 IPv6 也可能受到影响,因此您可能需要禁用两者。

这对我来说不起作用,因为:

我们刚刚测试了最新的 Windows 10 版本 1903,但仍然无法解决这个问题。

因此,对于我的产品,我需要能够通过单工机制发送。我正在查看 TCP,但我看不到单工“设置”?

有什么建议吗?

额外的

因此,我想使用单工的原因是我想使用连接到 Raspberry Pi 的 GSM 调制解调器将字节数组数据发送到我的服务器。我更喜欢使用 UDP,因为它确实会等待服务器的任何响应,因为没有给出任何响应,即收到有关帧的信息。

我发现 GSM 调制解调器确实像双工连接并且总是重置其 DHCP 地址,从而使应用程序无用。

所以,就像我说的,它适用于旧版 Windows 操作系统,但不适用于新版操作系统。

我还是更喜欢使用 UDP。该链接中的建议不起作用。

因此,我在 Google 上搜索了 TCP 连接 - 知道它不适合我的应用程序结构 - 但想知道是否可以将其设置为单工协议而不是双工协议,从而避免“需要握手”。

关于单纯形法,Google 搜索结果为零。

因此,由于我无处可去,我出于绝对的绝望,在这里提出了这个问题,

答案1

TCP 是全双工连接,但您可以通过它发送单工数据。在较低层,tcp 将建立连接并发送数据包。接收方将为收到的每个段发送确认,但除非您使用原始套接字,否则应在网络堆栈中处理该问题。

只需确保启用窗口缩放并在客户端上使用较大的接收窗口,这将防止出现 TCP 窗口已满问题。如果发送方和接收方位于同一网络上,则默认设置不会出现此问题。

如果您需要跨 WAN 链路或互联网,则可能需要计算 BDP 或带宽延迟乘积。这将使用您要发送的带宽和往返时间来计算所需的接收窗口。

相关内容