发送给您的 UDP 数据是否有可能已损坏?我知道它可能会丢失。

有帮助吗?

解决方案

UDP 数据包使用 16 位校验和。UDP 数据包损坏并非不可能,但可能性很小。无论如何,它并不比 TCP 更容易受到损坏。

其他提示

首先,上面提到的“IP校验和”只是IP头校验和。它不保护有效负载。参见 RFC 791

其次,UDP允许传输无校验和,这意味着16位校验和设置为0(即无)。请参阅 RFC 768。(传输的校验和值全为零意味着发送器未生成校验和)

第三,正如其他人提到的,UDP 有一个 16 位 checkSUM,这不是检测多位错误的最佳方法,但也不错。未检测到的错误当然有可能潜入,但可能性很小。

可能的?绝对地。未被发现? 不太可能, ,因为 UDP 使用校验和,需要多位错误才能显示有效。如果检测到错误,系统可能会丢弃数据包 - 这就是使用 UDP 的风险。

UDP 数据包也可能会无序传送,因此如果您在 UDP 之上设计协议,您也必须考虑到这一点。

影响毫无戒心的程序员的一种常见“腐败”形式是 数据报截断. 。有关详细信息,请参阅 Stevens 的“Unix Network Planning”(第 2 版第 539 页)。

您可以检查 MSG_TRUNC 标志...

简短回答:是的。

详细解答:

大约 7 年前(也许是 2011 年?)我们发现,当中国的一台计算机和韩国的另一台计算机之间交换 UDP 数据报时,UDP 数据报会被无意中更改。当然,UDP数据包头中的校验和也会根据有效负载的变化而重新计算。两台计算机中没有恶意软件。

我们发现,只有在满足以下条件时才会发生无意的更改:

  • 数据报的前几个字节与前面的数据报类似
  • 仅当 UDP 数据报从一个国家传输到另一个国家时才会发生

具体原因我不太清楚,但大概是这样 中国金盾.

所以我们在我们的ProudNet软件中添加了数据报乱码算法,问题就消失了。实施起来并不困难。只需对数据报的前几个字节进行编码或混淆即可。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top