计算机网络学习(九)—— 数据链路层的三个基本问题

501 阅读6分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第21天,点击查看活动详情

三个基本问题

数据链路层协议有许多种,但有三个基本问题则是共同的。这三个基本问题是:封装成帧、透明传输、和差错控制

封装成帧

封装成帧(framing)就是在一段数据的前后分别添加首部和尾部,这样就构成了一个帧。接收端再收到物理层上交的比特流之后,就能给句首部和尾部的标记,从收到的比特流中识别帧的开始和结束。

我们知道,分组交换的一个重要概念就是:所有在互联网上传送的数据都以分组(即 IP 数据报)为传送单位。网络层 IP 数据报传送到数据链路层就成了帧的数据部分。在帧的数据部分的前面和后面分别添加上首部和尾部,构成了一个完成的帧,这样的帧就是数据链路层的数据传送单元。

一个帧的帧长等于帧的数据部分长度加上帧首部和帧尾部的长度。首部和尾部的一个重要作用就是进行 帧定界(即确定帧的界限)。此外,首部和尾部还包含许多必要的控制信息。在发送帧时,是从帧首部开始发送的。各种数据链路层协议都对帧首部和帧尾部的格式有明确的规定。

显然,为了提高帧的传输效率,应当使帧的数据部分长度尽可能地大于首部和尾部的长度。但是,每一种链路层协议都规定了所能传送的帧的 数据部分长度上限——最大传送单元 MTU(Maximum Ttansfer Unit)。

帧的首部控制字符的十六进制为 01,尾部控制字符的十六进制为 04

当数据在传输中出现差错时,帧定界符的作用更加明显。假定发送端在尚未发送完一个帧时突然出故障,中断了发送。但随后很快又恢复正常,于是重新从头开始发送刚才未发送完的帧。由于使用了帧定界符,接收端就知道前面收到的数据是个不完整的帧(只有首部开始付 SOH 而没有传输结束符 EOT),必须丢弃。而后面收到的数据有明确的帧定界符(SOH 和 EOT),因此这是一个完整的帧,应当收下。

透明传输

数据链路层的透明传输表示无论什么样的比特数据,都能够按照原样没有差错地通过这个数据链路层。

由于帧的开始和结束的标记使用专门指明的控制字符,因此,所传输的数据中的任何 8 比特的组合一定不允许和用作帧定界的控制字符的比特编码一样,否则就会出现帧定界的错误。

当传送的帧是用文本文件组成的帧时(文本文件中的字符都是从键盘上输入的),其数据部分显然不会出现像 SOH 或 EOT 这样的帧定界控制字符。可见不管从键盘上输入什么字符都可以放在这样的帧中传输过去,因此这样的传输就是透明传输

但当数据部分是非 ASCII 码的文本文件时(如二进制代码的计算机程序或图像等),情况就不同了。如果数据中的某个字节的二进制代码恰好和 SOH 或 EOT 这种控制字符一样,数据链路成就会错误地“找到帧的边界”,把部分帧收下(误以为是个完整的帧),而把剩下的那部分数据丢弃(这部分找不到帧定界控制字符 SOH)。

为了解决透明传输问题,就必须设法使数据中可能出现的控制字符“SOH”和“EOT”在接收端不被解释为控制字符。具体的方法是:发送端的数据链路层在数据中出现控制字符 SOH 或 EOT 的欠佳插入一个转义字符 ESC(十六进制为 1B)。而在接收端的数据链路层在把数据送往网络层之前删除这个插入的转义字符。这种方法称为 字节填充 或 字符填充

如果转移字符已出现在数据当众,那么解决方法仍然是在转移字符的前面插入一个转义字符。因此,当接收端收到连续两个转义字符时,就删除其中的一个。

差错控制

现实的通信链路都不会是理想的,这就是说,比特的传输过程中可能会产生差错:1 可能会变成 0 ,而 0 可能会变成 1,这就是 比特差错。比特差错是传输差错中的一种。

为了保证数据传输的可靠性,在计算机网络传输数据时,必须采用各种差错检测措施。目前在数据链路层广泛使用了 循环冗余 CRC(Cyclic Redundancy Check)  的检测技术。

在数据链路层若仅仅使用循环冗余检验 CRC 差错检测技术,则只能做到对帧的无差错接受,即:凡是接收端数据链路层接受的帧,我们都能以非常接近于 1 的概率认为这些帧在传输过程中没有产生差错

传输差错可以分为两大类:

  1. 前面提到的比特差错;
  2. 帧丢失、帧重复、帧失序

目前对于数据链路层有两种实现方案:

  • 通信质量差:采用 帧确认、重传机制,保证数据可靠性;
  • 通信质量好,只采用 CRC 校验。

这样做极大地提高了通信效率。

参考文档

  • 《计算机网络》—— 谢希仁

往期文章