首先来回顾一下数据在计算机网络中的传输过程:
数据从H1发送至H2,中间需要经过3个路由器,电话网、局域网等多种网络。根据计算机网络五层体系结构,主机应有五层结构的各个层次,而路由器只需要有网络层、数据链路层和物理层。各设备通过物理层下的传输媒体进行互联,数据的流动如上图红色虚线所示:主机H1将待发送的数据由上至下逐层封装后通过物理层将封装后的数据包的各比特转换成电信号发送到传输媒体,路由器接收到数据包后,由下向上逐层解封到网络层,路由器跟数据包的目的网络地址和自身转发表,确定数据包的转发端口,然后从网络层向下逐层封装数据包,并通过物理层将数据包发送到传输媒体,就这样,数据包最终会到达H2,H2会由下向上逐层解封数据包,最终解析出H1所发送的数据。
在大多数情况下,我们研究数据链路层的时候,可以不考虑其他各层。也就是说,我们完全可以想象数据包只在数据链路层从左向右沿水平方向传输,如下图所示。这样的话,从主机H1到H2的通信可以看作数据包在4段链路上的通信组成的,在数据链路层传输的数据包为帧(数据链路层以帧为单位传输和处理数据)。
链路(Link):就是从一个结点到相邻结点的一段物理线路,中间没有任何其他的交换结点。本例中有4段链路。
数据链路(Data Link):把实现通信协议的硬件和软件加到链路上,就构成了数据链路(只有链路是不能完成通信的,需要有用来通信的协议)。
最基本最重要的三个问题:封装成帧,差错检测和可靠传输。
1.封装成帧
由于数据链路层传输数据的单位是帧,因此数据链路层接收到网络层的数据包时,会为其添加一个帧头和一个帧尾,使之成为帧。下图以以太网版本2的MAC帧的帧头和帧尾的格式举例:
2.差错检测
发送方将封装好的帧通过物理层发送到传输媒体,帧在传输过程中遭遇干扰后可能会出现误码,如比特0变为比特1,那么接收方如何判断帧在传输过程中出现了误码呢?可以通过检错码来检测是否有误码。
发送方再发送帧之前,基于待发送的数据和检错算法计算出检错码,并将其封装在帧尾(如以太网版本2的MAC帧的帧尾,就是4字节的帧检验序列FCS字段)。接收方接收到帧后,通过检错码和检错算法就可以判断出帧在传说过程中是否出现了误码。
3.可靠传输
接收方主机接收到有误码的帧后,会将其丢弃。如果数据链路层向其上层提供的是不可靠服务,那么丢弃也就丢弃了,不会有其他的措施;如果数据链路层向其上层提供的是可靠服务,那么还会有其他措施,来确保接收方主机还可以重新收到这个被丢弃帧的正确副本。也就是说,尽管误码是不能完全避免的,但若能实现发送方发送什么,接收方就能就收到什么,就称为可靠传输。
共享式局域网除了要解决点对点信道的数据链路层的三个基本问题外,还有一些其他问题需要解决:
1.若主机A要给主机C发送数据,主机B、D、E如何知道帧不是发送给自己的,主机C又如何知道所收到的帧是发送给自己的呢?这就引出了编址的问题,也就是将帧的目的地址添加到帧中一起传输。如以太网版本2的MAC帧中,其帧头的三个字段中,就有一个目的地址字段和一个源地址字段。
2.当总线上多台主机同时使用总线来传输帧时,传输信号就会产生碰撞。这是采用广播信道的共享式局域网不可避免的。以太网采用的协调方法是使用一种特殊的协议CSMA/CD(载波监听多点接入/碰撞检测)。
3.无线局域网:由于广播信道的广播天性,无线局域网仍然使用的是共享信道技术。如802.11局域网采用的媒体接入控制协议时CSMA/CA(载波监听多点接入/碰撞避免)的工作原理是怎样的呢?
1.网桥和交换机的工作原理
随着技术的发展,交换技术的成熟和成本的降低,具有更高性能的,使用点对点链路和链路层交换机的交换式局域网在有线(局域网)领域已经完全取代了共享式局域网。 那么,网络中的交换机,又是如何转发帧的呢?
2.集线器(物理层互连设备)与交换机的区别
上述所有问题,会在后续章节一一解决。
封装成帧是指在数据链路层将上层交付下来的协议数据单元添加帧头和帧尾使之成为帧。
1.帧头和帧尾中包含有重要的控制信息。
下图分别为以太网版本2的MAC帧的格式和点对点协议PPP帧的格式:
2.帧头帧尾的作用之一就是帧定界
发送方将帧交付给物理层,物理层将帧的各比特转换成电信号发送到传输媒体,那么接收方的数据链路层,如何从物理层交付的比特流中,提取出一个个帧呢?
如PPP帧,在其帧头和帧尾中,各含有一个字节的标志字段,其作用就是帧定界。这样接收方就可以根据帧定界标志,从物理层交付的比特流中提取出一个个帧。
要注意,并不是每一种数据链路层协议的帧都包含帧定界标志。如以太网版本2的MAC帧的帧头和帧尾就没有帧定界标志。
以太网的数据链路层封装好MAC帧后,将其交付给物理层,物理层会在MAC帧的前面,添加8字节的前导码,然后再将比特流转换为电信号发送。前导码中的前7个字节为前同步码,作用是使接收方的时钟同步,之后的一字节为帧开始定界符,表明其后面紧跟着的就是MAC帧。另外,以太网规定了帧间间隔为96bit的发送时间,因此,MAC帧不需要帧结束定界符(这只是帧间间隔的其中一个作用,后续会介绍其他作用)。
透明传输是指数据链链路层对上层交付的传输数据没有任何限制,就好像数据链路层不存在一样。
为了简单起见,以下的例子中帧头和帧尾只给出帧定界字段而省略其他字段。
1.面向字节的物理链路使用字节填充(或称字符填充)的方法实现透明传输
如果数据链路层上层向其交付的数据没有帧定界标志,那这种情况是很理想的,接收方只需要根据帧头帧尾的帧定界标志即可正确就收帧:
但是实际上上层交付的数据中,很可能会与帧定界标志相同(帧定界标志其实就是一个特定的数值),这时若不对其进行处理,那么就会导致错误的传输;若限制上层的数据不得含有帧定界标志,很明显这违背了透明传输的原则。这时,我们需要对上层交付来的数据扫描,若扫描出数据中含有帧定界标志,则在其前加上一个转义字符。这样当接收方就收到一个转义字符的时候,就知道这个转义字符后边紧跟的字节是数据而非帧定界标志。同样,若转义字符也要作为数据传输,在其前也加上一个转义字符即可。
注意字符是一种特殊的控制字符,其长度为1个字节,十进制值为27而并非ESC这三个字符。
2.面向比特的物理链路使用比特填充的方法实现透明传输
如下图所示,待传输的数据中包含了帧定界标志,此时可以采用零比特填充法对其进行处理,来保证传输的帧中帧定界标志的唯一性,也就实现了透明传输。
零比特填充法:每遇到连续的5个比特1就在其后插入一个比特0。这样接收方的数据链路层从物理层交付的比特流中提取帧时,只需要将帧的数据部分每连续的5个比特1后的比特0剔除即可正确的接收数据。
为了提高帧的传输效率,应尽可能使帧的数据部分长度大一些,因为仅从数据链路层来看,帧的数据部分才是真正需要传输的内容,帧头和帧尾是为了实现数据链路层功能而额外添加的 。
考虑到差错控制等多种因素,每一种数据链路层协议都规定了帧的数据部分的长度上限,即最大传送单元MTU(Maximum Transfer Unit).
实际的通信信道都不是理想的,比特在传输过程中可能会产生差错:1可能会变成0,0也可能会变成1,这就是比特差错。
在一段时间内,传输错误的比特占所传输比特总数的比率称为误码率BER(Bit Error Rate).我们可以使用差错检测码来检测数据在传输过程中是否产生了比特差错。
如以太网版本2的MAC帧,其帧尾包含了一个长度为4字节的帧检验序列FCS字段,其作用就是让接收方的数据链路层检查帧在传输过程中是否产生了误码。
再如点对点协议PPP帧,其帧尾包含了2字节的帧检验序列FCS字段,作用同上。
在待发送的数据后面添加1位奇偶校验位,使整个数据(包括所添加的校验位)中的==“1”的个数==为奇数(奇校验)或偶数(偶校验)。
来分别看两个奇校验和两个偶校验的例子:
第一行:收发双方约定采用奇校验
发送方:待传输的比特流中有4个比特1,为偶数,因此需要在末尾添加一个比特1来保证整个传输数据中比特1的数量为奇数。
传输中:发生了1位误码,导致比特流中比特1数量的奇偶性发生了改变(奇–>偶)。
接收方:发现数据中比特1的个数不是奇数,知道传输过程中发生了误码。
第二行:收发双方约定采用奇校验
发送方:待传输的比特流中有4个比特1,为偶数,因此需要在末尾添加一个比特1来保证整个传输数据中比特1的数量为奇数。
传输中:发生了2位误码,但是比特流中比特1数量的奇偶性没有发生变化,仍为奇数。
接收方:发现数据中比特1的个数是奇数,认为传输过程中没有发生误码。显然这是一次误判。
第三行:收发双方约定采用偶校验
发送方:待传输的比特流中有4个比特1,为偶数,因此需要在末尾添加一个比特0来保证整个传输数据中比特1的数量为偶数。
传输中:发生了1位误码,导致比特流中比特1数量的奇偶性发生了改变(偶–>奇)。
接收方:发现数据中比特1的个数不是偶数,知道传输过程中发生了误码。
第四行:收发双方约定采用偶校验
发送方:待传输的比特流中有4个比特1,为偶数,因此需要在末尾添加一个比特0来保证整个传输数据中比特1的数量为偶数。
传输中:发生了2位误码,但是比特流中比特1数量的奇偶性没有发生变化,仍为偶数。
接收方:发现数据中比特1的个数是偶数,认为传输过程中没有发生误码。显然这是一次误判。
根据上述4种情况可以看出:采用奇偶校验的方法,如果数据有奇数个位发生误码,则奇偶性发生了变化,可以检查出误码;如果数据有偶数个位发生误码,则奇偶性没有发生变化,不能检查出误码(漏检)。同时也可以看出,奇偶校验的漏检率是比较高的,因此,计算机网络的数据链路层一般不会采用这种检测方法。
CRC(Cyclic Redundancy Check)漏检率极低。CRC的过程如下:
1.收发双发约定好一个生成多项式G(x);
2.发送方基于待发送数据和生成多项式计算出差错检测码(冗余码),将其添加到待传输数据的后面一起传输;
3.接收方通过生成多项式来计算收到的数据是否产生了误码;
注意:CRC校验中使用到的除法是模2除法。这里不做详细介绍,原理不复杂,可以自行百度。
生成多项式举例:
G(x) = x^4 + x^2 + x + 1 = 1·x^4 + 0·x^3 + 1·x^2 + 1·x^1 + 1·x^0
生成多项式各项系数构成的比特串:10111常见的生成多项式:
CRC-16 = x^16 + x^15 + x^2 + 1
CRC-CCITT = x^16 + x^12 + x^5 + 1
CRC-32 = x^32 + x^26 + x^23 + x^22 + x^16 + x^12 + x^11 + x^10 + x^8 + x^7 + x^5 + x^4 + x^2 + x + 1
算法要求生成多项式必须包含最低次项,即x^0,也就是1。
下面来看一个具体的例子加深对CRC发送方的理解:
待发送的信息为101001,生成多项式为G(x) = x^3 + x^2 + 1,计算余数。
1)构造被除数(记得观察上图):生成多项式最高次为3次,因此被除数为待发送的信息后边再加上3个0,即:101001000;
2)构造除数:生成多项式各项系数构成的比特串为1101,将其作为除数;
3)做模2除法:
4)检查余数:余数的位数应等于生成多项式的最高次次数。若余数次数不够,则在前面补0来凑。本例中余数为1,只有1位,而生成多项数最高次次数为3,因此需要在前面添加2个0,得到最终的余数:001
5)发送数据:将余数添加到待发送的信息后:101001001
再举一个例子加深对CRC接收方的理解::
接收到的信息为101101001,生成多项式为G(x) = x^3 + x^2 + 1,传输是否产生误码?
1)构造被除数:接受到的信息就是被除数,即101101001;
2)构造除数:生成多项式各项系数构成的比特串,即1101;
3)做模2除法:
4)检查余数:余数为11而非0,表明传输过程有误码。
需要说明的几点:
1.检错码只能检测出帧在传说过程中是否出现了差错,但是不能定位差错,因此无法纠正错误。要想纠正传输过程中的错误,可以使用冗余信息更多的纠错码进行向前纠错。但是纠错码开销比较大,在计算机网络中较少使用。
2.循环冗余校验CRC有很好的检错能力,虽然计算比较复杂,但非常易于用硬件实现,因此被广泛应用于数据链路层。
3.在计算机网络中通常采用检错重传方式来纠正传输中的差错,或者仅仅是丢弃检测到差错的帧,这取决于数据链路层向上层提供的是可靠传输服务还是不可靠传输服务。
数据链路层向上层提供的服务类型包括以下两种:
由于可靠传输的实现比较复杂,开销也比较大,是否使用可靠传输取决于应用需求。
一般情况下,有线链路的误码率比较低,为了减小开销,并不要求数据链路层向上提供可靠传输服务。即使出现了误码,可靠运输的问题由其上层处理。而无线链路易受干扰,误码率比较高,因此要求数据链路层必须向上提供可靠传输服务。
需要说明的是,可靠传输服务并不仅限于数据链路层,其他各层均可选择实现可靠传输,这是因为传输过程中的差错不仅仅只有上一小节介绍的比特差错,从整个计算机网络体系结构来看,传输差错还包括分组丢失、分组乱序、分组重复,而这三种传输差错一般不会出现在数据链路层而是出现在其上层。
接下来要介绍的三种可靠传输实现机制的基本原理并不仅限于数据链路层,而是可以应用到计算机网络体系结构的各层协议中。
1.分别来看一下以下4种情况:收发双方基于互联网进行通信而不是局限在一条点对点的数据链路,纵轴为时间。
左一:
发送方发送数据分组,接收方对接收到的数据分组进行差错检测,若没有误码则接收该数据分组,同时向发送方发送ACK确认分组。
发送方接收到对所发送的数据分组的确认分组后才能发送下一个数据分组。假设这个数据分组在传输过程中出现了误码,接收方进行差错检测发现了误码,则丢弃该分组并给发送方发送NAK否认分组。
发送方收到对发送的数据分组的否认分组后,就知道该分组在传输过程中出现了误码而被接收方拒绝,于是重传该分组。由此可以看出,发送方发送一个数据分组后不能立刻将其从自己的缓存中删除掉,而是等到接收方对该数据分组的ACK后才能将其从缓存中删除。
不难看出:发送方每发送完一个数据分组后,就停止发送下一个数据分组,等待来自接收方的ACK或者NAK,然后再做出相应的处理。这就是确认与否认。
左二:
发送方发送的数据分组在传输过程中丢失了,导致了接收方无法接收到该数据分组,也就不会向发送方发送ACK或NAK。此时若不采取措施,发送方就会一直等待来自接收方的ACK或NAK,这很明显是不可以的。为了解决这个问题,可以在发送方发送完一个数据分组时启动一个超时计时器。若到了超时计时器所设置的重传时间后发送方仍没有接收到ACK或NAK,则发送方重传刚才发送的数据分组,这就是超时重传。
超时计时器的重传时间应仔细选择,一般可选为略大于从发送方到接收方的平均往返时间(在数据链路层点对点的往返时间比较确定,重传时间比较好设定。而在运输层,由于端到端往返时间非常不确定,设置合适的重传时间并不容易)。
说明:对于数据链路层点对点信道而言,不太容易出现这种情况。但对于通过多个网络通过多个路由器互连的复杂互联网环境而言,这种情况经常会出现。
左三:
既然发送方发送的数据分组可能丢失,那接收方的ACK和NAK同样可能丢失,即确认丢失,这就导致了发送方的超时重传。
但是接收方已经正确接收到了这个数据分组,不需要再额外接收一份,但是接收方有没有能力判断这个分组是否是重复的分组。为了避免分组重复这种传输错误,必须给每个分组带上编号。对于停止-等待协议,由于发送方每发送一个数据分组就停止等待,因此要保证可以区别本次发送的分组和上一次发送的分组不同,只需要使用1个比特即可。
于是接收方根据序号判断出接收到的分组是重复的,便丢弃该分组,然后再次发送对于该数据分组的ACK,以免发送方对于该数据分组的再次超时重传。
发送方接收到了0号数据分组的ACK后,就开始发送1号数据分组。
左四:
接收方给发送方发送对于0号数据分组的ACK0时,由于网络状况迟到了,触发了发送方的超时重传,发送方便又发送了一个0号数据分组,在0号数据分组的发送过程中才收到接收方对于第一个0号分组的ACK0,于是发送方就继续发送下一个编号为1的数据分组。
接收方接收到了发送方发来的重复的0号数据分组,将其丢弃,然后再发送对于0号分组的ACK0以防止发送方再次超时重传。然后又收到了1号数据分组,因此又向发送方发送了对于1号分组的ACK1。
发送方再次接收到了对于0号数据分组的ACK0,若不采取措施,发送方会以为这是对于1号数据分组的ACK,因此需要对ACK也进行编号。于是发送方就能发现其与上一个ACK0重复了,便将其忽略。然后接收到了对于1号数据分组的ACK1,便继续发送下一个数据分组。
说明:对于数据链路层的点对点信道而言,往返时间比较固定,不会出现确认迟到的情况,因此如果只在数据链路层实现停止-等待协议,可以不用给确认分组编号。
2.停止-等待协议的信道利用率
如图所示,横轴为时间。为了简单期间,假设收发双方之间是一条直通的信道。
Td:发送方发送数据分组的发送时延。
RTT:收发双方之间的往返时间。
Ta:接收方发送确认分组的发送时延。
Td+RTT+Ra:发送方从发送一个数据分组开始到可以发送下一个数据分组所经历的总时间。
忽略接收方对数据分组的处理时延和发送方对确认分组的处理时延。
其中Ta一般远小于Td,可以忽略。
举个例子加深理解:
可以看出当RTT远大于Td时(如卫星链路),信道利用率会非常低。
像停止-等待协议这种通过确认和重传机制实现的可靠传输协议,常称为自动请求重传协议ARQ(Automatic Repeat reQuest),因为重传的请求是自动进行的,不需要接收方显示地请求发送方重传某个出错的分组。
为了克服停止-等待协议信道利用率很低的缺点,就差生了另外两种协议,即后退N帧协议GBN和选择重传协议SR。
停止-等待协议的信道利用率很低,若采用流水线传输可提高信道利用率。
回退N帧协议就是在流水线传输的基础上,利用发送窗口来限制发送方可连续发送数据分组的个数,是一种连续ARQ协议。在协议的工作过程中发送窗口和接收窗口不断向前滑动,因此这类协议又称为滑动窗口协议。
发送方要维持一个发送分组,序号落在发送窗口内的分组可以被连续发送而不必等到接收方发来的的ACK,序号落在发送窗口外的数据分组不允许发送。发送窗口的尺寸记为Wt,取值为范围是 1< Wt <= 2^3 - 1(Wt取值为1时就是停止等待协议;Wt取值超过取值范围上限,会造成严重的错误,下面会介绍)。接收方则通过接收窗口来接收数据分组,序号落在接收窗口序号内的数据分组可以被接受而序号落在接收窗口外的数据分组不允许被接收。接收窗口的尺寸Wr的取值为1(对于回退N帧协议来说,Wr只能是1,因此接收方只能按序接收正确到达的数据分组)。
举个例子:
假设采用3个比特给分组编序号,即0~7;Wt = 5;Wr = 1。
(1)无差错情况
发送方将落在发送窗口内的分组发送给接收方,他们经过互联网的传输正确到达了接收方,即无乱序和误码。接收方按序接收他们,每接收一个,接收窗口就向前滑动一个位置,并给发送方发送针对所接收分组的确认分组。0~4号确认分组经过互联网的传输正确到达了发送方,发送方每接收一个,发送窗口就向前滑动一个位置,这样就有新的序号落入了发送窗口。发送方可以将收到确认的数据分组从缓存中删除;接收方可以择机将已接受的数据分组交付给上层处理。
累计确认:接收方不一定要对收到的数据分组逐个发送确认,可以在收到几个分组后(由具体实现决定),对按序到达的最后一个数据分组发送确认。ACKn表示序号为n及以前的所有数据分组都已正确接收。
如上图所示,接收方正确接收数据分组0和1后,发送ACK1,正确接收2、3、4号数据分组后,发送ACK4。若ACK1在传输过程中丢失,发送方只接收到的ACK4,那么发送方也可以知道0~4号数据分组被正确接收了。
由此可以看出累计确认的优点:1.即使确认分组丢失,发送方也可能不必重传;2.减小接收方的开销,减少对网络资源的占用。缺点:不能向发送方及时反映出接收方已经正确接收的分组信息。
(2)有差错情况
发送方发送5~1号数据分组,其中5号数据分组在传输过程中出现了误码,接收方通过检错码知道了5号数据分组出现错误,便丢弃该分组,但是后面正确传输的4个数据分组由于与接收窗口的序号不匹配,接收方也会将其全部丢弃,并对之前按序接收的最后一个分组(前边的无差错情况的4号数据分组)进行确认,也就是发送ACK4。每丢弃一个数据分组,就发送一个ACK4。
发送方收到重复的确认,就知道之前所发送的数据分组出现了差错,于是可以不等超时计时器就立刻重传。至于收到几个重复确认就立刻重传,由具体实现决定。本例中假设收到这4个重复的确认不会触发发送方立刻重传。一段时间后,重传计时器超时,发送方重新发送发送窗口中的数据,尽管这5个数据分组中的6、7、0、1号数据分组都正确到达了接收方,但是由于5号分组不被接收,他们也会受到牵连而不被接收,这就是Go-back-N(回退N帧).可见,当通信线路质量不好时,回退N帧协议的信道利用率并不比停止-等待协议高。
(3)Wt取值超过上限
对于本例用3个比特给分组编号,Wt的上限为2^3-1=7,尝试将Wt取值为8,看看会发生什么。
发送方发送0~7号数据分组,接收方正确接收后发送累计确认分组ACK7,假设ACK7在传输过程中丢失。
一段时间后,发送方的重传计时器超时了,便重传这8个数据分组,此时问题出现了,接收方根据接收窗口中的序号来判断是否接受数据分组,此时要接受的第一个分组序号为0,与接收窗口中的序号对应,于是便接收该分组,以此类推,接收方接收了全部这8个数据分组,但是这8个数据分组之前已经接收过了,于是产生了分组重复的传输差错。由此也可以看出,接收方无法分辨新、旧分组。因此,发送窗口的尺寸不能超过其上限。
小结一下回退N帧协议
为了进一步提高回退N帧协议的性能,可设法只重传出错的数据分组。因此,接收窗口的尺寸Wr应该大于1,以便接收方先收下失序到达但是无误码并且序号落在接收窗口内的那些数据分组,等到所缺分组收齐后再一并送叫上层。这就是选择重传协议。
选择重传协议为了使发送方仅重传出现差错的分组,接收方不能再采用累计确认,而需要对每一个正确接收到的数据分组进行逐一确认。
举例说明,本例中Wt为4,Wr=Wt=4:
发送方发送0~3号数据分组,其中2号分组在传输过程中丢失。接收方接收0、1号数据分组,发送ACK0和ACK1,并将接收窗口向前滑动2个位置,此时滑动窗口中有2、3、4、5号,接收方继续接收序号落在接收窗口内且无差错的数据分组即3号分组,接着发送ACK3,但是滑动窗口不能向前滑动,因为3号数据分组不是按序到达的数据分组,
发送方接收到ACK0和ACK1后,发送窗口向前滑动2个位置,这样序号4、5就落入了发送窗口。发送方将序号落入发送窗口的4、5号数据分组发送出去,此时发送方已经可以将0、1号数据分组从缓存中删除,而接收方也可以将0、1号数据分组择机交付给上层处理。发送方继续接收ACK3,但是发送窗口不能滑动,因为ACK3不是按序到达的,发送方未接收到其前边的ACK2,为了避免3号数据分组的超时重发,需要记录3号数据分组已收到确认。
4、5号数据分组到达接收方,接收方接收他们,并发送ACK4和ACK5,但是接收窗口不能滑动,因为他们不是按序到达的数据分组,他们之前的2号数据分组仍未被接收。
假设在ACK4和ACK5的传输过程中,发送方对于2号分组的重传计时器超时了,便重传2号数据分组。ACK4和ACK5到达后,发送方接收他们,但是不能滑动发送窗口,因为他们不是按序到达的确认分组,之前的ACK2仍未被接收。但是需要记录4、5号数据分组已经收到确认以避免他们超时重发。
接收方接收2号数据分组,接收窗口可以向前滑动了4个位置,这样就有4个新的序号落入其中,同时向接收方发送ACK2。接收方接收到ACK2后,发送窗口也可以向前滑动4个位置,使新的序号落入发送窗口,这样发送方就可以将这4个序号的数据分组依次发送出去了。
接下来说明一下发送窗口和接收窗口的尺寸:
若窗口尺寸不符合上述规定,看一下会发生什么问题。假设采用3个比特币给数据分组编号,那么发送窗口的最大尺寸为4,本例中故意将其设置为5,接收窗口也设置为5:
发送方依次发送序号落在发送窗口内的数据分组,接收方正确接接收到这5个数据分组后,滑动接收窗口并发送5个对应的确认分组。其中0号确认分组在传输的过程中丢失,发送方接收1~4号确认分组并记录下来避免重传。
一段时间后,0号数据分组的重传计时器超时,发送方便重新发送0号数据分组。而此时接收方的接收窗口内有序号0,因此他会接收这个0号数据分组,但是接收方之前已经正确接收了这个数据分组,这样就造成了分组重复的错误。
小结SR:
点对点协议PPP(Point-to-Point Protocol)是目前使用最广泛的点对点数据链路层协议。
普通的用户通常需要连接到某个ISP才能接入因特网,这些ISP已经从因特网管理机构申请了一批IP地址,用户计算机只有获取到ISP所分配的合法IP地址后,才能成为因特网上的主机。用户计算机与ISP进行通信时,数据链路层最常使用的就是PPP协议。在1999年公布的在以太网上运行的PPP协议(PPP over Ethernet,简称PPPoE),它使得ISP可以通过DSL(意为数字用户线路,是指以电话线为传输介质的传输技术组合)、电路调制解调器、以太网等宽带接入技术,以以太网接口的形式为用户提供接入服务。另外,点对点协议PPP也广泛应用于广域网路由器之间的专用线路。
PPP协议是因特网工程任务组IETF在1992年制定的。经过1993和1994年的修订,现在的PPP协议已经成为因特网的正式标准[RFC1661,RFC1662]。
PPP协议为在点对点链路传输各种协议数据报提供了一个标准方法,主要由以下三部分构成:
(1)对各种协议数据报的封装方法(封装成帧)
(2)链路控制协议LCP:用于建立、配置以及测试数据链路的连接
(3)一套网络控制协议NCPs:其中的每一个协议支持不同的网络层协议
从网络体系结构的角度来看,PPP协议属于数据链路层协议,他将上层交付下来的协议数据单元封装成帧;为了支持不同的网络层协议,PPP协议包含了一套网络控制协议NCPs,其中的每一个协议支持不同的网络层协议,如IP协议、IPX协议、AppleTalk协议等;链路控制协议LCP用于建立、配置以及测试数据链路的连接,PPP协议能够在多种类型的点对点链路上运行,如面向字节的异步链路、面向比特的同步链路。
PPP协议实现透明传输的方法取决于所使用的链路类型。如果是面向字节的异步链路,则采用字节填充法,即插入转义字符;若是面向比特的同步链路,则采用比特填充法,即插入比特0.
举例说明一下面向字节的异步链路采用插入转义字符的字节填充法
可以看出,当帧的数据部分出现了PPP帧定界符或者转义字符时,除了要在这个字节前加上一个转义字符外,还需要将这个字节的编码减掉0x20.
再举例说明一下面向比特的同步链路采用插入比特0的比特填充法
说明一下,PPP帧的帧定界符为0x7E,即二进制的01111110.
PPP协议使用的CRC校验的生成多项式为CRC-CCITT = x^16 + x^12 + x^5 + 1,FCS的计算范围如下:
(RFC1662的附录部分给出了FCS计算方法的C语言实现——查表法)
接收方每收到一个PPP帧,就进行CRC检验。若CRC检验正确就收下这个帧;反之就丢弃该帧。也就是说PPP协议向上不提供可靠传输服务。
以拨号接入为例简单介绍PPP协议的工作状态:
(1)PPP协议的开始和结束状态都是**“静止”状态,这时并不存在物理层的连接;
(2)当检测到调制解调器的载波信号并建立物理层连接后,PPP就进入链路的“建立”状态;
(3)此时链路控制协议LCP开始协商一些配置选项。若协商成功,则进入“鉴别”状态;否则退回到“静止”状态;
(4)若通信双方鉴别成功或无需鉴别,进入“网络”状态;否则进入“终止”状态;
(5)进入“网络”状态后,进行NCP配置。配置完成后进入“打开”状态,只要链路处于“打开”状态,就可以进行数据通信;
(6)当出现故障或链路的一段发出终止请求时,进入“终止”状态;
(7)载波停止后,进入“静止”**状态。