文章目录
- 前言
- 在这里插入图片描述
- 零、数据链路层基本概念
- 一、功能
- 0、数据链路层功能概述
- 1、封装成帧和透明传输
- 1.1封装成帧
- 1.2 透明传输
- 1.3组帧方法
- 2、数据链路层的差错控制
- 2.0差错从何而来
- 2.1位错(比特错,1变成0,0变成1)
- 2.2帧错(丢失,重复,失序)定时器、编号机制
- 3、流量控制 ★★★
- 3.1 基本概念
- 3.2 流量控制的方法
- 1、停止等待协议(效率低一些)
- 2、滑动窗口协议(效率高一些)
- 2.1 后退N帧协议(GBN)
- 2.2 选择重传协议(SR)(目前最好的)
- 4、可靠传输★★★
前言
零、数据链路层基本概念
1、结点:主机、路由器
2、链路:网络中两个结点之间的物理通道,链路的传输介质主要有双绞线、光纤和微波。分为有线链路、无线链路。
3、数据链路:网络中两个结点之间的逻辑通道,把实现控制数据传输协议的硬件和软件加到链路上就构成数据链路。
4、帧:链路层的协议数据单元,封装网络层数据报。
数据链路层负责通过一条链路从一个结点向另一个物理链路直接相连的相邻结点传送网络层给的数据报。
<注意>
在分析数据链路层时,看成水平方向的数据链路层数据传输。
一、功能
0、数据链路层功能概述
概述:
数据链路层在物理层提供服务的基础上向网络层提供服务,其最基本的服务是将源自网络层来的数据可靠地传输到相邻节点的目标机网络层。其主要作用是加强物理层传输原始比特流的功能,将物理层提供的可能出错的物理连接改造成为逻辑上无差错的数据链路,使之对网络层表现为一条无差错的链路。
<举例>
boosA (网络层)让 秘书A(数据链路层)送一份文件给boosB,秘书A将文件拆分并编号让傻子A(物理层)送到秘书B手上,这个过程物理层可能会丢失数据,根据编号可以把数据重新找回来
功能:
功能一:为网络层提供服务。
无确认无连接服务:通常用于实时通信,误码率较低的信道
有确认无连接服务:步提前建立连接,对方收到会返回一个确认帧。等不到的话就重新发
有确认面向连接服务:最可靠
功能二:链路管理。即连接的建立、维持、释放
功能三:组帧
功能四:流量控制
功能五:差错控制(帧错/位错)
1、封装成帧和透明传输
1.1封装成帧
封装成帧:就是在一段数据的前后部分添加首部和尾部,这样就构成了一个帧。接收端在收到物理层上交的比特流后,就能根据首部和尾部的标记,从收到的比特流中识别帧的开始和结束。
首部和尾部包含许多的控制信息,其中有一样叫:帧定界(确定帧的界限)。
帧同步:接收方应当能从接收到的二进制比特流中区分出帧的起始和终止。
1.2 透明传输
透明传输是指不管所传数据是什么样的比特组合,都应当能够在链路上传送。
当所传数据中的比特组合恰巧与某一个控制信息完全一样时,就必须采取适当的措施,使收方不会将这样的数据误认为是某种控制信息。这样才能保证数据链路层的传输是透明的。(就不用管内容是什么,直接传就完事儿了)
1.3组帧方法
1、字符计数法
就是在帧的首部做计数,这个字符记录了当前帧有多少个字符。
缺点:如果在某一个帧内,标记位后面的某个字节的数据丢失,那么会影响后面的帧比如311和4222,如果前面的帧丢失变成31,那么后面的4就会被补到前面变成314导致错误
2、字符填充法
就是加头加尾分别标记开始结束,和零比特填充法(见下)对比,开始和结束的对应的字符不一样
解决方法:添加转义字符。即对于那些与标记字符重复的数据流。在它们的前面添加一段转义字符,这祥接收方在解析帧时。看到这些转义字符就不会认为那些特殊的数据当成帧的开始/结束了。
3、零比特填充法(普遍)
和字符填充法不一样的点在于:开始和结束的对应的标志字符是一样的。
<无论五个1后面是1还是0,都加一个0。这样接收端和发送端处理数据都便捷>
开始和结束时六个1
4、违规编码法(普遍)
曼彻斯特在编码的时候,前高后低记为1(高低),前低后高记为0(低高)。所以数据中不会出现高高和低低。
2、数据链路层的差错控制
2.0差错从何而来
2.1位错(比特错,1变成0,0变成1)
1、检错编码(奇偶校验码、循环冗余码CRC,在数据最低位加上一位或几位数据)
1.1 奇偶校验码
奇偶校验:只需包含1个附加比特。
对于偶校验,选择一个值,使得所有比特中1出现偶数次。
对于奇校验,选择一个值,使得所有比特中1出现奇数次。接收方通过检测1出现的次数判断是否出现差错。如果出现偶数个比特差错,则检验不出
缺点:只能检测出奇数个比特错误,检测成功率位50%。
偶数个比特错误:比如111这串数字,冗余码给1,那么规则就是偶检验。但如果变成1001,1的个数也是偶数,但是数据已经错了
2、循环冗余码CRC
>CRC:循环冗余法 FCS:冗余码
可靠传输:数据链路层发送端发送什么,接收端就收到什么。
链路层使用CRC检验,能够实现无比特差错的传输,是指帧中不会出现位错,但是有的出现位错的帧会被丢弃,所以还不能叫做可靠传输
2、纠错编码(海明码)(发现错误、找到位置、纠正错误)(校验码位置不一定在最低位)
1、确认校验码位数r:设数据k位,校验码r位,k+r个数据,每个数据各错一次的情况就是 k+r 种情况,还有个情况是不出错,所以+1。r位校验码每一个无非是0或者1,所以可以表现2r种情况。所以海明不等式是:2r >= k+r+1。计算的时候把r带入,暴力计算就行。
2、确认校验码和数据位置
刚刚求出校验码是三位,从低位到高位分别填在20、21、22 的位置。原本的数据从高到低补入
3、求出校验码的值
比如x4,所在的位置是100,那么它就管理位置是1**类型的数。如果是偶校验,那么它所管理的4、5、6、7号数(110x)就要有偶数个1,所以推出x4 = 0
4、检错并纠错
2.2帧错(丢失,重复,失序)定时器、编号机制
3、流量控制 ★★★
3.1 基本概念
较高的发送速度和较低的接收能力的不匹配,会造成传输出错,因此流量控制也是数据链路层的一项重要工作。
数据链路层与传输层流量控制的区别
数据链路层的流量控制是点对点的,而传输层的流量控制是端到端的。
数据链路层流量控制手段:接收方收不下就不回复确认。(接收到且还有余力再接收,才会回复确认信息)
传输层流量控制手段:接收端给发送端一个窗口公告。(告诉发送端接收了多少,还能接收多少)
3.2 流量控制的方法
1、停止等待协议(效率低一些)
1.1 无差错情况
发送方发送一个帧,接收一个确认信号即可。
1.2 有差错情况
停止等待协议的有差错情况:
使用一个超时计时器,每发一帧就开始计时,设置时间略长于一个RTT (往返时延)
发送端发送数据开始,到发送端收到来自接收端的确认 (接收端收到数据后便立即发送确认),总共经历的时延
RTT=传播时延x2+处理时间(有时可能直接忽略)
1.2.1 数据帧丢失或者检测到帧出错的情况
数据帧丢失 : 压根没有接收到
检测到帧出错的情况 : 接收到了但是检测到帧出错
这两种都不能算正确接收,所以接收方不会返回一个接收信号。
数据帧和确认帧都需要进行编号
如果连续出现相同的发送序号的数据帧,说明发送端出现超时重传。(帧丢失)
连续出现序号相同的确认帧,说明接收方收到了相同的重复的帧(帧重复)
1.2.1 ACK丢失
1.2.1 ACK迟到
当发送完数据帧1以后,应该收到确认帧1,此时收到确认帧0就知道是来迟了,直接丢掉。
如果是在发送第二个数据帧0之后收到第一个确认帧0,那么就会理解发送数据帧1,此时第二个确认帧0回来了,会被丢弃,因为此时在等待的是确认帧1。
1.3 停止等待协议的特点
优点:简单
缺点:信道利用率太低
2、滑动窗口协议(效率高一些)
发送方可以连续发送:发送窗口里面的多个帧,而不是接收到一个帧才能发下一个。接收方接收到第一个信号就会移动一个接收窗口,然后给发送发一个确认信号。接收方接收到一个确认信号才能移动一格发送窗口。
2.1 后退N帧协议(GBN)
因为停止等待协议太浪费时间了,所以尝试采用GBN,发送连续多个数据帧,以增大信道利用率
累计确认
就是收到一个确认,那么它和它之前的所有帧都默认已收到
超时事件
举个例子
发送方:发送0,1,2,3,4。在这个过程中,接收方先接收到0,返回ack0,于是它开始等1,但是它收到2、3以后都没有收到1,那么他就清楚1丢失了,于是默认1后面收到的数据都是丢失的。于此同时,发送方在一个计时器以后没能等到ack1,就会从1开始重新传(1,以及1以后的都重新传)
举个例子
发送方发送:0、1、2、3、4、5
但是接收方接到0、1、3、4、5
于是expectedseqnum = 3 接到的4、5会被丢弃。接收方重新发送ack2(为最近按序接收的帧重新发送ACK)
下图是一个实例
注释:此图发送2顿时丢失,所以接收方几首收到后面的帧也是直接丢弃并且发送最晚收到的有效帧1的ACK,直至2顿的超时重传机制被触发进行重传并得到ACK之后接收方才会接受2顿以及后面的顿如果所示,GBN的形式就像排队,接收端为所有帧“预定”了接收位置,如果接收端发送的数据因为某些原因没有接收到,即使收到了这一帧后面所有的帧,这些“排在后面的”帧也要被丢弃
发送窗口不能无限大,与使用的编号的比特数有关
二进制表示。很简单,就是1比特编号0和1,
同理2比特编号0-3,二进制表示就是00,01,10,11。
GBN优缺点
优点:相对于上面的停止等待协议,明显提高了信道利用率,
缺点:因为重传机制的原因,导致已经收到数据却需要强行丢弃,进而造成浪费
Q:为什么最后一个公式是100010008,而不是1000,100.8ms不是传输一帧的速率吗
2.2 选择重传协议(SR)(目前最好的)
1、GBN协议的弊端
GBN中的累计重传机制会导致批量重传,一个帧传错了,它后面所有的帧都要重传一次。
优化思路是:那么可不可以只重传出错的帧?
——可以,设置单个帧的确认,同时加大接收窗口,设置接收缓存,缓存乱序到达的帧。
2、选择重传协议中的滑动窗口
3、SR发送方必须相应的三件事
- 上层的调用
从上层收到数据后,SR发送方检查下一个可用于该帧的序号,如果序号位于发送窗口内,则发送数据帧;否则就像GBN一样,要么将数据缓存,要么返回给上层之后再传输。
- 收到了一个ACK
如果收到ACK,加入该帧序号在窗口内,则SR发送方将那个被确认的帧标记为已接收。如果该帧序号是窗口的下界(最左边第一个窗口对应的序号),则窗口向前(右)移动到具有最小序号(窗口内)的未确认帧处。(别管什么最小,其实就是移动到第一个还没确认帧的窗口那)如果窗口移动了并且有序号在窗口内的未发送帧,则发送者些帧。
- 超时事件
每个帧都有自己的计时器,一个超时事件发生后只重传一个帧。
4、SR接收方要做的事
对接收窗口内应收到的帧来者不拒。SR接收方将确认一个正确接收的帧而不管其是否按序。失序的帧将被缓存,并返回给发送方一个帧的确认帧**(收谁确认谁)**,直到所有帧(即序号更小的帧)皆被收到为止,这时才可以将一批帧按序交付给上层,然后向前移动滑动窗口。
以下是一个运行中的SR例子
运行中的SR(假设发送窗口和接收窗口尺寸都为4)
5、滑动窗口长度
Q:窗口长度可以无限吗?以下两种情况出现不同的错误,但是接收端都接到一个0号帧(不知道是第几个0号帧)
第一种情况:ack0、ack1、ack2全部丢失,计时器超时以后发送端重新发送,接收端收到的是第一个0号帧;
第二种情况:ack2丢失,接收端将会收到第二个0号帧;
问题在于 发送窗口 相对于 帧的编号 比过大。
发送窗口最好等于接收窗口(大了会溢出,小了没意义)
WTmax=TRmax=2n−1
T为Send Window发送窗口
R为Receive Window接收窗口
n为用多少比特来编帧的序号。
本题中0、1、2、3共4位可以用2bit来编,所以本题中的n为2,窗口小于等于2时就不会出现问题。
6、SR协议重点总结
-
对数据帧逐一确认,收一个确认一个;
-
只重传出错帧
-
接收方有缓存
-
滑动窗口大小应小于等于WTmax=TRmax=2n−1
4、可靠传输★★★
可靠传输是发送端发送什么,接收端就要受到什么