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