数据链路层概述
数据链路层位于计算机网络的低层,且在物理层之上,数据链路层使用的信道主要有以下两种类型。
(1)点对点通信。在信道上使用一对一的点对点通信。
(2)广播信道。这种信道使用一对多的广播通信方式,因此过程比较复杂,广播信道上可以连接多个计算机,因此必须使用共享信道协议来协调这些计算机的数据发送。(如CSMA/CD等等)
本章重点:
(1)数据链路层的三个重要问题:封装成帧、差错检测、可靠传输
(2)互联网点对点协议实例
(3)广播信道的特点和媒体接入控制的概念,以及以太网的媒体介入控制协议(CDMA/CD)
(4)适配器(网卡)、转发器、集线器、网桥、以太网交换机的作用以及使用场合
链路就是从一个节点到相邻节点的一段物理链路,并且中间没有任何其他的交换节点。链路对应的是物理层
数据链路是指把实现通信协议的硬件和软件加在链路上,就构成了数据链路数据链路层在物理层的基础上加上了软件协议和硬件设备,实现了封装成帧、差错检测、可靠传输等等功能,就构成了数据链路层。
因此,总结下来:
链路 = 一个结点到相邻结点的一段物理链路(有线或无线)
数据链路 = n条链路 + 协议 + 软硬件构成的从头到尾的传输链路
数据链路和帧
帧是数据链路层的协议数据单元,数据链路层把网络层交下来的数据,按照不同的协议构成帧,然后发送到链路上。
反过来,也会将帧转为数据上交给网络层
两台主机通过数据链路互联(物理连接+协议),双方都会对对方所发送或者接收数据包进行封包或者解包操作。
注意,这里简化了通信过程,只用了点对点的模型,即同一条链路上只有收发的两台主机。
(1)结点A的数据链路层把网络层交下来的IP数据报添加首部和尾部封装成帧。
(2)结点A把封装好的帧发送给结点B的数据链路层。
(3)若结点B的数据链路层收到的帧无差错(CRC通过),则结点B的数据链路层从收到的帧中提取出IP数据报,上交给上面的网络层,否则丢弃这个帧(CRC失败)。
数据链路层的三个重要问题(前置概述)
- 封装成帧
两台主机通过数据链路互联(物理连接+协议),双方都会对对方所发送或者接收数据包进行封包或者解包操作。
- 差错检测(收到帧后进行校验(硬件级计算,不占用太多性能))
在帧传输的过程中,数据会受到各种干扰,很容易出现0变成1,1变成0的问题。这一现象被称之为误码。
那么这个误码怎么才能被判断出来呢,可以通过检错码发现。发送方在发送帧之前,基于待发送的数据以及算法,算出检测码封装在帧尾部。
接收方接到数据帧之后,根据检错码以及检错算法,就可以判断出这个数据帧在传输过程中是否出现了误码。如果出现了误码就会将其丢弃。
丢弃了以后怎么办?就需要重传,重传就需要依靠可靠传输。
- 可靠传输
多机广播的一些问题
找目的地址的问题
这个问题依靠地址来解决
抢占信号总线的问题
这个问题依靠接入以太网接入协议CSMA/CD
总线型(依赖网桥、集线器等等)现在用的不多,主要是以交换机为主
无线局域网也要依靠CSMA/CD协议。
但是有线网连接依靠交换机就不需要了,交换机可以自行的完成分配工作
总结一下
封装成帧
数据链路层以帧为单位传输和处理数据
之前已经说明了为什么要封装成帧了,帧的功能有哪些?
注意这里为什么说,数据载荷不能超过1500字节,是因为过长的数据会在CRC差错检测环节造成负担,因此需要控制数据载荷长度。
实现帧定界有很多方法,这里举例:固定时间间隔定界和控制字符定界
固定时间间隔
当数据链路层把帧给封装好之后,物理层会在帧前添加8字节的前导码(前7字节是同步码用于时钟同步,最后一个字节是帧开始定位符)。注意,前导码内部只有开始符,没有结束符,因为规定帧间间隔时间为96比特(发送96个比特走过的时间)的发送时间(固定间隔时间),所以想区分帧与帧之间和后面的帧岔开96个比特时间就可以了。
帧定界符方案
这种很好理解,就是通过插入特定字符来实现对帧首尾的开始和结束的界定
在ASCII码中,一共有128种,其中有95中可打印,而不可打印的控制字符有33个(关键字)。在这33个中,就预留了帧定界的关键字。
由于帧开始标志和帧结束标志使用了专门的控制字符,所以在传输的数据中不能出现与之相同的字节(和关键字一样的比特组合),否则就会出现定界错误(比如提前结束等等问题)
但是有一种情况,网络层传来的报文里,就是有关键字的比特流组合,总不能不让传吧?
所以,如果没有处理就会出一些问题。如果对传来的帧不做任何处理,其中部分数据就有可能被识别为特殊的标志位
针对这种情况,便引出了透明传输的概念。
透明传输
透明传输是指数据链路层对上层交付的传输数据没有任何限制,上层只管调用数据链路层,至于数据链路层怎么实现的,不需要上层去关心,上层是完全察觉不到这个转义 -> 还原
的过程,也察觉不到转义字符的存在。该操作均在数据链路层完成,对上层来说就好像不存在一样,即为透明传输。
转义字符处理方案
如果flag位在帧中间,如果不加处理,就可能会导致帧传输提前结束
所以要对帧进行一定的处理,对帧进行扫描,每次遇到与flag位相同的比特流部分,就进行处理。加转义字符标志。这里我们假设这个转义字符叫ESC,就插到 帧定界字符的前面实现转义。
这样在接收端的数据链路层收到帧的时候,就不会将转义字符后面的标记给解释成帧定界符。并且在向上交付给网络层之前,就删除这个插入的转义字符。这样就实现了透明传输。
那如果,转义字符还在帧内部怎么办?
还是老办法,给转义字符加转义字符。这样在接收端收到了两个同样的转义字符时,就删掉前面的一个。
比特流处理方案
当物理链路提供的是面向比特的传输服务时,此时因为传输内容只有0和1,那么帧定界符就可以是某个特殊的比特组合。如点对点协议PPP规定使用01111110
作为边界Flag。那么针对这个Flag的转义操作,也叫 零比特填充法
那么在0比特填充法下,因为01111110是Flag,所以在数据部分,就不能出现6个连续的1,那么在针对数据进行扫描、转义的过程中,只要发现有5个连续的1,就立即插入一个0。
同理,在接收端收到数据后,也会对其数据部分进行扫描,当数据部分发现有5个连续的1之后,就会立即删除5个连续的1后的那个0
帧效率提升
控制MTU的长度,也是为了保证在后续的差错检测的过程中(CRC),其计算过程不至于太长,将其控制在一个合理的范围内。同时,考虑到链路上的硬件也有缓存转发等等操作,其受限于硬件规格,因此也不能将MTU部分设置的过大。
差错检测
传输过程中不可能一点错误都没有,所以要有差错检测来检测是否传输过程中造成了错误。
比特差错的产生原因
奇偶校验
循环冗余校验(CRC)
这种就是,通过生成的算法,来根据发送之前的数据计算出一个校验码(冗余码)。等待接收方接收到之后,根据这个算法再对接收到的数据进行计算。算出的校验码和发来的校验码一致就代表没错。反之就是发生了比特差错。
因为其计算过程是通过硬件级别进行计算的,且因为数据部分的长度一般会限制在1500的长度,因此CRC过程对于性能的影响微乎其微。
生成多项式举例(也是校验算法生成过程)
差错检测的过程
总结
如若CRC校验出现差错,那么就会丢弃该帧,我们假设,数据链路层对上层提供可靠传输服务(即百分百正确),那么就需要通过可靠传输协议来实现可靠传输服务。
值得一提的是,针对有线网络,随着物理层介质质量的不断提高,其传输质量越来越好,数据链路层的重传方面的可靠传输就越来越没那么重要,现在的网络中(比如以太网(局域网)),数据链路层更倾向于通过CRC来进行收到帧的差错检测,如果错了就直接丢弃,至于可靠传输部分则交给再上一层的协议来实现。但是无线网路,因为其通信质量波动非常大,因此仍然要依赖可靠传输。
可靠传输
可靠传输概述
可靠传输由这些协议来实现
- 停止-等待协议SW
- 回退N帧协议GBN
- 选择重传协议SR
这三种可靠传输实现机制的基本原理并不仅限于数据链路层。而是可以应用到计算机网络体系结构的各层协议中。
基本概念
一般来说,有线连接是不需要实现可靠传输的。但是无线连接一般要求可靠传输。
停止-等待协议(SW)
也叫SW协议(Stop And Wait)
先看一些名词:
- ACK (Acknowledgment):确认分组,向对方确认它已成功接收。
- NAK(Negative Acknowledgment):否认分组,向发送方发送否认分组,简称为NAK位。
理想情况,依靠确认位就可以
发送方丢失帧的情况的情况
针对上面的情况,还能用NAK位来要求重传,那如果半路被截胡了,连发现数据帧损毁的机会都没有的情况。怎么办ÿ