UDP 数据是不是会损坏?

Posted

技术标签:

【中文标题】UDP 数据是不是会损坏?【英文标题】:Can UDP data be delivered corrupted?UDP 数据是否会损坏? 【发布时间】:2010-09-08 01:18:23 【问题描述】:

UDP 数据是否可能损坏?我知道它可能会丢失。

【问题讨论】:

【参考方案1】:

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

【讨论】:

技术上校验和是可选的。来自 RFC 768:“传输的校验和值全为零意味着发送器没有生成校验和(用于调试或不关心的更高级别的协议)。” 是的,但是:a) 我猜,校验和始终是为正常的未专门配置的 UDP 传输计算的,b) 如果数据包看起来具有正确的长度和校验和,那么它是正确的,否则系统不会将这样的数据包传递给调用者。对吗?【参考方案2】:

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

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

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

【讨论】:

如果数据报到达时没有校验和,应用程序是否可以要求提供该信息? 感谢您澄清 IP 校验和仅适用于标头。 @RandomInsano 请注意,海报有三点。第 1 点谈到“IP 校验和”,它比 UDP 低一级,第 3 点说 UDP 确实有一个校验和。所以有 2 个校验和,保护 IP 头的 IP 和保护 UDP 头和数据的 UDP 校验和。因此数据受到保护。 @benc 否。校验和由操作系统处理,只有当数据包通过校验和验证(或在零校验和时跳过验证)时,用户才会收到数据包。用户不知道是否使用了校验和。 根据 RFC,校验和不仅仅针对头:“校验和是来自 IP 头的伪头信息的反码和的 16 位反码,UDP 头,以及数据”【参考方案3】:

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

【讨论】:

【参考方案4】:

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

【讨论】:

【参考方案5】:

影响毫无戒心的程序员的常见“损坏”形式是数据报截断。有关更多信息,请参阅 Stevens 的“Unix Network Programming”(第 2 版第 539 页。)

您可以检查 MSG_TRUNC 标志...

【讨论】:

【参考方案6】:

简短回答:是的。

详细回答:

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

我们发现只有当这些条件匹配时才会发生无意的变化:

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

我不知道确切的原因,但我大致猜想是China Golden Shield。

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

【讨论】:

以上是关于UDP 数据是不是会损坏?的主要内容,如果未能解决你的问题,请参考以下文章

从 Hibernate 处理的 h2 数据库的表中删除是不是会损坏表?

Windows:要求 Socket 传递所有数据包(甚至是损坏的数据包)

H2 数据库:NIO JVM 错误消息是不是与 H2 相关(可能还有数据库损坏)?

如何检测pdf文档是不是有损坏

如何检测PDF文档是不是损坏了?

什么原因造成TF卡损坏?