UDP 数据传递会损坏吗?

Can UDP data be delivered corrupted?

提问人:Net Citizen 提问时间:9/7/2008 更新时间:1/13/2019 访问量:14213

问:

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

C++ 网络 UDP

评论


答:

6赞 Kyle Cronin 9/7/2008 #1

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

23赞 Leon Timmermans 9/7/2008 #2

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

评论

3赞 Andrew Johnson 9/12/2008
从技术上讲,校验和是可选的。来自 RFC 768:“传输的校验和值全部为零意味着发送器不生成校验和(用于调试或不关心的更高级别的协议)。
0赞 Ethouris 11/15/2016
是的,但是:a)我猜,校验和总是针对正常的未专门配置的UDP传输计算的,b)如果数据包似乎具有正确的长度和校验和,那么它是正确的,否则系统不会将这样的数据包传递给调用者。右?
5赞 Rob Walker 9/7/2008 #3

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

3赞 oz10 10/14/2008 #4

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

您可以查看 MSG_TRUNC 标志...

20赞 Jeff Douglass 12/11/2008 #5

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

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

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

评论

0赞 benc 9/25/2009
如果数据报到达时没有校验和,应用程序是否可以要求提供该信息?
0赞 RandomInsano 11/8/2011
感谢您澄清 IP 校验和仅适用于标头。
0赞 mikijov 3/15/2013
@RandomInsano 请注意,海报有三点。第 1 点谈到“IP 校验和”,它比 UDP 低一级,第 3 点说 UDP 确实有一个校验和。因此,有 2 个校验和,保护 IP 标头的 IP 和保护 UDP 标头和数据的 UDP 校验和。因此,数据受到保护。
0赞 mikijov 3/15/2013
@benc号校验和由操作系统处理,仅当数据包通过校验和验证(或跳过零校验和验证)时,用户才会收到数据包。用户不知道是否使用了校验和。
0赞 Tom Cumming 1/5/2018
根据 RFC,校验和不仅适用于标头:“ 校验和是来自 IP 标头、UDP 标头和数据的伪信息标头的补码和的 16 位补码和”
1赞 Hyunjik Bae 1/13/2019 #6

简短的回答:是的。

详细回答:

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

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

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

我不确切的原因,但我粗略猜测是中国金盾

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