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

Is a checksum needed for application data of a custom protocol?

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

我知道从应用层的角度来看,一个损坏的数据包可能会溜进去而不被Ethernet/IP/TCP丢弃,因为它们的校验和有可能是正确的,只有概率很低。

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

由于数据包在网络中损坏,我不会为校验和而烦恼。

但是,由于您正在处理可能会在开放互联网上使用的协议,因此您需要为意外的应用程序发送 udp 数据包或与您的 receiving/listening 建立 tcp 连接的罕见情况做好准备端口。此外,端口扫描和敲门的黑客/脚本小子可能也会减少。

所以你应该使你的协议很容易丢弃这种流量。恕我直言,在每次传输中使用校验和是一种明智的做法。

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

Jonathan Stone 和 Craig Partridge 于 2000 年发表的名为 "When the CRC and TCP checksum disagree" 的论文调查了数据包和帧错误,并查看 TCP 校验和出错的频率,但以太网 CRC 正常。您可以找到 PDF here。这是重要的部分。

来自摘要:

Traces of Internet packets from the past two years show that between 1 packet in 1,100 and 1 packet in 32,000 fails the TCP checksum, even on links where link-level CRCs should catch all but 1 in 4 billion errors.

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

In practice, the checksum is being asked to detect an error every few thousand packets. After eliminating those errors that the checksum always catches, the data suggests that, on average, between one packet in 10 billion and one packet in a few millions will have an error that goes undetected. The exact range depends on the type of data transferred and the path being traversed. While these odds seem large, they do not encourage complacency. In every trace, one or two 'bad apple' hosts or paths are responsible for a huge proportion of the errors. For applications which stumble across one of the `bad-apple' hosts, the expected time until a corrupted data is accepted could be as low as a few minutes. When compared to undetected error rates for local I/O (e.g., disk drives), these rates are disturbing. Our conclusion is that vital applications should strongly consider augmenting the TCP checksum with an application sum.

我不知道对这个问题有任何更新的研究(如果你不知道,请赐教!),所以从那时起互联网可能变得更加可靠,论文中的数字可能无关紧要。

然而,这很重要,17 年过去了,自那篇论文发表以来,Internet 流量呈爆炸式增长。在 1Gbps 的情况下,这在当今并不少见,您正在发送大约 81K 个完整的 TCP 段,包含 1460 字节的数据,每秒(如果数据包更小,则更多) ).那是每 12.5 秒 100 万个大数据包,大约 3.5 小时 10 亿个(或者,如果数据包很小,则更多)。

因此,要回答您的问题 - 视情况而定。 对于传输大文件或其他数据,如果数据本身没有以任何方式受到保护,我肯定会添加额外的检查。对于将非常少的数据推送到网络中的消息传递,您可能对 TCP 的校验和没有问题,可能对输入进行一些健全性检查以确保它的格式正确,并且各种参数和字段使感觉。