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

nee*_*vek 2 networking network-programming protocols network-protocols data-integrity

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

我知道,从应用程序层的角度来看,损坏的数据包可以滑入而不被以太网/ IP / TCP丢弃是不可能的,因为它们的校验和有可能是正确的,只有概率很小。

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

Mal*_*alt 5

在这个问题上有实际的研究。它很旧,但是与手头的问题非常相关。

乔纳森·斯通和克雷格·帕特里奇(Jonathan Stone)和克雷格·帕特里奇(Craig Partridge)于2000年发表的论文被称为“当CRC和TCP校验和不一致时”,该论文调查数据包和帧错误,并查看TCP校验和有多错误,但以太网CRC很好。您可以在此处找到PDF 。这是重要的位。

从摘要:

过去两年对Internet数据包的跟踪表明,即使在链路级CRC应该捕获除40亿个错误之外的所有错误的链接上,1100个数据包中的1个数据包和32,000个数据包中的1个数据包也无法通过TCP校验和。

从结论(我的一些重点)

实际上,要求校验和每几千个数据包检测一次错误。在消除了校验和始终捕获的那些错误之后,数据表明,平均而言,在100亿个数据包和几百万个数据包之间,将有一个未被发现的错误。。确切范围取决于传输的数据类型和所遍历的路径。尽管这些可能性似乎很大,但它们并不鼓励自满。在每条痕迹中,一两个“坏苹果”主机或路径会导致很大比例的错误。对于偶然碰到“坏苹果”主机之一的应用程序,直到接收到损坏的数据的预期时间可能只有几分钟。与未检测到的本地I / O(例如磁盘驱动器)错误率相比,这些错误率令人不安。我们的结论是,至关重要的应用程序应强烈考虑使用应用程序总和来扩展TCP校验和

我不知道对此问题有任何新的研究(如果您不知道,请告诉我!),因此,从那时起,互联网可能会变得更加可靠,并且本文中的数字可能无关紧要。

但是,这一点很重要,已经过去了17年,自撰写该论文以来,Internet流量就激增了。在1Gbps的速度下,这种连接速度如今已很普遍,您每秒将发送大约81K完整的TCP段,并具有1460个字节的数据(如果数据包较小,则传输的速度会更多)。那是每12.5秒发送一百万个大数据包,大约在3.5小时内发送十亿个(如果数据包很小,则再增加十亿个)。

因此,请回答您的问题-这取决于。对于传输大文件或其他数据,如果数据本身未受到任何保护,我肯定会添加其他检查。对于将很少的数据推送到网络中的消息传递,您可能会使用TCP的校验和,可能会对输入进行一些健全性检查,以确保其输入格式正确,并且各种参数和字段感。