DLL--数据链路层

  • 数据链路层使用物理层提供的服务在通信信道上发送和接收比特。
  • 数据链路层从网络层获得数据包(package),然后将这些数据包封装成帧(frame )以便传输。
  • 每个帧包含一个帧头(Header)、一个有效载荷(Payload field)(用于存放数据包〉以及一个帧尾(Trailer)
  • 实现两个相连机器稳定有效的交流(reliable, efficient communication)

主要功能

  • 为网络层提供定义好的服务接口
  • 处理传输错误
  • 规定数据流,这样处理较慢的接受机器不会被淹没

DLL提供的服务

数据链路层提供了许多种服务,实际上提供的服务在系统间存在差异

三种常见的服务

  • Unacknowledged connectionless service.
    • 无确认的无连接服务
    • 指源机器向目标机器发送独立的帧,目标机器并不对这些帧进行确认
    • 采用这种服务,事先不需要建立逻辑连接,事后也不用释放逻辑连接。
    • 若由于线路的噪声而造成了某一帧的丢失,数据链路层并不试图去检测这样的丢帧情况,更不会去试图恢复丢失的帧。
    • 使用场合
      • 错误率很低的场合
      • 实时通信
  • Acknowledged connectionless service.
    • 有确认的无连接服务
    • 数据链路层仍然没有使用逻辑连接,但其发送的每一帧都需要单独确认。
    • 发送方可知道一个帧是否已经正确地到达目的地。如果一个帧在指定的时间间隔内还没有到达,则发送方将再次发送该帧。
    • 适用于不可靠的信道
    • 不要求这种确认服务由数据链路层实现。
  • Acknowledged connection-oriented service.
    • 有确认的面向连接服务
    • 建立了两个机器的连接,帧可以传输
    • 在连接发送的每一个帧是编号的(numbered)和确认的(acknowledged)
    • 帧保证仅按顺序到达一次(Only once and in order)。
    • 一旦通信完成,就会释放连接。
    • 这与“可靠”比特流相同。

例子:两个路由间的数据流动

路由:1)通过网络传输信息 2)确定最佳路径

Frame--帧

  • 为了向网络层提供服务(use the service),数据链路层必须使用物理层提供的服务。
  • 物理层只能在传输介质上放置原始比特流(use the service)。
  • 位流不保证没有错误。
  • 数据链路层负责检测并在必要时纠正错误。

成帧

  • DDL 能够将位流分解为离散的帧(break up the bit stream into discrete frames)。

  • 计算每个帧的校验和,当帧到达目的地时重新计算校验和。

  • 将比特流分解成帧有点困难。

    • 时间间隔
  • 我们需要看看其他表示帧开始和结束的方法。

四种成帧的方法

  • Character count(字符计数法)

    • 使用帧头中的字段来指定帧中的字符数

    • 缺点:出现错误后,找不到下一帧的正确起始位置,重传也不知道从哪里开始

  • Flag bytes with byte stuffing(带字节/字符填充的分界符法)

    • 使用一些特殊的字节作为开始和结束,通常都相同,成为标志字节(flag byte)
    • 使用了两个连续的标志字符代表了一帧的结束和下一帧的开始

    • 问题1:如果标志字节出现在数据中,会干扰到帧的分界

      • 解决:添加转义字节,接收方的数据链路层在将数据传递给网络层之前必须删除转义字节,称为字节填充
    • 问题2:如果转义字节也出现在数据中,怎么办

      • 解决:同样用字节填充。用一个转义字节来填充

    • 缺点:只能使用8比特的字节

  • Starting and ending flags, with bit stuffing(带位填充的分界标志法)

    • 帧的划分可以在比特级完成

    • 每个帧的开始和结束由一个特殊的比特模式标记,如01111110或者十六进制0x7E

    • 这种模式是一个标志字节。每当发送方的数据链路层在数据中遇到连续五个1 ,它

      便自动在输出的比特流中填入一个比特 。

    • 比特填充还确保了转换的最小密度,这将有助于物理层保持同步。

  • Physical layer coding violations(物理层编码违例法)

    • 使用物理层的捷径
    • 比特编码成信号通常包括一些冗余比特,以便帮助接收器同步接收。这种冗余意味着一些信号将不会出现在常规数据中。
      • 例如,在 4B/5B 线性编码模式下, 个数据位被映射成 个信号比特,通过这种方法确保线路上的信号有足够的跳变。这意味着 32 个可能的信号中有 16 个是不会被使用的。
    • 可以使用保留的信号来指示帧的开始和结束
    • 大多数 DLL 协议将字符计数与另一种方法结合使用以提高安全性。 这增加了发现错误的机会。

差错控制--Error Control

  • 我们使用字节填充位填充校验和作为检测和确定我们发送的数据中的错误的方法。
  • 我们还必须确保帧能够到达目的地。
  • 接收器发回一个控制帧(control frame),确认接收到的帧和帧的状态。
  • 如果确认没有到达,可能会发生超时,导致帧被重新发送。
    • 超时间隔
  • 重新发送帧也会导致问题——当同一帧被接收两次或更多次时会发生什么?
  • 我们还可以对帧进行顺序编号(sequentially number the frames)以防止出现此问题。
  • 有许多不同的方法可以进行这种类型的错误控制(也可以在不同的级别上进行)。
  • 管理定时器和序列号是数据链路层职责的重要部分

流量控制--Flow Control

  • 我们必须处理发送方以高于接收方接收数据的速率发送数据的问题。
  • 有两种方法可以解决这个问题:
    • 基于反馈的流量控制 -- feedback-based flow control
      • 反馈用于告诉发送方接收方正在做什么或发送另一个帧
    • 基于速率的流量控制 -- rate-based flow control
      • 传输速率由发件人固定
      • 这从未在 DLL 中使用过

Why do we need Error Detection And Correction?

  • 本地环路仍然是模拟双绞线,错误仍然很常见。
  • 无线通信正变得越来越普遍,错误率比局间光纤干线上的差几个数量级。
  • 传输错误将伴随我们很多年。

Types of Error 错误的类型

  • 错误突然出现 Burst errors
  • 独立的单位错误 Independent single-bit errors
  • 例子
    • 块大小为 1000 位
    • 错误率为每比特 0.001
  • 突发错误比孤立错误更难纠正

错误处理--Error Processing

这两种技术中的每一种都适用于不同的情况

Error-correcting codes 纠错码
  • 在发送的每个数据块中包含足够的冗余信息。
  • 接收机可以推断发送的数据
  • 纠错码的使用通常被称为前向纠错(前向纠错).
  • 开销很高,但它减少了重新发送帧的需要。
  • 最适合高误差(无线)网络
Error-detecting codes 检错码
  • 只包含足够的冗余
  • 允许接收方推断出发生了错误,但不更正错误,只让它请求重新传输。
  • 适用于高可靠性信道(highly reliable channel),如光纤
  • 只要在发现错误时重新传输即可
Hamming code 汉明码
  • 纠错码位数:r
  • 数据位数:m

例子:

获得汉明码

  • 问题:Original data: 10101111,even-parity Hamming code 偶校验汉明码, if hope to correct one single error, What is the Hamming code for it?
  • 解法:m = 8, 根据公式 \((m+r+1) \le 2^r\)得到\(r = 4\)
12 11 10 9 8* 7 6 5 4* 3 2* 1*
1100 1011 1010 1001 1000 0111 0110 0101 0100 0011 0010 0001
1 1 1 1 0 1 0 1
  • 计算校验位用在相应位置上为1的数进行异或
  • P1:\(B1 \oplus B3 \oplus B5 \oplus B7 \oplus B9 \oplus B11 = 1\)
  • 同理:
    • P2:0
    • P3:0
    • P4:0
  • 这里自己位置设置为0,检验的时侯计算这些位置做异或运算一定得等于0
  • 所以汉明码为101001001111

利用汉明码检测错误

  • 收到一个代码为100110001100(m = 8, r = 4)
  • 这个代码是否正确,如果错了该改正哪里
12 11 10 9 8* 7 6 5 4* 3 2* 1*
1100 1011 1010 1001 1000 0111 0110 0101 0100 0011 0010 0001
0 0 1 1 0 0 0 1 1 0 0 1
  • P1:\(B1 \oplus B3 \oplus B5 \oplus B7 \oplus B9 \oplus B11 = 1\)

  • 同理:

    • P2:1
    • P3:0
    • P4:0
  • 0011是第三个位置出现了错误,改为相反数

  • 即101110001100

Error Detection
  • 错误检测代码仅包含足够的数据,以便接收器确定数据是否有故障。

  • 如果物理链路的错误率更低,则错误检测和重传通常更有效。

    • 铜线或光纤
  • 为了比较,考虑错误率为每比特\(10^{-6}\)的信道。让块大小为1000bits。

    • 要纠正单个错误(通过汉明码),每个块需要10个校验位。要传输1000个块,需要10000个校验位(开销)。
    • 要检测单个错误,每个块一个奇偶校验位就足够了。为了传输1000个块,只需重新传输一个额外的块(由于每比特的错误率为\(10^{-6}\)),从而产生开销(开销) 只有2001(=1000*1+1001)位。
Polynomial Code(多项式编码)
  • Also known as a CRC (Cyclic Redundancy Check,循环冗余校验码).
  • 基于将位字符串视为系数为0和1的多项式的表示
    • 例子:110001

    • 6项5阶多项式

    • \(1\times x^5+1\times x^4+0\times x^3+0\times x^2+0\times x^1+1\times x^0 = x^5+x^4+1\)

  • 多项式运算是模2(modulo 2)完成的。加法和减法都与异或相同(等同于异或) EXCLUSIVE OR

What is modulo 2?

  • Modulo 2 addition & substraction: XOR logic

  • CRC方法的基本思想是:

    • 发送方和接收方提前就在生成多项式(generator polynomial)上达成一致, G(x)。
    • 发送方在帧的末尾追加校验和(checksum),校验和帧表示的多项式可以被G(x)整除。
    • 当接收器获得帧时,它会尝试将其除以相同的G(x)。如果有余数,则一定是发生了错误,并将请求重新传输。
  • 计算校验和

    • r:G(x)的维度

    • 添加r个零位到帧的低阶端,使其现在包含m+r位,并对应于多项式\(x^rM(x)\)

    • 使用模2除法将对应于\(G(x)\)的位字符串划分为对应于\(x^rM(x)\)的位字符串。

    • 使用模2减法从与\(x^rM(x)\)对应的位字符串中减去余数(始终为r或更少的位)。

    • 结果是要传输的校验和帧。称其为多项式\(T(x)\)

  • 例子