Windows XP 会自动重组 UDP 片段吗?

Windows XP 会自动重组 UDP 片段吗?

我有一个 Windows 应用程序,用于接收和处理通过 UDP 传输的 XML 消息。该应用程序使用 Windows“原始”套接字收集数据,因此整个第 3 层数据包都是可见的。

我们最近遇到了一个令我困惑的问题。

如果 XML 消息(即 UDP 数据包)很大(即 > 1500 字节),它们会像预期的那样被分割成碎片。通常,这会导致 XML 处理器失败,因为它会尝试将每个 UDP 数据包都当作完整的 XML 消息来处理。这是系统在开发阶段的一个已知缺点。

在 Windows 7 上,确实发生了这种情况。接收并记录了片段,但没有进行任何处理。然而,在 Windows XP 上,可以看到相同的片段,并且 XML 处理器似乎可以很好地处理所有事情。

Windows XP 会自动重组 UDP 片段吗?我猜对于正常的 UDP 套接字我可以预料到这种情况,但在我看来,这不是“原始”套接字的预期行为。此外,如果在 Windows XP 上是这种情况,为什么在 Windows 7 上的行为不一样?有没有办法启用此功能?

答案1

听起来错误出在 XML 处理器获取 UDP 数据报的方式上。它根本不应该查看数据包。那是 UDP 堆栈的工作。

XML 处理器应该向 UDP 层请求重新组装的 UDP 数据报。将数据报拆分为数据包,然后将这些数据包重新组装为数据报是 IP 和 UDP 堆栈的工作。

显然,如果您使用原始套接字,如果不复制此行为,UDP 将会中断。但不要使用原始套接字,而是按照预期的方式使用 UDP。

当您通过原始接口拦截数据包时,是在 IP 重组之前还是之后获取这些数据包取决于许多系统参数,例如启用了哪些防火墙以及它们具有哪些规则。如果您的代码在 IP 重组之后获取原始数据包,则它“恰好可以工作”。但依赖这一点是不可行的。如果不需要重组,它就不会发生,而且重组并不总是必要的。

相关内容