参考教程:3.1 数据链路层概述_哔哩哔哩_bilibili
一、数据链路层概述
1、数据链路层在网络体系结构中所处的地位
(1)各设备通过物理层下面的传输媒体进行互连。如下图所示,主机H1向H2发送数据:
①主机H1将待发送的数据逐层封装后,通过物理层将构成数据包的各比特转换为电信号发送到传输媒体。
②数据包进入路由器后由下往上逐层解封到网络层,接着路由器根据数据包的目的网络地址和自身转发表确定数据包的转发端口,然后从网络层向下逐层封装数据包并通过物理层将数据包发送到传输媒体。
③数据包最终到达主机H2时还要由下往上逐层解封,最终解封出主机H1所发送的数据。
(2)在研究数据链路层时,可以想象成数据包只在数据链路层从左向右沿水平方向传送。
(3)从数据链路层来看,主机H1到H2的通信可以看成是在4段不同的链路上的通信组成的(链路就是从一个节点到相邻节点的一段物理链路,中间没有任何其它的交换节点),要在链路上传输数据,仅有链路还不够,还需要一些通信协议来控制这些数据的传输,若把实现这些协议的硬件和软件加到链路上,就构成了数据链路。
(4)在数据链路层上传输的数据包又称为“帧”,也就是说数据链路层以帧为单位传输和处理数据。
2、使用点对点信道的数据链路层需要解决的问题
(1)封装成帧:
①如下图所示,两台主机通过一段链路互连,两台主机都会对所发送或接收的数据包进行五个层次的封装或解封,发送方将待发送的数据通过应用层封装为应用层协议数据单元,然后交付给运输层,运输层为其添加运输层协议首部,使之成为运输层协议数据单元,然后交付给网络层,网络层为其添加网络层协议首部,使之成为网络层协议数据单元,然后交付给数据链路层,数据链路层给网络层协议数据单元添加一个数据链路层协议首部(简称为帧头)和尾部(简称为帧尾),将数据链路层给网络层交付的协议数据单元添加帧头和帧尾的操作称为“封装成帧”。
②添加帧头和帧尾的目的都是为了在链路上以帧为单元来传送数据,也就是为了实现数据链路层本身的功能。
(2)差错检测:
①发送方将封装好的帧通过物理层发送到传输媒体,帧在传输过程中可能会遭遇干扰而出现误码,也就是比特0可能变成了比特1,反之亦然。
②发送方在发送帧之前,基于待发送的数据和检错算法计算出检错码,并将其封装在帧尾,接收方主机收到帧后,通过检错码和检错算法就可以判断出帧在传输过程中是否出现了误码。
(3)可靠传输:
①接收方主机收到有误码的帧后会将该帧丢弃。如果数据链路层向其上层提供的是不可靠服务,那么将该帧丢弃后不会有任何补救措施;如果数据链路层向其上层提供的是可靠服务,那么将该帧丢弃后会有其它措施来确保接收方主机还可以重新收到被丢弃帧的正确副本。
②尽管误码是不能完全避免的,但若能实现发送方发送什么接收方就能收到什么,就称为可靠传输。
3、使用广播信道的数据链路层需要解决的问题
(1)使用广播信道的数据链路层同样需要解决封装成帧、差错检测和可靠传输三个问题。
(2)主机编址:
①如下图所示,主机A要给主机C发送帧,这时代表帧的信号会通过总线传输到总线上的其它各主机,主机C如何知道该数据是自己应该接收的,主机B、D、E如何知道自己应该拒绝该数据,这就引出了如何标识网络中的各主机的问题,也就是主机编址问题。
②为了实现主机编址,主机A会将帧的目的地址(也就是主机C)添加在帧中一起传输。
(3)信号碰撞:
①当总线上多台主机同时使用总线来传输数据帧时,传输信号就会产生碰撞,这是采用广播信道的共享式局域网不可避免的问题,因此,如何协调各主机争用总线也是必须要解决的问题。以太网采用的协调方法是使用一种特殊的协议CSMA/CD(也就是载波监听多点接入/碰撞检测)。
②随着技术的发展,具有更高性能的、使用点对点链路和链路层交换机的交换式局域网在有线(局域网)领域已完全取代了共享式局域网,不过由于无线信道的广播天性,无线局域网仍然使用共享信道技术。对于交换式局域网,需要解决的问题是网络中的交换机如何转发数据帧。
二、封装成帧
1、帧头和帧尾
(1)封装成帧是指数据链路层给上层交付的协议数据单元添加帧头和帧尾使之成为帧,帧头和帧尾中包含有重要的控制信息。
(2)帧头和帧尾的作用之一是帧定界。发送方的数据链路层将上层交付下来的协议数据单元封装成帧后,还要通过物理层将构成帧的各比特转换成电信号发送到传输媒体,那么接收方的数据链路层是如何从物理层交付的比特流中提取出一个个的帧的?以PPP帧的格式为例,在其帧头和帧尾中各包含有一个长度为1字节的标志字段,其作用就是帧定界,假设发送方发送的是PPP帧,下图比特流中红色部分是帧定界标志,接收方的数据链路层可以依据帧定界标志从物理层交付的比特流中提取出一个个的帧。
(3)并不是每一种数据链路层协议的帧都包含有帧定界标志。例如以太网版本2的MAC帧格式,在其帧头和帧尾中就不包含有帧定界标志,以太网的数据链路层封装好MAC帧后将其交付给物理层,物理层会在MAC帧前面添加8字节的前导码,然后再将比特流转换成电信号发送,前导码的前七个字节为前同步码,作用是使接收方的时钟同步,之后的1字节为帧开始定界符,表明其后面紧跟着的就是MAC帧,另外,以太网还规定了帧间间隔时间为96比特的发送时间,因此MAC帧并不需要帧结束定界符(值得一提的是,帧间间隔还有其它作用)。
2、透明传输
(1)透明传输是指数据链路层对上层交付的传输数据没有任何限制,就好像数据链路层不存在一样。
(2)面向字节的物理链路使用字节填充(或称字符填充)的方法实现透明传输:
①对于发送方数据链路层收到其上层交付的协议数据单元,给其添加帧头和帧尾,使其成为帧,如果在上层交付的协议数据单元中恰好也包含了帧定界标志,接收方就不能正确接收该帧了,接收方在收到第一个帧定界标志时认为是帧的开始,但是当接收方再次接收到(在上层交付的协议数据单元中的)帧定界标志时会误认为帧结束。
②如果数据链路层不采取其它措施来避免接收方对帧是否结束的误判,就不能称为透明传输,也就是说数据链路层对上层交付的协议数据单元有限制,其内容不能包含帧定界符,很显然这样的数据链路层没有什么使用价值。
③实际上各种数据链路层协议一定会想办法来解决误判帧结束的问题,例如在发送帧之前对帧的数据部分进行扫描,每出现一个帧定界符就在其前面插入一个转义字符(转义字符是一种特殊的控制字符,其长度为1个字节),接收方数据链路层在物理层交付的比特流中提取帧,遇到第一个帧定界符时认为这是帧的开始,当遇到转义字符时就知道其后面的一字节虽然与帧定界符相同,但它是数据而不是定界符,剔除转义字符后将其后面的内容作为数据继续提取。
④如果在上层交付给数据链路层的协议数据单元中既包含了帧定界符,又包含了转义字符,那么在发送帧之前对帧的数据部分进行扫描时,每出现一个帧定界符或转义字符就在其前面插入一个转义字符,接收方数据链路层在物理层交付的比特流中提取帧,遇到第一个帧定界符时认为这是帧的开始,当遇到转义字符时就知道其后面的一字节虽然与帧定界符或转义字符相同,但它是数据而不是定界符或转义字符,剔除转义字符后将其后面的内容作为数据继续提取。
(3)面向比特的物理链路使用比特填充的方法实现透明传输:
①下图所示是某个点对点协议的帧,帧的数据部分出现了两个帧定界标志(本例中为0x7E,转换为二进制就是01111110),但它们实际上是数据而不是帧定界。
②在发送前可以采用零比特填充法对数据部分进行扫描,在本例中每5个连续的比特1后面就插入一个比特0,这样就能确保帧定界在整个帧中的唯一性,可以实现透明传输。接收方的数据链路层从物理层交付的比特流中提取帧时,将帧的数据部分中每5个连续的比特1后面的那个比特0剔除即可。
(4)仅从数据链路层来看,帧的数据部分才是真正要传输的数据,帧头和帧尾是为了实现数据链路层功能而额外添加的,所以为了提高帧的传输效率,应当使帧的数据部分长度远大于帧头和帧尾的长度。
(5)考虑到差错控制等多种因素,每一种数据链路层协议都规定了帧的数据部分的长度上限,即最大传送单元MTU(Maximum Transfer Uint)。
三、差错检测
1、比特差错
(1)实际的通信链路都不是理想的,比特在传输过程中可能会产生差错,1可能会变成0,而0也可能变成1,这称为比特差错。在一段时间内,传输错误的比特占所传输比特总数的比率称为误码率BER(Bit Error Rate)。
(2)使用差错检测码来检测数据在传输过程中是否产生了比特差错,是数据链路层所要解决的重要问题之一。
①以以太网版本2的MAC帧格式为例,其帧尾中包含了一个长度为4字节的帧检验序列FCS字段,其作用就是让接收方的数据链路层检查帧在传输过程中是否产生了误码。
②再如点对点协议PPP的帧格式,其帧尾中包含了一个长度为2字节的帧检验序列FCS字段,其作用也是让接收方的数据链路层检查帧在传输过程中是否产生了误码。
2、奇偶校验
(1)在待发送的数据后面添加1位奇偶校验位,使整个数据(包括所添加的校验位在内)中“1”的个数为奇数(奇校验)或偶数(偶校验)。
①假设收发双方约定采用奇校验,那么在数据“101101”后面添加的校验位应该为比特1,使得比特1的总数为奇数:
[1]假设传输过程中产生了1位误码(下图中用红色表示误码),接收方对收到的比特流进行奇校验,发现比特1的总数为偶数而不是奇数,就知道传输过程中发生了误码,换句话说,采用奇校验,若比特1的数量的奇偶性改变,可以检出错误。
[2]假设传输过程中产生了2位误码(下图中用红色表示误码),接收方对收到的比特流进行奇校验,发现比特1的总数为奇数,会误认为传输过程中没有发生误码,换句话说,采用奇校验,若比特1的数量的奇偶性不改变,是无法检出错误的。
②假设收发双方约定采用偶校验,那么在数据“101101”后面添加的校验位应该为比特0,使得比特1的总数为偶数:
[1]假设传输过程中产生了1位误码(下图中用红色表示误码),接收方对收到的比特流进行奇校验,发现比特1的总数为奇数而不是偶数,就知道传输过程中发生了误码,换句话说,采用奇校验,若比特1的数量的奇偶性改变,可以检出错误。
[2]假设传输过程中产生了2位误码(下图中用红色表示误码),接收方对收到的比特流进行奇校验,发现比特1的总数为偶数,会误认为传输过程中没有发生误码,换句话说,采用奇校验,若比特1的数量的奇偶性不改变,是无法检出错误的。
(2)如果有奇数个比特位发生误码,则奇偶性发生变化,可以检查出误码;如果有偶数个比特位发生误码,则奇偶性不发生变化,不能检出误码,这称为漏检。
(3)由于奇偶校验的漏检率比较高,因此计算机网络的数据链路层一般不会采用这种检测方法。
3、循环冗余校验(CRC,Cyclic Redundancy Check)
(1)收发双方约定好一个生成多项式G(x),发送方基于待发送的数据和生成多项式计算出差错检测码(冗余码),将其添加到待传输数据后面一起传输,接收方通过生成多项式计算收到的数据是否产生了误码。
(2)发送方的处理:
①待发送的数据作为被除数的一部分,后面添加生成多项式最高次个0(下面的生成多项式举例中生成多项式最高次个0为4个0)以构成被除数,生成多项式各项系数构成的比特串作为除数,进行除法运算,得到商和余数。
②余数就是所计算出的冗余码,将其添加到待发送数据的后面一起发送。
③冗余码的长度与生成多项式最高次数相同,商仅作为标记防止计算过程中对错位。
(3)接收方的处理:
①将接收到的数据作为被除数,除数仍是生成多项式各项系数构成的比特串,进行除法运算,得到商和余数。
②如果余数为0,可判定传输过程中没有产生误码;如果余数不为0,可判定传输过程中产生了误码。
(4)生成多项式的各项系数只能是0或1;CRC算法要求生成多项式必须包含最低次项。
(6)循环冗余校验CRC有很好的检错能力(漏检率非常低),虽然计算比较复杂,但非常易于用硬件实现,因此被广泛应用于数据链路层。
(7)检错码只能检测出帧在传输过程中是否出现差错,并不能定位错误,因此也无法纠正错误,要想纠正传输中的差错,可以使用冗余信息更多的纠错码进行前向纠错,但纠错码的开销比较大,在计算机网络中较少使用。
(8)在计算机网络中通常采用检错重传方式来纠正传输中的差错,或者仅仅是丢弃检测到差错的帧,这取决于数据链路层向其上层提供的是可靠传输服务还是不可靠传输服务。
四、可靠传输
1、可靠传输的基本概念
(1)使用差错检测技术,接收方的数据链路层就可检测出帧在传输过程中是否产生了误码。如果确实产生了误码,在计算机网络中通常采用检错重传方式来纠正传输中的差错,或者仅仅是丢弃检测到差错的帧,这取决于数据链路层向其上层提供的是可靠传输服务还是不可靠传输服务。
①不可靠传输服务:仅仅丢弃有误码的帧,不采取其它任何措施。
②可靠传输服务:实现发送端发送什么,接收端就接收什么。
(2)要实现想象中的可靠传输,接收方可以给发送方发送一个通知帧,告知发送方之前发送的帧产生了误码,并让发送方将该帧重发,不过实际上可靠传输的实现并没有这么简单,如果通知帧也出现了误码或丢失等问题,那依然不是可靠传输。
(3)一般情况下,有线链路的误码率比较低,为了减小开销,并不要求数据链路层向上提供可靠传输服务,即使出现了误码,可靠传输的问题也可由其上层处理;而无线链路易受干扰,误码率比较高,因此要求数据链路层必须向上层提供可靠传输服务。
(4)之前介绍的比特差错只是传输差错中的一种,从整个计算机网络体系结构来看,传输差错还包括分组丢失、分组失序以及分组重复(此处将帧的称呼改为了分组)。
①假如主机H6想给主机H5发送分组,发送过程中主机H6发送的分组到达路由器R5,如果此时R5的输入队列爆满,那么R5将根据自己的分组丢弃策略将该分组丢弃,这就会造成分组丢失的传输差错。
②假如主机H6依次给主机H2发送三个分组,但它们可能不会按照发送顺序依次到达H2,也就是说,最先发送的分组未必最先到达,这就会造成分组失序的传输差错。
③假如主机H6依次给主机H2发送分组,发送过程中主机H6发送的分组可能会因为某些原因在网络N10中滞留,因此没能及时到达H2,这可能造成H6对该分组的超时重发,重发的分组到达H2,接着滞留在网络N10的分组也到达了H2,这就会造成分组重复的传输差错。
(5)分组丢失、分组失序以及分组重复这三种传输差错一般不会出现在数据链路层,而会出现在其上层,因此可靠传输服务并不仅局限于数据链路层,其它各层均可选择实现可靠传输(下面介绍的三种可靠传输实现机制可以应用到计算机网络体系结构的各层协议中)。另外可靠传输的实现比较复杂,开销也比较大,是否使用可靠传输取决于应用需求。
2、停止-等待协议(SW)
(1)数据传输的过程中可能会出现误码的现象。如下图所示,收发双方基于互联网进行通信,而不是局限在一条点对点的数据链路,纵坐标为时间。
①发送方给接收方发送数据分组,接收方收到后对其进行差错检测,若没有误码则接收该数据分组,并给发送方发送确认分组(简称ACK),发送方收到针对所发送数据分组的确认分组后才能发送下一个数据分组。
②假设下一个数据分组在传输过程中出现了误码,接收方收到后对其进行差错检测就会发现误码,接着丢弃该数据分组并给发送方发送否认分组(简称NAK),发送方收到针对所发送数据分组的否认分组后就知道了之前发送的数据分组出现了差错而被接收方拒绝,于是发送方会立刻重传该数据分组。
③发送方每发送完一个数据分组后并不能立刻将该数据分组从缓存中删除,只有在受到针对该数据分组的确认分组后才能将其从缓存中删除。
④发送方每发送完一个数据分组后就停止发送下一个数据分组,等待来自接收方的确认分组或否认分组,若收到确认分组则可继续发送下一个数据分组,若收到否认分组则重发之前发送的那个数据分组,这样看起来就能实现可靠传输,不过实际情况远比这复杂。
(2)数据传输的过程中可能会出现分组丢失的现象。如下图所示,收发双方基于互联网进行通信,纵坐标为时间。(对于数据链路层点对点信道而言,不太容易出现分组丢失的情况)
①发送方给接收方发送数据分组,如果该数据分组在传输过程中丢失,接收方就收不到数据分组,也就不会发送ACK或NAK,如果不采取其他措施,发送方就会一直处于等待接收方ACK或NAK的状态。
②为解决发送方一直处于等待接收方ACK或NAK状态的问题,可以在发送方发送完一个数据分组时启动一个超时计时器,若到了超时计时器所设置的重传时间而发送方仍收不到接收方的任何ACK或NAK,则重传原来的数据分组,这就叫做超时重传。
③一般可将重传时间选为略大于“从发送方到接收方的平均往返时间”。
(3)数据传输的过程中可能会出现分组重复(ACK或NAK丢失)的现象。如下图所示,收发双方基于互联网进行通信,纵坐标为时间。
①发送方给接收方发送数据分组,接收方正确接收该数据分组后给发送方发送确认分组,但该确认分组在传输过程中丢失了,这必然会造成发送方对之前所发送数据分组从超时重传,如果重传的数据分组也正确地到达了接收方,就会引发分组重复的问题。
②为避免分组重复这种传输错误,必须给每个分组带上序号。对于停止-等待协议,由于每发送一个数据分组就停止等待,只要保证每发送一个新的数据分组其发送序号与上次发送的数据分组的序号不同就可以了,因此用一个比特来编号就够了(即序号0和1)。
③根据数据分组的序号,接收方就可以判断出该数据分组是否是重复的,如果重复则丢弃重复的数据分组,并给发送方发送针对该数据分组的确认分组,以免发送方对该数据分组的再次超时重传。
④发送方收到针对0号数据分组的确认分组后,发送下一个数据分组给接收方,其序号为1,接收方正确收到1号数据分组后给发送方发送确认分组。
(4)数据传输的过程中可能会出现重复确认(确认迟到)的现象。如下图所示,收发双方基于互联网进行通信,纵坐标为时间。
①发送方发送0号数据分组给接收方,接收方正确接收后给发送方发送确认分组,不过确认分组可能会由于某些原因而稍晚到达发送方,这时发送方可能会对0号数据分组进行超时重传,在重传的0号数据分组的传输过程中,发送方收到了迟到的确认分组,于是发送1号数据分组给接收方,接收方收到重传的0号数据分组后发现这是一个重复的数据分组便将其丢弃,并针对该数据分组给发送方发送确认分组,这时发送方将会面临对0号数据分组重复确认的问题,如果不采取其它措施,发送方会误认为这是对1号数据分组的确认。
②为避免重复确认这种传输错误,需要对确认分组也进行编号,这样就可以使发送方避免这种误判。
③发送方收到序号为0的确认分组,发送方通过确认分组的序号可以知道这是否是一个重复的确认分组,如果重复则忽略。
④接收方收到1号数据分组后给发送方针对该数据分组的确认分组,其序号为1,发送方收到该确认分组后发送下一个数据分组,其序号为0。
(5)注意事项:
①接收端检测到数据分组有误码时,将其丢弃并等待发送方的超时重传,但对于误码率较高的点对点链路,为使发送方尽早重传,也可给发送方发送NAK分组。
②为了让接收方能够判断所收到的数据分组是否是重复的,需要给数据分组编号。由于停止-等待协议的停等特性,只需1个比特编号就够了,即编号0和1。
③为了让发送方能够判断所收到的ACK分组是否是重复的,需要给ACK分组编号,所用比特数量与数据分组编号所用比特数量一样。数据链路层一般不会出现ACK分组迟到的情况,因此在数据链路层实现停止-等待协议可以不用给ACK分组编号。
④超时计时器设置的重传时间应仔细选择,一般可将重传时间选为略大于“从发送方到接收方的平均往返时间”。
[1]在数据链路层,点对点的往返时间比较确定,重传时间比较好设定。
[2]在运输层,由于端到端往返时间非常不确定,设置合适的重传时间有时并不容易。
(6)停止-等待协议的信道利用率:
①如下图所示,是发送方发送数据分组所耗费的发送时延,RTT是收发双方之间的往返时间,是接收方发送确认分组所耗费的发送时延,忽略接收方对数据分组的处理时延以及发送方对确认分组的处理时延,+RTT+是使用停止-等待协议的发送方从发送一个数据分组开始到可以发送下一个数据分组为止所经历的总时间。
②仅在时间内才是传送真正有用的数据,于是信道的利用率U可用下式计算:
③当往返时延RTT远大于数据帧发送时延TD时(例如使用卫星链路),信道利用率会非常低;若出现重传,则对于传送有用的数据信息来说,信道利用率还要降低。
④为了克服停止-等待协议信道利用率很低的缺点,就产生了另外两种协议,即后退N帧协议GBN和选择重传协议SR。
(7)像停止-等待协议这种通过确认和重传机制实现的可靠传输协议常称为自动请求重传协议(ARQ)。
3、回退N帧协议(GBN)
(1)在停止-等待协议的基础上,如果发送方在收到接收方的确认分组之前可以连续发送多个数据分组,则可大大提高信道利用率,这是一种流水线式的传输。如下图所示,同等条件下,在相同时间内,使用停止-等待协议的发送方只能发送一个数据分组,而采用流水线传输的发送方能发送5个数据分组。
(2)回退N帧协议在流水线传输的基础上利用发送窗口来限制发送方可连续发送数据分组的个数。
①如下图所示,假设采用3个比特给分组编序号,序号的取值范围是0~7(2的3次方减1,其中3是构成分组序号的比特数量),当分组的序号编到7时,下一个分组序号从0开始。
②发送方要维持一个发送窗口,序号落在发送窗口内的数据分组可被连续发送,而不必等收到接收方的相应确认分组后再发送,序号落在发送窗口外的数据分组不允许发送。
[1]发送窗口的尺寸记为,对于本例,其取值范围是1~7(2的3次方减1,其中3是构成分组序号的比特数量),本例取 = 5。
[2]如果 = 1,就相当于停止-等待协议;如果的值超过取值范围的上限,则会造成严重的错误。
[3]序号落在发送窗口内的5个数据分组可以连续发送,而序号落在发送窗口外的数据分组不允许发送。
③接收方要维持一个接收窗口,序号落在接收窗口内的数据分组被允许接收,而序号落在接收窗口外的数据分组不被允许接收。接收窗口的尺寸记为,对于回退N帧协议,其取值只能为1。
(3)无差错情况:
①发送方将序号落在发送窗口内的0~4号数据分组依次连续发送出去,它们经过互联网的传输正确到达接收方,也就是没有出现乱序和误码。
②接收方按序接收它们,每接收一个数据分组,接收窗口就向前移动一个位置并给发送方发送针对所接收分组的确认分组。
③0~4号确认分组经过互联网的传输正确到达了发送方,发送方每接收一个确认分组,发送窗口就向前移动一个位置,这样就有新的序号落入了发送窗口。
④发送方可以将收到确认的数据分组从缓存中删除,同时接收方可以择机将已接收的数据分组交付上层处理。
(4)累积确认:使用回退N帧协议的接收方不一定要对收到的数据分组逐个发送确认,而是可以在收到几个数据分组后(由具体实现决定)对按序到达的最后一个数据分组发送确认。对确认分组也进行编号,ACKn表示序号为n及以前的所有数据分组都已正确接收。
①如下图所示,发送方将序号落在发送窗口内的0~4号数据分组依次连续发送出去,它们经过互联网的传输正确到达了接收方。
②接收方按序接收它们,当接收完0~1号数据分组后,接收方给发送方发送一个累积确认ACK1,当接收完2~4号数据分组后,接收方给发送方发送一个累积确认ACK4。
③假设ACK1在传输过程中丢失了,而ACK4正确到达了发送方,发送方接收ACK4后就得知序号为4及之前的数据分组已被接收方正确接收,于是一口气将发送窗口向前移动5个位置,这样就有新的序号落入了发送窗口。(使用累积确认,即使确认分组丢失,发送方也可能不必重传,还可以减少接收方的开销,减少对网络资源的占用,不过使用累积确认不能向发送方及时反映出接收方已经正确接收的数据分组信息)
④发送方可以将收到确认的数据分组从缓存中删除,同时接收方可以择机将已接收的数据分组交付上层处理。
(5)有差错情况:
①发送方将序号落在发送窗口内的5~1号数据分组依次连续发送出去,它们经过互联网的传输到达接收方,假设它们在传输过程中受到了干扰,其中5号数据分组出现了误码。
②接收方通过数据分组中的检错码发现错误,于是接收方丢弃5号数据分组,而后续到达的4个数据分组的序号与接收窗口中的序号不匹配,接收方同样也会将它们丢弃,并对之前按序接收的最后一个数据分组进行确认,也就是发送ACK4,每丢弃一个数据分组,就发送一个ACK4,本例中就是发送4个ACK4。
③4个ACK4通过互联网的传输到达接收方,由于发送方之前就接收过ACK4,当收到这些重复的ACK4时发送方就能得知之前发送的数据分组有差错,于是可以不等超时计时器超时就立刻开始重传,至于收到几个重复确认就立刻重传,由具体实现决定。
④在本例中,假设收到这4个重复的确认后并不会触发发送方立刻重传,一段时间后,超时计时器出现超时,发送方会将发送窗口内已发送过的这些数据分组全部重传。
⑤在本例中,尽管序号为6、7、0、1的数据分组正确到达接收方,但由于5号数据分组误码不被接受,它们“受到牵连”而也不被接受,发送方还要重传这些数据分组,这就是所谓的Go-back-N(回退N帧)。可见,当通信线路质量不好时,回退N帧协议的信道利用率并不比停止-等待协议高。
(6)如下图所示,的最大值为7,如果的值超过取值范围的上限,比如 = 8。
①发送方将序号落在发送窗口内的0~7号这8个数据分组依次发送出去,它们经过互联网的传输正确到达了接收方。
②接收方按序接收它们后,接收窗口总共向前移动8个位置,同时接收方给发送方发回累积确认ACK7,如果ACK7在传输过程中丢失了,这将导致发送方的超时重传。
③重传的0~7号数据分组到达接收方,接收方根据当前接收窗口内的序号会对这8个数据分组按序接收,但是接收方之前已经接收过这8个数据分组了,现在是在重复接收,也就是说接收方无法分辨新、旧分组,从而引发分组重复的问题。
(7)总结:
①回退N帧协议在流水线传输的基础上利用发送窗口来限制发送方连续发送数据分组的数量,是一种连续ARQ协议。
②在协议的工作过程中发送窗口和接收窗口不断向前滑动,因此这类协议又称为滑动窗口协议。
③由于回退N帧协议的特性,当通信线路质量不好时,其信道利用率并不比停止-等待协议高。
4、选择重传协议(SR)
(1)回退N帧协议改进为选择重传协议:
①回退N帧协议的接收窗口尺寸只能等于1,因此接收方只能按序接收正确到达的数据分组。
②一个数据分组的误码就会导致其后续多个数据分组不能被接收方按序接收而丢弃(尽管它们无乱序和误码),这必然会造成发送方对这些数据分组的超时重传,显然这是对通信资源的极大浪费。
③为了进一步提高性能,可设法只重传出现误码的数据分组。因此,接收窗口的尺寸不应再等于1(而应大于1),以便接收方先收下失序到达但无误码并且序号落在接收窗口内的那些数据分组,等到所缺数据分组收齐后再一并送交上层,这就是选择重传协议。
④选择重传协议为了使发送方仅重传出现差错的分组,接收方不再采用累积确认,而需要对每个正确接收到的数据分组进行逐一确认。
(2)选择重传协议在流水线传输的基础上利用发送窗口来限制发送方可连续发送数据分组的个数。
①如下图所示,假设采用3个比特给分组编序号,序号的取值范围是0~7(2的3次方减1,其中3是构成分组序号的比特数量),当分组的序号编到7时,下一个分组序号从0开始。
②发送方要维持一个发送窗口,序号落在发送窗口内的数据分组可被连续发送,而不必等收到接收方的相应确认分组后再发送,序号落在发送窗口外的数据分组不允许发送。
[1]发送窗口的尺寸记为,对于本例,其取值范围是1~4(2的3-1次方,其中3是构成分组序号的比特数量),本例取 = 4。
[2]如果 = 1,就相当于停止-等待协议;如果的值超过取值范围的上限,则会造成严重的错误。
[3]序号落在发送窗口内的5个数据分组可以连续发送,而序号落在发送窗口外的数据分组不允许发送。
③接收方要维持一个接收窗口,序号落在接收窗口内的数据分组被允许接收,而序号落在接收窗口外的数据分组不被允许接收。
[1]接收窗口的尺寸记为,对于选择重传协议,一般可与发送窗口的尺寸取值相同(即=)。
[2]序号落在接收窗口内的4个数据分组被允许接收,而序号落在接收窗口外的数据分组不被允许接收。
(3)有差错情况:
①发送方将序号落在发送窗口内的0~3号数据分组依次连续发送出去,它们经过互联网的传输到达接收方,但其中的2号数据分组丢失。
②只要序号落入接收窗口内且无误码的数据分组,接收方都会接收,本例中接收方接收0号和1号数据分组,并发送0号和1号确认分组,同时接收窗口向前移动2个位置,4和5两个新序号落入接收窗口。
③接着接收方接收3号数据分组,并发送3号确认分组,但接收窗口不向前移动,因为3号数据分组不是按序到达的数据分组。
④0号、1号、3号确认分组经过互联网的传输陆续到达发送方,发送方接收0号和1号确认分组,发送窗口就向前移动2个位置,4和5两个新序号落入发送窗口,发送方将序号落入发送窗口的4号和5号数据分组发送出去,并将已经收到确认的0号和1号数据分组从发送缓存中删除,而接收方可择机将已按序接收的0号和1号数据分组交付上层处理。
⑤发送方接收3号确认分组,但发送窗口不能向前滑动,因为发送方还未收到它之前的2号确认分组,3号确认分组是一个未按序到达的确认分组,不过发送方仍然需要记录3号数据分组已收到确认,防止3号数据分组超时重发。
⑥4号和5号数据分组到达接收方,接收方接收两个数据分组并发送4号和5号确认分组,不过接收窗口不向前滑动,因为它们是未按序到达的数据分组,接收方还未收到它们之前的2号数据分组。
⑦假设在4号和5号确认分组的传输过程中,发送方针对2号数据分组的重传计时器超时了,发送方就会重传2号数据分组。
⑧接着4号和5号确认分组陆续到达发送方,发送方接收它们,不过发送窗口不向前滑动,因为它们是未按序到达的确认分组,接收方还未收到它们之前的2号确认分组,不过发送方仍然需要记录4号和5号数据分组已收到确认,防止4号和5号数据分组超时重发。
⑨发送方之前重传的2号数据分组到达接收方,接收方接收该数据分组并发送2号确认分组,同时接收窗口向前滑动4个位置,序号6~1落入接收窗口。
⑩2号确认分组经过互联网的传输到达发送方,发送方接收该确认分组,同时发送窗口向前滑动4个位置,序号6~1落入发送窗口,发送方现在就可以将这4个序号的数据分组依次发送出去,并将已经收到确认的2号、3号、4号、5号数据分组从发送缓存中删除,而接收方可择机将已按序接收的2号、3号、4号、5号数据分组交付上层处理。
(4)窗口尺寸问题:
①发送窗口尺寸和接收窗口尺寸的限制:
②假如采用3个比特给分组编序号,那么发送窗口尺寸的最大取值为4,接收窗口的尺寸的最大取值由发送窗口尺寸决定,如果的值超过取值范围的上限,比如故意将发送窗口尺寸设置为5,相应地将接收窗口尺寸也设置为5:
[1]发送方将序号落入发送窗口内的0~4号这5个数据分组依次发送出去,它们经过互联网的传输依次到达接收方。
[2]接收方接收它们并发送0~4号确认分组,同时接收窗口向前滑动5个位置,序号5~1落入接收窗口。
[3]0~4号确认分组经过互联网的传输陆续到达发送方,如果其中的0号确认分组丢失了,那么发送方只能接收1~4号确认分组,并记录1~4号分组已经收到确认,但是发送窗口不能向前移动。
[4]一段时间后,发送方针对0号数据分组的重传计时器超时,发送方重传0号数据分组,该数据分组经过互联网的传输到达接收方,由于接收方中序号0落在接收窗口内,接收方会接收该数据分组,但是接收方先前已经正确接收过该数据分组了,于是这就引发了分组重复的问题。
(5)总结:
五、点对点协议PPP
1、点对点协议PPP概述
(1)点对点协议PPP(Point-to-Point Protocol)是目前使用最广泛的点对点数据链路层协议。
(2)用户计算机与ISP进行通信时,使用的数据链路层协议通常就是PPP协议。
(3)点对点协议PPP也广泛应用于广域网路由器之间的专用线路。
(4)PPP协议是因特网工程任务组IETF在1992年制定的。经过1993年和1994年的修订,现在的PPP协议已成为因特网的正式标准[RFC1661,RFC1662]。
(5)PPP协议为在点对点链路传输各种协议数据报提供了一个标准方法,主要由以下三部分构成:
①对各种协议数据报的封装方法(即封装成帧)。
②链路控制协议LCP(用于建立、配置以及测试数据链路的连接)。
③一套网络控制协议NCPs(其中的每一个协议支持不同的网络层协议)。
(6)从网络体系结构的角度看:
①PPP是数据链路层的协议,它将上层交付下来的协议数据单元封装成PPP帧。
②为了支持不同的网络层协议,PPP协议包含了一套网络控制协议NCPs,其中的每一个协议支持不同的网络层协议,例如TCP/IP中的IP、Novell Netware网络操作系统中的IPX等。
③链路控制协议LCP用于建立、配置以及测试数据链路的连接,PPP协议能够在多种类型的点对点链路上运行,例如面向字节的异步链路、面向比特的同步链路。
2、PPP协议的帧格式
(1)帧首部由4个字段构成,帧尾部由2个字段构成,各字段的长度以及帧的数据部分的最大长度如下图所示。
(2)帧首和帧尾部中的标志(Flag)字段是PPP帧的定界符,取值为十六进制的7E。
(3)帧首部的地址(Address)字段取值为十六进制的FF(预留,目前没有什么作用)。
(4)帧首部的控制(Control)字段取值为十六进制的03(预留,目前没有什么作用)。
(5)帧首部的协议(Protocol)字段指明了帧的数据部分应送交哪个协议处理。
①取值0x0021,表示帧的数据部分为IP数据报。
②取值0xC021,表示帧的数据部分就是链路控制协议LCP的分组。
③取值0x8021,表示帧的数据部分就是网络控制协议NCP的分组。
(6)帧尾部的帧检验序列(Frame Check Sequence)字段,其值是使用循环冗余校验CRC计算出的校验位,用于检查PPP帧是否存在误码。
3、PPP协议实现透明传输
(1)当PPP帧的数据部分出现帧首和帧尾中的标志字段时,如果不采取措施,则会造成接收方对PPP帧是否结束的误判,因为标志字段是PPP帧的定界符,取值为0x7E。
(2)PPP协议实现透明传输的方法取决于所使用的链路类型:
①如果是面向字节的异步链路,采用字节填充法,也就是插入转义字符。
②如果是面向比特的同步链路,采用比特填充法,也就是插入比特0。
(3)字节填充法:
①发送方将数据部分出现的每一个0x7E字节转变成2字节序列[0x7D,0x5E],这相当于在0x7E字节前插入了转义字节0x7D,并将0x7E字节减去0x20。
②发送方将数据部分出现的每一个0x7D字节转变成2字节序列[0x7D,0x5D],这相当于在0x7D字节前插入了转义字节0x7D,并将0x7D字节减去0x20。
③发送方在数据部分出现的每一个ASCII码控制字符(数值小于0x20的字符)前插入一个0x7D字节,同时将该字符的编码加上0x20。
④接收方对接收到的数据帧进行上述三个变换的反变换即可恢复出原来的帧。
(4)比特填充法:
①以0x7E(转换为二进制就是01111110)作为PPP帧的定界符,如下图所示,加入帧的数据部分包含了两个帧定界符。
②发送方对帧的数据部分进行扫描(一般由硬件实现),只要发现5个连续的比特1就立即填充1个比特0。
③接收方对接收到帧的数据部分进行扫描(一般由硬件实现),只要发现5个连续的比特1就把其后的1个比特0删除。
4、PPP协议实现差错检测
(1)PPP帧的尾部包含有1个2字节的帧检验序列FCS字段,使用循环冗余校验CRC来计算该字段的取值,使用的生成多项式如下图所示。
(2)RFC1662的附录部分给出了FCS的计算方法的C语言实现(查表法),为了减少对CPU的占用,FCS的计算使用查表法实现;FCS的计算范围如图所示。
(3)接收方每收到一个PPP帧,就进行CRC检验,若CRC检验正确就收下这个帧,反之则丢弃这个帧。使用PPP协议的数据链路层向上不提供可靠传输服务。
5、PPP协议的工作状态(以拨号接入为例,稍复杂介绍版本)
(1)PPP链路的开始和结束状态都是“静止”状态,这时并不存在物理层的连接。
(2)当检测到调制解调器的载波信号并建立物理层连接后,PPP链路进入“建立”状态,这时链路控制协议LCP开始协商一些配置选项。
(3)若协商成功,PPP链路进入“鉴别”状态;若协商失败,PPP链路退回“静止”状态。所协商的配置选项包括最大帧长、鉴别协议等,可以不使用鉴别,也可以使用口令鉴别协议PAP或挑战握手鉴别协议CHAP。
(4)若通信双方无需鉴别或鉴别身份成功,则进入“网络”状态;若鉴别失败,则进入“终止”状态。
(5)进入“网络”状态后进行NCP配置,配置完成后就进入“打开”状态。PPP链路的两端通过互相交换网络层特定的NCP分组来进行NCP配置。如果在PPP链路上运行的是IP协议,则使用IP控制协议IPCP来对PPP链路的每一端配置IP模块,例如分配IP地址。
(6)只要链路处于“打开”状态,就可以进行数据通信。
(7)当出现故障或链路的一端发出终止请求时,进入“终止”状态。
(8)当载波停止后则回到“静止”状态。
6、PPP协议的工作状态(以拨号接入为例,简单介绍版本)
(1)PPP链路的初始化过程:
①当用户拨号接入ISP后,就建立了一条从用户个人电脑到ISP的物理连接,这时用户个人电脑向ISP发送一系列的链路控制协议LCP分组(封装成多个PPP帧),以便建立LCP连接,LCP分组及其响应选择了将要使用的一些PPP参数。
②接着进行网络层配置,网络控制协议NCP给新接入的用户个人电脑分配一个临时的IP地址,这样用户个人电脑就成为了互联网上的一个有IP地址的主机了。
(2)当用户通信完毕时,NCP释放网络层连接,收回原来分配出去的IP地址,接着LCP释放数据链路层连接,最后释放物理层的连接。
(3)PPP链路的起始和终止状态永远是“链路静止”状态,这时在用户个人电脑和ISP的路由器之间并不存在物理层的连接。