计算机网络中数据链路层采用,计算机网络的数据链路层简述

  • Post author:
  • Post category:其他


2019独角兽企业重金招聘Python工程师标准>>>

6936d1565ae689371725cdb5fc51c415.png

在计算机网络体系中,数据链路层位于物理层和网络层之间,其作用是保证网络层的数据包以可靠的方式在物理层提供的比特流信道上传输。为实现其作用,数据链路层将网络层的数据包封装成帧(Frame)。数据链路层的工作核心即是对帧的管理。

数据链路层完成这些功能:

1)为网络层提供一个定义良好的接口。发送端网络层的数据包,在数据链路层封装成帧,到达接收端之后,数据链路层把帧重新解析为原始数据包并提供给网络层。

2)处理帧传输中的错误。通信线路出错造成的帧丢失及帧数据错误等。

3)调解数据流。发送方和接收方的处理速度并不总是一致的,要确保快速的发送方不会淹没慢速的接收方。

数据成帧

物理层传输的是比特流,如何在比特流中识别出每一帧,是数据链路层发送和接受帧时需要解决的问题。比特流封装成帧的设计方案,需要保证接收方能容易的识别帧的开始和判断帧的结束,同时基于实际传输考虑,方案要占用较少的信道带宽。

通常所采用的方案包括计数法、标志法和物理层编码违禁等。

计数法以每帧头部的字段来标识该帧的字节数,接收方的数据链路层获取到头部字段的数值,即可知道该帧的字节数,因而也就知道了帧在哪里结束。计数法是一个并不健壮的方案,因而很少被使用。考虑以下场景:当一个帧的计数字段因传输错误而发生变化时,接收方不能获取正确的结束位置,因此也就无法获取下一帧的正确位置,即使接收方已经通过校验知道帧已经被损坏,它仍然无法知道下一帧的正确起始位置,甚至要求发送方重传时,接收方也并不知道应该跳过多少字节才能到达重传的开始处。

标志法的方案,是在数据流中填充标志字节或者标志比特,以此标识帧的边界。无论是采用字节填充还是比特填充,都需要考虑数据流中可能出现的标志字节或标志比特。

例如在一种使用字节填充的方案中,采用一个标志字节FLAG作为帧的开始和结束。但传输的数据本身,也可能会包含标识字节FLAG。接收方在收到一个FLAG字节时,需要判断这是发送方插入的帧边界,还是数据中出现的字节。为了避免接收方产生迷惑,需要对数据中出现的标志字节定义一个转义方案。定义一个转义字节ESC,当数据中出现FLAG字节时,在其前插入一个ESC字节,接收方通过是否有转义字节来判断标志字节是帧的边界还是出现在数据流中的字节,接收方数据链路层把数据传递给网络层时,转义字节会被删除掉。随之而来的问题是,转义字节ESC也可能会出现在数据流中,这时接收方需要判断出现的转义字节ESC是由发送方插入的,还是数据流本身所有的。解决这一问题的方法,采用同样的字节填充技术,即数据流中出现的每个ESC字节前插入另一个转义字节ESC,接收方只需判断ESC字节的个数,即可知道出现的ESC是数据流中的字节,还是发送方插入的转义字节。上面所描述的成帧方案,是在PPP协议中所使用的方案的简化形式。

比特填充的方案中也有类似的问题,用作标识的比特同样可能出现在原始的比特流。例如每帧开始和结束以01111110的比特模式作为标识,对于数据中同样会出现的01111110,需要采用某种方式将其区别开来。每当发送方在数据中遇到5个连续的1,就在其后插入一个0,这样数据中便不会出现01111110的比特模式。对于接收方,只需要在接受到的数据流中,每遇到5个连续的1,将其后的0删掉就可以了。

另一种方案利用了物理层,原理类似于比特填充。物理层在进行比特传输时,为了信号平衡等问题,通常要对比特流编码。比特流编码为物理层传输的信号流时,通常会包括一些冗余的比特模式,这些模式永远不会出现在信号流中,数据链路层因而可以利用这些冗余的比特模式,作为帧边界的标识。

错误检测和纠正

通信信道并不总是可靠的,比特流传输过程中的信号串扰很容易造成比特信息的错误,接收端的物理层负责把电子信号转化为比特信息,而检测和纠正传输过程中的比特错误,则是数据链路层应该完成的工作。发送方的数据链路层,通常会按照某种算法在数据流中加入冗余的比特,接收方验证接受到的数据流和冗余比特在经过通信信道之后是否依然符合约定的算法,以此判断传输过程是否发生比特错误。

通常冗余比特包括纠错码和检错码两种。接收方可通过纠错码发现并改正传输中的比特错误,检错码只能用来检测错误,而不能修正错误。在同样的数据块码中,可靠地纠正N位错误要比可靠地检测N位错误在编码方案中加入更多的冗余比特。因此在一个可靠性较高的信道上,使用检错码检查数据,在偶尔发生错误时重传整个数据块,比使用纠错码要节省信道资源。而在错误发生频繁的信道上,采用纠错码是更好的选择。无论纠错码和检错码,都无法处理所有可能的传输错误,因为提供保护作用的冗余编码也会像数据比特一样出现错误——对信道本身而言,他们都是一样的比特。

常用的纠错码有海明码,二进制卷积码和里德所罗门码等。常用的检错码包括奇偶校验和校验和,循环冗余校验(CRC)广泛用于数据链路层。

纠错码和检错码并不仅可用在数据链路层,也可用在物理层或者更高的层次。

数据流控制

数据链路层协议需要保证接收方完好无损地接收到每一个帧,并且帧需要安装发送的顺序组织起来供网络层使用。为防止快速的发送发淹没慢速的接收方,协议要提供流量控制机制。

协议通常要实现一个确认和重传的机制。发送方在发出一帧之后,要求接收方在收到之后发回一个确认,以此判断数据正确到达,还是发生损坏需要重传。另外在发送方通常还要为每帧设置一个计数器,当超过一定时间未收到接收方确认,则自动重传该帧(如数据帧或确认帧在传输过程中丢失)。

为了保证帧的顺序,发送方通常要给帧编上序号。若由于某些帧的损坏和重传造成其他帧的乱序,接收方可以选择丢弃这些乱序的帧,或者建立一种缓存机制来保存这些帧,以获得更大的带宽效率。

数据链路层协议为其上的网络层提供一个可靠的链路。

数据链路层实现

数据链路层进程部分运行在专用硬件(网络接口卡NIC)上,其他部分进程作为操作系统的一部分运行在主CPU,数据链路层进程软件通常以设备驱动器的形式存在。

Internet上的主要数据链路层协议是PPP(Point-to-Point Protocol)。PPP协议使用标志字节区分帧的边界,错误检测使用的是CRC。PPP协议通用于广域网的SONET(光纤物理层协议)和家庭网ADSL链路上。

相比物理层只关注单个比特的传输,数据链路层关注的是如果在两台相邻的机器(实体)之间实现可靠有效的完整信息块(帧)通信。