目录


文章目录


为什么应用层要做数据完整性校验?

以太网的 CRC32 比较强,但它只能保证同一个网段上的通信不会出错(两台机器的网线插到同一个交换机上,这时候以太网的 CRC 是有用的)。

为什么说 TCP/IP 是一个不确定性网络_数据

但是,如果两台机器之间经过了多级路由器呢?

我知道同一个以太网域内,Ethernet 的 FCS 尾部有 CRC32 字段会保证数据完整性,但是作者说在多级路由器之间传输的数据无法保证数据完整性。原因是什么呢,是不是因为 “由于多级路由器之间的传输不是使用的 Ethernet 协议栈,所以就没有 CRC32 等算法?”

那么问题来了,为什么路由器间的传输不做完整性校验呢?如果整个链路的每个传输环节都有类似于 CRC 这样的校验算法,那么是不是上层是不是就可以省略数据校验了?为什么实际情况下没有这样做呢?是成本因素考量?

还有一个问题就是,既然 MAC 帧已经有 CRC32 校验了,为什么位于运输层的 UDP 数据包仍然有 checksum 字段?

这个世界没有 100% 的可靠!即使电脑也会犯错,数据受到干扰更会犯错,甚至还有恶意的人为修改数据。那么互联网的专家们是如何最大限度保证数据的完整性的呢?

链路层强校验

通常数据离开电脑在各种介质中流淌的场合是最容易出错的,因为信号会有各种干扰。介质包括网线、光纤、空气,由于出错概率颇大,故数据链路层的数据完整性校验采用强校验,CRC 校验。

所谓强校验,是指一旦数据发生了错误,CRC 校验会高可靠性地检测倒错误并丢弃,可靠性可以达到 1-1/108。

以太网为例,一帧的数据大约 1500 字节,而 CRC 却要为这 1500 字节提供完整性,而 CRC 的取值空间去仅仅 4 个字节!对,你没有看错,仅仅 4 个字节,却要为 1500 字节服务。客人远远超出服务员的人数,能够达到高可靠性已经难能可贵了。

网络层弱校验

意味着数据链路层提交给 IP 层的数据,有可能是错误的。提交的过程是一次数据的复制过程,这里可能会引入错误,上文已经提到了这一点。浓眉大眼、五官端正的电脑竟然也会犯错,这实在是没有想到啊!

没有关系,IP 层不是还有 Checksum 校验吗?

有同学会说,CRC 是非线性的、高级校验算法,而 Checksum 不过是线性的、低级的校验和算法,CRC 没有校验出的,你 Checksum 能校验出吗?

尺有所长,寸有所短,真不好说 Checksum 是否能校验出 CRC 的疏漏。但是如果我告诉你,IP 层的 Checksum 主要目的是为了防止数据在电脑中的复制操作产生 IP 头数据错误错误,你可能就不会那么纠结了。因为 IP 校验压根不覆盖数据部分。

这里的核心思想是,距离数据的发源地越近的地方,将错误的数据丢弃,避免错误的数据奔袭万里贻害网络资源,善莫大焉!

传输层弱校验

不怕不怕,不是还有 TCP/UDP 的校验吗?

问题是 TCP/UDP 也是 Checksum 弱校验,既然是弱校验,意味着可靠性堪忧,尽然堪忧为何不采用强校验,例如 CRC 或 MD5 或 SHA 校验呢?

在设计 TCP/IP 时代,电脑的计算能力没有那么强大,CRC 耗费的 CPU 资源大,会让电脑一下子慢下来,而 Checksum 只是一个单纯的加法,耗费的 CPU 资源小,故 Checksum 胜出!

不怕不怕不怕啦,我们还有安全层的校验!

安全层超强校验

这里的安全层指的是业界妇孺皆知的 TLS,通常 TLS 的校验值空间具有 16 或 20 字节,取决于是 MD5 还是 SHA1。如果觉得可靠性不够,可以采用 SHA 512, 校验空间可以达到 64 字节。

此外,安全层在计算这些校验值时,还会加入密钥,只有发送方、接收方知晓,任何第三方都无法伪造。这样就真正实现了超过可靠性的数据完整性!

应用层超强校验

数据是通信的核心要素,如果数据错了,一切都是浪费感情!

所以,应用层做为最后一道管卡,要尽可能采用超强校验,来最大限度地保护数据的完整性!

总结

如果五层的校验,只能选择其中之三,那就选择:

  1. 链路层强校验
  2. 安全层超强校验
  3. 应用层超强校验