Windows10中如何设置UDP包重组超时
How to set the UDP packet reassembly timeout in Windows 10
我目前正在用 Visual C++ 开发图像采集应用程序,它从功能有限(即没有 UDP 校验和)的 UDP 硬件设备接收图像数据。该设备具有到专用交换机的 GBit 连接,PC 使用专用 NIC 和到该交换机的 10GBit 连接。
传输的图像数据由大小为6528到19680字节的数据包组成。这些数据包由硬件设备分段,并由 PC 上的网络堆栈重建。
有时会丢失一个数据包(称为数据包#4711),PC 端会尝试重建它很长时间。在此时间跨度内,由于 16 位数据包 ID 溢出,硬件设备将发送具有相同打包 ID 的新数据包。现在 PC 接收到(新)数据包#4711 的新片段,并使用它来完成旧的、仍未组装的数据包,并组装一个损坏的数据包。最重要的是,新#4711 数据包的剩余片段被存储并与下一个#4711(将在几秒钟后收到)合并。所以系统运行的时间越长,就会有越多的数据包 ID 被泄露,直到完全无法通信。
我们无法在硬件设备上计算 UDP 校验和,因为它的功能有限。
我们不能使用 IPv6(它会提供更大的数据包 ID),因为不支持硬件设备。
我们将不得不在 UDP 和 "manually" 之上实现我们自己的协议并重建数据,但如果我们能找到一种方法来减少 [=34] 上的数据包重建超时,我们就可以避免这种情况=] 到 500 毫秒或更短。
我在 Google 和 Whosebug 上搜索了资料,但结果不多,其中 none 个对我帮助很大。
因此出现问题:有没有办法通过注册表、Windows API 或任何其他魔法减少 Windows 10 上 IPv4 UDP 片段的重建超时,或者您有有更好的建议吗?
自 Windows 2000 年以来,由于严格的 RFC 2460 兼容性,其硬编码没有正式的方法来修改 ip 数据包重组超时。
目前唯一的可能性似乎是使用自 Windows 7 以来受到限制的原始套接字,并且并非每个套接字提供商都可用。这会使应用程序变得更加复杂。
我们将更改我们的软件协议,以便根本不会发送大于 1400 字节的数据包。这迫使我们关心软件中的碎片,但可以防止 IP 数据包碎片及其所有陷阱。或许这才是处理此类问题的正确方式。
我目前正在用 Visual C++ 开发图像采集应用程序,它从功能有限(即没有 UDP 校验和)的 UDP 硬件设备接收图像数据。该设备具有到专用交换机的 GBit 连接,PC 使用专用 NIC 和到该交换机的 10GBit 连接。
传输的图像数据由大小为6528到19680字节的数据包组成。这些数据包由硬件设备分段,并由 PC 上的网络堆栈重建。
有时会丢失一个数据包(称为数据包#4711),PC 端会尝试重建它很长时间。在此时间跨度内,由于 16 位数据包 ID 溢出,硬件设备将发送具有相同打包 ID 的新数据包。现在 PC 接收到(新)数据包#4711 的新片段,并使用它来完成旧的、仍未组装的数据包,并组装一个损坏的数据包。最重要的是,新#4711 数据包的剩余片段被存储并与下一个#4711(将在几秒钟后收到)合并。所以系统运行的时间越长,就会有越多的数据包 ID 被泄露,直到完全无法通信。
我们无法在硬件设备上计算 UDP 校验和,因为它的功能有限。
我们不能使用 IPv6(它会提供更大的数据包 ID),因为不支持硬件设备。
我们将不得不在 UDP 和 "manually" 之上实现我们自己的协议并重建数据,但如果我们能找到一种方法来减少 [=34] 上的数据包重建超时,我们就可以避免这种情况=] 到 500 毫秒或更短。
我在 Google 和 Whosebug 上搜索了资料,但结果不多,其中 none 个对我帮助很大。
因此出现问题:有没有办法通过注册表、Windows API 或任何其他魔法减少 Windows 10 上 IPv4 UDP 片段的重建超时,或者您有有更好的建议吗?
自 Windows 2000 年以来,由于严格的 RFC 2460 兼容性,其硬编码没有正式的方法来修改 ip 数据包重组超时。
目前唯一的可能性似乎是使用自 Windows 7 以来受到限制的原始套接字,并且并非每个套接字提供商都可用。这会使应用程序变得更加复杂。
我们将更改我们的软件协议,以便根本不会发送大于 1400 字节的数据包。这迫使我们关心软件中的碎片,但可以防止 IP 数据包碎片及其所有陷阱。或许这才是处理此类问题的正确方式。