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