数据链路层功能:
- 向网络层提供一个定义良好的服务接口。即将源机器中来自网络层的数据传输到目标机器的网络层。数据链路层提供以下三个服务:(1)无确认的无连接服务:LANs;(2)有确认的无连接服务:Wireless Systems;(3)有确认的有连接服务:WANs;
- 差错控制,处理传输错误;
- 流量控制(限制发送方),调节数据流,确保慢速的一方不会被快速的发送方淹没。
数据链路层从网络层获得数据包(将这些数据包封装成帧(frame)以便传输,每个帧包含帧头、有效载荷、帧尾),数据链路层负责将数据包传输到目标机器,接受层将接收到的数据包传输给其网络层。
拆分比特流成帧4种方法:
(1)字节计数法:利用头部中的一个字段来标识该帧中的字符数。
![](https://i-blog.csdnimg.cn/blog_migrate/b4ad4442234d22b7105bdecae8ad4b35.jpeg)
(2)标志字节填充:让每个帧用特殊字节(Flag)作为开始和结束。(考虑了错误之后的重新同步问题:两个连续的flag)
![](https://i-blog.csdnimg.cn/blog_migrate/3ec86b70b69377f9065490714108c5ce.png)
(3)标志比特填充:用一段标志比特如:01111110,标志着每一个帧的开始与结束。连续发送多个帧时,用一个标志字段,即表示帧的开始,又表示帧的结束。
为避免其他字段中出现“01111110”:发送方除标志位外,连续发送5个“1”后自动插入“0”;接收方连续收到5个“1”后,若其后为“0”,则自动去掉该“0”,若其后为“1”,则检查下一位,为“0”则是标志位,为“1”说明出错。
![](https://i-blog.csdnimg.cn/blog_migrate/e814ba03a16275990a7c39909955a58b.png)
相比于标志字节填充的优点:标志字节填充意味着帧只能由8比特的字节组成,而标志比特填充支持帧以任意大小的单元组成。
(4)使用“编码违法”(冗余比特)区分帧边界:优点是不用填充数据。
纠错和检错:
海明距离:海明距离指两个帧同样位置上,取值不同的位置数目。例: 10001001和10110001海明距离是3。
为检测至多k位错,充要条件是任意两个帧的海明距离大于等于k + 1。
为纠正至多k位错,充要条件是任意两个帧的海明距离大于等于2k + 1。
检错码:奇偶校验,比特流的尾部加上奇偶校验位(奇校验:加了校验位后1的个数为奇数),可检测出单个错误,帧之间海明距离至少为2。
海明码纠错:第2k (k = 0, 1, 2…)位为校验位。只能纠正单个错误。(数据位中1的个数为偶数个,则校验位为0,奇数个则校验位为1)
![](https://i-blog.csdnimg.cn/blog_migrate/6c8d5a4032c1e05d1dfa9a46a1ad7ed5.png)
S:发送的字符串
R:收到的字符串
C:改正后的校验位(第1位和第8位出错,纠正须第8 + 1位取反)
F:纠错后的字符串
m个报文位, r个校验位, 纠单个错误。
n = m + r,2m个合法报文,每个都对应有n个非法的码字,他们与正确报文的距离为1。每个合法报文都要求n + 1个位模式,专门供它使用。
(n + 1) × 2m 应该小于等于2n,即:(m + r + 1) ≤ 2r,意义:给定m的情况下,纠单个错误需要的校验位数目下界。
流量控制:对链路上的帧的发送速率的控制,以使接收方有足够的缓存空间来接受每个帧。基本方法是由接收方控制发送方发送数据的速率:停等协议和滑动窗口协议。
自动重传请求(ARQ):
(1)停止-等待协议:发送窗口 = 1,接受窗口 = 1
(2)回退N帧(GBN)协议:发送窗口 > 1,接受窗口 = 1
(3)选择重传(SR)协议:发送窗口 > 1,接受窗口 > 1
发送窗口:允许发送的帧集合。(一个帧从发送窗口中删除掉当且仅当它已被确认)
接收窗口:允许接收的帧集合。
捎带确认:暂时延缓确认以便将确认信息搭载在下一个出境数据帧上。
好处:提高通信效率,单独帧的开销大,捎带只需占据帧头中的几位,发送的帧越少,“帧到达”中断也越少。
滑动窗口协议(全双工协议):不是单帧发送,而是可以一次发送若干帧。若双方窗口大小为1,它就是停等协议。
停等协议:
发送窗口 = 1,接受窗口 = 1,一个受损帧一直在接收窗口中,除非已正确收到。此外,第N个帧一直在窗口里除非第N - 1个帧被收到。
![](https://i-blog.csdnimg.cn/blog_migrate/dfecb8abad7b9beb074421d936a2ae4c.png)
(a)初始化,接受窗口等待接受帧1
(b)发送帧1后,帧1在发送方的缓存区
(c)接受帧1后,接受窗口+1
(d)收到帧1的确认帧后,发送窗口下边界+1,帧1被删除
接收方收到帧后,首先核对是否为预期帧号(frame_expected),如果是的,则接收并frame_expected + 1,即移动接收窗口。
发送端收到应答帧,核对响应帧号next_frame_to_send,核对无误后,从网络层取新的帧,并执行next_frame_to_send + 1, 即移动发送窗口。如核对帧号不正确,则不移动窗口。
![](https://i-blog.csdnimg.cn/blog_migrate/4db9e74e8d8a7e825feac00d626920f6.png)
假设信道的容量是B位/秒,帧长为L位,往返传播时间为R秒(RTT),则传输一帧时间是L/B秒;在停等协议中(窗口大小为1),发送方有L/B秒是忙的,而R秒是空歇的;所以:
线
路
利
用
率
=
1
∗
L
/
B
(
L
/
B
)
+
R
=
1
∗
L
L
+
B
R
线路利用率=\frac{1*L/B}{(L/B)+R}=\frac{1*L}{L+BR}
线路利用率=(L/B)+R1∗L/B=L+BR1∗L
若增加滑动窗口大小(W):
线
路
利
用
率
=
W
∗
L
/
B
(
L
/
B
)
+
R
=
W
∗
L
L
+
B
R
线路利用率=\frac{W*L/B}{(L/B)+R}=\frac{W*L}{L+BR}
线路利用率=(L/B)+RW∗L/B=L+BRW∗L
当
W
=
1
+
B
R
L
W=1+\frac{BR}{L}
W=1+LBR时,利用率为100%。
回退n帧协议
发送方 | 接收方 |
---|---|
正常发送:对帧编号,待确认帧缓存 | 收到每个期望的正确帧都上交网络层、回送确认 |
收到确认:释放确认帧所占缓存区,滑动发送窗口 | 收到出错帧或非期望帧:丢弃,回送对接收的最后正确帧的确认 |
差错帧超时时间到:回退到超时帧(出错帧),顺序重传最后被确认帧以后的缓存区中缓存的帧 | 收到重传帧(即为一个期望的正确帧) |
(1)发送方一直保存着未被确认的帧。
(2)累计确认:n号帧的确认到达时,暗含一个意思:n - 1、n - 2……等n号帧之前的帧也被确认;当采用了累计确认,收到了n帧的确认,n帧之前的帧都可从缓存中删掉。
(3)该协议假设总是有反向的数据流量可以捎带确认。若没有这样的流量,确认报文不会被送出且发送允许上限帧后协议停止。(1位滑动窗口协议没有这样的要求,每次收到一帧就送回一帧,即便是刚刚已经送出了这一帧,但会无用重发,浪费带宽。)
![](https://i-blog.csdnimg.cn/blog_migrate/c85fe5b25e0ad1c8d8cfb6ef9d701176.png)
未确认帧的最大数量是MAX_SEQ,而不是MAX_SEQ + 1(即发送方最大窗口尺寸等于序列号个数 - 1):如果为8则发送方无法判断第二批的8个帧是全部成功到达,还是全部丢失,因为是累计确认,这两种情况下,接收方都会发送针对7号帧的确认,但是发送方却无从分辨。
选择重传协议
发送方 | 接收方 |
---|---|
正常发送:对帧编号,待确认帧缓存 | 正常接收:上交网络层、回送确认,滑动接收窗口 |
收到确认:释放确认帧所占缓存区,滑动发送窗口 | 收到非期望的正确帧:缓存,回送对接收的最后正确帧的确认 |
差错帧超时时间到:重传缓存的最后被确认帧以后的那一帧 | 收到重传帧:将缓存帧排序上交,回送确认,滑动接收窗口 |
否定确认NAK:加快出错帧的重传;对出错帧回送否定确认,使发方不再等到超时再重传。 |
滑动窗口长度W的选择(MAX_SEQ = 7):
![](https://i-blog.csdnimg.cn/blog_migrate/29b2d5b4df00c1a0103132c70cf4550e.png)
若全部丢失,重帧0被认为是正确帧提交,出现重复提交错误,错误原因是新老窗口重叠,解决办法:使新老窗口不重叠,此时0-3帧重传帧在接受窗口外,被拒绝:
W ≤ M A X _ S E Q + 1 2 W \leq \frac{MAX\_SEQ + 1}{2} W≤2MAX_SEQ+1
停等协议 | 回退n帧协议 | 选择重传协议 | |
---|---|---|---|
发送窗口 W 1 W_1 W1 | 0 ≤ W 1 ≤ 1 0\leq W_1\leq1 0≤W1≤1 | 0 ≤ W 1 ≤ M A X _ S E Q 0\leq W_1\leq MAX\_SEQ 0≤W1≤MAX_SEQ | 0 ≤ W 1 ≤ W 2 0\leq W_1\leq W_2 0≤W1≤W2 |
接收窗口 W 2 W_2 W2 | W 2 = 1 W_2=1 W2=1 | W 2 = 1 W_2=1 W2=1 | W 2 = M A X _ S E Q + 1 2 W_2=\frac{MAX\_SEQ + 1}{2} W2=2MAX_SEQ+1 |
参考资料
《Computer Networks》(第5版)作者:Andrew S. Tanenbaum / David J. Wetherall