生成多项式 G 的选择:常见的有 8、12、16
和 32
比特
国际标准已经定义了 8-、16-、32-
位生成多项式 G;8-
位 CRC 用于 ATM 信元首部的保护;32-CRC
用于大量链路层 IEEE 协议。
$$
\begin{align*}
& \text{CRC8生成多项式: } G(x) = x^8 + x^5 + x^4 + 1 \\
& \text{CRC16生成多项式: } G(x) = x^{16} + x^{12} + x^5 + 1 \\
& \text{CRC32生成多项式: } G(x) = x^{32} + x^{26} + x^{23} + x^{22} \\
& \quad + x^{16} + x^{12} + x^{11} + x^{10} + x^8 + x^7 \\
& \quad + x^5 + x^4 + x^2 + x + 1
\end{align*}
$$
D × 2^r
(相当于比特串左移 r 位)。D × 2^r
模 2 除以 G,得到余数 R,即$$D \times 2^r \oplus R = nG$$DR
,如果 R 的长度不足 r 个 bit 则在高位补 0,得到的DG
满足条件DR / G
余数为 0,发送 DR 给接收方。模 2 运算是一种二进制算法,CRC 校验技术中的核心部分。与四则运算相同,模 2 运算也包括模 2 加法、模 2 减法、模 2 乘法、模 2 除法四种二进制运算。与四则运算不同的是模 2 运算不考虑进位和借位,模 2 算术是编码理论中多项式运算的基础。模 2 算术在其他数字领域中的应用也是很广泛的。
+,-,⊕(XOR, 异或)
三种运算等价在除法运算中,被除数 = 除数 × 商 + 余数,且余数 < 除数,对于 CRC 中的模 2 除法也是如此:
$$D \times 2^r = G \times Q + R$$
其中:
$D \times 2^r$ 是被除数(d+r 位),$G$ 是除数(r+1 位),$Q$ 是商,$R$ 是余数
根据除法的基本性质,余数必须小于除数, 即$R < G$,又由于生成多项式 G 是 r+1 位的二进制数(最高位为 1),所以:
因此余数 R 满足$0 \leq R \leq 2^r-1$,即其长度不可能超过 r 个 Bit
在上面得到这样的关系:$$D \times 2^r \oplus R = nG$$
由于 DR 中的 R 被填充成 r 位,所以有
$$DR = D \times 2^r + R$$
而在模 2 运算中,加法等价于异或运算:
$$DR = D \times 2^r \oplus R$$
差错检测方法比较
检错纠错的基本原理
但纠错码的开销比较大,在计算机网络中较少使用。
循环冗余校验有很好的检错能力,漏检率非常低,虽然计算比较复杂,但非常易于用硬件实现,因此被广泛应用于数据链路层。在计算机网络中通常采用检错重传方式来纠正传输中的差错,或者仅仅是丢弃检测到差错的帧,这取决于数据链路层向其上层提供的是可靠传输服务还是不可靠传输服务。
可能发送的差错
三种可靠传输方式
确认与否认
首先,每次发送方都只发一个数据分组,接收方对数据分组进行差错检测,检验是否有误码;
如果没有误码,接收方发送ACK
确认分组,发送方收到ACK
确认分组后,发送方才能发送下一个数据分组。
如果有误码,接收方发送NAK
否认分组并丢弃当前分组,发送方收到NAK
否认分组后,重发数据分组。
超时重传
接收方收不到数据分组,就不会发送ACK
或NAK
。如果不采取其他措施,发送方就会一直处于等待接收方ACK
或NAK
的状态。数据分组在传输过程中有可能遇到已经满了的路由器等情况,此时路由器会丢失该分组,如此便会产生数据分组被丢失,发送方等不到接收方的ACK
或者NAK
,导致发送方陷入等待状态。
为解决该问题,可以在发送方发送完一个数据分组时,启动一个超时计时器。若到了超时计时器所设置的重传时间而发送方仍收不到接收方的任何ACK
或NAK
,则重传原来的数据分组,这就叫做超时重传。
超时计时器设置的重传时间应仔细选择。一般可将重传时间选为略大于从发送方到接收方的平均往返时间;在数据链路层点对点的往返时间比较确定,重传时间比较容易设定。然而在运输层,由于端到端往返时间非常不确定,设置合适的重传时间有时并不容易。
确认丢失
实际过程中,接收方发送的ACK
或NAK
也可能会丢失,发送方收不到接收方的ACK
或NAK
,触发超时计时器,会重传数据分组。如果接收方成功接收了数据分组,但发送ACK
的分组丢失了,发送方会重传数据分组,这样会导致接收方收到重复的数据分组。
为解决该问题,我们用一个比特位给每个数据分组一个序号(0 或 1),当重新传输数据分组的时候,接收方检测到这个数据分组的序号,如果刚才的数据分组的序号相同就丢弃该数据分组,否则接收该数据分组。然后发送ACK
确认分组。
这里为什么可以只用0
和1
呢,主要还是因为停止等待协议的特性,即每发送完一个数据分组便等待发送方的ACK
或NAK
,只要保证每发送一个新的数据分组,其发送序号与上次发送的数居分组的序号不同就可以了,因比用一个比特来编号就够了。
确认迟到
为了让发送方能够判断所收到的ACK
分组是否是重复的,需要给ACK
分组编号,所用比特数量与数据分组编号所用比特数量一样。数据链路层一般不会出现ACK
分组迟到的情况,因此在数据链路层实现停止.等待协议可以不用给ACK
分组编号。
信道利用率
在停止-等待协议中,随着 RTT 的变大,信道的利用率也会变低(卫星通信),解决该问题的方法是:不以停等方式运行,允许发送方发送多个分组而无须等待确认。因为许多从发送方向接收方输送可以看成是填充到一条流水线中,故这种技术被称为流水线(pipeline),下图为停等和流水线发送示意图:
在回退 N 步协议中,将基序号(base)定义为最早未确认分组的序号,将下一个序号(nextseqnum)定义为最小的未使用序号,则将序号范围分割成如下 4 段:
GBN 协议也常被称为滑动窗口协议(sliding-window protocol)中,窗口大小 N 决定了可以在没有确认的情况下发送的数据包的最大数量。这个窗口会随着数据包的确认而向前滑动。限制窗口大小的原因有两个,一个是流量控制,防止接收者被发送者的大量数据包淹没;另一个是 TCP 拥塞控制
在 GBN 协议中,接收方丢弃所有失序分组。这种方法的优点是接收缓存简单,即接收方不需要缓存任何失序分组。因此,虽然发送方必须维护窗口的上下边界及 nextseqnum
在该窗口的位置,但接收方需要维护的唯一信息就是下一个按序接收的分组序号。运行中的 GBN 如下图所示:
Notes
有限状态机 FSM
![]() | ![]() |
---|
GBN 协议的接收窗口尺寸 WR 只能等于 1 ,因此接收方只能按序接收正确到达的数据分组。一个数据分组的误码会导致其后续多个数据分组不能被接收方按序接收而丢弃(尽管它们无乱序和误码)。这必然会造成发送方对这些数据分组的超时重传,显然这是对通信资源的极大浪费。为了进一步提高性能,可设法只重传出现误码的数据分组。因此,接收窗口的尺寸不应再等于 1 (而应大于 1 )以便接收方先收下失序到达但无误码井且序号落在接收窗口内的那些数据分组,等到所缺分组收齐后再一井送交上层。这是选择重传协议。
$$
\begin{align*}
& 发送窗口尺寸W_{T}必须满足: 1 < W_{T} \lt 2^{n-1}; n为分组中的bit数 \\
& 若W_{T} = 1,则退化为停止等待协议;若W_{T} \gt 2^{n-1},则会造成接收方无法辨别新旧数据分组的问题\\
& 接收窗口尺寸W_{R}必须满足: 1 < W_{R} \leq W_{T}\\
& 若W_{R} = 1,则退化为回退 N 帧协议;W_{R} \gt W_{T}没有意义
\end{align*}
$$
www.tkn.tu-berlin.de/teaching/rn/animations/gbn_sr/
zhuanlan.zhihu.com/p/126312611
Ch5-1TransportLayer
数据链路层 Datalink Layer Ⅰ