UDP数据是否有可能损坏?我知道它可能会丢失。
6 回答
UDP 数据包使用 16 位校验和。UDP 数据包损坏并非不可能,但可能性很小。无论如何,它并不比 TCP 更容易受到损坏。
首先,上面提到的“IP校验和”只是一个IP头校验和。它不保护有效载荷。参见 RFC 791
其次,UDP 允许传输没有校验和,这意味着 16 位校验和设置为 0(即无)。请参阅 RFC 768。(传输的校验和值全为零表示发送器未生成校验和)
第三,正如其他人所提到的,UDP 有一个 16 位的校验和,这不是检测多位错误的最佳方法,但也不错。未检测到的错误当然有可能潜入,但可能性很小。
可能的?绝对地。未被发现?不太可能,因为 UDP 使用需要多位错误才能显示有效的校验和。如果检测到错误,系统可能会丢弃数据包——这就是使用 UDP 的风险。
UDP 数据包也可以乱序传送,因此如果您在 UDP 之上设计协议,您也必须考虑到这一点。
影响毫无戒心的程序员的常见“损坏”形式是数据报截断。有关更多信息,请参见 Stevens 的“Unix Network Programming”(第 2 版中的第 539 页。)
您可以检查 MSG_TRUNC 标志...
简短的回答:是的。
详细解答:
大约 7 年前(也许是 2011 年?)我们发现在中国的一台计算机和韩国的另一台计算机之间交换一个 UDP 数据报时,UDP 数据报会被无意更改。当然,UDP数据包头中的校验和也针对有效载荷的变化进行了重新计算。两台计算机中没有恶意软件。
我们发现只有当这些条件匹配时才会发生无意的变化:
- 数据报的前几个字节与前面的数据报相似
- 仅在 UDP 数据报从一个国家传送到另一个国家时发生
我不确切的原因,但我大致猜它是中国金盾。
因此,我们将数据报乱码算法添加到软件 ProudNet 中,问题就消失了。实施起来并不难。只需编码或混淆数据报的前几个字节。