tcp/ip 5层模型下的多重校验以及思考
QBug Lifelong Learner

我们知道,tcp/ip 有5层。从上到下分别为:应用层,传输层,网络层,数据链路层,物理层。今天我们要说到的只有前4层,要聊的是校验

什么是校验?

在生活中,每逢下雨天,WIFI就有很大概率会变得不稳定,因为信号在传输过程在受到了湿度上升的干扰,导致出现数据有一些bit会被flip. 校验就是为了避免这种情况,检查包是否因为信噪/机器错误/…被篡改.

tcp/ip模型中的校验

在5层模型中,前四层每一层都会进行或强或弱的校验,尽最大可能以确保数据送达时不会出现任何错误。也就是说,一个数据包需要经过至少4层校验才能成功到达应用程序。为什么我们需要这么多层校验呢?我们模拟一下一个包被接收后可能被篡改的过程。

假设现在有一个包P到达网络层前,包中的IP地址被修改为其他IP : 我们记修改后IP为Y,而此时好巧不巧包中的校验结果也被“非常巧合”地修改为被篡改后的包的校验值,那么这个时候包P就可以非常顺利到达Y并且由于校验值也被修改为正确的值,所以包P通过了网络层的校验。如果这个时候传输层没有多一层校验,那么Y将错误地接收这个本不属于Y的包

所以其实多重校验是为了保证数据包99.99999999%不会出问题,要是真有那极小的概率出现了问题,那也不一定会造成重大损失;要是真的造成了重大损失,uh,那就纯属天意了。

UDP中的伪首部

在UDP校验中,需要一个叫做伪首部的数据块加入校验运算。伪首部如下图所示(0 - 96 bit offset,被粉红色高亮的就是伪首部). (图片来自维基百科)

image.png

之所以我们需要伪首部,主要原因是UDP在设计的时候IP地址同时也属于UDP这一层(所以计算校验的时候把IP计算上是本分工作),但是IP地址同时在网络层也有存在,如果给UDP首部塞进去个IP地址那就是浪费空间了。于是就有了这一招伪首部。其次就是我们上面所提到的,防止出错,在这里出错有两个可能:IP地址和协议。

不过可能就有人(包括我自己)会问了:不是IP层校验过了吗?怎么传输层还要校验?

这是因为防止出错,因为如今的互联网是大数据时代,每分每秒的数据量都是十分庞大的,在这么庞大的数据量下,玩过炉石传说的同学应该知道:大概率会发生小概率事件,因此我们最好将出错概率降到最小。

一些小细节

在数据链路层上,会采用CRC等比较强的校验方式,因为数据链路层是除了物理层最先接触到数据的,所以如果出错了就尽早将该包丢弃,不至于到达应用层才发现出错了。

而在网络层以及传输层(不包括TSL/SSL)上,只是采用简单的checkSum进行校验。

而在TSL/SSL,应用层上采用了较强的校验方式,前者是为了安全,后者则是最后一道防线,理应加强校验。

  • Post title:tcp/ip 5层模型下的多重校验以及思考
  • Post author:QBug
  • Create time:2021-07-29 00:23:24
  • Post link:https://q-bug4.github.io//articles/2021/07/29/1627489403948.html
  • Copyright Notice:All articles in this blog are licensed under BY-NC-SA unless stating additionally.