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

目录

1、封装成帧

2、透明传输

3、差错检验


        数据链路层属于计算机网络的低层。数据链路层使用的信道主要有以下两种类型:

  1. 点对点信道。这种信道使用一对一的点对点通信方式。
  2. 广播信道。这种信道使用一对多的广播通信方式,广播信道上连接的主机很多,因此必须使用专用的共享信道协议来协调这些主机的数据发送。

        所谓链路(link),就是从一个节点到相邻节点的一段物理线路,而中间没有任何其他的交换节点。

        数据链路(data link) 除了必须有一条物理线路外,还必须有一些必要的通信协议来控制这些数据的传输。若把实现这些协议的硬件和软件加到链路上,就构成了数据链路。//数据链路=物理链路+通信协议

        实现这些通信协议最常用的方法是使用网络适配器(既有硬件,也包括软件)。一般的适配器都包括了数据链路层和物理层这两层的功能。

        点对点信道的数据链路层的协议数据单元网络层协议数据单元就是 IP 数据报。下边是点对点通信的三层简化模型示意图,详细描述了两个节点之间的链路通信情况:

【链路层】数据链路层的三个基本问题:封装成帧、透明传输和差错检测_第1张图片

        如图所示,点对点信道的数据链路层在进行通信时的主要步骤如下:

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

        以上步骤,涉及到了数据链路层需要解决的三个基本问题:封装成帧、透明传输和差错检测,接下来重点探讨这三个基本问题。

1、封装成帧

        封装成帧(framing)就是在一段数据的前后分别添加首部和尾部,这样就构成了一个帧。

        为什么要这么做呢?

        添加首部和尾部的一个重要作用就是进行帧定界(即确定帧的界限)。此外,首部和尾部还包括许多必要的控制信息//数据是一帧一帧发送的,帧与帧之间需要有界限

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

【链路层】数据链路层的三个基本问题:封装成帧、透明传输和差错检测_第2张图片

        那么数据链路层是如何进行帧定界的呢?

        例如,当数据是由可打印的 ASCII 码组成的文本文件时,帧定界可以使用特殊的帧定界符,控制字符 SOH (Start Of Header) 放在一帧的最前面,表示的首部开始。另一个控制字符 EOT (End Of Transmission) 表示帧的结束。

【链路层】数据链路层的三个基本问题:封装成帧、透明传输和差错检测_第3张图片

        请注意,SOH EOT 都是控制字符的名称。它们的十六进制编码分别是 01 (二进制是 00000001) 和 04 (二进制是 00000100),SOH 并不是指 S,O,H 三个字符。//也就是说,在十六进制编码的报文中,01是帧的开始,04是帧的结束

        当数据在传输中出现差错时,由于使用了帧定界符,接收端就知道收到的数据是否是一个完整的帧 ,如果只有首部开始符 SOH 而没有传输结束符 EOT,那么就必须丢弃。如果收到的数据有明确的顿定界符(SOH 和 EOT),那么这是一个完整的帧,应当收下。//帧定界的作用

2、透明传输

        什么是透明传输?

        所谓透明,就是表示某一个实际存在的事物看起来却好像不存在一样。所以,“在数据链路层透明传送数据”就是指无论什么样的比特组合的数据,都能够按照原样没有差错地通过这个数据链路层。因此,对所传送的数据来说,这些数据就“看不见”数据链路层有什么妨碍数据传输的东西。或者说,数据链路层对这些数据来说是透明的。

        那么数据链路层传送数据还有什么不透明的吗?或者说数据传送出现了明显的差错?

        我们知道帧的开始和结束的标记使用专门指明的控制字符,但是,如果所传输的数据中出现了和帧定界符一样的编码组合,比如,数据中的某个字节的二进制代码恰好和 SOH 或 EOT 这种控制字符一样,数据链路层就会错误地“找到的边界”,把部分帧收下(误认为是个完整的帧),而把剩下的那部分数据丢弃,如下图所示:

【链路层】数据链路层的三个基本问题:封装成帧、透明传输和差错检测_第4张图片

        如图所示的帧的传输显然就不是“透明传输”,因为当遇到数据中碰巧出现字符 “EOT” 时就传不过去了。

        那么,如何去解决这个问题呢?

        为了解决透明传输问题,就必须设法使数据中可能出现的控制字符 “SOH” 和 “EOT” 在接收端不被解释为控制字符。

        具体的方法是:发送端的数据链路层在数据中出现控制字符 “SOH” 或 “EOT” 的前面插入一个转义字符 “ESC” (其十六进制编码是 1B,二进制是 00011011)。而在接收端的数据链路层再把数据送往网络层之前删除这个插入的转义字符。这种方法称为字节填充(byte stufing)字符填充(character stufing)

        如果转义字符也出现在数据当中,那么解决方法仍然是在转义字符的前面插入一个转义字符。因此,当接收端收到连续的两个转义字符时,就删除其中前面的一个。//这个很容易理解,就是两个转义字符中必定有一个是有用数据,有一个是转移字符

        下图展示了用字节填充法解决透明传输的问题:

【链路层】数据链路层的三个基本问题:封装成帧、透明传输和差错检测_第5张图片

3、差错检验

        为什么需要差错检验?

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

        在一段时间内,传输错误的比特占所传输比特总数的比率称为误码率 BER (Bit Error Rate)。例如,误码率为 10^{-10} 时,表示平均每传送 10^{10}个比特就会出现一个比特的差错。

        误码率信噪比有很大的关系。如果设法提高信噪比,就可以使误码率减小。实际的通信链路并非是理想的,它不可能使误码率下降到零。因此,为了保证数据传输的可靠性,在计算机网络传输数据时,必须采用各种差错检测措施。

        目前在数据链路层广泛使用的检错技术是循环余检验 CRC(Cyclic Redundancy Check)

        至此,全文结束。

你可能感兴趣的:(计算机网络原理,数据链路层,封装成帧,透明传输,差错检验)