本系列文章为湖南科技大学高军老师的计算机网络微课堂学习笔记,前面的系列文章链接如下:
计算机网络:P1-概述
计算机网络:P2-物理层
文章目录
一、数据链路层概述
数据链路层在网络体系结构中所处的地位
如下图所示,主机H1给H2发送数据,中间要经过三个路由器和三种网络。从五层协议原理体系结构的角度来看,主机应具有体系结构中的各个协议,而路由器只需具有体系结构中的下面三层。各设备通过物理层下面的传输媒体进行互连,数据的流动如下图所示。
----主机H1将待发送的数据逐层封装后,通过物理层将构成数据包的各比特转换为电信号发送到传输媒体。
----数据包进入路由器后,由下往上逐层解封到网络层。路由器根据数据包的目的网络地址和自身转发表,确定数据包的转发端口。然后从网络层向下逐层封装数据包,并通过物理层将数据包发送到传输媒体。
----数据包最终到达主机H2时,还要由下往上逐层解封,最终解封出主机H1所发送的数据。
链路、数据链路、数据链路层
当我们专门研究数据链路层的问题时,在大多数情况下,我们可以只关心数据链路层而不考虑网络体系结构的其他各层。换句话说,我们可以想象数据包只在数据链路层从左向右沿水平方向传送。从数据链路层来看,主机H1到H2可以看成是在4段不同的链路上的通信组成的。
链路(Link)就是从一个结点到相邻结点的一段物理线路,而中间没有任何其他的交换结点。
数据链路(Data Link)是指把实现通信协议的硬件和软件加到链路上,就构成了数据链路。
数据链路层以帧为单位传输和处理数据。
数据链路层的三个重要问题
①封装成帧
如图所示,两台主机通过一段链路互连。两台主机都会对所发送或接收的数据包进行五个层次的封装或解封。发送方将待发送的数据通过应用层封装成为应用层协议数据单元,然后交付给运输层。运输层为其添加运输层协议首部使之成为运输层协议数据单元,然后交付给网络层。网络层为其添加网络层协议首部使之成为网络层协议数据单元,然后交付给数据链路层。数据链路层给网络层协议数据单元添加一个数据链路层协议首部,简称为帧头,还要给其添加一个帧尾。我们将数据链路层给网络层交付的协议数据单元添加帧头和帧尾的操作称为封装成帧。添加帧头和帧尾的目的都是为了在链路上以帧为单元来传送数据,也就是为了实现数据链路层本身的功能。
例如,这是以太网版本2的MAC帧格武
②差错检测
思考:发送方将封装好的帧通过物理层发送到传输媒体。帧在传输过程中遭遇平扰后可能会出现误码,也就是比特0可能变成了比特1,反之亦然。接收方主机如何判断帧在传输过程中是否出现了误码呢?
答:这可以通过检错码来发现。发送方在发送帧之前,基于待发送的数据和检错算法计算出检错码,并将其封装在帧尾。
例如,以太网版本2的MAC帧的帧尾就是4字节的帧检验序列FCS字段。要写入该字段的内容,也就是我们所说的检错码。接收方收到数据后,通过检错码和检错算法就可以判断出帧在传输过程中是否出现了误码
③可靠传输
接收方主机收到有误码的帧后,是不会接受该帧的,将其丢弃。如果数据链路层向其上层提供的是不可靠服务,那么丢弃就丢弃了,不会有更多措施。如果数据链路层向其上层提供的是可靠服务,那么就还需要其他措施来确保接收方主机还可以重新收到被丢弃的这个帧的正确副本。换句话说,尽管误码是不能完全避免的,但若能实现发送方发送什么接收方就能收到什么,就称为可靠传输。
一些问题
我们在介绍上面这三个问题的时候使用的是点对点信道的数据链路层来举例的。
①对于使用广播信道的数据链路层,除了包含这3个问题外,还包含其它一些问题需要解决。如下图所示,主机ABCDE通过总线相连,主机A给主机C发送数据,代表帧的信号会通过总线传输到总线上的其他各主机。那么主机BDE如何知道就收到的帧不是发送给它们的。主机C又如何知道收到的帧恰恰是发送给自己的呢?
答:进行编址,将帧的目的地址添加在帧中一起传输。例如,这是以太网版本2的MAC帧格式。其首部中的三个字段中有两个字段和地址相关。
②当总线上多台主机同时使用总线来传输帧时,传输信号就会产生碰撞。这是采用广播信道的共享式局域网不可避免的,如何解决呢?
答:以太网采用的协调方法是使用一种特殊的协议CSMA/CD,也就是载波监听多点接入/碰撞检测。随着技术的发展,交换技术的成熟和成本的降低,具有更高性能的使用点对点链路和链路层交换机的交换式局域网在有线局域网领域已完全取代了共享式局域网。
③那么,网络中的交换机又是如何转发帧的呢?另外,由于无线信道的广播天性,无线局域网仍然使用的是共享信道技术。例如,802.11局域网采用的媒体接入控制协议是CSMA/CA,也就是载波监听多点接入/碰撞避免。它的工作内容又是怎样的呢?这些内容我们在本篇博客下面一些将会学习到。
小测验
1、数据链路层传输和处理数据的单位是
A. 报文段
B. 比特流
C. 数据报
D. 帧
答案:D
2、下列不属于数据链路层功能的是
A. 封装成帧
B. 差错检测
C. 可靠传输
D. 拥塞控制
答案:D
3、共享式以太网的媒体接入控制协议和802.11局域网的媒体接入控制协议分别是
A. CSMA/CD, CSMA/CA
B. CSMA/CD, CDMA
C. CSMA/CA, CDMA
D. CSMA/CA, Wi-Fi
答案:A
4、下列属于数据链路层的互连设备是
A. 集线器
B. 网桥和交换机
C. 路由器
D. 网关
答案:B
二、封装成帧
封装成帧
封装成帧是指数据链路层给上层交付的协议数据单元添加帧头和帧尾使之成为帧,帧头和帧尾中包含有重要的控制信息。一些帧的格式如下所示:
发送方的数据链路层将上层交付下来的协议数据单元封装成帧后,还要通过物理层将构成帧的各比特转换成电信号发送到传输媒体。
帧定界
问题: 接收方的数据链路层如何从物理层交付的比特流中提取出一个个的帧?
答案: 帧头和帧尾的作用之一就是帧定界。假设发送的是PPP帧,帧首和帧尾分别由1个字节的标志位,用来对帧定界,对应于比特流中红色的部分。于是就可以根据帧定界标志提取一个又一个的帧。
一些说明
需要说明的是,并不是每一种数据链路层协议的帧都包含有帧定界标志。例如,这是以太网版本2的MAC帧格式,在其帧头和帧尾中并没有包含帧定界标志。那么,接收方又是如何从物理层交付的比特流中提取出一个个帧的呢?
答案: 实际上,以太网的数据链路层封装好MAC帧后将其交给物理层。物理层会在MAC帧前面添加8字节的前导码,然后再将比特流转换成电信号发送。前导码中的前7个字节为前同步码,作用是使接收方的时钟同步。之后的1字节为帧开始定界符,表明其后面紧跟着的就是MAC帧,因此不需要帧开始定界符。
另外,以太网还规定了帧间间隔时间为96比特的发送时间。因此,MAC帧并不需要帧结束定界符。需要说明的是,帧间间隔还有其他作用,在后面学习过程中再详细介绍。
透明传输
透明传输是指数据链路层对上层交付的传输数据没有任何限制,就好像数据链路层不存在一样。
思考:帧定界符其实就是一个特殊的数值,如果在上层交付的协议数据单元中恰好也包含了这个特定数值,接收方还能正确接收该帧吗?
答案:不能。如下图所示,接收方在收到第一个帧定界标志时,认为这是帧的开始,这并没有错误。当接收方再次接收到帧定界标志时,会误认为帧结束了。如果数据链路层不采取其他措施来避免接收方对帧是否结束的误判,就不能称为透明传输。也就是说,数据链路层对上层交付的协议数据单元有限制,其内容不能包含帧定界符。
问题:很显然,这样的数据链路层没有什么使用价值。实际上,各种数据链路层协议会想办法来解决这个问题。例如,在发送帧之前对帧的数据部分进行扫描,每出现一个帧定界符,就在其前面插入一个转义字符。接收方数据链路层在物理层交付的比特流中提取帧,遇到第一个帧定界符时,认为这是帧的开始。当遇到转义字符时就知道,其后面的1字节内容虽然与帧定界符相同,但它是数据而不是定界符,剔除转义字符后将其后面的内容作为数据继续提取。
问题:若在上层交付给数据链路层的协议数据单元中,即包含了帧定界符,又包含了转义字符,应该怎样处理呢?
答案:方法仍然是在发送帧之前对帧的数据部分进行扫描。每出现一个帧定界符或转义字符,就在其前面插入一个转义字符。需要说明的是,转义字符是一种特殊的控制字符,其长度为1个字节,十进制值为27,而并不是ESC这3个字符。
面向比特的物理链路
我们刚刚介绍的是面向字节的物理链路,使用字节填充(或称字符填充)的方法来实现透明传输。面向比特的物理链路使用比特填充的方法实现透明传输。例如,下图是某个点对点协议的帧首、数据部分、帧尾部。为了简单起见,在帧首和帧尾仅给出了帧定界标志,而未给出其他控制字段。而帧的数据部分出现了两个帧定界标志,但它们实际上是数据而不是帧定界。
在发送前,可以采用零比特填充法对数据部分进行扫描。每5个连续的比特1后面就插入1个比特0。这样就确保了帧定界在整个帧中的唯一性,也就可以实现透明传输。
接收方的数据链路层从物理层交付的比特流中提取帧时,将帧的数据部分中的每个连续的比特1后面的那个比特0剔除即可。
例题
【2013年题37】HDLC协议对0111110001111110组帧后对应的比特串为 (A)
A. 011111000011111010
B. 011111000111110101111110
C. 01111100011111010
D. 011111000111111001111101
解析:高级数据链路控制协议HDLC采用帧头和帧尾中的标志字段作为帧定界符,其值为01111110。HDLC为了实现透明传输,采用零比特填充法(每5个连续1后面插入一个比特0)。
注意
为了提高帧的传输效率,应当使帧的数据部分的长度尽可能大些,应远大于帧首帧尾的长度。考虑到差错控制等多种因素,每一种数据链路层协议都规定了帧的数据部分的长度上限,即最大传送单元MTU(Maximum Transfer Unit) 。
小测验
1、某个数据链路层协议使用下列字符编码:
字符A的编码为01000111
字符B的编码为11100011
字符ESC的编码为11100000
字符FLAG的编码为01111110
使用字符FLAG作为帧定界符,字符ESC作为转义字符。现在要对待传输的4个字符A、B、ESC、FLAG封装成帧。若物理链路是面向字符的,则封装出的帧的二进制位序列是
A. 11100000 01000111 11100011 11100000 01111110 11100000
B. 01111110 01000111 11100011 11100000 01111110 01111110
C. 01111110 01000111 11100011 11100000 11100000 11100000 01111110 01111110
D. 11100000 01000111 11100011 11100000 11100000 11100000 01111110 11100000
答案:C
解析:封装出的帧的结构为:FLAG(帧头的帧定界符)、A(数据)、B(数据)、ESC(转义)、ESC(数据)、ESC(转义)、FLAG(数据)、FLAG(帧尾的帧定界符)。拼接起来就是答案C。
2、某个数据链路层协议使用下列字符编码:
字符A的编码为01000111
字符B的编码为11100011
字符ESC的编码为11100000
字符FLAG的编码为01111110
使用字符FLAG作为帧定界符,字符ESC作为转义字符。现在要对待传输的4个字符A、B、ESC、FLAG封装成帧。若物理链路是面向比特的,则封装出的帧的二进制位序列是
A. 11100000 01000111 11100011 11100000 01111110 11100000
B. 01111110 01000111 11100011 11100000 01111110 01111110
C. 11100000 01000111 110100011 111000000 011111010 11100000
D. 01111110 01000111 110100011 111000000 011111010 01111110
答案:D
解析:封装出的帧结构为:FLAG(帧头的帧定界符)、A(数据)、B(数据)、ESC(数据)、FLAG(数据)、FLAG(帧尾的帧定界符)。同时,在数据中,每5个1插入1个0,所以结果为:01111110 01000111 110100011 111000000 011111010 01111110,其中红色的1就是数据中插入的1。
三、差错检测
概念
实际的通信链路都不是理想的,比特在传输过程中可能会产生差错:1可能会变成0,而0也可能变成1,这称为比特差错。
在一段时间内,传输错误的比特占所传输比特总数的比率称为误码率BER(Bit Error Rate)。使用差错检测码来检测数据在传输过程中是否产生了比特差错,是数据链路层所要解决的重要问题之一。
例如,这是以太网版本2的MAC帧格式,其帧尾中包含了一个长度为4字节的帧检验序列FCS字段,其作用就是让接收方的数据链路层检查帧在传输过程中是产生了误码。
这是点对点协议PPP的帧格式,其帧尾中也包含了一个长度为两字节的帧检验序列FCS字段,其作用也是让接收方的数据链路层检查帧在传输过程中是产生了误码。
接下来我们看看一些检错方法。
奇偶校验法
在待发送的数据后面添加1位奇偶校验位,使整个数据(包括所添加的校验位在内)中1的个数为奇数(奇校验)或偶数(偶校验)。
如果有奇数个位发生误码,则奇偶性发生变化,可以检查出误码。如果有偶数个位发生误码,则奇偶性不发生变化,这是因为每个误码对奇偶性的影响相抵消了,就不能检查出误码(漏检)
循环冗余校验CRC(Cyclic Redundancy Check)
由于奇偶校验的漏检率较高,因此一般不采用这种检测方法。循环冗余校验CRC是一种具有很强检错能力的检错方法,漏检率极低。
----收发双方约定好一个生成多项式G(x)
----发送方基于待发送的数据和生成多项式计算出差错检测码(冗余码),将其添加到待传输数据的后面一起传输
----接收方通过生成多项式来计算收到的数据是否产生了误码;
发送方: 使用除法去来计算冗余码。待发送的数据作为被除数的一部分,后面添加生成多项式最高次个0构成被除数。生成多项式各项系数构成的比特串作为除数。进行除法,得到商和余数,余数就是所计算出的冗余码,将其添加到待发送数据的后面一起发送。注意:冗余码的长度与生成多项式最高次数相同,而商仅作为标记,防止计算过程中对错位。
接收方: 也是做除法。被除数就是接收到的数据,除数仍是生成多项式各项系数构成的比特串。进行除法,得到商和余数。如果余数为0。可判定传输过程没有产生误码。否则,可判定传输过程产生了误码。
举例
假设我们有下面这个生成多项式 G ( x ) = x 4 + x 2 + x + 1 G(x)=x^4+x^2+x+1 G(x)=x4+x2+x+1,写出其完整形式,就可以得到做除法的除数。
常用的生成多项式
值得注意的是,CRC算法要求生成多项式必须包含最低次项。
练习
待发送的信息为101001,生成多项式为 G ( x ) = x 3 + x 2 + 1 G(x)=x^3+x^2+1 G(x)=x3+x2+1,计算余数。
解析:
①构造被除数
待发送信息后面添加生成多项式最高次数个0,即被除数就是101001000
②构造除数
生成多项式各项系数构成的比特串,即除数就是1101
③做除法
----将1101与被除数的最高4位做亦或,结果为111,是3位,不够下一轮除法,于是被除数落一个0下来
----将1101与1110做亦或,结果是11,是2位,不够下一轮除法,于是被除数落一个1和一个0下来
----将1101与1110做亦或,结果是11,是2位,不够下一轮除法,于是被除数落一个0和一个0下来
----将1101与1100做亦或,结果是1,是1位,被除数已经没有落的了,于是这个1就是余数
④检查余数
余数的位数应与生成多项式最高次数相同,如果位数不够,则在余数前补0来凑足位数。这里生成多项式最高次数为3,所以余数为001
⑤最终结果
将余数添加到发送数据后面即可,结果是101001001
练习
接收到的信息为101101001,生成多项式为 G ( x ) = x 3 + x 2 + 1 G(x)=x^3+x^2+1 G(x)=x3+x2+1,判断传输是否误码。
①构造被除数
接收到的信息就是被除数,即101101001
②构造除数
生成多项式各项系数构成的比特串,即1101
③做除法
④检查余数
余数为0,可认为传输过程无误码。余数不为0,可认为传输过程产生误码。这里余数为11,代表产生误码。
说明
①检错码只能检测出帧在传输过程中出现了差错,但并不能定位错误,因此无法纠正错误。
②要想纠正传输中的差错,可以使用冗余信息更多的纠错码进行前向纠错。但纠错码的开销比较大,在计算机网络中较少使用。
③循环冗余校验CRC有很好的检错能力(漏检率非常低),虽然计算比较复杂,但非常易于用硬件实现,因此被广泛应用于数据链路层。
④在计算机网络中通常采用我们后续课程中将要讨论的检错重传方式来纠正传输中的差错,或者仅仅是丢弃检测到差错的帧,这取决于数据链路层向其上层提供的是可靠传输服务还是不可靠传输服务。
小测验
1、下列属于奇偶校验码特征的是
A. 只能检查出奇数个比特出现误码的情况
B. 只能检查出偶数个比特出现误码的情况
C. 能检查出任意数量个比特出现误码的情况
D. 漏检率比CRC低
答案:A
2、要发送的数据为101110。采用CRC的生成多项式为。则应添在数据后面的余数是
A. 1001
B. 011
C. 111
D. 11
答案:B
四、可靠传输
4.1 可靠传输的基本概念
前面我们知道通过差错检测技术接收方的数据链路层可以检测出帧在传输过程中是否出现了误码。
那么,检测出来之后该怎么做呢?
这取决于数据链路层向上层提供的服务类型
①不可靠传输服务:仅仅丢弃有误码的帧,其他什么也不做
②可靠传输服务:想办法实现发送端发送什么,接收端就收到什么。例如,接收方可以给发送方发送一个通知帧,告诉它
之前发送的帧产生了误码,请重发。发送发收到通知帧后重发产生误码的那个帧即可。
问题:实际上,可靠传输并没有我们想象的这么简单。试想一下,这个通知帧如果也出现了误码,又会怎么样呢?
答:
①一般情况下,有线链路的误码率比较低,为了减小开销,并不要求数据链路层向上提供可靠传输服务。即使出现了误码,可靠传输的问题由其上层处理。
②无线链路易受干扰,误码率比较高,因此要求数据链路层必须向上层提供可靠传输服务。
各种差错
比特差错只是传输差错中的一种。从整个计算机网络体系结构来看,传输差错还包括分组丢失、分组失序以及分组重复(注意,这里我们将帧的称呼改成了分组,这意味着传输差错不仅局限于数据链路层的比特差错)。
①分组丢失
主机H6给主机H2发送的分组到达了路由器R5,由于此时R5的输入队列快满了,R5根据自己的分组丢弃策略将该分组丢弃,这是一种分组丢失的情况。
②分组失序
主机H6依次给主机H2发送了3个分组,但它们并未按照发送顺序依次到达H2。也就是说,最先发送的分组未必最先到达。
③分组重复
主机H6给主机H2发送的分组由于某些原因在网络中滞留了,没有及时到达H2,这可能造成H6对该分组的超时重发。重发的分组到达H2,—段时间后滞留在网络中的那个分组又到达了H2。
可靠传输/不可靠传输的实际案例
分组丢失、分组失序以及分组重复这些传输差错,一般不会出现在数据链路层,而会出现在其上层。可靠传输服务并不仅局限于数据链路层,其他各层均可选择实现可靠传输。例如,下面是TCP/IP的四层体系结构,各层的一些协议提供的服务如下:
可靠传输的实现比较复杂,开销也比较大,是否使用可靠传输取决于应用需求。
4.2 可靠传输的实现 — 停止-等待协议SW(Stop-and-Wait)
基于确认否认的一般情况
如图所示,收发双方基于互联网进行通信,而不是局限在一条点对点的数据链路,纵坐标为时间。
发送方给接收方发送数据分组。
接收方收到后对复其进行差错检测。若没有误码,则接受该分组,并给发送方发送确认分组,简称为ACK。
发送方收到对发送数据分组的确认分组后,才能发送下一个分组。假设这个数据分组在传输过程中出现了误码
接收方收到后对其进行差错检测。检测出错误,于是丢弃该分组,并给发送方发送否认分组,简称为NAK。
发送方收到对所发送数据分组的否认分组后,就知道自己之前发的数据分组出现了差错而被接收方拒绝,于是立刻重传该数据分组。
因此。发送方每发送完一个数据分组后,并不能立刻将该数据分组从缓存中删除,只有在收到该数据分组的确认分组后才能将其从缓存中删除。
总结:看来,发送方每发送完一个数据分组后,就停止发送下一个数据分组,等待来自接收方的确认分组或否认分组。若收到确认分组,则发送下一个数据分组。若收到否认分组,则重传这个数据分组。这样就实现了发送方发送什么接收方就收到什么,即可靠传输。但是实际情况远比我们想的要复杂,具体来看下面这种情况。
数据分组丢失的情况
发送方给接收方发送数据分组,然而该数据分组在传输过程中丢失了。
需要说明的是,对于数据链路层点对点信道而言,不太容易出现这种情况。但对于多个网络通过多个路由器互连的复杂互联网环境而言,这种情况是会经常出现的。对于这种情况:
①接收方收不到数据分组,就不会发送ACK或NAK。如果不采取其他措施,发送方就会一直处于等待接收方ACK或NAK的状态。
②为解决该问题,可以在发送方发送完一个数据分组时,启动一个超时计时器。若到了超时计时器所设置的重传时间而发送方仍收不到接收方的任何ACK或NAK,则重传原来的数据分组,这就叫做超时重传。
③一般可将重传时间选为略大于从发送方到接收方的平均往返时间。
如图所示,发送方超时重传之前所发送的数据分组。
接收方正确接收重传的数据分组后,给发送方发送确认分组。
发送方收到确认分组后,发送下一个数据分组。
接收方收到正确分组后,给发送方发送确认分组
到目前为止,貌似基于停止等待、使用确认或否认分组、再加上超时重传的手段就可以实现可靠传输了。但是仍会础现目前这些手段不足以应对实现可靠传输的其他情况,具体如下面所示。
确认/否认分组丢失的情况
既然发送方发送的数据分组可能丢失,那么接收方发送的确认或否认分组就也有可能丢失。例如,发送方发送了一个数据分组。
接收方收到该分组后检查没错,给发送方发送确认分组,但是该分组在传输过程中丢失了。
这必然会造成发送方对之前所发送数据分组的超时重传。假设这个重传的数据分组正确到达了接收方。
那么问题来了,接收方如何判断该数据分组是否是一个重复的分组呢?为避免分组重复这种传输错误,必须给每个分组带上序号。例如,该数据分组的序号为0。对于停止-等待协议,由于每发送一个数据分组就停止等待,只要保证每发送一个新的数据分组,其发送序号与上次发送的数据分组的序号不同就可以了,因此用一个比特来编号就够了。
这样,接收方就可判断出该数据分组是否是重复的。接收方丢弃重复的数据分组,并给发送方发送针对该数据分组的确认分组,以免发送方对该数据分组的再次超时重传。
发送方收到针对0号数据分组的确认分组,就可以发送下一个数据分组了,其序号为1。
接收方正确接收到1号数据分组后,给发送方发送确认分组。
总结:我们通过确认分组丢失的情况,引了给数据分组编号的问题。这里就有一个问题:既然数据分组需要编号,那么确认分组是否需要编号?来看下面这种情况
确认/否认分组迟到的情况
发送方发送0号数据分组给接收方
接收方收到后检查没错,于是发送确认分组。但是由于某些原因,导致该确认分组迟到了。
这必然会导致发送方对0号数据分组的超时重传。在超时重传过程中,发送方收到了迟到的确认分组,于是发送数据分组1
接收方收到重传的0号数据分组后,发现是重复的数据分组,将其丢弃,并针对该分组给发送方发送确认分组,以免发送方再次超时重传数据分组0
现在我们可以看到,这是一个对0号数据分组的重复确认,但是发送发又如何知道呢?如果不采取其他措施,发送方会误认为这是对1号数据分组的确认。
如果对确认分组也编号,就可以避免发送方对确认分组的误判。如图所示,该确认分组序号为0,发送方通过确认分组序号知道这是个重复的确认分组,忽略即可。接收方收到1号数据分组后,确认没错后发送确认分组,其序号为1。
发送方收到该确认分组后,发送下一个数据分组,序号为0。请注意,该数据分组和之前序号为0的那个数据分组不是同一个数据分组。我们用给确认分组编号的方法解决了确认迟到所导致的重复确认的问题
需要说明的是,对于数据链路的点对点信号,往返时间比较固定,不会出现确认迟到的情况。因此,如果只是在数据链路层实现停止-等待协议,可以不用给确认分组编号。
注意事项
①接收端检测到数据分组有误码时,将其丢弃并等待发送方的超时重传。但对于误码率较高的点对点链路,为使发送方尽早重传,也可给发送方发送NAK分组。
②为了让接收方能够判断所收到的数据分组是否是重复的,需要给数据分组编号。由于停止-等待协议的停等特性,只需1个比特编号就够了,即编号0和1。
③为了让发送方能够判断所收到的ACK分组是否是重复的,需要给ACK分组编号,所用比特数量与数据分组编号所用比特数量一样。数据链路层一般不会出现ACK分组迟到的情况,因此在数据链路层实现停止-等待协议可以不用给ACK分组编号。
④超时计时器设置的重传时间应仔细选择。一般可将重传时间选为略大于从发送方到接收方的平均往返时间。
------在数据链路层点对点的往返时间比较确定,重传时间比较好设定。
------然而在运输层,由于端到端往返时间非常不确定,设置合适的重传时间有时并不容易。
停止-等待协议的信道利用率
如图所示,横坐标是时间,假设收发双方之间是一条直通的信道。发送方发送完一个数据分组后就停止发送,并等待接收方对该数据分组的确认。当收到确认分组后,可以发送下一个分组,如此反复进行。
发送方发送数据分组所耗费的发送时间我们设为 T D T_D TD。收发双方之间的往返时间我们设为RTT。接收方发送确认分组所耗费的发送时我们设为 T A T_A TA。图中忽略了接收方对数据分组的处理时延以及发送方对确认分组的处理时延。使用停止等待协议的发送方从发送一个数据分组开始到可以发送下一个数据分组为止所经历的总时间就是: T D + R T T + T A T_D+RTT+T_A TD+RTT+TA。由于只有 T D T_D TD的时间是在传输数据分组,因此信道利用率 U = T A / ( T D + R T T + T A ) U = T_A / (T_D+RTT+T_A) U=TA/(TD+RTT+TA)。其中, T A T_A TA一般远小于 T D T_D TD,可以忽略。当RTT远大于T_D时。信道利用率会常低
举例: 假设信道长度2000km,数据分组长度1500B,发送速率10Mbit/s.(忽略 T A T_A TA,因为 T A T_A TA一般都远小于 T D T_D TD)
若提高发送速率到100Mb/s
总结:
①当往返时延RTT远大于数据帧发送时延 T D T_D TD时(例如使用卫星链路),信道利用率非常低。
②若出现重传,则对于传送有用的数据信息来说,信道利用率还要降低。
③为了克服停止-等待协议信道利用率很低的缺点,就产生了另外两种协议,即后退N帧协议GBN和选择重传协议SR。
例题
【2018年题36】主机甲采用停-等协议向主机乙发送数据,数据传输速率使3kbps,单向传播延时是200ms,忽略确认帧的传输延时。当信道利用率等于40%时,数据帧的长度为 (D)
A. 240比特
B. 400比特
C. 480比特
D. 800比特
解析:
像停止-等待协议这种通过确认和重传机制实现的可靠传输协议,常称为自动请求重传协议ARQ(Automatic Repeat reQuest)。意思是重传的请求是自动进行的,因为不需要接收方显式地请求发送方重传某个出错的分组。
小测验
1、在停止-等待协议中,当发送端所发送的数据帧出现丢失时,由于接收端收不到数据帧,也就不会给发送端发回相应的确认帧,则发送端会永远等待下去,解决这种死锁现象的办法是
A. 检错码
B. 帧编号
C. NAK机制
D. 超时重传
答案:D
2、在停止-等待协议中,为了让接收方能够判断所收到的数据分组是否是重复的,采用的方法是
A. 帧编号
B. 检错码
C. 重传计时器
D. ACK机制
答案:A
3、主机甲采用停止-等待协议向主机乙发送数据,数据传输速率是6kbps,单向传播时延是100ms,忽略确认帧的传输延时。当信道利用率等于40%时,数据帧的长度为
A. 240比特
B. 320比特
C. 600比特
D. 800比特
答案:D
4.3 可靠传输的实现 — 回退N帧协议GBN(Go-Back-N)
流水线式的传输
对于停止-等待协议,发送方每发送一个数据分组后,就需要停止发送并等待接收方的确认分组,收到确认分组后才能继续发送下一个数据分组。这导致数据链路的信道利用率很低,尤其是往返时间很长的卫星链路,当出现超时重传时,信道利用率更低。
如果发送方在收到接收方的确认分组之前,可以发送多个数据分组,则可大大提高信道利用率。这是一种流水线式的传输,就本例而言,同等条件下,在相同时间内,使用停止-等待协议的发送方只能发送一个分组,而采用流水线的发送方可以发送五个分组。
回退N帧协议
回退N帧协议在流水线传输的基础上,利用发送窗口来限制发送方回连续发送数据分组的个数。
例子:假设采用3个比特给分组编序号,序号范围就是0-7。 当序号增加到7时,下一个序号又从0开始。收发双方的序号如下:
发送方要维持一个发送窗口,序号落在发送窗口内的数据分组可被连续发送,而不必等收到接收方的相应确认分组后再发送。发送窗口的尺寸记为 W T \rm{W_T} WT,对于本例,其取值范围是 1 ≤ W T ≤ 2 3 − 1 \rm{1 \le {W_T} \le {{\rm{2}}^{\rm{3}}}{\rm{ - 1}}} 1≤WT≤23−1,其中的 3 3 3 是构成分组序号的比特数量,我们取 W T \rm{W_T} WT 为 5 5 5。如果 W T \rm{W_T} WT 的值取为 1 1 1,则是停止等待协议。如果 W T \rm{W_T} WT 的值超时取值范围的上限,则会造成严重错误,后续进行详细讲解。如下图所示,序号落在发送窗口内的这 5 5 5 个数据分组可以连续发送,而序号落在发送窗口外的数据分组不允许发送。
接收窗口的尺寸可记为 W R \rm{W_R} WR,对于回退N帧协议,其取值只能为 1 1 1,这一点与停止-等待协议是相同的。如图所示,序号落在接收窗口内的这个数据分组允许接收,而序号落在接收窗口外的数据分组不允许接收。
无差错情况
无差错传输情况全过程如下图所示:
①发送方将序号落在发送窗口内的 0 − 4 0-4 0−4 号数据分组依次连续发送出去,它们经过互联网的传输,正确到达了接收方,也就是没有出现乱序和误码。
②接收方按序接收它们,每接收一个接收窗口就向前滑动一个位置,并给发送方发送针对所接收分组的确认分组。
③ 0 − 4 0-4 0−4 号确认分组经过互联网的传输确到达了发送方。发送方每接收一个,发送窗口就向前滑动一个位置,这样就有新的序号落入了发送窗口。
④发送方可以将收到确认的数据分组从缓存中删除了,而接收方可以择机将已接收的数据分组交付上层处理。
累积确认
使用回退N帧协议的接收方可以使用累积确认方式。也就是说,接收方不一定要对收到的数据分组逐个发送确认,而是可以在收到几个数据分组后(由具体实现决定)对按序到达的最后一个数据分组发送确认。 A C K n \rm{ACK_n} ACKn 表示序号为 n \rm{n} n 及以前的所有数据分组都已正确接收。累积确认情况全过程如下图所示:
①发送方将序号落在发送窗口内的 0 − 4 0-4 0−4 号数据分组依次连续发送出去,它们经过互联网的传输正确到达了接收方。
②接收方按序接收它们,当接收完 0 0 0 号和 1 1 1 号数据分组后,给发送方发送了—个累积确认 A C K 1 \rm{ACK_1} ACK1。
③当接收完 2 − 4 2-4 2−4 号数据分组后,又给发送方发送了—个累积确认 A C K 4 \rm{ACK_4} ACK4。
④设 A C K 1 \rm{ACK_1} ACK1 在传输过程中丢失了,而 A C K 4 \rm{ACK_4} ACK4 正确到达了发送方。发送方接收 A C K 4 \rm{ACK_4} ACK4 后就知道了,序号为 4 4 4 及之前的数据分组已被接收方正确接收了,于是将发送窗口向前滑动 5 5 5 个位置,这样就有新的序号落入了发送窗口。
⑤发送方可以将收到确认的数据分组从缓存中删除了,而接收方可以择机将已接收的数据分组交付上层处理。
从本例可以看出,使用累积确认的
一些优点:即使确认分组丢失,发送方也可能不必重传!此外,还可以减小接收方的开销、减少对网络资源的占用。
一些缺点:不能向发送方及时反映出接收方已经正确接收的数据分组信息。
有差错情况
有差错传输情况全过程如下图所示:
①发送方将序号落在发送窗口内的这 5 5 5 个数据分组依次连续发送出去,它们经过互联网的传输到达了接收方。
②假设它们在传输过程中受到了干扰,其中 5 5 5 号数据分组出现了误码。
③接收方通过数据分组中的检错码发现了错误,于是丢弃该数据分组。而后续到达的这 4 4 4 个数据分组的序号与接收窗口中的序号不匹配。接收方同样也不能接受它们,将它们丢弃,并对之前按序接收的最后一个数据分组进行确认,也就是发送 A C K 4 \rm{ACK_4} ACK4。每丢弃一个数据分组,就发送一个 A C K 4 \rm{ACK_4} ACK4。
④这 4 4 4 个 A C K 4 \rm{ACK_4} ACK4 经过互联网的传输到达了接收方,发送方之前就接收过 A C K 4 \rm{ACK4} ACK4。发送方收到重复的确认,就知道之前所发送的数据分组出现了差错,于是可以不等超时计时器超时就立刻重传!至于收到几个重复确认就立刻重传,由具体实现决定。
⑤在本例中,假设收到这 4 4 4 个重复的确认并不会触发发送方立刻重传。一段时间后,超时计时器出现超时,发送方将发送窗口内已发送过的这些数据分组全部重传。
总结: 在本例中,尽管序号为 6 、 7 、 0 、 1 6、7、0、1 6、7、0、1 的数据分组正确到达接收方。但由于 5 5 5 号数据分组误码不被接受,它们也受到牵连而不被接受,发送方还要重传这些数据分组,这就是所谓的Go-back-N(回退N帧)。可见,当通信线路质量不好时,回退N帧协议的信道利用率并不比停止-等待协议高。
W T \rm{W_T} WT超过取值范围
W T \rm{W_T} WT超过取值范围情况全过程如下图所示:
①假设我们这里将 W T \rm{W_T} WT 取值为 8 8 8,发送方将序号落在发送窗口内的 0 − 7 0-7 0−7 号这 8 8 8 个数据分组依次连续发送出去,它们经过互联网的传输正确到达了接收方。
②接收方按序接收它们后,给发送方发回累积确认 A C K 7 \rm{ACK_7} ACK7。
③假设 A C K 7 \rm{ACK_7} ACK7 在传输过程中丢失了,这将导致发送方的超时重传。
④重传的 0 − 7 0-7 0−7 号数据分组到达接收方。
现在问题来了:接收方根据当前接收窗口内的序号,会对 8 8 8 个数据分组按序接收。但是,接收方之前已经接收过这 8 8 8 个数据分组了,现在是在重复接收。也就是说,接收方无法分辨新、旧分组,进而会产生分组重复这种传输差错。因此,发送窗口的尺寸不能超过其上限。
小结
发送方:
①发送窗口尺寸 W T \rm{W_T} WT 的取值范围是 1 ≤ W T ≤ 2 n − 1 \rm{1 \le {W_T} \le {{\rm{2}}^{\rm{n}}}{\rm{ - 1}}} 1≤WT≤2n−1。其中, n n n 是构成分组序号的比特数量。 W T = 1 \rm{W_T=1} WT=1,代表和停止-等待协议一样。 W T > 2 n − 1 \rm{W_T>2^n -1} WT>2n−1 时,接收方无法分辨新、旧数据分组。
②发送方可在未收到接收方确认分组的情况下,将序号落在发送窗口内的多个数据分组全部发送出去
③发送方只有收到对已发送数据分组的确认时,发送窗口才能向前相应滑动;
④发送方收到多个重复确认时,可在重传计时器超时前尽早开始重传,由具体实现决定。
⑤发送方发送窗口内某个已发送的数据分组产生超时重发时,其后续在发送窗口内且已发送的数据分组也必须全部重传,这就是回退N帧协议名称的由来。
接收方:
①接收方的接收窗口尺寸 W R \rm{W_R} WR 的取值范围是 W R = 1 \rm{W_R=1} WR=1,因此接收方只能按序接收数据分组。
②接收方只接收序号落在接收窗口内且无误码的数据分组,并且将接收窗口向前滑动一个位置,与此同时给发送方发回相应的确认分组。为了减少开销,接收方不一定每收到一个按序到达且无误码的数据分组就给发送方发回一个确认分组
----而是可以在连续收到好几个按序到达且无误码的数据分组后(由具体实现决定),才针对最后一个数据分组发送确认分组,这称为累积确认
----或者可以在自己有数据分组要发送时才对之前按序接收且无误码的数据分组进行捎带确认
③接收方收到未按序到达的数据分组,除丢弃外,还要对最近按序接收的数据分组进行确认
回退N帧协议:
①回退N帧协议在流水线传输的基础上利用发送窗口来限制发送方连续发送数据分组的数量,是一种连续ARQ协议。
②在协议的工作过程中发送窗口和接收窗口不断向前滑动,因此这类协议又称为滑动窗口协议。
③由于回退N帧协议的特性,当通信线路质量不好时,其信道利用率并不比停止-等待协议高。
例题
【2009年题35】数据链路层使用后退N帧(GBN)协议,发送方已经发送了编号为0~7的帧。当计时器超时时,若发送方只收到0、2、3号帧的确认,则发送方需要重发的帧数是 ( C )
A. 2
B. 3
C. 4
D. 5
解析:
①发送方只收到0、2、3号帧的确认,表明接收方正确接收了0~3号帧,并针对它们中的每一个发送了确认帧,只不过针对1号帧的确认帧丢失了(这是题目中的陷阱,但又没有相应的选项,所以迷惑性并不是很大)
②截止到计时器超时,发送方只收到了针对0 ~ 3号帧的确认,而发送方之前已经发送了0~7号帧,因此应该从4号帧开始重传,即重传之前已经发送过的4、5、6、7号帧,共计重传4个帧。
小测验
1、数据链路层采用回退N帧协议GBN,发送方已经发送了编号0~6的帧。计时器超时时,只收到了对1、2、4号帧的确认,发送方需要重传的帧的数目是
A. 1
B. 2
C. 5
D. 6
答案:B
2、数据链路层采用回退N帧协议GBN,帧编号由7个比特构成,则发送窗口的最大长度为
A. 7
B. 8
C. 127
D. 128
答案:C
3、数据链路层采用回退N帧协议GBN,如果发送窗口的大小是32,那么至少需要几个比特来给帧编号才能保证协议不出错
A. 4
B. 5
C. 6
D. 7
答案:C
4.4 可靠传输的实现 — 选择重传协议SR(Selective Request)
选择重传协议:
回退N帧协议的不足: 回退N帧协议的接收窗口尺寸 W R \rm{W_R} WR 只能等于 1 1 1,因此接收方只能按序接收正确到达的数据分组。一个数据分组的误码就会导致其后续多个数据分组不能被接收方按序接收而丢弃(尽管它们无乱序和误码)。这必然会造成发送方对这些数据分组的超时重传,显然这是对通信资源的极大浪费。
改进: 为了进一步提高性能,可设法只重传出现误码的数据分组。因此,接收窗口的尺寸 W R \rm{W_R} WR 不应再等于 1 1 1 (而应大于 1 1 1),以便接收方先收下失序到达但无误码并且序号落在接收窗口内的那些数据分组,等到所缺分组收齐后再一并送交上层。这就是选择重传协议。
注意: 选择重传协议为了使发送方仅重传出现差错的分组,接收方不能再采用累积确认,而需要对每个正确接收到的数据分组进行逐一确认!
具体工作流程:
例子:假设采用3个比特给分组编序号,序号范围就是0-7。 当序号增加到7时,下一个序号又从0开始。收发双方的序号如下:
发送方要维持一个发送窗口,序号落在发送窗口内的数据分组可被连续发送,而不必等收到接收方的相应确认分组后再发送。发送窗口的尺寸记为 W T \rm{W_T} WT,对于本例,其取值范围是 1 ≤ W T ≤ 2 3 − 1 \rm{1 \le {W_T} \le {{\rm{2}}^{\rm{3}}}{\rm{ - 1}}} 1≤WT≤23−1,其中的 3 3 3 是构成分组序号的比特数量,我们取 W T \rm{W_T} WT 为 4 4 4。接收窗口的尺寸可记为 W R \rm{W_R} WR,一般可以设置为与 W T \rm{W_T} WT 相等,我们这里也设置为 4 4 4。
具体工作流程:
发送方将序号落在发送窗口内的这4个数据分组依次连续发送出去。
它们经过互联网的传输陆续到达接收方,但其中的2号数据分组丢失了。
只要序号落入接收窗口内且无误码的数据分组,接收方都会接收。接收方接受0号和1号数据分组,并发送0号和1号确认分组,接收窗口向前滑动两个位置,这样就有4和5这两个新的序号落入接收窗口。
接收方接收3号数据分组,并发送3号确认分组,但接收窗口不能向前滑动,因为3号数据分组是未按序到达的数据分组。
这些确认分组经过互联网传输陆续到达发送方。
发送方每按序收到一个确认分组,发送窗口就向前滑动一个位置。发送方接收0号和1号确认分组,发送窗口向前滑动两个位置,这样就有4和5这两个新的序号落入发送窗口。
发送方将序号落入发送窗口的4号和5号数据分组发送出去,同时可以将已经收到确认的0号和1号数据分组从发送缓存中删除了。而接收方可以择机将已按序接收的0号和1号数据分组交付上层处理。
发送方接收3号确认分组,但发送窗口不能向前滑动,因为这是一个未按序到达的确认分组,发送方还未收到它之前的2号确认分组。不过,需要记录3号数据分组已收到确认,这样该数据分组就不会超时重发。
4号和5号数据分组到达接收方。
接收方接收它们,并发送4号和5号确认分组,但接收窗口不能向前滑动,因为它们是未按序到达的数据分组,接收方还未收到它们之前的2号数据分组。
假设在4号和5号确认分组的传输过程中,发送方针对2号数据分组的重传计时器超时了,发送方重传2号数据分组。
4号和5号确认分组陆续到达发送方。发送方接收它们,但发送窗口不能向前滑动,因为它们是未按序到达的确认分组,发送方还未收到它们之前的2号确认分组。不过,需要记录4号和5号数据分组已收到确认,这样该数据分组就不会超时重发。
发送方之前重传的2号数据分组到达接收方。接收方接收该分组,并发送2号确认分组。接收窗口现在可以向前滑动4个位置,这样就有6、7、0、1这四个新的序号落入接收窗口。
2号确认分组经过互联网的传输到达发送方。
发送方接收该数据分组,发送窗口现在可以向前滑动4个位置,这样就有6、7、0、1这四个新的序号落入发送窗口。发送方现在就可以继续将这四个序号的数据分组依次发送出去了,同时发送和接收双方可以清除前面的数据分组缓存。
发送/接收窗口的尺寸
发送方:
发送方的发送窗口尺寸 W T W_T WT 必须满足: 1 < W T ≤ 2 ( n − 1 ) {\rm{1}} < {W_T} \le {2^{(n - 1)}} 1<WT≤2(n−1),其中 n n n 是构成分组序号的比特数量。
若 W T = 1 W_T=1 WT=1:与停止-等待协议相同
若 W T > 2 ( n − 1 ) {W_T} > {2^{(n - 1)}} WT>2(n−1):造成接收方无法分辨新、旧数据分组的问题
接收方:
接收方的接收窗口尺寸 W R W_R WR 必须满足: 1 < W R ≤ W T {\rm{1}} < {W_R} \le {W_T} 1<WR≤WT
若 W R = 1 W_R=1 WR=1:与回退N帧协议相同
若 W R > W T W_R>W_T WR>WT:无意义
W R W_R WR 与 W T W_T WT 超过取值范围的情况:
①我们还是采用 3 3 3 个比特给分组编号,即序号 0 − 7 0-7 0−7。
②发送窗口的尺寸 W R W_R WR 取最大值,则接收窗口的尺寸 W T W_T WT 的取值与 W R W_R WR 相同,即 W T = W R = 2 ( 3 − 1 ) = 4 {W_T} = {W_R} = {2^{(3 - 1)}} = 4 WT=WR=2(3−1)=4。
③假设我们故意将发送窗口尺寸 W T W_T WT 设置为 5 5 5,相应地将接收窗口尺寸 W R W_R WR 也设置为 5 5 5,看看会出现什么情况。
发送方将落入发送窗口的0~4号这五个数据分组依次发送出去。
它们经过互联网的传输依次到达接收方。
接收方接收它们,并发送0~4号确认分组,接收窗口向前滑动5个位置,这样就有5、6、7、0、1这五个新的序号落入接收窗口。
这些确认分组经过互联网的传输陆续到达发送方,但其中的0号确认分组丢失了。
发送方接收 1 − 4 1-4 1−4号确认分组,并记录 1 − 4 1-4 1−4号数据分组已收到确认。发送窗口不能向前移动。
一段时间后,0号数据分组的重传计时器超时了,发送方重传0号数据分组。
该数据分组经过互联网的传输到达接收方,其序号0落在接收窗口内。接收方会接收它,但是接收方先前已经正确接收过该数据分组了。如果现在还要接收,那就会出现分组重复这种传输差错。也就是说,如果发送窗口和接收窗口的尺寸超过了取值范围,就会使接收方无法分辨新、旧数据分组,进而出现分组重复这种传输差错。
总结
发送方:
①发送窗口尺寸,前面已经讲过,不再赘述
②发送方可在未收到接收方确认分组的情况下,将序号落在发送窗口内的多个数据分组全部发送出去;
③发送方只有按序收到对已发送数据分组的确认时,发送窗口才能向前相应滑动。若收到未按序到达的确认分组时,对其进行记录,以防止其相应数据分组的超时重发,但发送窗口不能向前滑动。
接收方:
①接收窗口尺寸,前面已经讲过,不再赘述
②接收方可接收未按序到达但没有误码并且序号落在接收窗口内的数据分组。为了使发送方仅重传出现差错的分组,接收方不能再采用累积确认,而需要对每个正确接收到的数据分组进行逐一确认!
③接收方只有在按序接收数据分组后,接收窗口才能向前相应滑动。
例题
【2011年题35】数据链路层采用选择重传协议(SR)传输数据,发送方已发送了0~3号数据帧,现已收到1号帧的确认,而0、2号帧依次超时,则此时需要重传的帧数是 (B)
A. 1
B. 2
C. 3
D. 4
解析:
①与回退N帧协议不同,选择重传协议不支持累积确认。接收方每接收一个数据帧,就会发回相应的确认帧。
②题目所给收到1号帧的确认,而0、2号帧依次超时,因此需要重传0、2号帧。至于发送方已发送的3号数据帧,题目并未给出它的任何其他线索,因此无须考虑3号帧。
小测验
1、数据链路层采用选择重传协议SR,帧编号由5个比特构成,则接收窗口的最大长度为
A. 15
B. 16
C. 31
D. 32
答案:B
2、数据链路层采用选择重传协议SR,帧编号由6个比特构成,则发送窗口的最大长度为
A. 32
B. 33
C. 64
D. 65
答案:A
3、以下哪些协议的接收方只能按序接收分组
I. 停止-等待协议 II. 回退N帧协议 III. 选择重传协议
A. I、II
B. I、III
C. II、III
D. 全部
答案:A