Skip to content

数据链路层

:material-circle-edit-outline: 约 2772 个字 :material-clock-time-two-outline: 预计阅读时间 9 分钟

网络中的主机、路由器等都必须实现数据链路层

image-20241010170536575

数据链路层信道类型

image-20241010170609855

使用点对点信道的数据链路层 - 数据链路和帧

  • 链路 (link) /物理链路
    • 一条无源的点到点的物理线路段,中间没有任何其他的交换结点
  • 数据链路 (data link)/逻辑链路
    • 把实现控制数据传输的协议的硬件和软件加到链路上,就构成了数据链路,比如网卡

数据链路层协议数据单元:帧 frame

image-20241010171119312

  • 封装成帧 (framing):在一段数据的前后分别添加首部和尾部,构成一个帧。
    • 首部和尾部的一个重要作用就是进行帧定界(即确定帧的界限)

数据链路层还需要处理传输中的差错,控制发送速率不大于接收方的处理速率

分组 (packet) 与 帧(frame)的关系

image-20241011104938747

成帧(framing)的方式

如何标识一个帧的开始?帧同步或帧定界问题

字节计数法( Byte count )

image-20241011105228634

如果某个计数字节出错会破坏帧的边界,导致一连串帧的错误

带字节填充的定界符法

定界符(FLAG):一个特殊的字节,比如 01111110,即 0x7E,用于区分前后两个不同的帧

image-20241011105423512

为避免有效载荷出现与 FLAG 一样的比特串导致错误,我们定义所谓的转义字节 ESC,并在 framing 时,在有效载荷里进行以下填充操作:

  • 原来的 FLAG 前加一个 ESC
  • 原来的 ESC 前加一个 ESC

image-20241011105803892

接收方的逐个检查收到的每一个字节,收到 ESC 则后一字节无条件成为有效载荷,不予检查,收到 FLAG 则为帧的边界

这种方法过于冗余了

带比特填充的定界符法

定界符:两个0比特之间,连续6个1比特,即01111110,0x7E

image-20241011110152844

  • 发送方检查有效载荷,若在有效载荷中出现连续5个1,则直接插入1个0

image-20241011110311193

  • 接收方的处理时,若出现连续5个1
    • 若下一比特为0,则为有效载荷,直接丢弃0
    • 若下一比特为1,则连同后一比特的0,构成定界符,一帧结束

image-20241011110509618

透明传输

透明指某一个实际存在的事物看起来却好像不存在一样。

“在数据链路层透明传送数据” 表示:无论发送什么样的比特组合的数据,这些数据都能够按照原样没有差错地通过这个数据链路层。

差错检测和纠正

保证一定差错检测和纠错能力的前提下,减少冗余信息量

两种主要策略

  • 检错码(error-detecting code)
    • 增加冗余信息,只能使接收方推断是否发生错误,但不能推断哪发生错误,接收方可以请求发送方重传数据
  • 纠错码(error-correcting code)
    • 接收方能够判断接收到的数据是否有错,并能纠正错误(定位出错的位置)

新概念

  • 码字 (code word):一个包含 m 个数据位和 r 个校验位的 n 位单元
    • 描述为 (n, m) 码,n=m+r
  • 码率 (code rate):码字中不含冗余部分所占的比例,可以用m/n表示
  • 海明距离 (Hamming distance):两个码字 对应位置 bit 不一样 的数目
    • 0000000000 与0000011111的海明距离为5
    • 如果两个码字的海明距离为d,则需要d个单比特错就可以把一个码字转换成另一个码字

检错码(error-detecting code)

奇偶校验 (Parity Check)

1位奇偶校验:增加1位校验位,可以检查奇数位错误

image-20241011112759815

校验和 (Checksum)

image-20241011112949015

发送方将两个16 bit 相加,再加 1,再取反,作为校验和

接收方将两个16 bit 相加,再加 1,再加上校验和,结果全 1 就说明这 32 bit 没问题

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

在发送端,先把数据划分为组。假定每组 k 个比特。

CRC 运算在每组 M 后面再添加供差错检测用的 n 位冗余码,然后构成一个帧发送出去,一共发送 (k + n) 位

image-20241010172746386

CRC 冗余码的计算
  1. 在原始数据 M 后面添加 n 个 0。
  2. 除以事先选定好的长度为 (n + 1) 位的除数 P,得出商是 Q ,余数是 R
    • 注意到余数 R 比除数 P 少 1 位,即 R 是 n 位。
  3. 将余数 R 作为冗余码拼接在数据 M 后面,一起发送出去。

image-20241010172856089

接受方将接受的数据除以 P,余数为 0 则没问题

用循环冗余检验 CRC 差错检测技术能做到无差错接受 (accept),即凡是接收端数据链路层接受的帧均无差错。

纠错码(error-correcting code)

纠正单比特错误校验位数的下界

什么鬼玩意儿

m个信息位,r个校验位,纠正单比特错,对 \(2^m\) 个有效信息中任何一个,有n个与其距离为1的无效码字

以考虑将该信息对应的合法码字的n位逐个取反,得到n个距离为1的非法码字,需要n+1个位模式来标识

因此有:\((n + 1) 2^m \le 2^n\)

利用 \(n = m + r\),得到 \((m + r + 1) \le 2^r\)

在给定m的情况下,利用该式可以得出纠正单比特错误校验位数的下界

海明码

以奇偶校验为基础,如何找到出错位置,提供1位纠错能力

以 (15, 11)海明码为例,11比特的数据 01011001101 按顺序放入数据位

校验位:2的幂次方位(记为p1, p2, p4, p8),每个校验位对自己负责的数据子集做奇偶校验,缩小定位错误的范围

image-20241011120434037

各校验位负责的自己如下图所示(浅紫色)

image-20241011120546529

如果发送过程中第7位出现差错,从 1 变成 0

组1和组2的校验结果可定位错误位于第4列

image-20241011121310114

组3和组4的校验结果可定位错误位于第2行

image-20241011121302378

基本的数据链路层协议

乌托邦式单工协议

  • 假设:乌托邦,完美但不现实的协议
  • 单工(Simplex)协议:数据单向传输
  • 不处理任何流量控制或纠错工作

无错信道上的停等式协议

  • 假设:通信信道不会出错(Error-Free)
  • 假设:数据传输保持单向, 但是需要双向传输链路(半双工物理信道)
  • 停-等式协议(stop-and-wait)
    • 发送方发送一帧后暂停,等待确认(Acknowldgement)到达后发送下一帧
    • 接收方完成接收后,回复哑帧(dummy frame)确认接收

有错信道上的单工停等式协议

  • 假设:通信信道可能会出错,帧会损坏但接收方能检测出来,帧会丢失
  • 发送方增加一个计时器(timer),等待 ACK,超时重发
  • 序号(SEQ:sequence number)
    • 发送方在帧头放一个序号,接收方由此判断这是个新帧还是应该被丢弃的重复帧。
    • ACK 丢失时,会超时重发重复帧,以此解决

效率的评估

  • 基础信息

    • F = frame size (bits)
    • R = channel capacity (Bandwidth in bits/second)
    • I = propagation delay + processor service time (second)
  • 指标

    • 每帧发送时间 (Time to transmit a single frame) = F/R
    • 总延迟 (Total Delay) = D =2I
    • 停止等待协议的发送工作时间是F/C,空闲时间是D
    • 信道利用率 (line utilization)=\(\frac{F}{F+RD}\)
      • 当 F<D 时:信道利用率 < 50%

例如,每一帧的发送时间是 1毫秒 ( 1000 bits/(1,000,000 bits/sec))

由于传播延迟较长,发送者在541毫秒之后才能收到确认,信道利用率1/541

一种提高效率的方法:使用更大的帧,但在传输中出错的概率越高,将导致更多的重传

滑动窗口协议

stop-and-wait 机制降低了信道利用率,我们寻找更高效的协议

改进思路:流水线协议/管道协议,即允许发送方在没收到确认前连续发送多个帧

窗口机制:发送方和接收方都具有一定容量的缓冲区,即窗口,发送端在收到确认前可发送多个帧

  • 滑动窗口协议
    • 对可以连续发出的最多帧数(已发出但未确认的帧)作限制
    • 循环重复使用有限的帧序号
    • 接收窗口驱动发送窗口的转动
      • 发送窗口:其大小记作\(W_T\),表示在收到对方确认的信息之前,可以连续发出的最多数据帧数
      • 接收窗口:其大小记作\(W_R\) ,为可以连续接收的最多数据帧数
    • 累计确认:不必对收到的分组逐个发送确认,而是对按序到达的最后一个分组发送确认

image-20241017102750246

image-20241017102803198

下面为一些具体的滑动窗口协议

回退N协议 go back N

接收窗口为1的情况,即只能按顺序接收帧

思路:一个出错全部重发

  • 当接收端收到一个出错帧或乱序帧时,丢弃所有的后继帧,且不为这些帧发送确认
  • 发送端超时后,重传所有未被确认的帧

当发送方发送了N个帧后,若发现该N帧的前一个帧在计时器超时后仍未返回其确认信息,则该帧被判为出错或丢失,此时发送方就重新发送出错帧及其后的N帧。

image-20241017103238659

出错全部重发时,若帧序号为n位,接收窗口\(W_R=1\),发送窗口 \(W_T ≤ 2^n-1\)

发送窗口收到 ACK 后移动,始终保持窗口里有\(W_T\)个PDU未确认

发现错误时整个窗口重发,超时也全部重发

  • 如果发送包丢失,接收方会把同一窗口下丢失包后面的所有包的ACK改成丢失包前一个已收到的包的ACK,表示丢失包丢失了
  • 如果是ACK丢失,但丢失的ACK后面的ACK都是正常的,那说明接收方没有丢失,就不用管

选择重传协议(Selective Repeat)

若发送方发出连续的若干帧后,收到对其中某一帧的否认帧,或某一帧的定时器超时, 则只重传该出错帧或计时器超时的数据帧

接收方窗口可以大于 1,帧出错要发否认帧 NAK,NAK让发送方重发帧

帧丢失处理流程如下

  • 如果发送帧丢失,无对应的ACK返回,而发送窗口后端必须在接受ACK后才移动,这样丢失的包会卡住发送窗口,最后超时重发
  • ACK丢失,处理流程一致,超时重发,然后ACK重发

发送窗口的尺寸:\(W_T ≤2^{n-1}\),发送窗口应等于或小于序号空间的一半

*3.5 数据链路协议实例

PPP协议 (Point-to-Point Protocol)

image-20241017110611559

11:16