计算机网络-数据链路层

kolbe 2021年10月07日 55次浏览

1 基本概念

数据链路层主要考虑两台相邻的机器实现可靠的信息(帧)传输

2 基本问题

2.1 封装成帧

封装成帧(framing)就是在数据报(IP数据报)的前后分别添加首部和尾部,从而构成一个帧。数据链路层协议规定了帧的数据部分长度上限——最大传送单元MTU (Maximum Transfer Unit),帧的构成如下图:
image

帧的起始位置为控制字符SOF(Start Of Header,十六进制01),帧的结束位置为控制字符EOT(End Of Transmission,十六进制04)
image

当数据部分恰好是SOH或EOT时,需要使用转义字符ESC,发送端在出现SOH或EOT的字符前添加ESC,接收端将数据转给网络层时会删除转义字符ESC,这种方法叫做字节填充(byte stuffing)
image

2.2 差错检测

比特在通讯链路传输的过程中会出现差错,有可能1变成0或0变成1,所以需要进行差错检测

2.2.1 循环冗余检验CRC (Cyclic Redundancy Check)

假设发送端要传送的数据 M = 101001,CRC运算会在M的后面添加差错检测用的n位冗余码,则发出去的帧大小为6+n位。

规则:假设被除数X,除数P,余数R

  • 对X进行补零操作,补零的位数取决于P的最高阶
  • X除以P,被除数首位为1时,商为1,被除数首位为0时,商为0
  • 所得余数去除首位,当R的首位为0时,将0作为新的被除数,当R首位为1时,将P作为被除数
  • 当R的位数小于P时,结束运算

例子1:发送端生成校验串

1)发送端使用CRC生成101001的可校验位串,假设P为1101
2)因为P的最高阶为3,则需要对被除数后添加3个0,故被除数X为101001000
3)将被除数X(101001000)除以除数P(1101),对X和P做模2加减法

   110101    // 商
---------
101001000    // 被除数,首位为1,则商为1
1101         // 被除数首位为1,使用原有的除数P,即1101
---------
 11101000    // 余数去除首位,作为新的被除数,首位为1,即商为1
 1101        // 被除数首位为1,使用原有的除数P,即1101
---------
  0111000    // 余数去除首位,作为新的被除数,首位为0,即商为0
  0000       // 被除数首位为0,使用除数0000
---------
   111000    // 余数去除首位,作为新的被除数,首位为1,即商为1
   1101      // 被除数首位为1,使用原有的除数P,即1101
---------
    01100    // 余数去除首位,作为新的被除数,首位为0,即商为0
    0000     // 被除数首位为0,使用除数0000
---------
     1100    // 余数去除首位,作为新的被除数,首位为1,即商为1
     1101    // 被除数首位为1,使用原有的除数P,即1101
---------
      001    // 余数的位数(3位)小于除数P的位数(4位),此时结束运算

4)将得到的结果011填充到原数据的后面,即在101001后添加001,结果串为101001001

例子2:接收端验证校验串

1)接收端使用CRC校验101001的可校验位串,假设P为1101
2)因为根据例子1中生成的可校验串为001,则被除数为101001001
3)将被除数X(101001001)除以除数P(1101),对X和P进行模2加减法

   110101    // 商
---------
101001001    // 被除数,首位为1,则商为1
1101         // 被除数首位为1,使用原有的除数P,即1101
---------
 11101001    // 余数去除首位,作为新的被除数,首位为1,即商为1
 1101        // 被除数首位为1,使用原有的除数P,即1101
---------
  0111001    // 余数去除首位,作为新的被除数,首位为0,即商为0
  0000       // 被除数首位为0,使用除数0000
---------
   111001    // 余数去除首位,作为新的被除数,首位为1,即商为1
   1101      // 被除数首位为1,使用原有的除数P,即1101
---------
    01101    // 余数去除首位,作为新的被除数,首位为0,即商为0
    0000     // 被除数首位为0,使用除数0000
---------
     1101    // 余数去除首位,作为新的被除数,首位为1,即商为1
     1101    // 被除数首位为1,使用原有的除数P,即1101
---------
      000    // 余数的位数(3位)小于除数P的位数(4位),此时结束运算

4)根据余数判断接收的数据是否正确,为0则正确,非0则为异常

例子3:模2加减法

1)对1101和1001进行模2加减法

1101
1001
----
0100   // 当进行加减的位相同时,则结果为0,反之为1