计算机网络-错误检测

Aki 发布于 2023-08-04 192 次阅读


在计算机网络中,数据是通过网络传输的,当数据离开主机后,我们不知道会发生什么,因此数据在传输的过程中可能会出现错误,因此由于这种传输而引起的错误叫做传输错误。

为了实现可靠的通信,接收者必须检测和纠正这些错误。实际上,根据OSI模型,在传输层和数据链路层进行了错误控制。

错误类型、

存在两种基本的错误类型。

(1)位错误

也称为单比特错误,也就是说在所有数据位中只有一个bit发生了错误。

(2)突发错误

在突发错误中,有两个或者更多个bit发生错误。

当我们计算突发错误长度时,不是实际错误的位数的数量,而是整个长度,例如上述中长度为8.

检测错误、

一般来说,错误检测在接收方进行,这意味着接收方必须在没有原始消息的副本的情况下判断消息是否发生了错误。

我们必须在消息的基础上添加一些附加的信息,供接收方来查明消息是否发生了错误。这些额外的位叫做冗余位。

通常会用一个算法或者函数根据传输的data生成冗余码,然后把data和冗余码一起发送过去;接收方接收到消息,从其中分理出data和冗余码,然后使用相同的函数或者算法计算冗余码,如果计算出的冗余码和传输接收的冗余码一致,则认为消息没有出现错误,然后接受该消息,否则就拒绝消息。

错误处理、

错误处理可以很简单也可以很难。如果检测到消息出现错误,那么就抛弃它,要求发送方在发送一次;也可以不抛弃消息,而是去纠正消息的错误。

错误检测和纠正错误都需要冗余码,因为没有冗余码就无法纠错和检错了。

check检查器会检查接收的消息,并且根据设定选择接收或者拒绝消息,如果出现错误就会选择丢弃或者纠错。

错误检测四个算法、

(1)VRC,垂直冗余检查

(2)LRC,纵向冗余校验

(3)校验和

(4)CRC,循环冗余校验

Checksum在tcp协议中使用;CRC在数据链路层协议中使用,如HDLC,BISYNC,PPP,DDCMP。这两个是比较熟悉和重要的部分。

VRC、

也被称为奇偶校验,冗余码是1位。

假设有一个七位数据是 1100001,然后该数据被交给偶校验生成器,生成冗余码1。原理就是数1的个数,有3个1,奇数就是1,偶数就是0,非常简单,但是错误也很明显。生成的冗余码附加到原始数据上变成11100001。

接收方接收到数据分理处冗余码和原始数据,就去数1的个数,如果是奇数得到的冗余码就是1,否则就是0,然后与收到的冗余码匹配,判断信息是否出现错误。

VRC可以检测位错误,而且能力非常强大,然而传输过程中出现位错误的概率非常非常小。VRC可以检测突发错误当且仅当错误位数为奇数时!!!

例如上述两条数据,第一条数据出现了位错误,VRC检测成功。

第二条数据出现了突发错误,有两个bit的值改变了,但是VRC却不能检测出来,检测失败。

LRC、

LRC也就是二维的VRC,原理和VRC差不多。在LRC中,数据按行和列组织。

例如上述数据 11100111 11011101 00111001 10101001 四个八位数据,按照行列组织如上所示,然后按照列来计算冗余码,得到一组冗余码。

传输的数据如上所示,把冗余码添加到数据尾部。接收方接收到数据分离出原始数据和冗余码。

与VRC相比LRC在突发错误的检测中有更好的性能,但是仍然存在问题。如果有两个不同行但是同位上的数据发生了改变,LRC还是检测不出来。

Checksum、

发送方计算冗余码,接收方校验和。

步骤:

  • (1)将原始消息平均分成n个消息块,每一个块的位数相同
  • (2)对这n个消息块执行二进制加法,如果产生了进位,则连同进位一起执行加法,最后得到总和
  • (3)对总和所有位取反,得到冗余码
  • (4)发送方发送冗余码和原始消息,接收方进行验证
  • (5)接收方将消息块均分并且执行二进制加法,如果产生了进位,则连同进位一起执行加法,还要加上冗余码,最后得到总和。如果总和全部位数为1则消息没有错误,否则出现错误。

假设原始数据为32位,平均分成4份8位的块。

然后执行二进制加法,发现有两位溢出!!!

继续加上两位溢出!!!然后按位取反得到校验和。然后把校验和附加在尾部和原始数据发送。

接收方收到校验和和原始数据,对这些数据进行分块和累加,方法就是上述的方法。

可以看到,累加后的结果全为1!!!

基本上,校验和是一个非常强大的检测技术,可以检测位错误,在突发错误也有一定的功能,但是也有缺点。如果不同块的同一位发生了改变校验和也不会改变。

CRC、

步骤:

  • (1)发送发和接收方根据协议决定一个相同的除数,L位
  • (2)在原始消息尾部添加(L-1)个0
  • (3)然后进行二元除法运算
  • (4)余数就是CRC码

假设约定除数是1101,四位;原始消息是100100,6位。

原始消息尾部加上(4-1)个0

当以0开始时,要与全0异或。得到的结果就是CRC码。然后附加到原始消息尾部一起发送。

根据上图,给出一个多项式可以确定除数为1101!!!计算得到CRC为110,所以需要发送的数据为1110010101110.

接收方也会进行CRC计算,只不过当计算结果为0时表明消息正确,否则就出现错误!!!