数据链路层的设计问题

数据链路层使用物理层提供的服务在通信信道上发送和接收比特。它要完成一些功能, 包括:

  1. 向网络层提供一个定义良好的服务接口。
  2. 处理传输错误。
  3. 调节数据流,确保慢速的接收方不会被快速的发送方淹没。

数据链路层从网络层获得数据包,然后将这些数据包封装成帧 (frame)以便传输。每个帧包含一个帧头、一个有效载荷(用于存放数据包〉以及一个帧尾。如图:

数据包和帧的关系

提供给网络层的服务

数据链路层可以设计成向上提供各种不同的服务。实际提供的服务因具体协议的不同 而有所差异。一般情况下,数据链路层通常会提供以下 3 种可能的服务:

1. 无确认的无连接服务
指源机器向目标机器发送独立的帧,目标机器并不对这些帧进 行确认。以太网就是一个提供此类服务的数据链路层极好实例。这类服务合适 两种场合,第一种是错误率很低的场合,此时差错恢复过程可以留给上层来完成;第二种是实时通信,比如语音传输,因为在实时通信中数据迟到比数据受损更糟糕。

2. 有确认的无连接服务
当向网络层提供这种服务时,数据链路 层仍然没有使用逻辑连接,但其发送的每一帧都需要单独确认。这样,发送方可知道一个 帧是否已经正确地到达目的地。如果一个帧在指定的时间间隔内还没有到达,则发送方将 再次发送该帧。这类服务尤其适用于不可靠的信道,比如无线系统。 802.11 CWiFi)就是 此类服务的一个很好例子。

3. 有确认的有连接服务
源机器和目标机器在传输任何数据之前要建立一个连接。连接上发 送的每一帧都被编号,数据链路层确保发出的每个帧都会真正被接收方收到。它还保证每 个帧只被接收一次,并且所有的帧都将按正确的顺序被接收。它适用于长距离且不可靠的链路,比如卫星信 道或者长途电话电路。

成帧

为了向网络层提供服务,数据链路层必须使用物理层提供给它的服务。物理层所做的 只是接收一个原始比特流,并试图将它传递给目标机器。 对于数据链路层来说,通常的做法是将比特流拆分成多个离散的帧,为每个帧计算一 个称为校验和的短令牌(本章后面将讨论校验和算法),并将该校验和放在帧中一起传输。
拆分比特流的实际工作有下面4种方法:

1. 字节计数法:该成帧方法利用头部中的一个字段来标识该帧中的字符数。当接收方的数据链路 层看到字符计数值时,它就知道后面跟着多少个字节 , 因此也就知道了该帧在哪里结束。

2. 字节填充的标志字节法:该方法考虑到了出错之后的重新同步问题,它让每个帧用 一些特殊的字节作 为开始和结束.这些特殊字节通常都相同 , 称为标志字节( flag byte),作为帧的起始和结束分界符,如下图:

字节填充

3. 比特填充的标志比特法:该方法考虑了字节填充的缺点,即只能使用 8 比特的字节。 帧的划分可以在比特级完成,因而帧可以包含由任意大小单元(而不是只能以 8 比特为单元)组成的二进制比特数。

4. 物理层编码违禁法:是一条使用物理层的捷径。例如,在 4B/5B 线性编码模式下, 4 个数据位被映射成 5 个信号比特,通过 这种方法确保线路上的信号有足够的跳变。

差错控制

确保可靠传递的常用方法是向发送方提供一些有关线路另一端状况的反馈信息。通常 情况下,协议要求接收方发回一些特殊的控制帧,在这些控制帧中,对于它所接收到的帧 进行肯定的或者否定的确认。如果发送方收到了关于某一帧的肯定确认,那么它就知道这 帧己经安全地到达了。另一方面,否定的确认意味着传输过程中产生了错误,所以这帧必须重传。

更为复杂的是存在这样的可能性,有时候由于硬件的问题,一个帧被完全丢失了(比 如一个突发噪声〉。在这种情况下,接收方根本不会有任何反应,因为它没有根据做出反应。 当发送方发出一帧时,通常还要启动一个计时器。该计时器的超时值应该设置得足够长,以便保证在正常情况下该帧 能够到达接收方,并且在接收方进行处理后再将确认返回到发送方。一般情况下,在计时 器超时前,该帧应该被正确地接收,并且确认帧也被传了回来。这种情况下,计时器被取消。如果帧或者确认被丢失,则计时器将被触发,从而警告发送方存在一个潜在的 问题。

流量控制

在数据链路层(以及更高的各层)中,另一个重要的设计问题是如果发送方发送帧的 速度超过了接收方能够接受这些帧的速度,发送方该如何处理。有以下两种方法:

  1. 基于反馈的流量控制(feedback-basedflow control),接收方给发送方返回信息,允许它 发送更多的数据,或者至少告诉发送方自己的情况怎么样。

  2. 基于速率的流量 控制 Crate-based flow control),使用这种方法的协议有一种内置的机制,它能限制发送方 传输数据的速率,而无须利用接收方的反馈信息。