数据链路层
1 数据链路层的三个基本问题
1.1 封装成帧
封装成帧(framing)就是在一段数据的前后分别添加首部和尾部,这样就构成了一个帧。接收端在收到物理层上交的比特流后,就能根据首部和尾部的标记,从比特流中识别帧的开始和结束。
首部和尾部的一个重要作用就是进行帧定界(即确定帧的界限)。此外,首部和尾部还包括许多必要的控制信息。
为了提高帧的传输效率,应当使帧的数据部分长度尽量大于首部和尾部的长度。
最大传输单元 MTU(Maximum Transfer Unit):帧数据部分长度上限。
当数据是由可打印的 ASCII 码组成的文本文件时,帧定界可以使用特殊的帧定界符。
- 控制字符 SOH (Start Of Header)放在一帧的最前面,表示帧首部。
- 控制字符 EOT (End Of Transmission)放在一帧的最后面,表示帧尾部。
注意: SOH 和 EOT 都只是控制字符的名称,他们的十六进制编码分别是 01(二进制是00000001)和 04(二进制是00000100)。
SOH , EOT 并不是 S O H E O T这几个字符,只是名字而已。
当传输中出现差错,帧定界符的作用更加明显。假设未发送完一个帧而发生故障,接收端就知道收到的数据是不完整的帧(只有首部),必须丢弃。
1.2 透明传输
如果数据中的某个字节的二进制代码恰好和 SOH 或 EOT 一样,数据链路层就会错误地找到帧的边界。
为了解决透明传输问题,字节填充法或字符填充:在控制字符SOH、EOT的前面插入一个**转义字符 ESC(其十六进制编码是 1B,二进制是 0001 1011)。**而接收端的数据链路层在把数据送往网络层之前删除这个插入的转义字符。
当然如果转义字符 ESC 也出现在数据当中,那么解决的方法仍然是在转义字符的前面插入一个转义字符,所以,当接受到连续的两个转义字符的时候,就去删除其中前面的一个。
在接收端进行处理之后可以还原出原始数据。这个过程透明传输的内容是转义字符,用户察觉不到转义字符的存在。
1.3 差错检测
在传输过程中可能会产生比特差错: 1 可能变成 0 , 0 可能变成 1 。
在一段时间内,传输错误的比特占所传输比特总数的比率称为误码率( BER,Bit Error Rate)。
误码率和信噪比有很大的关系。
为了保证数据传输的可靠性,在计算机网络传输数据时,必须采用各种差错检測措施。在数据链路层传送的帧中,广泛使用了循环冗余检验 CRC 的检错技术。
传输差错分为两类:
- 比特差错。
- 收到的帧出现了帧丢失、帧重复和帧失序。(停止等待协议,ARQ)。
差错控制(比特差错)
- 检错编码
- 奇偶校验码
- 循环冗余码 CRC
- 纠错编码
- 海明码
1.3.1 奇偶校验码
奇偶校验只能检测出奇数个错误,无法纠错。
通过在编码中**增加一位校验位,要么是 0 ,要么是 1 **。来使编码中 1 的个数为奇数或者偶数,校验位可以在原编码的前面或者后面加。通过计算加入校验位后, 1 的个数是奇数还是偶数,可分为两种:
- 奇校验:1 的个数为奇数
- 偶校验:1 的个数为偶数
1.3.2 循环冗余码 CRC
循环冗余码 CRC 由 n 位信息位和 k 位校验位构成。 k 位校验位拼接在 n 位数据位后面, n + k 为循环冗余校验码的字长,又称这个校验码(n + k, n )码。
n 位信息位可以表示成为一个报文多项式 M(x),最高幂次是 xn-1 。约定的生成多项式 G(x) 是一个 k + 1 位的二进制数,最高幂次是 xk 。将 M(x) 乘以 xk ,即左移 k 位后,除以 G(x) ,得到的 k 位余数就是校验位。这里的除法运算是模 2 除法,即当部分余数首位是 1 时商取 1 ,反之商取 0 。然后每一位的减法运算是按位减,不产生借位。
循环冗余码 CRC 的特点:
- 可检测出所有奇数位错。
- 可检测出所有双比特的错。
- 可检测出所有小于、等于校验位长度的突发错。
计算 CRC :
M(x) 代表发送信息的多项式,G(x) 代表校验位信息
M ( x ) = x 3 + 1 = 1 x 3 + 0 x 2 + 0 x 1 + 1 X 0 = 1001 \begin{aligned} M(x)&=x^3+1\hspace{50cm}\\ &=1x^3+0x^2+0x^1+1X^0\\ &=1001 \end{aligned} M(x)=x3+1