UDP数据是否可以被破坏?

时间:2008-09-06 22:45:32

标签: c++ networking udp

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

6 个答案:

答案 0 :(得分:21)

UDP数据包使用16位校验和。 UDP数据包不是不可能有腐败,但它不太可能。在任何情况下,它都不比TCP更容易受到腐败。

答案 1 :(得分:14)

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

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

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

答案 2 :(得分:6)

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

答案 3 :(得分:5)

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

答案 4 :(得分:3)

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

您可以查看MSG_TRUNC标志...

答案 5 :(得分:0)

简短的回答:是的。

详细答案:

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

我们发现无意更改仅在以下条件匹配时发生:

  • 数据报的前几个字节与上一个数据报类似
  • 仅当UDP数据报从一个国家发送到另一个国家时发生

我不是确切原因,但我粗略猜测是China Golden Shield

因此,我们将数据报收集算法添加到软件ProudNet中,问题就消失了。实施起来并不难。只需对数据报的前几个字节进行编码或混淆。