数据链路层三个问题---封装成帧、透明传输、差错检查

来源:互联网 发布:linux如何修改文件权限 编辑:程序博客网 时间:2024/05/22 13:32

数据链路层:

前言:

数据链路层使用的信道主要有以下的两种类型: 
1. 点对点信道。这种信道使用一对一的点对点信道方式。 
2. 广播信道。这种信道使用一对多的广播通信方式,因此过程比较复杂。

通常我们使用的更多的是点对点的信道,所以在这里我们需要了解一些相关的概念。

点对点信道的数据链路层在进行通信的时步骤如下: 
1. 节点A的数据链路层把网络层交下来的IP数据报添加首部和尾部封装成帧。 
2. 节点A把封装好的帧发送给节点B的数据链路层。 
3. 若节点B的数据链路层收到的帧无差错,则从收到的帧当中提取出IP数据报上交给上面的网络层,否则丢弃这个帧。


数据链路层的三个基本问题: 
封装成帧、透明传输、差错检测。

(一)封装成帧:

在进行数据链路层传输的时候存在一个问题,我们需要对饮数据链路层的协议对应将有效的数据封装成一个帧,封装成帧就是在一段数据的前后分别添加首部和尾部,这样就构成一个帧。这个时候我们就需要考虑,我们如何来识别一个帧,所以这里提出了一个帧定界的概念,使用两个控制字符,一个控制字符SOH放在一帧的最前面,表示帧的首部开始。另一个控制字符EOT标识帧的结束。 


![enter description here][1]

所以简单的说第一步就是在一段数据的前后分别添加首部和尾部,然后就构成了一个帧。首部和尾部就是起到帧定界的作用。

(二)透明传输:

关于透明传输,我们主要目的是因为,在帧的有效数据当中,可能出现和帧定界的控制字符一样的字符,为了防止将这些字符当中帧定界的字符,错误的处理帧,所以我们采方法使得数据当中可能出现的控制字符“SOH”和“EOT”在接收端不被解释为控制字符。

方法是:发送端的数据链路层在数据中出现控制字符“SOH”或“EOT”的前面插入一个转义字符”ESC”。而在接收端的数据链路层在将数据送往网络层之前删除这个插入的转义字符。我们把这种方法叫做字节填充法。当然如果转义字符”ESC“也出现在数据当中,那么解决的方法仍然是在转义字符的前面插入一个转义字符,所以,当接受到连续的两个转义字符的时候,就去删除其中前面的一个。 


(三)差错检查:

数据链路层点对点传输的第三个问题就是差错检测。就是我们所说的比特在传出过程当中可能会产生差错,1可能会变成0,0可能会变成1.这就是比特差错。而这种差错对于我们来说是不希望发生这种状况的,所以为了保证数据传输的可靠性,在计算机网络传输数据时,必须采用差错检测措施。目前广泛运用的是循环冗余检验CRC,

CRC的基本思想就是将传输的数据当作一个位数很长的数,将这个数除以另外的一个数。得到的余数作为校验数据附加到原数据后面。

计算n位冗余码

现假定待传输的数据M = 101001(k = 6),除数p = 1101 (n = 3)比n多一位 
这n位冗余码可以用下面的方法得出。 
(1)用二进制的模2运算进行(2^n)乘M的运算,相当于在M后面添加n个0。 
即M后面添加3个0 
(2)现在得到M = 101001000(k+n = 9)位的数除以除数p(n = 3)位, 
得到商是Q(不关心),余数R =001(n位)R就是冗余码FCS

现在加上FCS后发送的帧是101001001 
这里写图片描述

这种添加冗余码的方法叫做帧检验序列FCS,而CRC循环冗余差错检测和这个并不是一个概念,然后我们可以对上面最后的数据进行CRC检验,方法就是把收到的每一帧都除以相同的除数,然后检查得到的余数。如果没有差错,那么得到的余数一定是0。


所以总的来说,就是每一个接受到的帧经过了CRC检验后,只会有两种情况: 
1. 余数为0,表示结果是正确的,这个时候自然就接收这个帧。 
2. 余数不为0,这样标识这个帧是有问题的,这样就丢弃这个帧。

注意:

在数据链路层若仅仅使用CRC差错检验技术,则只能做到对帧的无差错接收,不会检查ip数据报是不是正确的。


0 0