提示:节物风光不相待。桑田碧海须臾改
文章目录
- 前言
- 3.1.1 数据链路层功能
- 数据链路层功能概述
- 3.2.1 封装成帧和透明传输
- 封装成帧
- 透明传输
- 组帧的四种方式
- 字符计数法
- 字符填充法
- 零比特填充法
- 违规编码法
- 3.3.1 差错控制(检错编码)
- 奇偶校验码
- CRC循环冗余码
- 3.3.2 差错控制(纠错编码)
- 海明码
- 海明距离
- 1.确定校验码位数r
- 2.确定校验码和数据的位置
- 3.求出校验码的值
- 检错并纠错
- 方法一
- 方法二
- 脑图时刻
- 3.4.1流量控制与可靠传输机制
- 数据链路层的流量控制
- 流量控制方法
- 停止等待协议
- 滑动窗口协议
- 脑图时刻
- 3.4.2 停止等待协议
- 为什么要有停止等待协议
- 无差错情况
- 有差错的情况
- 停等协议性能分析
- 脑图时刻
- 3.4.3 后退n帧协议
- 后退n帧协议中的滑动窗口
- GBN发送方必须响应的三件事
- GBN接收方要做的事
- 运行中的GBN
- 滑动窗口的长度
- GBN协议重点总结
- 习题1
- 习题2
- 选择重传协议
- 脑图时刻
- 3.4.4 选择重传协议SR
- GBN协议的弊端
- 选择重传协议中的滑动窗口
- SR发送方必须要响应的三件事
- SR接收方要做的事
- 运行中的SR
- 滑动窗口的长度
- SR协议重点总结
- 脑图时刻
前言
这一章主要学习数据链路层的功能和应用,功能中最主要的也是最重要的就是封装成帧和透明传输,封装成帧就是帮我过滤一下物理层,这里就是将物理层的几个bit分装成帧,帧就是数据链路层的传输单位或者说是传输单元,透明传输他想表达的不管我们分装好的帧是怎么样的一个组合,我们都能把他顺利的传输过去,就是链路层好像看不到他所传输的bit序列,我们在链路层传输的时候可能有一定的差错,差错主要是由于噪声引起的,位错就是bit发生了错误了,也就是1,0 发生错误,帧错误也就是帧发生丢失,乱序等,流量控制其实就是在控制发送方的速度,流量控制中我们会学习几个协议,这几个协议就是对流量控制的保证,可靠传输与其说说是链路层的功能,倒不如说是链路层的特点,为了实现流量控制和可靠传输,我们引入了一个滑动窗口机制,流量控制也是为了满足差错控制,应用主要是学习两种链路以及链路层设备,介质访问控制就是说我要给你发送一个信息,如何避免别人发送的信息和我发送的信息发生碰撞,链路层设备主要学习的是交换机网桥
3.1.1 数据链路层功能
数据链路层的主要功能就是将网络层交给他的数据报安全的无差错的交给相邻结点,就像是一个搬运工的角色,
数据链路层功能概述
举一个例子,假如有一个公司的boss网络层,他有一个小蜜数据链路层,网络层交给数据链路层五份文件,让他交给B公司的boss网络层,小秘就将五份文件交给了一个傻子物理层,但是她也知道物理层是一个傻子,所以交给物理层之前要先进行编号,丢失也好寻找,
物理层很傻,数据链路层需要未雨绸缪,进行一定的差错控制,相当于给网络层提供了一种无差错的服务,使得网络层感觉不会发生什么错误,数据链路层干的很好,为了实现这种无差错的功能,无确定无连接服务通常用于实时通信或者误码率比较低的一个通信信道,也就是源主机发送一个信息的时候,不用事先和目的主机连接,目的主机收到数据帧的时候也不用返回确认,若是帧丢失,数据链路层也不负责重发,而是交给上一层处理,这种无确认无连接是为了实时通信,为了更快,这种就需要传输层来解决信息出错的问题,有确认无连接服务,不用事先确认连接,但是目的主机收到数据帧的时候,要发回一个确认,若是源主机在规定时间内没有收到一个确认,就会把没有收到确认的帧重新发送一次,这种适合误码率较高的通信,比如无线通信,有确认面向连接就是需要先建立链接,然后发送数据帧之后需要目的主机发回一个确认信息,发送端只有收到一个确认帧之后才能发送下一个,要注意有连接的一定有确认
3.2.1 封装成帧和透明传输
封装成帧
封装成帧就是将网络层的ip数据报加头加尾形成一个帧,ip数据报也就成为了帧的数据部,f分,发送的时候就是从帧开始发送的,直到发送到帧尾部为止,组帧就是在发送方完成的事情,帧同步就是接收端识别帧的开始和结束,显然为了提高帧的传输效率,应当帧的数据部分尽可能的大于首部和尾部,但是也不能无限大,帧的最大传输单元叫做MTU,根据不同的协议它们的MTU也不相同,
透明传输
下面这句话就是若是某些达不到透明传输就使用一些手段来达到透明传输,透明传输的意思简单来说不会管它传输的是什么,无论是什么都将他交给网络层来进行处理,
组帧的四种方式
字符计数法
对于每一个帧,它的第一个字节都是规定了字节数,这样他就可以区分出每一个帧,但是这样就会有一个问题若是第一个帧的第一个字节发生错误,则后面帧的读取就会发生错误,
字符填充法
SOH就是指帧首部第一个标志的开始的字节,EOT就是帧尾部的结束字节,看到不同的bit组合来观察是帧开始还是结束,键盘上每一个键字都对应一个ASCII码,键盘上的ASCII和这8bit是不会有重复的,所以无论从键盘上敲击什么都可以放在帧的数据部分,而不会认为是一个EOT,但是当传送的帧是非ASCII的时候 则可能其中的0 1 组合就有与EOT相同的bit组合,从而把后面的丢弃,导致帧传输错误,也就是说通过一种方式当接收方当看到和EOT同样组合的时候也不会认为是一个EOT而是一个数据照常接收,直到遇到帧结束符才会停止接收,
字符填充就是在这些控制信息前加上一个转义字符,转义字符其实也是一个8位0 1bit的组合,就是告诉接收端你不用管后面是什么,你只需要正常接收就可以了,同样的SOH之前也加上一个转义字符,遇到转义字节同样的需要加一个转义字节,,直到遇到真正的结束EOT,将原始数据进行一个字节填充就可以放在链路上进行传输了,接收端再将收到的数据的ESC拿掉便可,
零比特填充法
主要和字节填充法的区别是首部和尾部,这里的首部和尾部的标识符是一样的,若是数据部分出现了和首部尾部同样的bit组合,我们需要只要遇到五个1 就往后面填一个零,接收端收到一个字段,首先要找到首部和尾部,来确定边界,然后再去扫描其中的数据部分,若是有5个1就把后面的0 删除,
违规编码法
就是用两个编码方式中不会用到的编码方式来确定起始和终止,是常用的方法
3.3.1 差错控制(检错编码)
对于不同链路可以使用不同的可靠传输机制的,
对于链路层的差错控制 我们是在任何一个节点的链路层都可以实现的,每一个结点和他下一个结点就构成了发送方和接收方之间的关系,只要这个关系一成立接收方就应该对发送方发来的数据进行一个差错的检测,甚至是纠正,检错编码中我们主要学习两种奇偶校验码和循环冗余码CRC,现在普遍使用的是CRC,
奇偶校验码
若是同时有两个bit发生错误则不能检错
CRC循环冗余码
将要发送的数据分组,每一个dbit,加上一个冗余码构成一个数据链路层的传输单元帧在进行发送,但是R位的冗余码是如何确认的呢,这里就需要双方商定一个除数,位数是r+1 位的,除数是题目给的,然后来求R位的冗余数据,首先我们要在发送的d位数据后面加上r位的0,然后除以生成多项式,这个除法是模二的除法,模二就是指加法不进位,减法不退位
等同于异或,同零异一的运算,得到一个商和一个余数,这个余数就是r位的fcs,将这个填到r位0上面,然后再把这样一个帧发送到链路上面,接收方再除生成多项式,看余数是否为零
然后用1101 0110 11 0000来除10011 这里是异或,同零异一,第一位若是0 则不需要写,
发送方某些数据被丢弃了,没有对这些帧进行处理,因此还不是可靠传输
3.3.2 差错控制(纠错编码)
海明码
海明码和之前学的类似都是需要加上一些冗余码,奇偶校验码是在最低位加上一位或者几位,但是海明码这里需要按照一定的规则在数据位上安插校验码,接下来确定好位置即可插入校验码,所以也就需要求出校验码的值,还有一个问题就是接收方如何根据海明码来进行纠错,
海明距离
是取任意两个编码码距的最小值,若是遇到两个编码之间的码距是一,那么这个编码系统码距自然也就是1 了,若是码距是一的话,是检测不出来错误的,跟不要说去纠正,若是码距为2,则若是有一位发生错误使得编码系统码距变成1了,自然也就能发现错误了,但是却不能纠错,所以若是需要检错d位bit的话,码距需要d+1 ,若是需要纠错的话需要的码距是2d+1,
1.确定校验码位数r
将m等于4带入,右边也就是最小是5,所以r最小是从3开始,这里求r使用的就是一个一个试,来看那个合适
2.确定校验码和数据的位置
3.求出校验码的值
海明码会采用一个通配符的形式,如这里的100 写成1**。也就是说四号校验码能管所有1**的数据位的,因此也就是相当于根据不同的校验位来进行分组,采用偶校验就是希望出现偶数个1,
检错并纠错
方法一
首先使用三个圈,分别标上1,2,4 然后三个圈中两个两个的交集来说相加,也就是3,5,6, 然后最后一个填上7,然后我们发现4 号与1号发生错误了,所以也就是错误发生在5,7 里面。但是2号并没有发生错误,所以错误位也就发生在5号
方法二
脑图时刻
3.4.1流量控制与可靠传输机制
数据链路层的流量控制
窗口公告就是告诉发送方此时还有的缓冲区还剩多少,控制一下你的速度不要发太多,
流量控制方法
停止等待协议
停止等待协议也可以看作是一个特殊的停止等待协议,不过是滑动窗口的大小是1,在链路层的滑动窗口在发送过程中是固定的,传输层的窗口是不固定的,
滑动窗口协议
比如这里有许多的数据,这里每一个小窗口都是标志着一个帧,这里出现了循环,这就说明了帧序号出现了重复利用,滑动窗口就是指在发送方这里允许发送的帧的序号,比如这里就是这六个都是可有发送,比如发送方发送了0号帧给接收方,接收方收到了0号帧之后,就可以返回给接收方一个确认帧,接收窗口就可以向后移动一位,接收方收到之后就可以向右移动一个窗口,就是收到一个确认帧窗口移动一个单位,
滑动串口解决流量控制的问题,因为若是接收方一直没有收到一个确认帧,发送窗口就一直圈在哪里,就相当于变相的控制了发送速率,可靠传输意思是发送方若是超时还是没有收到一个确认帧,则发送方重传帧,
脑图时刻
3.4.2 停止等待协议
停止等待协议有的放在了传输层,有的放在了链路层,在计算机网络发展的前期,通信质量还不是特别好,链路层就需要担任可靠传输的职责,随着通信质量的发展,出现差错的可能性也变小了,把这个责任交给传输层来实现,链路层主要负责差错的控制,这样使得在链路上传输的速度更快,因此不需要关注是属于哪一个层次的,因为在哪一个层次最后影响的也只是传输数据的一个对象,若是传输层的,发送的数据就可以称为分组,而在链路层进行传输的时候称作是一个帧,只是命名的不同,本质上是一个传输的数据,
为什么要有停止等待协议
数据包其实就是一个数据,链路层可以叫做一个帧,网络层可以叫做IP数据报或者叫做分组,传输层可以叫做报文段,
无差错情况
这两个数轴的指向就是时间增大的方向,发送方开始发送数据,因为我们是在链路层进行讨论所以我们把数据以帧作为一个单位,发送方发送一个0号帧,接收方收到0号帧之后,回复一个对0号帧的确认,写作ACK0,这里的第一个0 帧和第二个0 帧是不一样的,
有差错的情况
数据帧丢失或检测到帧出错
但是实际上经常会出现一些差错,也就是之前提到的丢包,链路层的体现就是丢失了一些数据帧,这个超时计时器每次发送一个帧都会启动,但是在这个计数器到期之前,确认帧已经到了发送方,这个时候计时器就可以终止掉,若是到期之前还是没有收到确认帧,就会在到期之后重新发一次数据帧,RTT就是往返传播时延,这里需要比平均往返时延要长一点,因为发送方发送需要发送时延,接收方发送确认帧也有发送时延,需要对帧进行编号,这样就有效解决了帧的丢失,帧的重复,
ACK丢失
若是在确认帧发给发送方的时候丢失了,这个时候发送方就不会收到确认帧,然后超时重传刚才的帧,然后接收方会丢弃重复的1帧,再次发送一个对一号帧的一个确认,
ACK迟到
首先发送方在等待了一个超时计时器之后依然没有等待到确认帧,这个时候发送方就会超时重传一个0号帧,此时接收方收到0号帧,发现刚才是受到过0号帧的,此时就需要丢弃这个0号帧,并重新发送一个确认帧,然后接收方收到这个0号帧的确认之后,开始发送一号帧,但是此时收到了0号帧的一个确认帧,本来应该收到的是1号帧的一个确认的,说明0号帧的确认来晚了,此时发送方对这个0号确认帧不做处理,只是简单的丢弃就可以,
停等协议性能分析
发送方发送数据也是按照1bit 1bit进行数据发送的,这个红色的宽就是发送方的发送时延,这个确认帧是一个只包含控制信息的不含数据,因此这个黑色的长条要窄一些,下面这个例题中没有给确认帧的发送时延,因此这里就不加上了,
脑图时刻
3.4.3 后退n帧协议
这里连续发送多个帧,这样就会比我们刚才的信道利用率要更高,所以这里必须要增加一个序号范围,传送中的数据帧必须有一个序号,所以就像这里三组数据帧的序号要是不同的,这样接收方才能返回给发送方一个唯一确认帧,另外发送方需要缓存多个分组,这是因为传递数据的过程中很容易出现帧丢失的情况,所以可能多个分组都是需要缓存的,当然这里可能会出现发那个的帧或者确认的帧出现丢失等情况,所以这里也就有了后退n帧协议和选择重传协议,
后退n帧协议中的滑动窗口
发送窗口,简单来说就是发送帧的序号都必须在这个发送窗口里面,后面没有进入这个发送窗口里面的自然也就是不能发送的,后退n帧中这里接收窗口固定为1,停等协议中发送窗口接收窗口都是1,后退n帧协议发送窗口是有n个,接收窗口是有1个,sr选择重传协议发送窗口有n个,接收窗口同样有n个,如下发送方先发送0号帧,0号帧已经发送到链路上了,发送方也会copy一个1号帧的副本,0号帧传输的过程中,1号帧也是可以发送的,因为只要在这个发送窗口里,且有这个帧我们就可以发送,接收方收到之后,接收窗口就向右移动一个位置,接收方就会发送一个确认帧,发送方收到这个确认帧之后,窗口就会前移一位
若是每一个都发送一个确认帧,这不就是停等协议了吗,所以这里有一个独特之处就是累积确认,若是接收方同时收到了123三个帧接收方不需要逐一的去确认,只需要发送一个3号的确认帧即可,在发送方这里我们可以分成三个部分,发送并且被确认收到的帧,已经发送但是等待确认的帧,还能发送的帧,还有就是不在发送窗口中的帧,
GBN发送方必须响应的三件事
GBN接收方要做的事
如果我们接收方按序收到了n号帧,接收方对接下来收到的帧心中都是有一个数的,知道接下来要收到几号帧,若是之前都是按照计划进行的,每一个期待的帧都受到了,接收方就可以发送一个ACK,假如现在收到了0 1 2 4 5 号帧 这里接收方收完2号帧之后,它心中就知道接下来要受到的是3 号帧,这个三号帧就存放于expectedseqnum中, 若是等不到三号帧则会丢弃4,5 号帧并且重新发送一个2号的确认帧,发送方就会把3号帧以及之后的帧都重新发送
运行中的GBN
这里假设滑动窗口大小是4, 首先发送过来的是0号帧,然后是一号帧,这些无论是发送方还是接收方都没有丢失,然后发送方发送二号帧的过程中丢失了,此时接收方无论是收得3 号帧还是四号帧接收方都会丢弃,而且发送方的一直发送的都是ack1,直到发送方接收到之后确认帧之后,然后重新发送已发送但是还没有确认的帧,
滑动窗口的长度
假如这里n为2,则滑动窗口的大小是4,若是发送的时候,0号帧丢失了,则此时就无法分辨是新窗口的0号帧还是原来窗口的0号帧,
GBN协议重点总结
偶尔捎带确认是指接收方偶尔也可以发送一些数据给发送方,接收方可以将这个确认帧放到数据中这样就相当于是一个顺风车的形式,一旦发送窗口的大小在发送的时候确定好,发送的过程中是不能改变的,
习题1
发送方受到了3号帧的确定,所以这里这里应该从4号帧可以发送
习题2
首先需要算一下甲的发送延迟,也就是甲的发送窗口的尺寸乘以数据帧长,然后换算成bit也就是乘8,再除以甲的发送功率,算出甲的发送时延是80ms,甲在发送第一个帧之后,什么时候才能受到这个帧的确认帧,先算传播延迟,加上甲发送第一个帧的传输延迟,也就是100.08ms,所以也就是需要等待20毫秒才能受到确认帧,受到确认帧之后窗口才能向前移动,
选择重传协议
脑图时刻
3.4.4 选择重传协议SR
GBN协议的弊端
选择重传协议中的滑动窗口
SR发送方必须要响应的三件事
SR接收方要做的事
这里所说的收到小于窗口的帧,可能原因是发给接收方的确认帧丢失了,所以发送方有超时重传了,返回一个ACK的确认帧,这个确认帧是与那个小于窗口的帧相对应的确认帧,注意这里和后退n帧的区别,注意这里返回的确认帧是一一对应,不能使用一个高帧来代替
运行中的SR
对于接收方,只要收到了接收窗口中的帧,都会返回一个确认帧,并返回一个确认,收一个确认一个,接收方只有收到下界的帧窗口才会移动,发送方只有收到发送窗口下界的确认帧窗口才会移动,
滑动窗口的长度
控制长度主要是为了区分是新帧还是旧帧,如下面左图中窗口大小是三,这三个帧都顺利到达了,所以接收窗口向右移动三个单位,但是发送的确认帧都丢失了,所以发送窗口没有移动,超时重传的就是原来的老0号帧,而接收方以为是滑动窗口新0号帧,还有就是下右图,发送方发送的帧都顺利到达了接收方,接收窗口向右移动三个单位,然后接收方收到了一个0号的确认帧,发送窗口向右移动一个位置,然后可以发送三号帧,但是三号帧丢失了,然后收到1号帧的确认,接收窗口向右移动一个位置,发送方就可以发送一个0号帧,这个0号帧就是新帧,所以是0是新帧还是旧帧就无法确认,
SR协议重点总结