参考视频教程:计算机网络微课堂
文章目录
一、数据链路层概述
1.数据链路层的地位
看下面的这一个例子,当主机H1向主机H2,发送数据的时候,我们又之前的知识可以知道,数据经过逐层的封装和解开才能传送到H2,在下面的传输过程中,主机H1可以看做是具备了网络体系中的5层结构,而路由器可以看做只具备三层网络结构。
在数据链路层这一章,我们可以只考虑数据链路层这一层。下面看一下相关的概念。
1.链路(Link) 就是从一个结点到相邻结点的一段物理线路,而中间没有任何其他的交换结点。
2.数据链路(Data Link) 是指把实现通信协议的硬件和软件加到链路上,就构成了数据链路。
3.数据链路层以帧为单位传输和处理数据。
2.数据链路层三个基本问题
a.封装成帧
两个主机通过一段链路互连,两台主机都会对发送或者接受的数据包,进行5个层次的封装或者解封。
(1)发送方将待发送的数据,经过应用层封装成应用层协议数据单元。
(2)然后运输到运输层,运输层添加运输协议首部,使之成为运输层协议数据单元,然后交给网络层。
(3)网络层添加网络层协议首部,使之成为网络层协议数据单元,然后交给数据链路层。
(4)数据链路层添加数据链路层协议首部,简称为帧头,还需要添加一个帧尾。我们把添加帧头和帧尾的操作称为封装成帧。
b.差错检测
发送方将封装好的帧通过物理层发送到传输媒体。帧在传输过程中遭遇干扰后可能会出现误码。
PS:那么问题来了,接收方主机如何判断帧在传输过程中出现了误码呢?
这就需要检错码来发现了,发送方在发送帧之前,基于待发送的数据和检错算法计算出检错码,并将其封装在帧尾。接收方主机收到帧后,通过检错码和检错算法,就可以判断帧在传输过程中是否出现了误码。
c.可靠传输
3.使用广播信道的数据链路层
如下图所示,主机A、B、C、D、E通过一根主线互连,主机A给主机C发送一段帧信号,那么B、C、D如何判断此帧不属于自己,而C又知道此帧是发给自己的呢?或许根据之前的知识,我们可以想到把地址放到帧中一起传输,里面就包含了目的地址。
那么当多个主机同时传输帧信号时,又会发生碰撞,又该如何解决呢?
这是采用广播信道的共享式局域网不可避免的。以太网采用的方法时,也就是载波监听,多点接入碰撞检测。随着技术发展,交换技术的发展,在有线网中,使用点对点链路和链路层交换机的交换式局域网,已完全取代了共享性局域网。
无线局域网仍然使用的是共享信道技术。也就是载波监听,多点接入碰撞避免。
4.小结
二、封装成帧
封装成帧是指数据链路层给上层交付的协议数据单元添加帧头和帧尾使之成为帧。
为了解决上述的问题,帧头和帧尾的作用之一就是帧定界。如下图所示,PPP帧的格式中,比特流中红色部分就是帧定界的标志,接收方的数据链路层,就可以根据帧定界的标志,从物理层交付的比特流中提取出一个个的帧。这里需要注意的是,并不是每一种数据链路层协议的帧都包含有帧定界标志。
下面看一下接收方如何处理提取出没有帧定界的以太网帧。在物理层接收到帧信号后,会添加一个8字节的前导码,前7个字节是前同步码,目的是使接收方的时钟同步,之后一个字节为帧开始定界符,表示后面就是MAC帧。
以太网还规定了帧间间隔时间为96比特的发送时间,因此MAC帧并不需要帧结束定界符。
透明传输是指数据链路层对上层交付的传输数据没有任何限制,就好像数据链路层不存在一样。
我们看一下下面的这个过程(第一次尝试动图QAQ,可能做的不是很流畅):发送方数据链路层收到其上层交付的协议数据单元,给其添加帧头和帧尾,假设上一层交付数据的时候,存在了帧定界符(flag),那么接收方能否正确判断接受的起始位置呢?
答案是否定的,接收方接收到第一个flag后,会认为是开始位置,再一次接收到的时候,会认为已经结束了,如果再有,就会发生错误,如果数据链路层不能解决此问题,那么就算不上透明传输,数据链路层对上层交付的协议数据单元有限制,其内容不能包含帧定界符。
为了解决上面的问题,数据链路层会在flag前面添加一个转义字符,接收方数据链路层在物理层交付的比特流中提取帧,遇到第一个flag的时候,认为是帧的开始,遇到转义字符时,就会知道不是真正的flag了,剔除转义字符后将其后面的内容作为数据继续提取。
我们看下面的这个栗子:每5个连续的1后插入一个比特0
三、差错检测
1.奇偶校验
奇偶校验说白了,其实就是检测奇数或者偶数是否发生个数上面的改变,举个例子,奇校验就是在我们传输的数据后面添加一个1,然后让1的个数是奇数,当发生无码,比如1变为0,或者0变为1,接收方就会检测到1的数目发生了改变,从而知道发生了误码,但是当误码产生的个数是2个时,就会检测不出,从而发生漏检。偶校验也是同理的,检测的是1是不是偶数个,跟奇校验一样,同样存在漏检状态。
2.循环冗余校验CRC
目前流行的是循环冗余校验,下图有很详细的说明了,这里需要注意的就是发送方和接收方的商和余数,如何判断是否有误码的产生。
下面的公式,是生成多项式的举例,系数的确定从而影响着比特串的产生,我们后面根据例题进行详细的解释。
例题:
根据下面的题目,我们首先根据生成多项式的x的最高次幂是3,所以就在待发送信息的后面补上3个0,然后我们的被除数也就是101001000,然后我们的除数是1101,这是因为x的三次方前面的系数是1,x平方前面的系数也是1,但是x这一项没有,所以是0,而最后的数字1,也就是x的0次方,前面的系数也就是1。
然后开始计算,这里的运算采用的是位运算,我们根据下图的演示可以很容易得知整个的运算流程。然后最后我们的余数,如果位数和多项式的最高次不同,就在前面进行补0,下图可知,最高次是3次幂,所以应该是3位的结果。
这个例题跟上面是一样的,我们只需要知道当余数是0的时候,认为传输无误码,余数不为0的时候,可以认为传输产生了误码。
3.小结
四、可靠传输
1.基本概念
2.停止-等待协议SW
我们看下面的图片,发送方发送DATA后给接收方,如果接收方成功接收,那么就返回ACK确认分组,当发送方收到ACK后,继续发送DATA,如果传输时候出现了误码,那么接收方就会丢弃,并且返回NAK否定分组,当发送方接收到的时候,就会继续重新发送上一个状态的DATA,直到接收到ACK为止。
自然,这是理想的状态,但是当发送方的DATA还没有传输到接收方就被丢失后,那么这时就会有一个超时计时器,如果发送方发送完一个数据分组后,在超时计时器的时间超出范围后,那么就会再次发送上一次未被确认的数据分组。
如果接收方返回ACK的时候出现了问题呢?那么发送方为了避免重复传输分组,会给每一个分组标记上序号,每当发送一次数据分组,就保持数据分组的序号不同就可以了。
如果接收方返回的ACK较慢,导致了发送方又一次发送了数据分组DATA0,那么接收方接收到发送方的数据分组后,会丢弃,并再次返回确认分组ACK0,那么发送方接收到后,会忽略掉此次的ACK,继续传输还没有收到ACK的数据分组DATA0。
需要注意的事项:
例题:
3.回退N帧协议GBN
我们看一下无差错的情况:也就是发送方发送的数据全部被接收方接受,并且返回ACK确认信息,并且发送方全部接收到。
但是大多数情况并非如上,而是会进行累积确认。
看一下下面的图,当没有出错的时候:发送方一次性发送出以3个比特为分组的数据分组,也就是下面的5位窗口数据,接收方接收到了0和1两位后,返回了1的ACK,在接受完后面的数据后,返回了4的ACK,那么发送方接收到1,就知道1之前的都已经被确认,接收到4后,就知道4之前都有已经被确认。
当出现错误的时候:比如下图所示,我的5号位出现了问题,那么接收方就无法返回5的ACK,那么接收方就会返回多个4的ACK,发送方收到重复的ACK,立刻重传数据,由于收到5的影响,5之后,也就是6701的数据被接收方丢弃,发送方仍然需要重新传一次。
如果我们传输的数据超过标准的范围:本来我们只能一次接受7个数据,如果非要给8个,那么接收方无法判断第8个是新的数据分组,还是旧的数据分组,只会返回7的ACK,那么我们发送方也会因此等待超时。
例题:
注意事项:
4.选择重传协议SR
其实这个协议的特点在于不是累计确认,接收方每接收到一个数据,就返回一个ACK,下面的动图可以知道,我收到几,就返回几的ACK,收不到就不返回,那么发送方接收到ACK,向右移动窗口,但是移动到2的时候会被卡住,因为还没有收到2的ACK,但是3的数据已经被确认,接着传出去4和5,超时重传2,直到收到2的ACK后,如果4和5也已经收到,那么就会顺势在这些数据上划过窗口。与上一个协议(回退N帧协议GBN)的区别在于,不需要多次重传数据,一个失误的数据,不会影响被正确接受的数据。
同理,数据范围也是不可以超的,否则会导致发送方超时。
例题:
注意事项:
五、点对点协议PPP
小结
后续
文中若有错误,欢迎评论区留言,笔者才疏学浅,希望各位师傅不吝赐教!(由于CSDN最大的图片上传尺寸只能5MB,所以部分动图可能制作的演示速度快一些,还请理解,私信博主可以拿课程配套的PPT。)