文章目录
数据链路层的重要问题
封装成帧
在计算机网络中,封装成帧(Frame encapsulation)是数据链路层的一项重要任务。它将从更高层接收到的协议数据单元PDU ,如网络层的数据包,添加一个首部和一个尾部,使其转换成数据链路层的帧格式,以便于在物理链路上传输和处理。
帧首部和尾部的作用之一就是帧定界 (并不是每一种数据链路层协议的帧都包含有帧定界标志,例如以太网 V2 的 MAC帧
)
点对点协议 PPP
帧格式:
封装过程
封装成帧的过程通常包括以下步骤:
-
帧起始标志(Frame Start Delimiter):在帧的开始处添加一个特定的标志,用于表示帧的开始边界,通常是一个预定义的比特模式(如 01111110)。
-
帧头(Frame Header):帧头包含了一些重要的控制信息,如地址、控制字段等,用于识别帧的发送和接收端,以及帧的类型和操作。
-
数据字段(Data Field):数据字段是待传输的数据包。它可能包含从更高层传递下来的信息,例如网络层的数据包。
-
帧尾 (Frame Footer):帧尾通常包含了一些错误检测和纠正的机制,例如循环冗余校验 (CRC)、帧检验序列字段(FCS),用于检测传输过程中的比特错误。
帧的数据载荷
为提高数据链路层传输帧的效率,应当使帧的数据载荷的长度尽可能地大于首部和尾部的长度。
考虑到对缓存空间的需求以及差错挥制等诸多因素,每一种数据链路层协议都规定了帧的数据载荷的长度上限,即最大传送单元 (Maxmum Transfer Unit,MTU )。例如,以太网的 MTU 为 1500 个字节。
透明传输
透明传输 (Transparent Transmission)是指在数据链路层实现的一种传输方式,其中数据链路层对上层传输的数据不做任何修改或解释 。也就是说,数据链路层对上层交付下来的协议数据单元 PDU
没有任何限制,就好像数据链路层不存在一样。传输的数据在链路层保持不变,原样传输到接收端。
透明传输的特点是,上层协议可以自由地将数据传递给数据链路层,而不必考虑链路层的具体实现和细节。这样可以更加灵活地使用不同的上层协议,而不受数据链路层的限制。
实现透明传输
一般原理性方法方法:
-
面向字节 的物理链路使用字节填充 的方法实现透明传输:在把帧交付给物理层之前,会对帧的数据载荷进行扫描,每出现一个帧定界符或转义字符,就在其前面插入一个转义字符(长度为一个字节,十进制为 27)
-
面向比特 的物理链路使用比特填充 的方法实现透明传输:发送方的数据链路层在把帧交付给物理层之前,会对帧的数据载荷进行扫描,只要出现 5 个连续的比特 1,就在其后填入一个比特 0(零比特填充法)。接收方的数据链路层在把数据载荷向上交付网络层之前,会对帧的数据载荷进行扫描,每当发现连续的 5 个 比特 1,就把其后的一个比特 0 删除。
为了实现透明传输,数据链路层通常会使用特定的编码和解码技术,以确保传输数据的唯一性和完整性。这些技术包括差错检测 、帧起始标志 、帧长度字段等,以便在接收端正确地识别和处理接收到的数据。
差错检测
实际的通信链路都不是理想的,比特在传输过程中可能会产生差错(称为比特差错)比特 1 可能变成比特 0;比特 0 可能变成比特 1
使用差错检测 技术来检测数据在传输过程中是否产生了比特差错,是数据链路层所要解决的重要问题之一。
传输差错
-
误码出现在数据链路层及其下层
-
分组丢失、分组失序、分组重复出现在数据链路层的上层
误码(比特差错)
比特差错 也称为误码
如发送方的数据链路层采用某种检错技术,根据帧的内容计算出一个检错码 ,将检错码填入帧尾部 。接收方的数据链路层从帧尾部取出检错码,采用与发送方相同的检错技术 ,根据检错码检测出帧在传输过程中是否出现了误码。帧尾部中用于存放检错码 的字段称为帧检验序列 (FCS)
比特流在传输过程中可能受到噪声干扰,传输媒体质量等因素的影响而出现比特差错。在一段时间内,传输错误的比特数量占所传输比特总数的比率 称为误码率 (Bit Error Rate, BER)
提高链路的信噪比,可以降低误码率。但在实际的通信链路上,不可能使误码率下降为零,使用差错检测技术来检测数据在传输过程中是否产生了比特差错,是数据链路层所要解决的重要问题之一。
分组丢失
分组丢失(Packet Loss):在数据传输过程中,有时候数据包可能会在传输过程中丢失,这可能是由于网络拥塞、路由器故障、路由器输入队列将满、或者其他网络问题导致的。分组丢失可能会导致通信中断或数据不完整。
分组失序
分组失序(Packet Reordering):数据包在传输过程中可能会因为网络路由不同而导致顺序被打乱,即数据包到达的顺序与发送时的顺序不一致。这可能是由于网络拓扑变化或者不稳定路由引起的。分组失序可能会导致数据包在接收端无法正确重组,从而影响数据的正确性。
分组重复
分组重复(Packet Duplication):有时候,数据包可能会在网络中重复传输,这可能是由于路由器繁忙分组在输入队列中等待较长时间,导致主机对该分组进行超时重发。分组重复可能会导致数据冗余或者应用程序收到重复数据。
奇偶校验
- 奇校验是在待发送的数据后面添加 1 个校验位 ,使得添加该校验位后的整个数据中比特 1 的个数为奇数。
- 偶校验是在待发送的数据后面添加 1 个校验位 ,使得添加该校验位后的整个数据中比特 1 的个数为偶数。
-
在所传输的数据中,如果有奇数个位发生误码 ,则所包含比特1的数量的奇偶性会发生改变,可以检测出误码。
-
在所传输的数据中,如果有偶数个位发生误码 ,则所包含比特1的数量的奇偶性不会发生改变,无法检测出误码(漏检)
在实际使用时,奇偶校验又可分为垂直奇偶校验、水平奇偶校验以及水平垂直奇偶校验
循环冗余校验
数据链路层广泛使用漏检率极低 的循环冗余校验 (Cyclic Redundancy Check,CRC)检错技术。
收发双方约定好一个生成多项式 G ( X ) G(X) G(X)。发送方基于待发送的数据和生成多项式 G ( X ) G(X) G(X),计算出差错检测码(冗余码)将冗余码添加到待发送数据的后面一起传输。接收方收到数据和冗余码后,通过生成多项式 G ( X ) G(X) G(X)来计算收到的数据和冗余码是否产生了误码。
发送方 CRC 操作:
接收方 CRC 操作:
生成多项式
循环冗余算法要求生成多项式必须包含最低次项
若有如下生成多项式: G ( X ) = X 4 + X 2 + X + 1 = 1 ∗ X 4 + 0 ∗ X 3 + 1 ∗ X 2 + 1 ∗ X 1 + 1 ∗ X 0 \begin{equation} \begin{aligned} G(X) &= X^4+X^2+X+1\\&=1*X^4+0*X^3+1*X^2+1*X^1+1*X^0 \end{aligned} \end{equation} G(X)=X4+X2+X+1=1∗X4+0∗X3+1∗X2+1∗X1+1∗X0
生成多项式各项系数构成的比特串 10111
为计算冗余码时所用到的除数
常用的生成多项式:
CRC-16 = X 16 + X 15 + X 2 + 1 X^{16} + X^{15} + X^{2} + 1 X16+X15+X2+1,简记式 8005
CRC-CCITT = X 16 + X 12 + X 5 + 1 X^{16} + X^{12} + X^{5} + 1 X16+X12+X5+1,简记式 0x1021
CRC-32 = X 32 + X 26 + X 23 + X 22 + X 16 + X 12 + X 11 + X 10 + X 8 + X 7 + X 5 + X 4 + X 2 + X 1 + 1 X^{32} + X^{26} + X^{23} + X^{22} + X^{16} + X^{12} + X^{11} + X^{10} + X^{8} + X^{7} + X^{5} + X^{4} + X^{2} + X^{1} + 1 X32+X26+X23+X22+X16+X12+X11+X10+X8+X7+X5+X4+X2+X1+1,简记式 0x04C11DB7
方法流程
发送方:
-
构造"被除数",待发送数据后面添加生成多项式最高次数个0
-
构造"除数",生成多项式各项系数构成的比特串作为除数
-
做"二进制模2除法",相当于对应位进行逻辑异或运算
-
检查"余数",余数的位数应与生成多项式最高次数相同如果位数不够,则在余数前补0来凑足位数。
-
将冗余码添加到待发送数据的后面进行发送。
接收方:
-
构造"被除数",接收到的信息作为被除数
-
构造"除数",生成多项式各项系数构成的比特串作为除数
-
做"二进制模2除法",相当于对应位进行逻辑异或运算
-
检查"余数",余数为0可认为传输过程无误码;余数不为0,可认为传输过程产生了误码
纠错码
奇偶校验、循环冗余校验等差错检测技术,只能检测出传输过程中出现了差错,但并不能定位错误 ,因此无法纠正错误 。要想纠正传输中的差错,可以使用冗余信息更多的纠错码(例如海明码)进行前向纠错。但纠错码的开销比较大,在计算机网络中较少使用。
在计算机网络中,通常采用检错重传方式 来纠正传输中的差错(可靠传输服务),或者仅仅丢弃检测到差错的帧(不可靠传输服务),这取决于数据链路层向其上层提供的是可靠传输服务还是不可靠传输服务。