使用校验和重发的方法,使得物理线路相对可靠
1. 帧
是数据链路层发送数据的单位,在数据链路层中,帧的封装需要在一段数据前后添加首部和尾部
显然,增加帧的数据占比可以提高传输效率,但每一种数据链路协议规定了帧的数据部分的长度上限:最大传输单元(Maximum Transfer Unit,MTU)。
帧应当有特殊的格式,用于区分数据流和噪音,有以下的若干种方法:
Character Count
最前面的是包括它在内的帧长度(每一个方块的单位都是byte,也就是character),后面是帧数据。但是当帧长度字节错误时,就会一直错下去,所以这种方法很少单独使用
Start&ending character with character stuffing
使用flag byte(或character),置于帧的开始和结束位置。这样即使接收端失去同步,也可以找到连续2个FLAG的地方来确定帧的结束位置
但是,当flag byte出现在数据中时,正常情况下这样的结构解析就会被干扰。一种方法是当在数据段中检测到flag时,在它前面加一个ESC(escape byte),从而表示这是数据而跳过flag的解析,并在传输给网络层时去掉这个ESC,这样的方法就叫 byte stuffing(数据中心出现ESC也可以被ESC掉)
Start&ending flags with bit stuffing
01111110/0x7E
作为帧的起始和结束的字符串,如果出现这样的数据,就使用bit转义,在发送数据时,5个1发出去后强制发出1个0
很多数据链路写往往使用以上三种方法的组合。以太网常用的是让帧以preamble(序言,共72bit)为起始,之后是长度域来确定帧的结尾。
2. 错误控制与改正
确保传输的帧的内容和顺序正确,帧可能错误一部分,也可能部分或全部丢失
方法大概如下:
2.1 Error Correcting Code
所有的方法都会为信息带来冗余
一些基本概念:
当m个bit数据带有r为冗余时,记块总长为n=m+r。称这样的编码方式为
(
n
,
m
)
(n,m)
(n,m) code。其中n位的数据被称为码字(codeword),码率(code rate)是有效数据在总长度中的占比。
- Hamming Code 海明码 & Hamming distance
编码的基础知识
1) 编码与码距
图中,两个字节取异或可以发现不同位数的数量,这个数量的最小可能值被称为码距(code distance),在海明码中被称为海明距离(Hamming distance)。当用n个二进制位来编码m个码字的时候,提高n的值可以让码距增加(定义为d)。这样每个编码至少有d位不同,
d
≥
2
d\geq2
d≥2 时,如果仅仅有一个bit错误,就会让编码变为非法编码,从而能通过一系列校验的方法将错误检测出来,而至少要
d
≥
3
d\geq3
d≥3,才能将错误修正(因为d=2时无法判断翻转位),此时也可以检测2个错误位。因此可以看出,要提升编码检测和纠正错误的能力,必须要提高码距,也即必须要提高n-m=r,即校验位数。但另一方面,码距越长,传输的冗余性越大,所以需要结合发生差错的概率与系统的容错率综合设计。
2)奇偶校验码
奇偶校验码是奇偶校验码是一种增加二进制传输系统最小距离的简单和广泛采用的方法。
一个二进制码字,如果码元有奇数个1,择成为具有奇性。反之择具有偶性。容易得到奇性等于所有码元的异或。
奇偶校验可以描述为:给每一个码字加一个校验位,进而构成机型校验或偶性校验。因此指定了性质之后,如果仅有1个码元翻转,就能够分辨出来(因为翻转了之后奇偶性指定校验的结果不同)。易得偶校验位
a
n
=
a
0
⊕
a
1
⊕
a
2
⊕
…
⊕
a
n
−
1
a_{n} = a_{0} ⊕ a_{1} ⊕ a_{2} ⊕ … ⊕ a_{n-1}
an=a0⊕a1⊕a2⊕…⊕an−1, 奇校验位
a
n
=
¬
(
a
0
⊕
a
1
⊕
a
2
⊕
…
⊕
a
n
−
1
)
a_{n} =\neg (a_{0} ⊕ a_{1} ⊕ a_{2} ⊕ … ⊕ a_{n-1})
an=¬(a0⊕a1⊕a2⊕…⊕an−1)。
典型系统在检测到错误后会要求重发。
- 分组奇偶校验码
现在考虑一个系统, 它传输若干个长度为m位的信息。如果把这些信息都编成每组n个信息的分组,则在这些不同的信息间,也如对单个信息一样,能够作奇偶校验
下图中,有n个分组,每组的码字长度为n
从上图也可以看到,分组奇偶校验逼近能检测错误,并且在给定行货列中产生鼓励错误是,还可以进行纠正
回到海明码
之前指出过要能纠正单个错误,最小距离为3,实现这种纠正的方法之一为海明码
通过放置在合适位置,系统对于错误的数位无论是原有信息位中的,还是附加校验位中的都能把它分离出来。
推导并使用长度为m位的码字的海明码,所需步骤如下:
1. 确定最小的校验位数k,将它们记成
D
1
D_{1}
D1、
D
2
D_{2}
D2、…、
D
k
D_{k}
Dk,每个校验位符合不同的奇偶测试规定。
2. 原有信息和k个校验位一起编成长为m+k位的新码字。选择k校验位(0或1)以满足必要的奇偶条件。
3. 对所接收的信息作所需的k个奇偶检查。
4. 如果所有的奇偶检查结果均为正确的,则认为信息无错误。
5. 如果发现有1个或多个错了,择错误的为由这些检查的结果唯一确定。
习惯上,将海明码的校验位安排在2的幂次,即1、2、4、8……,并且这样的安排会产生极大的方便
位数K:
总长度应为m+k,在接收器中进行k次奇偶检验,可以认为生成了k位结果二进制字,它可以确定最多
2
k
2^k
2k中不同状态,其中一定有一个,所有就测试都为真,而剩下的状态(
2
k
−
1
2^k-1
2k−1)则可以判定误码位置,如果要成功判断误码位置,误码情况种类(
2
k
−
1
2^k-1
2k−1)应不小于码字长(m+r),因此有
(
m
+
r
+
1
)
≤
2
r
(m+r+1)\leq2^r
(m+r+1)≤2r
每个校验位校验的bit位:
海明码的分布位置和这一步的确定是海明码精妙设计的关键,其思想是先计算某个位置的bit要被哪些位置上的海明码校验,方法就是将bit分解为2的幂次和,这样幂次项和的每项都对应着一个校验位,这个bit就是由这些校验位来校验。
例如,对第11位的bit,其分解结果是 11=1+2+8,所以第1,2和8位上的校验码会对这个bit进行校验。
这样遍历每个码元,就能得到每个校验位所校验的比特序列。进而可以得到校验结果。
如下图,将结果翻转放置,得到的k位校验结果(被称为error syndrome)其实就是出错bit的位置(当然,如果是全0,就代表没有错误)
detect d bit error, need d+1 distance coding
correct d bit error, need 2d+1 distance coding
2.2 Error Detecting,With Retransmission
顾名思义,这样的机制不需要改错,只需要纠错重传,显然适用于错误率比较高的信道。
Cyclic Redundancy Check (循环冗余校验法)
CRC也被称为多项式码,因为其机制就是把bit string视作多项式的系数。例如,110001可以表示为
A divisor is said ‘‘to go into’’ a dividend if the dividend has as many bits as the divisor
使用方法:
当这样的方法被使用时,发送方和接收方必须事先确定一个共同的生成器多项式(generator polynomial)
G
(
x
)
G(x)
G(x)。它的特点是最高位和最低位的系数都必须是1(k-1次幂和1的系数)。
之后计算由m个bit数据的帧确定
M
(
x
)
M(x)
M(x)的CRC,显然frame的长度要长于m才能起到校验的目的。
插入的方法是:通过在最后插入CRC的项,使得处理后的帧能够被
G
(
x
)
G(x)
G(x)整除。而在接收端,如果接受到的帧不能被
G
(
x
)
G(x)
G(x)整除,就意味着出现了传输错误。 注意到,这里所有的除法都是二进制的modulo 2
division,也即不会向上一位借位的除法(实质上就是对每一次除法结果做模2加减,也就是异或)
算法表现如下:如果 G ( x ) G(x) G(x)的度数为r(也即它的长度为r+1):
- 在 M ( x ) M(x) M(x)低位补上r个0(或者说左移r位),实际上形成了m+r位的 x r M ( x ) x^rM(x) xrM(x)
- 用模2除法将 x r M ( x ) x^rM(x) xrM(x)除以 G ( x ) G(x) G(x),得到余数称为FCS(Frame Check Sequence)
- FCS必然小于等于r位,把FCS左边补零扩展到r位,然后放在 x r M ( x ) x^rM(x) xrM(x)的低r位,结果就是应该被传输的多项式,记为 T ( x ) T(x) T(x),这样如果传输正常的话, T ( x ) T(x) T(x)必然可以被 G ( x ) G(x) G(x)整除。
那么显然,如果传输结果有任何不相同,得到的T(x)就无法被整除,错误就能被检测。
证明的长度:如果添加了r位的检测位,CRC法就能够检测出所有的
≤
r
\leq r
≤r位的burst error,而长于r的错误被接受的概率为
(
1
2
)
r
−
1
(\frac{1}{2})^{r-1}
(21)r−1
IEEE 802的通用
G
(
x
)
G(x)
G(x)为
3. Elementary Data Link Protocols
Stop and wait
是一种纠错方法,也是一种防止发送端发送过快导致的flooding的方法,它是点对点协议的一种
接收端确认返回ACK帧,不确认发NAK帧
数据发出一定时间后没有回复,数据就会重传,知道接到ACK/NAK为止
ACK可能也会丢失,此时需要丢弃重发的数据帧
一些关键的参数:
T f r a m e : 从 一 次 发 送 的 第 一 个 数 据 帧 发 送 到 最 后 一 个 数 据 帧 发 送 的 时 间 T_{frame}:从一次发送的第一个数据帧发送到最后一个数据帧发送的时间 Tframe:从一次发送的第一个数据帧发送到最后一个数据帧发送的时间
T p r o p : 从 一 个 数 据 帧 发 送 到 它 被 接 受 的 时 间 , = D i s t a n c e S p e e d o f S i g n a l T_{prop}:从一个数据帧发送到它被接受的时间,= \frac{Distance}{Speed\ of\ Signal} Tprop:从一个数据帧发送到它被接受的时间,=Speed of SignalDistance
U t i l i z a t i o n = T f r a m e 2 T p r o p + T f r a m e Utilization\ =\ \frac{T_{frame}}{2T_{prop}+T_{frame}} Utilization = 2Tprop+TframeTframe,第2个prop指的是ACK的传输时间
如果令 α = T p r o p T f r a m e , 则 U t i l i z a t i o n = 1 2 α + 1 \alpha=\frac{T_{prop}}{T_{frame}},则Utilization\ =\ \frac{1}{2\alpha+1} α=TframeTprop,则Utilization = 2α+11
4. Sliding Window Protocols
基本思想是将同一个信道用于双向传输。
piggybacking:当主机收到远程主机的frame后,通常不马上发送ACK帧,而是等短暂时间,此时如果主机有发送回远程主句的frame则把这个ACK数据包捎带着发送晦气,即可以2合1(通过在返回的frame加一个ack域),这样的方法称为捎带确认(piggybacking)。
显然,他它需要制定一个固定等待时间,超时则要制作一个ack帧发送出去
Sliding Window Protocols的特性(需要补充)
需要sequence number,在其长为n bit时范围是 [ 0 , 2 n − 1 ] [0,2^n-1] [0,2n−1]。这也意味着sender需要有sending window,接受段要有receiving window,它们的大小不需要一致。
sending window中的seq num表示已送出或可送出但还没有被接受的帧,当有新帧来的时候,给它下一个最大的,此时窗口的的上边缘增长。而收到ACK帧使下边缘增长。因为帧可能丢失/错误,sender要把window中的帧保留。
receiving window保存可能接受的帧,在window中的帧也被放进buffer。当帧seqnum==接受窗口的下限时,把这个帧传给network layer,同时下限incr,window接受不了的帧被丢弃。
上图可以看到,window大小可以根据seq num确定,window不应当滑出上限
Go-back-N
提前发,如果一个帧错了,后面提前发的帧都需要重新发,这项的协议被称为Go-back-N
对应着size为1的receiving window。
U
t
i
l
i
z
a
t
i
o
n
=
N
∗
T
f
r
a
m
e
2
T
p
r
o
p
+
T
f
r
a
m
e
Utilization\ =\ \frac{N*T_{frame}}{2T_{prop}+T_{frame}}
Utilization = 2Tprop+TframeN∗Tframe
U
t
i
l
i
z
a
t
i
o
n
=
{
N
/
(
2
α
+
1
)
,
需
要
修
改
1
,
需
要
修
改
Utilization=\begin{cases} N/(2\alpha+1),\quad &需要修改 \\ 1, &需要修改 \end{cases}
Utilization={N/(2α+1),1,需要修改需要修改
第一帧传输完后才能开始计时器
似乎是实现GBN的方法:
n bit用来做SEQ_NUM时,发送窗口应该小于等于
2
n
−
1
2^n-1
2n−1
Selective Repeat
另一类控制和处理错误的方法,如图所示
此时坏帧被丢弃,但成功传输的帧都被保存和缓冲,当sender的某些帧时间片time out之后,只有最早发送的没有ACK确认的帧会被重发。
这样的实现机制是,如果接受方收到了seq顺序不对的帧(这意味着某些帧被漏发)或收到坏帧,它就会给sender返回一个NAK帧,sender收到了这个NAK帧之后才会重发这个帧,但在此之前,发出去的帧都会被接收,并在receiver处缓存。
另外可以看到,当receiver发出了一个NAK帧之后,它将在接受正确且正常顺序的帧后停止发送其他反应帧,直到第一个NAK帧制定的帧被重发并被接收之后再重新正常运作
NAK帧的作用是,在发送端的某些帧超时之前就告知它未发送成功,从而提升效率。
不是累计确认
n bit用来做SEQ_NUM时,发送窗口+接收窗口应该小于等于
2
n
2^n
2n,并且接收窗口不能比发送窗口小
5. HDLC
是面向bit的协议,也是PPP适配的数据格式(但PPP是面向byte的)
整体格式
下属的PPP协议(单位变成了byte):
P/F是poll/final的意思