本章研究数据链路层的基本思想是当A要给B发送数据,那么就是从A的数据链路层,自左向右发送的,如图箭头所示
结点:指主机和路由器,用同一条线连在一起的主机或路由器叫做相邻结点
链路:网络中两个结点之间的物理通道,链路的传输介质主要有双绞线、光纤和微波。分为有线链路、无线链路
数据链路:网络中两个结点之间的逻辑链路,把实现控制数据传输协议的硬件和软件加到链路上就构成数据链路
帧:链路层的协议数据单元,封装网络层数据报
数据链路层负责通过一条链路从一个结点向另一个物理链路直接相连的相邻结点传送数据报
数据链路层在物理层提供服务的基础上向网络层提供服务, 其最基本的服务是将源自网络层来的数据可靠地传输到相邻节点的目标机网络层。 其主要作用是加强物理层传输原始比特流的功能, 将物理层提供的可能出错的物理连接改造成为逻辑上无差错的数据链路, 使之对网络层表现为一 一条无差错的链路。
物理层容易把数据弄丢,数据链路层就需要把可能要发生的差错预知好,然后进行一定的差错控制,给网络层提供一个无差错的服务
无确认的无连接服务。源机器发送数据顿时不需先建立链路连接,目的机器收到数据顿时不需发回确认。对丢失的帧,数据链路层不负责重发而交给上层处理。适用于实时通信或误码率较低的通信信道,如以太网。
有确认的无连接服务。源机器发送数据顿时不需先建立链路连接,但目的机器收到数据帧时必须发回确认。源机器在所规定的时间内未收到确定信号时,就重传丢失的帧,以提高传输的可靠性。该服务适用于误码率较高的通信信道,如无线通信。
有确认的面向连接服务。帧传输过程分为三个阶段:建立数据链路、传输帧、释放数据链路。目的机器对收到的每一帧都要给出确认,源机器收到确认后才能发送下一帧,因而该服务的可靠性最高。该服务适用于通信要求(可靠性、实时性)较高的场合。
有链接就一定要确认,即不存在无确认的面向连接的服务
数据链路层连接的建立、维持和释放的过程称为链路管理,它主要用于面向连接的服务
封装成帧就是在一段数据的前后部分添加首部和尾部,这样就构成了一个帧。接收端在收到物理层上交的比特流后,就能根据首部和尾部的标记,从收到的比特流中识别帧的开始和结束
首部和尾部包含许多的控制信息,他们的一个重要作用:帧定界(确定帧的界限)
帧同步:接收方应当能从接收到的二进制比特流中区分出帧的起始和终止
为了提高帧的传输速率,应当使帧的数据部分长度尽可能地大于首部和尾部的长度,但每种数据链路层协议都规定了帧的数据部分和长度上限,即最大传输单元
透明传输是指不管所传数据是什么样的比特组合,都应当能够在链路上传送。因此,链路层就“看不见”有什么妨碍数据传输的东西
当所传数据中的比特组合恰巧与某一个控制信息完全一样时,就必须采取适当的措施,使接收方不会将这样的数据误认为是某种控制信息。这样才能保证数据链路层的传输是透明的
例如上面boss和秘书的例子,boss让秘书传五分文件给B公司,秘书不知道文件里面有什么,只管传输就可以了
问题:如果某一个计数字段错误,后面全都错误
SOH(start of header):首部的第一个字节
EOT(end of transmission):尾部的最后一个字节
字符填充法也就是在发送端的时候添加转义字符,在接收端的时候把所有转义字符去掉,剩下的就是原始数据
注意开始和结束标志字节是0+6个1+0
保证了透明传输:在传输的比特流中可以传送任意比特组合,而不会引起对帧边界的判断错误
可以用“高-高”、“低-低”(也就是编码中不同的电平)来定界帧的起始和终止
由于字节计数法汇总Count字段(起始字节)的脆弱性(其值若有差错将导致灾难性后果)及字符填充法实现上的复杂性和不兼容性,目前较为普遍使用的帧同步法是比特填充法和违规编码法
关于可靠传输、滑动窗口、流量控制
可靠传输:发送端发什么,接收端收到什么,中间不会出现失序,出错等问题
流量控制:控制发送速率,使接受方有足够的缓冲空间来接收每一个帧
滑动窗口解决
- 流量控制,也就是收不下就不给确认,想发也发不了
- 可靠传输,通过发送方自动重传
较高的发送速度和较低的接受能力的不匹配,会造成传输出错,因此流量控制也是数据链路层的一项重要工作
数据链路层的流量控制是点到点的,传输层的流量控制是端到端的
数据链路层流量控制手段是接收方收不下就不回复确认帧,传输层流量控制手段是接收端给发送端一个窗口公告,告诉发送端接收端当前窗口有多少、缓冲区还有多大等
例如,一个主人给猫喂食,把食物和装食物的盘子放到屋子里,如果猫吃完了,没吃饱,就会叼着盘子,送给主人,主人再加食物,如果没把盘子送回来,就认为猫吃饱了,不在加食物
每发送完一个帧就停止发送,等待对方的确认,在收到确认后再发送下一个帧
研究停止等待协议的前提
- 虽然现在常用全双工通信方式,但是为了讨论问题方便,仅考虑一方发送数据(发送方)一方接收数据(接收方)
- 因为是在讨论可靠传输的原理,所以并不考虑数据是在哪一个层次上传送的
- 停止等待就是每发送完一个分组就停止发送,等待对方确认,在收到确认后再发送下一个分组
这里0被重复利用了,只是编号相同,但是帧本身并不同,因为每发送一个数据帧就停止并等待,因此用1bit来编号就够了
设置的重传时间就是有一个超时计时器,每次发送一个帧就启动一个计时器。超时计时器设置的重传时间应当比帧传输的平均RTT(往返时延)更长一些
需要注意
发完一个帧后,必须保留它的副本
数据帧和确认帧必须编号
ACK丢失
信道利用率:发送方在一个发送周期内,有效的发送数据所需要的时间占整个发送周期的比率
信 道 利 用 率 = L / C T 信道利用率=\frac{L/C}{T} 信道利用率=TL/C
T指发送周期,即从开始发送数据,到收到第一个确认帧为止,L指T内发送L比特的数据,单位比特,C值发送方数据传输率,单位比特/秒
信道利用率
U = T D T D + R T T + T A U = \frac{T_{D}}{T_{D}+RTT+T_{A}} U=TD+RTT+TATD
信道吞吐率
信 道 吞 吐 率 = 信 道 利 用 率 × 发 送 发 的 发 送 速 率 信道吞吐率=信道利用率 \times 发送发的发送速率 信道吞吐率=信道利用率×发送发的发送速率
例:一个信道的数据利用率为4kb/s,单向传播时延为30ms,如果使停止-等待协议的信道最大利用率达到80%,要求数据帧的长度至少为
80 % = L / 4 L / 4 + 2 × 30 m s L = 960 b i t \begin{aligned} 80\%&=\frac{L/4}{L/4+2\times 30ms}\\ L&=960bit\end{aligned} 80%L=L/4+2×30msL/4=960bit
滑动窗口相比于停等协议
发送窗口:发送方维持一组连续的允许发送的帧的序号
接收窗口:接收方维持一组连续的允许接收帧的序号
发送端每收到一个确认帧,发送窗口就向前滑动一个帧的位置,当发送窗口内没有可以发送的帧(即窗口内的帧全部是已发送但未收到确认的帧)时,发送方就会停止发送,直到收到接收方发送的确认帧使窗口移动,窗口内有可以发送的帧后,才开始继续发送。
接收端收到数据帧后,将窗口向前移一个位置,并发回确认帧,若收到的数据帧落在接收窗口之外,则一律丢弃。
停止等待协议可以看做特殊的滑动窗口协议,也就是发送窗口大小=1,接收窗口大小=1
后退N帧协议(GBN)发送窗口大小>1,接收窗口大小=1
选择重传协议(SR)发送窗口大小>1,接收窗口大小>1
相比于停等协议,后退N帧协议的接收窗口可以依次接收012甚至更多个帧,然后再发送一个ACK2(对应前面的012),这是发送窗口收到就可以向前移动3帧
上层要发送数据时,发送方先检查发送窗口是否已满,如果未满,则产生一个帧并将其发送:如果窗口已满发送方只需将数据返回给上层,暗示上层窗口己满。上层等一会再发送。(实际实现中,发送方可以缓存这些数据,窗口不满时再发送帧)
GBN协议中,对n号帧的确认采用累积确认的方式,标明接收方已经收到n号帧和它之前的全部帧。
协议的名字为后退N帧/回退N帧,来源于出现丢失和时延过长帧时发送方的行为。就像在停等协议中一样,定时器将再次用于恢复数据帧或确认帧的丢失。如果出现超时,发送方重传所有己发送但未被确认的帧。
如果正确收到n号帧,并且按序,那么接收方为n帧发送一个ACK,并将该帧中的数据部分交付给上层
其余情况都丢弃帧,并未最近按序接收的帧重新发送ACK。接收方无需缓存任何失序帧,只需要维护一个信息:expectedseqnum(下一个按序接受收的帧序号)
这里我们假设发送窗口尺寸为4。出现超时,发送方重传所有已发送但未被确认的帧
例如汉堡从上至下为面包片、芝士、西红柿、牛排、面包片,发送方从上到下一片一片的给接收方,接收方必须要按照从上至下的顺序吃,因此吃了面包片、芝士之后,如果来了牛排、面包,接收方都不吃,必须要西红柿
若采用n个比特对帧编号,那么发送窗口的尺寸 W T W_{T} WT应满足
1 ≤ W T ≤ 2 n − 1 1 \leq W_{T} \leq 2^{n}-1 1≤WT≤2n−1
因为发送窗口尺寸过大,就会使得接收方无法区别新帧和旧帧
例如,如果我们对帧用2个比特编号,因此就可编号为0123,如果窗口为4,我们发完四个帧后,假设接收方的所有确认帧都丢失,那么此时超过计时器时间后,发送方再次发送0123,但是对于接收方而言,它无法判定这是这一次的0123,还是下一次的0123。因为如果按照0123的确认帧全部丢失,那么第二次收到的0123就应该是和前一次相同的,如果按照确认帧全部被正确收到,那么第二次收到的0123就应该是下一个0123,这对于接收方而言是无法判断的(也就是接收方无法判断是否发生了重传)。因此窗口最大只能为3
连续发送数据帧而提高了信道利用率
在重传时必须把原来已经正确传送的数据帧重传,使传送效率降低
例题:
主机甲与主机乙之间使用后退N帧协议(GBN)传输数据,甲的发送窗口尺寸为1000,数据帧长为1000字节信道带宽为100Mb/s,乙每收到一个数据帧立即利用一个短帧(忽略其传输延迟)进行确认,若甲、乙之间的单向传播时延是50ms,则甲可以达到的最大平均数据传输率约为()。
A.10Mb/s B.20Mb/s C.80Mb/s D.100Mb/s
1000 × 1000 × 8 b 1000 × 1 0 6 b / s = 80 m s \begin{aligned} \frac{1000 \times 1000 \times 8b}{1000 \times 10^{6}b/s}&=80ms \end{aligned} 1000×106b/s1000×1000×8b=80ms
发送完所有窗口的帧需要80ms,如果窗口一直滑动,也就是一直有帧在发送,那么信道带宽就为数据传输率
2 × 50 m s + 1000 × 8 b 100 × 1 0 6 b / s = 100.08 m s \begin{aligned} 2 \times 50ms+\frac{1000 \times 8b}{100 \times 10^{6}b/s}&=100.08ms \end{aligned} 2×50ms+100×106b/s1000×8b=100.08ms
验证是否在发完一个窗口的最后一帧之前,能接收到第一帧的确认信息,但是显然收不到,因此发送 1000 × 1000 × 8 b 1000 \times 1000 \times 8b 1000×1000×8b的数据所需的时间大概是 100 m s 100ms 100ms,有
1000 × 1000 × 8 b 100.08 m s ≈ 80 M b / s \begin{aligned} \frac{1000 \times 1000 \times 8b}{100.08ms}&\approx80Mb/s \end{aligned} 100.08ms1000×1000×8b≈80Mb/s
从上层收到数据后,SR发送方检查下一个可用于该帧的序号,如果序号位于发送窗口内,则发送数据帧:否则就像GBN一样,要么将数据缓存,要么返回给上层之后再传输。
如果收到ACK,加入该帧序号在窗口内,则SR发送方将那个被确认的帧标记为已接收。如果该帧序号是窗口的下界(最左边第一个窗口对应的序号),则窗口向前移动到具有最小序号的未确认帧处。如果窗口移动了并且有序号在窗口内的未发送帧,则发送这些帧。
每个帧都有自己的定时器,一个超时事件发生后只重传一个帧
SR接收方将确认一个正确接受的帧而不管其是否按序。失序的帧将被缓存,并返回给一个该帧的确认帧(收谁确认谁),知道所有帧(即序号更小的帧)都被接收为止,这是才可以将一批帧按序交付给上层,然后向前移动滑动窗口
如果收到了窗口序号外(小于窗口下界)的帧,就返回一个ACK
其他情况忽略该帧
这里ACK012丢失,但实际上这里接收方收到的0号帧不知道是哪一个,有歧义,如下图
这里3号帧丢失
这两种情况下都能收到0号帧,但是分不清新帧和旧帧
发送窗口最好等于接收窗口(大了会溢出,小了没意义)
设帧的序号需要n个比特储存
W T m a x = W R m a x = 2 n − 1 W_{Tmax}=W_{Rmax}=2^{n-1} WTmax=WRmax=2n−1
W T m a x , W R m a x W_{Tmax},W_{Rmax} WTmax,WRmax分别是发送、接收窗口最大值
例:
数据链路层采用了选择重传协议,发送发已经发送了0123号帧,现已收到1号帧确认,而02号帧依次超时,则发送方需要重传的帧数是()
2,只有超时才需要重传,这里3不需要重传,因为没有超时,有可能只是还没收到,在路上
概括来说,传书中的差错都是由于噪声引起的
差错分为
之前说到链路层为网络层提供服务有无确认无连接的服务,常用于通信质量好的有线传输链路;有确认无连接服务、有确认面向连接服务,常用于通信质量差的无线传输链路
差错控制主要分为:
数据链路层编码和物理层编码
数据链路层编码和物理层的数据编码与调制不同。物理层编码针对的是单个比特,解决传输过程中比特的同步等问题,如曼彻斯特编码。而数据链路层的编码针对的是一组比特,它通过见余码的技术实现一组二进制比特串在传输过程是否出现了差错。
检错编码都采用冗余编码技术
冗余编码:在有效数据/信息位发送之前,先按某种关系附加上一定的冗余位,构成一个符合某一规则的码字后再发送。当要发送的有效数据变化时,相应的冗余位也随之变化,使码字遵从不变的规则。接收端根据收到码字是否仍符合原规则,从而判断是否出错
简单来说,就是在发送数据的时候不仅发送原始数据,同时在原始数据后面还有附加上几位比特,这几位比特就叫做冗余码,它的作用就是和原始数据可以构成某种规则,把这个组合发出去之后,接收方就按照和发送方共识的规则来检查是不是有问题,如果发现不符合这个规则就是有问题,反之无问题,接收
例如要发一串烧烤,在烧烤的首端加一块肉,告诉接收方,加上这块肉一共有偶数块肉,此时如果接收方发现肉是奇数块,则说明烧烤有问题
常见的检错编码有奇偶校验码和循环冗余码。
奇偶校验码由n-1位信息元和1位校验元组成
分为
特点:它只能检测奇数个比特的出错情况,但不能发现偶数个比特的出错情况,也并不知道哪些位错了。
操作方法
准备带传的有效数据,并分成多组
每个组都加上冗余码构成帧再发送。
给定个m bit的领或报文,发送器生成一个r bit的序列,称为帧检验序列(FCS)。这样所形成的帧将由m+r比特组成。发送方和接收方事先商定一个生成多项式G(x)(最高位和最低位必须为1),使这个带检验码的帧刚好能被预先确定的多项式G(x)整除。
这里生成多项式是r+1位的,已知条件会给到,不需要计算。如果最高位是0自动舍去不看,从第一个1开始,位数为r+1位。有时也用类似于
x 4 + x 2 + x x^{4}+x^{2}+x x4+x2+x
补全即为
1 ⋅ x 4 + 0 ⋅ x 3 + 1 ⋅ x 2 + 1 ⋅ x + 0 1 \cdot x^{4}+0 \cdot x^{3}+1 \cdot x^{2}+ 1 \cdot x + 0 1⋅x4+0⋅x3+1⋅x2+1⋅x+0
对应生成多项式即为10110
假设一个帧有m位,其对应的多项式为M(x),则计算冗余码的步骤如下
接收方用相同的多项式去除收到的帧,如果无余数,那么认为无差错,正确接收;反之,丢弃
例:要发送的数据是1101 0110 11,采用CRC校验,生成多项式是10011,那么最终发送的数据应该是?
10011为生成多项式,因此冗余码有4位,加0后为11010110110000
FCS的生成以及接收端CRC检验都是由硬件实现,处理很迅速,因此不会延误数据的传输
链路层使用CRC检验,能够实现无比特差错传输,但这还不是可靠传输(因为有帧被丢弃)
之前的奇偶校验码和循环冗余码都是在最低位加,但海明码插入规则不同
海明距离:
显然
总结:如果海明码要检测d位错,则海明矩为d+1;如果海明码纠正d位错,则海明矩为2d+1
海明码编码过程
确定校验码位数r
数据/信息有m位,冗余码/校验码有r位,因此校验码一共有 2 r 2^{r} 2r种取值,有海明不等式
2 r ≥ m + r + 1 2^{r}\geq m+r+1 2r≥m+r+1
例如我们现在有数据1100,可以算得r=3
4号校验码可以匹配类似1**
的二进制位,这里的二进制位就是把序号用二进制表示。因此4号负责4567的校验,如果我们采用偶校验有?011
,显然4号为0
2号校验码可以匹配类似*1*
的二进制位,因此2号负责2367的校验,如果采用偶校验有?011
,显然2号为0
1号校验码可以匹配类似**1
的二进制位,因此1号负责1357的校验,如果采用偶校验有?001
,显然1号为1
得到完整海明码为
用421分别进行偶校验即可
如果我们收到的数据有问题,例如变为1110001
4、1号校验发现有问题,2号校验无问题