自定义协议的应用程序数据是否需要校验和?

时间:2016-11-24 13:56:02

标签: networking network-programming protocols network-protocols data-integrity

由于通过线路传输的数据包在不同层上具有校验和,因此以太网和 IPv4的头部具有校验和,TCP的校验和甚至覆盖整个段。

我知道从应用层的角度来看,损坏的数据包可能会在没有被以太网/ IP / TCP丢弃的情况下滑入,因为有可能它们的校验和是正确的,只有概率很低

我正在为IM应用程序设计自定义二进制协议。我的问题是我是否需要添加校验和以确保应用程序数据的完整性?校验和真的需要在实践中吗?

2 个答案:

答案 0 :(得分:4)

有关于这个主题的实际研究。它已经过时了,但与手头的问题非常相关。

这篇论文从2000年开始被称为"当CRC和TCP校验和不一致时,#34;由Jonathan Stone和Craig Partridge调查数据包和帧错误,并查看TCP校验和错误的频率,但以太网CRC很好。您可以找到PDF here。这是重要的一点。

摘自:

  

过去两年的互联网数据包痕迹显示在1之间   1,100中的数据包和32,000中的1个数据包未通过TCP校验和,即使在   链路级CRC应该捕获除了40亿之外的所有链接   错误。

从结论(我的一些突出显示)

  

实际上,要求校验和检测错误   几千包。消除那些校验和错误后   总是捕获,数据表明,平均来说,一个数据包之间   在100亿和一个数百万的数据包将有一个错误   没有被发现。确切的范围取决于数据类型   转移和遍历的路径。虽然这些可能性似乎很大,   他们不鼓励自满。在每一条痕迹中,一两个都不好   苹果&#39;主机或路径负责很大一部分   错误。对于偶然遇到“坏苹果”之一的应用程序   主机,接受损坏数据之前的预期时间可能是   低至几分钟。与未检测到的错误率相比较   本地I / O(例如磁盘驱动器),这些速率令人不安。 <强>我们   结论是重要的应用应该强烈考虑   使用应用程序总和扩充TCP校验和。

我不知道有任何关于这个问题的新研究(如果你不知道的话,请告诉我!),因此从那以后互联网可能变得更加可靠,而且论文中的数字可能无关紧要。

然而,这很重要,已经过去了17年,自撰写该论文以来,互联网流量的数量刚刚爆发。在1Gbps,这不是一个不常见的连接速度,你现在发送大约81K完整的TCP段,1460字节的数据,每秒(或者如果数据包更小,则更多) 。这是每12.5秒就有一百万个大数据包,在大约3.5小时内有十亿个(或者如果数据包很小则再多一个)。

所以回答你的问题 - 这取决于你。 对于传输大文件或其他数据,如果数据本身没有受到任何保护,我肯定会添加额外的检查。对于将非常少的数据推送到网络中的消息传递,您可能对TCP的校验和很好,可能会对您要确保其输入的输入进行一些健全性检查。 s的格式正确,各种参数和字段都有意义。

答案 1 :(得分:1)

由于数据包在网络中被破坏,我不打算使用校验和。

但是,由于您正在开发可能在开放互联网上使用的协议,因此您需要为非预期应用程序发送udp数据包或与接收/侦听端口建立TCP连接的极少数情况做好准备。此外,可能会有更少的端口扫描和黑客/脚本小子敲门。

因此,您应该制定协议,以便轻松丢弃此类流量。在每次传输中使用校验和将是一种明智的方式。