当前位置: 首页 > news >正文

数据链路层 I(组帧、差错控制)【★★★★★】

(★★)代表非常重要的知识点,(★)代表重要的知识点。

为了把主要精力放在点对点信道的数据链路层协议上,可以采用下图(a)所示的三层模型。在这种三层模型中,不管在哪一段链路上的通信(主机 - 路由器之间 or 路由器 - 路由器之间),我们都看成是结点和结点的通信(如下图中的结点 A 和 B ) ,而每个结点只有下三层一一网络层、数据链路层和物理层。

点对点信道的数据链路层在进行通信时的主要步骤如下:
① 结点 A 的数据链路层把网络层交下来的 IP 数据报添加首部和尾部封装成帧。
② 结点 A 把封装好的帧发送给结点 B 的数据链路层。
③ 若结点 B 的数据链路层收到的帧无差错,则从收到的帧中提取出 IP 数据报交给上面的网络层;否则丢弃这个帧。
数据链路层不必考虑物理层如何实现比特传输的细节(为终端结点隐蔽物理传输的细节是物理层的功能)。我们甚至还可以更简单地设想好像是沿着两个数据链路层之间的水平方向把帧直接发送到对方,如上图(b)所示。

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

一、组帧

先来了解一些定义和概念:

  • 封装成帧(framing, 又称组帧):是指在一段数据的前后分别添加首部和尾部,构成帧(即数据链路层的数据传送单元)。
  • 帧长:等于数据部分的长度加上首部和尾部的长度。
  • 帧定界:首部和尾部中含有很多控制信息,它们的一个重要作用是确定帧的界限,即帧定界。
  • 帧同步:指接收方能从接收到的二进制比特流中区分出帧的起始与终止。
  • 透明传输:如果在数据中恰好出现与帧定界符相同的比特组合(会误认为“传输结束”而丢弃后面的数据),若下图所示,那么就要采取有效的措施解决这个问题,即透明传输。更确切地说,透明(看不见)传输就是不管所传数据是什么样的比特组合,都应当能在链路上传送。
  • 最大传送单元(Maximum Transfer Unit, MTU):为了提高帧的传输效率, 应当使帧的数据部分的长度尽可能地大于首部和尾部的长度,但每种数据链路层协议都规定了帧的数据部分的长度上限,即 MTU 。

注意:组帧时既要加首部,又要加尾部。原因是, 在网络中信息是以帧为最小单位进行传输的,所以接收端要正确地接收帧,必须要清楚该帧在一串比特流中从哪里开始到哪里结束(因为接收端收到的是一串比特流,没有首部和尾部是不能正确区分帧的)。而分组(即IP 数据报)仅是包含在帧中的数据部分,所以不需要加尾部来定界。

数据链路层之所以要把比特组合成帧为单位传输,是为了在出错时只重发出错的帧,而不必重发全部数据,从而提高效率。组帧主要解决帧定界、帧同步、透明传输等问题。通常有以下 4 种方法实现组帧。

1. 字符计数法

如下图所示,字符计数法是指在帧首部使用一个计数字段来记录该帧所含的字节数(包括计数字段自身所占用的 1 个字节)。当接收方读出帧首部的字节计数值时,就知道后面跟随的字节数,从而可以确定帧结束的位置。因为帧与帧之间是连续传输的,所以也能确定下一帧的开始位置。

这种方法最大的问题在于若计数字段出错,即失去了帧边界划分的依据,那么接收方就无法判断所传输帧的结束位和下一帧的开始位,收发双方将失去同步,从而造成灾难性后果。

2. 字节填充(byte stuffing)法

字符填充法使用特定字符来定界一帧的开始与结束,在下图所示的例子中, 控制字符 SOH(Start Of Header)放在帧的最前面,表示帧的首部开始;控制字符 EOT(End Of Transmission)表示帧的结束。

为了使信息位中出现的特殊字符不被误判为帧的首尾定界符,可在特殊字符前面填充一个转义字符 ESC 来加以区分(注意,转义字符是 ASCII 码中的控制字符,是一个字符,而非 “E" “S” “C” 三个字符的组合),以实现数据的透明传输。接收方收到转义字符后,就知道其后面紧跟的是数据信息,而不是控制信息。

在下图(a)所示的字符帧中,帧的数据段中出现 EOT 或 SOH 字符,发送方在每个 EOT 或 SOH字符前再插入一个 ESC 字符(下图(b)所示),接收方收到数据后会自己删除这个插入的 ESC 字符,结果仍得到原来的数据(下图(c)所示)。这也正是字符填充法名称的由来。如果转义字符 ESC 也出现在数据中,则解决方法仍是在转义字符前插入一个转义字符。

3. 零比特填充法

零比特填充法允许数据帧包含任意个数的比特,也允许每个字符的编码包含任意个数的比特。它使用一个特定的比特串 01111110 来标志一帧的开始和结束,如下图所示。

为了不使信息位中出现的比特流 01111110 被误判为帧的首尾标志,发送方的数据链路层先扫描整个数据字段,每遇到 5 个连续的 “1” 时,将自动在其后插入 1 个 “0” 。接收方做该过程的逆操作,即每收到 5 个连续的 “1” 时,就自动删除后面紧跟的 “0” ,以恢复原始信息。

在数据链路层早期使用的 HDLC 协议中,便是采用这种比特填充的首尾标志法来实现透明传输的。零比特填充法很容易由硬件来实现,性能优于字符填充法。

4. 违规编码法

在物理层进行比特编码时,通常采用违规编码法。例如,曼彻斯特编码方法将数据比特 “1” 编码成“高 - 低“电平对,将数据比特 “0” 编码成“低 - 高”电平对,而“高 - 高“电平对和“低 - 低“电平对在数据比特中是违规的(即没有采用)。因此可以借用这些违规编码序列来定界帧的起始和终止。局域网 IEEE 802 标准就采用了这种方法。违规编码法不需要采用任何填充技术,便能实现数据的透明传输,但它只适用于采用冗余编码的特殊编码环境。

因为字符计数法中计数字段的脆弱性和字节填充法实现上的复杂性与不兼容性,目前较常用的组帧方法是零比特填充法和违规编码法。

5. 例题

【2013 统考真题】HDLC 协议对 01111100 01111110 组帧后,对应的比特串为( A )。
A. 01111100 00111110 10
B. 01111100 01111101 01111110
C. 01111100 01111101 0
D. 01111100 01111110 01111101

二、差错控制

由于信道噪声等各种原因,帧在传输过程中可能会出现错误。用以使发送方确定接收方是否正确收到由其发送的数据的方法称为差错控制。通常,这些错误可分为位错和帧错。

  • 位错:帧中某些位出现了差错。通常采用循环冗余校验(CRC)方式发现位错。
  • 帧错:指帧丢失、帧重复或帧失序等错误,它们都属于传输差错。

过去 OSI 的观点是:必须让数据链路层向上提供可靠传输。因此在 CRC 检错的基础上,增加了帧编号、确认和重传机制。收到正确的帧就要向发送端发送确认。发送端在一定的期限内若没有收到对方的确认,就认为出现了差错,因而就进行重传,直到收到对方的确认为止。
这种方法在历史上曾经起到很好的作用。但现在的通信线路的质量已经大大提高了,由通信链路质量不好引起差错的概率已经大大降低。因此,现在互联网就采取了区别对待的方法:
① 对于通信质量良好的有线传输链路,数据链路层协议不使用确认和重传机制,即不要求数据链路层向上提供可靠传输的服务。如果在数据链路层传输数据时出现了差错并且需要进行改正,那么改正差错的任务就由上层协议(例如,传输层的 TCP 协议)来完成。
② 对于通信质量较差的无线传输链路,数据链路层协议依然使用确认和重传机制,向上提供可靠传输的服务。
实践证明,这样做可以提高通信效率。

在一段时间内,传输错误的比特占所传输比特总数的比率称为误码率(Bit Error Rate, BER)。误码率与信噪比有很大的关系,如果设法提高信噪比,就可以使误码率减小。实际的通信链路并非是理想的,它不可能使误码率下降到零。比特在传输过程中可能会产生差错:1 可能会变成 0,而 0 也可能变成 1 ,这就叫做比特差错。比特差错是传输差错中的一种。下面我们仅讨论比特差错。

为了保证数据传输的可靠性,在计算机网络传输数据时,必须采用各种差错检测措施。通常利用编码技术进行差错控制,主要有两类:
自动重传请求(Automatic Repeat Request, ARQ),当接收端检测到差错时,就设法通知发送端重发,直到接收到正确的数据为止;
前向纠错(Forward Error Correction, FEC),接收端不但能发现差错,而且能确定比特串的错误位置并加以纠正。
因此,差错控制又可分为检错编码和纠错编码。

1. 检错编码(Error Detection Codes)

检错编码是用于检测在数据传输或存储过程中是否发生了错误的编码方式。通过添加冗余信息,检错编码能够检测到数据在传送过程中所发生的错误,而无法修正这些错误。常见的检错编码有奇偶校验码(Parity Bit)和循环冗余码(Cyclic Redundancy Check, CRC)。

1)奇偶校验码

奇偶校验码是奇校验码和偶校验码的统称,是一种最基本的检错码。它由 n - 1 位数据和 1 位校验位组成,校验位的取值(0 或 1)将使整个校验码中 “1” 的个数为奇数或偶数。

  • 奇校验码:在附加一个校验位后,码长为 n 的码字中 “1" 的个数为奇数;
  • 偶校验码:在附加一个校验位后,码长为 n 的码字中 “1" 的个数为偶数。

它只能检测奇数个比特的错误,但并不知道哪些位错了,也不能发现偶数个比特的错误。

例如,数据 1001101 对应的奇校验码为 1001101 1,奇校验码为 1001101 0。若该数据出现 1 位错误(即奇数个比特出错)变为 10 1 1101 ,那么可以检测出该数据有误;若该数据出现 2 位错误(即偶数个比特出错)变为 10 10 101 ,那么将检测不出该数据有误。

2)循环冗余码(CRC)

数据链路层广泛使用循环冗余码检错技术。循环冗余码(CRC)检错的基本思想为:

① 收发双方约定生成多项式 G(x)(最高位和最低位必须为 1)。k 位位串可视为阶数为 k - 1 的多项式的系数序列。例如,可用多项式 x3 + x2 + 1 表示位串 1101 。
② 发送方基于待发送的数据 M 和 G(x),计算出冗余码,将冗余码附加到数据后面一起发送。
③ 接收方收到数据和冗余码后,通过 G(x) 来计算收到的数据和冗余码是否产生差错。

假设一个待传送 m 位的数据 M ,CRC 运算产生一个 r 位的冗余码,称为帧检验序列(FCS)。这样形成的帧将由 m + r 位组成(在所要发送的数据后面增加 r 位冗余码,虽然增大了传输开销,但是可以进行差错检测,这种代价往往是值得的)。这个带检验码的帧刚好能被预先确定的多项式 G(x) 整除。接收方用相同的多项式去除收到的帧,若无余数,则认为无差错。

帧检验序列(Frame Check Sequence, FCS)是指为了进行检错而添加的冗余码。循环冗余检验 CRC 和帧检验序列 FCS 并不是同一个概念,CRC 是一种检错方法,而 FCS 是添加在数据后面的冗余码。CRC 冗余码的位数等于多项式 G(x) 的最高次数。

假设一串二进制数据 M 有 m 位,给定的多项式 G(x) 的阶(即最高次数)为 r,则计算冗余码的步骤如下:
① 加 0 :在 M 的低位端加上 r 个 0,相当于乘以 2r
② 模 2 除:利用模 2 除法,用 ① 中计算出的 2r × M 除以多项式 G(x) 对应的二进制数据串,得到的余数即为冗余码(共 r 位,若前面有 0,则不可省略)。
按照模 2 运算规则,加法不进位,减法不借位,相当于对应位进行逻辑异或操作。下面举一个例子:

设多项式 G(x) = x3 + x2 + 1(即 r = 3),待传送的二进制数据 M = 101001(即 m = 6),经模 2 除法运算后的结果是:商 Q = 110101、余数 R = 001 。所以发送出去的数据为 101001 001(即 2rM + FCS),共有 m + r 位。

在数据链路层,发送端帧检验序列 FCS 的生成和接收端的 CRC 检验都是用硬件完成的,处理很迅速,因此并不会延误数据的传输。

若在传输过程中无差错,则经过 CRC 检验后得出的余数 R 肯定为 0 。但是,若出现误码,则余数 R 仍为 0 的概率极低。因此,在数据链路层若使用 CRC 差错检测技术,可以做到对帧的无差错接受,即:“凡是接收方数据链路层接受的帧均无差错”。

凡是接收方数据链路层接受的帧,我们都能以非常接近于 1 的概率认为这些帧在传输过程中没有产生差错;而接收端丢弃的帧虽然曾收到了,但最终还是因为有差错而被丢弃,即未被接受。

注意:
I、循环冗余码(CRC)是具有纠错功能的,只是数据链路层仅使用了它的检错功能。为了方便协议的实现,检测到帧出错则直接丢弃。
II、目前我们没有要求数据链路层向网络层提供“可靠传输”的服务。所谓“可靠传输”就是:数据链路层的发送端发送什么,在接收端就收到什么。传输差错可分为位错(比特差错)和帧错(帧丢失、帧重复或帧失序)。可能接收方收到的每一个帧都没有发生比特差错,但却出现了帧丢失、帧重复或帧失序的传输差错情况。因此,我们应当明确:“无比特差错”与“无传输差错”并不是同样的概念。在数据链路层使用 CRC 检验,能够实现无比特差错的传输,但这还不是可靠传输。

2. 纠错编码(Error Correction Codes)

纠错编码不仅可以检测到错误,还能够在一定程度上自动修正错误。这类编码通过更复杂的冗余信息使接收方能够恢复原始数据,通常在信号噪声较大的环境中使用。最常见的纠错编码是海明码(Hamming Code)。

1)海明码

海明码的实现原理是在有效信息位中加入几个校验位形成海明码,并把海明码的每个二进制位分配到几个奇偶校验组中。当某一位出错后,就会引起有关的几个校验位的值发生变化,这不但可以发现错位,而且能指出错位的位置,为自动纠错提供依据。

码距,又称海明距离,指两个码字中不相同的二进制的个数。对于一个编码系统,将其中所有的合法码字的最小距离值称为这个编码系统的码距。
例如,某编码系统有 3 个二进制码字,每个码字占 3 位,为 000 101 001。其中,码字 000 和码字 101 的码距为 2;码字 000 和码字 001 的码距为 1;码字 101 和码字 001 的码距为 1。因此,此编码系统的码距为 1 。
海明码 “纠错” d 位,需要码距为 2d + 1 的编码方案;“检错” d 位,需要码距为 d + 1 的编码方案。

现以数据码 1010 为例讲述海明码的编码原理和过程。

① 确定海明码的位数
设 n 为有效信息的位数(n = 4),k 为校验位的位数,则信息位 n 和校验位 k 应满足:n + k <= 2k - 1 。当 k = 3 时,海明码位数为 n + k = 7 <= 23 - 1 成立,此时的 n、k 有效。
设信息位为 D4D3D2D1(1010),共 4 位,检验位为 P3P2P1,共 3 位,对应的海明码为 H7H6H5H4H3H2H1

② 确定检验位的分布
规定校验位 Pi 在海明位号为 2i-1 的位置上,其余各位为信息位,因此有:
P1 的海明位号为 2i-1 = 20 = 1,即 H1 为 P1
P2 的海明位号为 2i-1 = 21 = 2,即 H2 为 P2
P3 的海明位号为 2i-1 = 22 = 4,即 H4 为 P3
将信息位按原来的顺序插入,则海明码各位的分布为:H7H6H5H4H3H2H1 = D4D3D2P3D1P2P1

③ 分组以形成校验关系
每个数据位用多个校验位进行校验,但要满足条件:被校验数据位的海明位号等于校验该数据位的各校验位海明位号之和。另外,校位不需要再被校验。分组形成的校验关系如下。

④ 校验位取值
校验位 Pi 的值为第 i 组(由该校验位校验的数据位)所有位求异或。根据 ③ 中的分组有:
P1 = D1 ⊕ D2 ⊕ D4 = 0 ⊕ 1 ⊕ 1 = 0
P2 = D1 ⊕ D3 ⊕ D4 = 0 ⊕ 0 ⊕ 1 = 1
P3 = D2 ⊕ D3 ⊕ D4 = 1 ⊕ 0 ⊕ 1 = 0
所以, 1010 对应的海明码为 101 0 0 10(被标记的为校验位,其他为信息位)。

⑤ 海明码的校验原理
每个校验组分别利用校验位和参与形成该校验位的信息位进行奇偶校验检查,构成 k 个校验方程:
S1 = P1 ⊕ D1 ⊕ D2 ⊕ D4
S2 = P2 ⊕ D1 ⊕ D3 ⊕ D4
S3 = P3 ⊕ D2 ⊕ D3 ⊕ D4
若 S3S2S1 的值为 “000" ,则说明无错;否则说明出错,且这个数就是错误位的位号,如S3S2S1 = 001 ,说明第 1 位出错,即 H1 出错,直接将该位取反就达到了纠错的目的。

3. 例题

① 要发送的数据是 1101 0110 11,采用 CRC 检验,生成多项式是 10011,那么最终发送的数据应该是( C )。
A. 1101 0110 1110 10
B. 1101 0110 1101 10
C. 1101 0110 1111 10
D. 1111 0011 0111 00

② 【2023 统考真题】若甲向乙发送数据时采用 CRC 检验,生成多项式为 G(x) = X4 + X + 1(即 G = 10011),则乙方接收到比特串( D )时,可以断定其在传输过程中未发生错误。
A. 10111 0000
B. 10111 0100
C. 10111 1000
D. 10111 1100

三、其他知识点(了解即可)

  1. 数据链路层使用的两种信道:
    点对点信道:使用一对一的点对点方式。PPP 协议则是目前使用最广泛的点对点协议。
    广播信道:使用一对多的广播通信方式。广播信道上连接的主机很多,因此必须使用专用的共享信道协议来协调这些主机的数据发送,采用共享广播信道的有线局域网普遍使用 CSMA/CD 协议,而无线局域网则使用 CSMA/CA 协议。

  2. 数据链路层所处的地位:
    下图中主机 H1 与主机 H2 都有完整的五层协议栈,而路由器在转发分组时仅使用协议栈的下三层。从图中可以看出数据从主机 H1 传送到主机 H2 需要在路径中的各结点的协议栈向上和向下流动多次。

当我们专门研究数据链路层的问题时,在许多情况下我们可以只关心在协议栈中水平方向的各数据链路层。于是,当主机 H1 向主机 H2 发送数据时,我们可以想象数据就是在数据链路层从左向右沿水平方向传送的,如下图所示。

从数据链路层来看,主机 H1 到主机 H2 的通信可以看成由四段不同的链路层通信组成,即: H1 --> R1, R1 --> R2, R2 --> R3 和 R3 --> H2 。这四段不同的链路层可能采用不同的数据链路层协议。

  1. 点对点信道的一些基本概念:
    链路(“物理链路”, link):指从一个结点到相邻结点的一段物理线路(有线或无线),且中间没有任何其他的交换结点。当进行数据通信时,两台计算机之间的通信路径往往要经过许多段这样的链路。可见链路只是一条路径的组成部分。
    数据链路(“逻辑链路”, data link):当在一条链路上传送数据时,除了需要链路本身外,还需要一些必要的通信协议来控制这些数据的传输,把实现这些协议的硬件和软件加到链路上,就构成了数据链路。【即逻辑链路是物理链路加上必要的通信协议。】
    :数据链路层对等实体之间进行逻辑通信的协议数据单元。数据链路层把网络层交下来的数据构成帧发送到链路上,并把接收到的帧中的数据取出并上交给网络层。

  2. 数据链路层通常可以为网络层提供如下三种服务:
    无确认的无连接服务:源主机发送数据帧时不需先建立链路连接,目的主机收到数据帧时不需发回确认。
    【数据传输的可靠性交由高层负责。适用于误码率较低的通信信道,如以太网。对于信道比较可靠且对实时性要求高的网络,数据链路层采用该服务比较合适。】
    有确认的无连接服务:源主机发送数据帧时不需先建立链路连接,但目的主机收到数据帧时必须发回确认。源主机在所规定的时间内未收到确定信号时,就重传丢失的帧,以提高传输的可靠性。
    【该服务适用于误码率较高的通信信道,如无线通信。】
    有确认的面向连接服务:帧传输过程分为三个阶段:建立链路、传输帧、释放链路。目的主机对收到的每一帧都要返回确认,源主机收到确认后才能发送下一帧,因而该服务的可靠性最高。
    【该服务适用于可靠性要求较高的场合。】

注意:有连接就一定要有确认,即不存在无确认的面向连接的服务。

  1. 链路管理:
    数据链路层连接的建立、维持和释放过程称为链路管理,它主要用于 面向连接 的服务。链路两端的结点要进行通信,必须首先确认对方已处于就绪状态,并交换一些必要的信息以对帧序号初始化,然后才能建立连接,在传输过程中则要能维持连接,而在传输完毕后要释放该连接。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • YOLO目标检测的单目(多目标测距),使用相机光学模型,支持目标检测模型训练,可输出目标位置和距离信息并可视化
  • 【Python机器学习】利用SVD简化数据——示例:基于SVD的图像压缩
  • 倍增算法 最近公共祖先(LCA)C++
  • 低代码开发:机遇与挑战并存的技术革新
  • 大数据系列之:Doris Kafka Connector,实时消费Kafka Topic中的数据同步到Doris数据库
  • 【sql】MySQL中的 JOIN 操作
  • react-redux的使用
  • Java编程中接口与实现分离的七种关键技术和设计模式
  • 【OpenHarmony4.1 之 U-Boot 2024.07源码深度解析】019 - RK3568 Uboot 完整流程梳理
  • plantUML介绍和使用
  • python:画由两条抛物线所围成的图形
  • Vue 3 深入指南:`watch` 属性监控与响应式处理
  • 深入理解java web分层架构的高内聚低耦合
  • 力扣热题100_二分查找_74_搜索二维矩阵
  • WPF学习(8) --Windows API函数的使用
  • __proto__ 和 prototype的关系
  • Apache Pulsar 2.1 重磅发布
  • Apache的80端口被占用以及访问时报错403
  • export和import的用法总结
  • js递归,无限分级树形折叠菜单
  • LeetCode算法系列_0891_子序列宽度之和
  • Making An Indicator With Pure CSS
  • React中的“虫洞”——Context
  • session共享问题解决方案
  • SpringCloud集成分布式事务LCN (一)
  • Terraform入门 - 1. 安装Terraform
  • Vue 2.3、2.4 知识点小结
  • Yii源码解读-服务定位器(Service Locator)
  • 汉诺塔算法
  • 基于axios的vue插件,让http请求更简单
  • 基于Dubbo+ZooKeeper的分布式服务的实现
  • 聊聊hikari连接池的leakDetectionThreshold
  • 爬虫进阶 -- 神级程序员:让你的爬虫就像人类的用户行为!
  • 微信小程序填坑清单
  • 新版博客前端前瞻
  • 选择阿里云数据库HBase版十大理由
  • #宝哥教你#查看jquery绑定的事件函数
  • (1)(1.13) SiK无线电高级配置(六)
  • (NO.00004)iOS实现打砖块游戏(十二):伸缩自如,我是如意金箍棒(上)!
  • (附源码)基于SSM多源异构数据关联技术构建智能校园-计算机毕设 64366
  • (免费领源码)python#django#mysql校园校园宿舍管理系统84831-计算机毕业设计项目选题推荐
  • (十三)Flink SQL
  • (四)Controller接口控制器详解(三)
  • (转)菜鸟学数据库(三)——存储过程
  • .net 4.0 A potentially dangerous Request.Form value was detected from the client 的解决方案
  • .NET Core 将实体类转换为 SQL(ORM 映射)
  • .Net6使用WebSocket与前端进行通信
  • .NET开源全面方便的第三方登录组件集合 - MrHuo.OAuth
  • .NET开源项目介绍及资源推荐:数据持久层 (微软MVP写作)
  • .NET连接数据库方式
  • @31省区市高考时间表来了,祝考试成功
  • [ HTML + CSS + Javascript ] 复盘尝试制作 2048 小游戏时遇到的问题
  • [ vulhub漏洞复现篇 ] JBOSS AS 4.x以下反序列化远程代码执行漏洞CVE-2017-7504
  • [<MySQL优化总结>]
  • [12] 使用 CUDA 加速排序算法