计算机网络(四):数据链路层(功能概述、组帧/封装成帧、差错控制、流量控制与可靠传输机制)
文章目录
- 数据链路层功能
- 封装成帧(组帧)
- 字符计数法
- 字节填充法
- 零比特填充法
- 违规编码法
- 差错控制
- 奇偶校验码
- 循环冗余码
- 纠错编码(海明码)
- 流量控制与滑动窗口机制
- 可靠传输机制
- 停止-等待协议(S-W)
- 后退N帧协议(GBN)
- 选择重传协议(SR)
- 数据链路层考点
数据链路层功能
数据链路层的主要任务是让帧在一段链路上或一个网络中传输。数据链路层协议有多种,但有三个基本问题则是共同的,即封装成帧、透明传输和差错检测。
数据链路层使用的信道主要有两种:
1)点对点信道,使用一对一的通信方式。PPP则是目前使用最广泛的点对点协议。
2)广播信道,这种信道上连接的主机很多,使用兴对多的广播通信方式。采用共享广播信道的有线局域网普遍使用CSMA/CD协议,而无线局域网则使用CSMA/CA协议。
一些基本概念:
1)链路
指从一个节点到相邻节点的一段物理线路。当进行数据通信时,两台计算机之间的通信路径往往要经过许多段这样的链路。可见链路只是一条路径的组成部分。
2)数据链路
当在一条链路上传送数据时,除了需要链路本身,还需要一些必要的通信协议来控制这些数据的传输,把实现这些协议的硬件和软件加到链路上,就构成了数据链路。有时也把上面所说的链路称为物理链路,而把数据链路称为逻辑链路。
3)帧
数据链路层对等实体之间进行逻辑通信的协议数据单元。数据链路层把网络层下交的数据构成帧发送到链路上,并把接收到的帧中的数据取出并上交给网络层。
4)链路管理
数据链路层连接的建立、维持和释放过程称为链路管理,它主要用于面向连接的服务。链路两端的节点要进行通信,必须首先确认对方已处于就绪状态,并交换一些必要的信息以对帧序号初始化,然后才能建立连接,在传输过程中要能维持连接,而在传输完毕后要释放该连接。
封装成帧(组帧)
发送方依据一定的规则将网络层递交的分组封装成帧(也称组帧)。数据链路层之所以要将比特组合成以帧为单位传输,是为了在出错时只重发出错的帧,而不必重发全部数据,从而提高
效率。组帧主要解决帧定界、帧同步、透明传输等问题。实现组帧的方法通常有以下4种。
组帧时既要加首部,又要加尾部。原因是,在网络中信息是以帧为最小单位进行传输的,所以接收方要正确地接收帧,就必须清楚该帧在串比特流中从哪里开始到哪里结束因为接收方收到的是一串比特流,没有首部和尾部是不能正确区分帧的)。而分组(IP数据报)仅是包含在帧中的数据部分(后面将详细讲解),因此不需要加尾部来定界。
字符计数法
字符计数法是指在帧首部使用一个计数字段来记录该帧所含的字节数(包括计数字段自身所占用的1字节)。
当接收方读出帧首部的字节计数值时,就知道后面跟随的字节数,从而确定帧结束位置。因为帧与帧之间是连续传输的,所以也能确定下一帧的开始位置。
字节填充法
字节填充法使用特定字节来定界一帧的开始与结束,控制字符SOH放在帧的最前面,表示帧的开始,控制字符EOT表示帧的结束。为了使信息位中出现的特殊字符不被误判为帧的首尾定界符,可在特殊字符之前填充一个转义字符ESC来加以区分(注意,转义字符是ASCII码中的控制字符,是一个字符,而非“E”“S”“C”三个字符的组合),以实现数据的透明传输。接收方收到转义字符后,就知道其后面紧跟的是数据信息,而不是控制信息。
若转义字符ESC也出现在数据中,则解决方法仍是在转义字符前插入一个转义字符。
零比特填充法
零比特填充法允许数据帧包含任意个数的比特,它使用一个特定的比特串01111110来标志一帧的开始和结束。为了不使数据字段中出现的比特流01111110被误判为帧的首尾标志,发送方先扫描整个数据字段,每遇到5个连续的“”就自动在其后插入一个“0”。经过这种比特填充后,就可保证数据字段中不会出现6个连续的“1”。接收方执行该过程的逆操作,即每收到5个连续的“1”,就自动删除后面紧跟的“0”,以恢复原始数据。
在数据链路层早期使用的HDLC协议中/便是采用这种比特填充的首尾标志法来实现透明传输的。
零比特填充法很容易由硬件来实现,性能优于字节填充法。
违规编码法
在物理层进行比特编码时,常采用违规编码法。
例如,曼彻斯特编码方法将数据比特“1”编码成“高一低”电平对,将数据比特“0”编码成“低-高”电平对,而“高-高”电平对和“低一低”电平对在数据比特中是违规的(没有采用),因此可借用这些违规编码序列来定界帧的起始和终止。
局域网IEEE802标准就采用了这种方法。违规编码法不采用任何填充技术便能实现数据的透明传输,但只适用于采用冗余编码的特殊编码环境。
因为字符计数法中计数字段的脆弱性和字节填充法实现上的复杂性与不兼容性,所以目前较常用的组帧方法是零比特填充法和违规编码法。
差错控制
实际通信链路都不是理想的,比特在传输过程中可能产生差错,1可能变成0,0也可能变成1,这就是比特差错。比特差错是传输差错中的一种,本节仅讨论比特差错。
通常利用编码技术进行差错控制,主要有两类:自动重传请求(AutomaticRepeat reQuest,ARQ)和前向纠错(ForwardErrorCorrection,FEC)。在ARQ方式中,当接收方检测到差错时,就设法通知发送方重发,直到收到正确的数据为止。在FEC方式中,接收方不但能发现差错,而且能确定错误的位置并加以纠正。因此,差错控制又可分为检错编码和纠错编码。
检错编码都采用冗余编码技术,核心思想是在有效数据(信息位)被发送前,按某种关系附加一定的冗余位(检验位),构成一个符合某一规则的码字后发送。当要发送的有效数据变化时,相应的冗余位也随之变化,使得码字遵从不变的规则。接收方根据收到的码字是否仍符合原规则来判断是否出错。常见的检错编码有奇偶检验码和循环冗余码。
最常见的纠错编码是海明码,其实现原理是在有效信息位中加入几个检验位形成海明码,并把海明码的每个二进制位分配到几个奇偶检验组中。某一位出错后,就会引起有关的几个检验位的值发生变化,这不但可以发现错位,而且能指出错位的位置,为自动纠错提供依据。
奇偶校验码
奇偶检验码是奇检验码和偶检验码的统称,是一种最基本的检错码。它由n-1位数据和1位检验位组成,检验位的取值(0或1)将使整个检验码中“1”的个数为奇数或偶数。
1)奇检验码:附加一个检验位后,n位的码字中“1”的个数为奇数。
2)偶检验码:附加一个检验位后,n位的码字中“1”的个数为偶数。
循环冗余码
数据链路层广泛使用 循环冗余码(Cyclic Redundancy Code,CRC) 检错技术。
循环冗余码(CRC)检错的基本思想:
1)收发双方约定一个生成多项式G(x)(要求最低位必须为1)。k位位串可视为阶数为k-1的多项式的系数序列。例如,可用多项式x³ + x² + 1
表示位串1101。
2)发送方基于待发送的数据和G(x),计算出冗余码,将冗余码附加到数据后面一起发送。
3)接收方收到数据和冗余码后,通过G(x)来计算收到的数据和冗余码是否产生差错。
假设一个待传送m位的数据,CRC运算产生一个r位的冗余码,称为帧检验序列(FCS)。这样形成的帧将由m+r位组成。在所要发送的数据后面增加r位冗余码,虽然增大了传输开销,但是可以进行差错检测,这种代价往往是值得的。这个带检验码的帧刚好能被预先确定的多项式G(x)整除。接收方用相同的多项式去除收到的帧,若余数为0,则认为无差错。
纠错编码(海明码)
最常见的纠错编码是海明码,其实现原理是在有效信息位中加入几个检验位形成海明码,并把海明码的每个二进制位分配到几个奇偶检验组中。某一位出错后,就会引起有关的几个检验位的值发生变化,这不但可以发现错位,而且能指出错位的位置,为自动纠错提供依据。
码距
海明码编码过程
流量控制与滑动窗口机制
在数据链路层中,流量控制机制和可靠传输机制是交织在一起的。都与滑动窗口机制相关。
流量控制 是指由接收方控制发送方的发送速率,使接收方有足够的缓冲空间来接收每个帧。
常见的流量控制方法有两种:停止-等待协议 和 滑动窗口协议。数据链路层和传输层均有流量控制的功能,它们都用到了滑动窗口协议,但也有所区别,主要体现如下:
1)数据链路层控制的是相邻节点之间的流量,而传输层控制的是端到端的流量。
2)数据链路层的控制手段是接收方收不下时就不返回确认。传输层的控制手段是接收方通过确认报文段中的窗口值来调整发送方的发送窗口。
1. 停止-等待流量控制基本原理
停止-等待流量控制是一种最简单的流量控制方法。发送方每次只允许发送一个帧,接收方每接收一个帧都要反馈一个确认信号,表示可以接收下一帧,发送方收到确认信号后才能发送下一帧。若发送方没有收到接收方反馈的确认信号,则需要一直等待。发送方每发送完一个帧,就进入等待接收方确认信息的过程中,因而传输效率相对较低。
2.滑动窗口流量控制基本原理
滑动窗口 流量控制是一种更高效的流量控制方法。在任意时刻,发送方都维持一组连续的允许发送帧的序号,称为发送窗口;同时接收方也维持一组连续的允许接收帧的序号,称为接收窗口。发送窗口表示在还未收到对方确认信息的情况下,发送方最多还能发送多少个帧和哪些帧。同理,在接收方设置接收窗口是为了控制可以接收哪些帧和不可以接收哪些帧。
滑动窗口具有以下重要特性:
1)只有接收窗口向前滑动(同时接收方发送了确认)时,发送窗口才有可能(只有发送方收到确认后才一定)向前滑动。
2)从滑动窗口的概念看,停止-等待协议与后面将介绍的后退N帧协议和选择重传协议只在发送窗口大小与接收窗口大小上有所差别:
3)当接收窗口大小为1时,只有收到该帧后才允许接收下一帧,因此可保证帧的有序接收。
4)在数据链路层的滑动窗口协议中,窗口大小在传输过程中是固定的(与传输层不同)。
可靠传输机制
可靠传输 是指发送方发送的数据都能被接收方正确地接收,通常采用确认和超时重传两种机制来实现。确认是指接收方每收到发送方发来的数据帧,都要向发送方发回一个确认帧,表示已正确地收到该数据帧。超时重传是指发送方在发送一个数据帧后就启动一个计时器,若在规定时间内没有收到所发送数据帧的确认帧,则重发该数据帧,直到发送成功为止。
使用这两种机制的可靠传输协议称为自动重传请求(ARQ),它意味着重传是自动进行的,接收方不需要对发送方发出重传请求。在ARQ协议中,数据帧和确认帧都必须编号,以区分确认帧是对哪个帧的确认,以及哪些帧还未确认。
ARQ协议分为三种:
- 停止-等待(Stop-and-Wait)协议
- 后退N帧(Go-Back-N)协议
- 选择重传(Selective Repeat)协议。
值得注意的是,这三种可靠传输协议的基本原理并不仅限于数据链路层,还可应用到其上各层。
在有线网络中,链路的误码率较低,为了降低开销,并不要求数据链路层向其上层提供可靠传输服务,即使出现了误码,可靠传输的问题也由其上层处理。而无线网络的链路易受干扰,误码率较高,因此要求数据链路层必须向其上层提供可靠传输服务。
停止-等待协议(S-W)
在停止-等待协议中,发送方每次只能发送一个帧,当发送方收到接收方的确认帧之后,才可以发送下一个帧。从滑动窗口的角度看,停止-等待协议的发送窗口和接收窗口大小均为1。
在停止-等待协议中,可能出现两种差错:
①数据帧出错或丢失,接收方检测到数据帧出了差错,就简单地将该帧丢弃;若是数据帧在传输过程中丢失,接收方当然什么都不知道。为了应付这种可能的情况,发送方装备了计时器。在一个帧发送后,发送方等待确认,当计时器超时的时候,若仍未收到确认,则重发该数据帧。如此重复,直到该数据帧正确到达为止。
②确认帧出错或丢失,若接收方已收到正确的数据帧,但发送方收不到确认帧,因此发送方会重传已被接收的数据帧,接收方收到相同的数据帧时会丢弃该帧,并重传一个该帧对应的确认帧。
对于停止-等待协议,由于每发送一个数据帧就停止等待,只需保证每次发送的新数据帧的序号与上次发送的数据帧的序号不同,因此用1比特来编号就足够。发送的帧交替地用0和1来标识,确认帧分别用ACK0
和ACK1
来表示。若连续出现相同序号的数据帧,则表明发送方进行了超时重传。若连续出现相同序号的确认帧,则表明接收方收到了重复帧。
此外,为了超时重传和判定重复帧的需要,发送方和接收方都要设置一个帧缓冲区。当发送方发送完数据帧时,必须在其发送缓存中保留该数据帧的副本,这样才能在出现差错时进行重传。只有在收到对方发来的确认帧ACK后,方可清除该副本。
停止-等待协议的信道利用率很低。为了提高传输效率,产生了连续ARQ协议(后退N帧协议和选择重传协议),发送方可连续发送多个帧,而不是每发完一个帧就停止等待确认。
后退N帧协议(GBN)
GBN协议的工作原理(2009)
在后退N帧协议中,发送方可在未收到确认帧的情况下,将序号在发送窗口内的多个数据帧全部发送出去。
后退N帧的含义是:发送方发送N个数据帧后,若发现这N个帧的前一个数据帧在计时器超时的时候仍未收到其确认信息,则该帧被判为出错或丢失,此时发送方不得不重传该出错帧及随后的N个帧。这意味着,接收方只允许按顺序接收帧。
选择重传协议(SR)
为了进一步提高信道的利用率,可以设法只重传出现差错和计时器超时的数据帧,但此时必须加大接收窗口,以便先收下失序但正确到达且序号仍落在接收窗口内的那些数据帧,等到所缺序号的数据帧收齐后,再一并送交上层。这就是选择重传协议。