计算机网络 - 2


计算机网络 Q&A

问题2-7同步通信和异步通信的区别是什么?

答:异步通信”是一种很常用的通信方式。异步通信在发送字符时,所发送的字符之间的时间间隔可以是任意的。当然,接收端必须时刻做好接收的准备(如果接收端主机的电源都没有加上,那么发送端发送字符就没有意义,因为接收端根本无法接收)。发送端可以在任意时刻开始发送字符,因此必须在每一个字符的开始和结束的地方加上标志,即加上开始位停止位,以便使接收端能够正确地将每一个字符接收下来。异步通信的好处是通信设备简单、便宜,但传输效率较低(因为开始位和停止位的开销所占比例较大)。

    异步通信也可以是以作为发送的单位。接收端必须随时做好接收帧的准备。这是,帧的首部必须设有一些特殊的比特组合,使得接收端能够找出一帧的开始。这也称为帧定界。帧定界还包含确定帧的结束位置。这有两种方法。一种是在帧的尾部设有某种特殊的比特组合来标志帧的结束。或者在帧首部中设有帧长度的字段。需要注意的是,在异步发送帧时,并不是说发送端对帧中的每一个字符都必须加上开始位和停止位后再发送出去,而是说,发送端可以在任意时间发送一个帧,而帧与帧之间的时间间隔也可以是任意的。在一帧中的所有比特是连续发送的。发送端不需要在发送一帧之前和接收端进行协调(不需要先进行比特同步)。

            

同步通信”的通信双方必须先建立同步,即双方的时钟要调整到同一个频率。收发双方不停地发送和接收连续的同步比特流。但这时还有两种不同的同步方式。一种是使用全网同步,用一个非常精确的主时钟对全网所有结点上的时钟进行同步。另一种是使用准同步,各结点的时钟之间允许有微小的误差,然后采用其他措施实现同步传输。


问题2-8比特同步和帧同步的区别是什么?

答:在数据通信中最基本的同步方式就是“比特同步(bit synchronization)位同步。比特是数据传输的最小单位。比特同步是指接收端时钟已经调整到和发送端时钟完全一样,因此接收端收到比特流后,就能够在每一个比特的中间位置进行判决(如下图所示)。比特同步的目的是为了将发送端发送的每一个比特都正确地接收下来。这就要在正确的时刻(通常就是在每一个比特的中间位置)对收到的电平根据事先已约定好的规则进行判决。例如,电平若超过一定数值则为1,否则为0

                   

但仅仅有比特同步还不够。因为数据要以帧为单位进行发送。若某一个帧有差错,以后就重传这个出错的帧。因此一个帧应当有明确的界限,也就是说,要有帧定界符。接收端在收到比特流后,必须能够正确地找出帧定界符,以便知道哪些比特构成一个帧。接收端找到了帧定界符并确定帧的准确位置,就是完成了“帧同步(frame synchronization)

在使用PCM的时分复用通信中(这种通信都采用同步通信方式),如图教材的2-20所示,接收端仅仅能够正确接收比特流是不够的。接收端还必须准确地将一个个时分复用帧区分出来。因此用作同步的特殊时隙CH0包含一些特殊的比特组合,使接收端能够将每一个时分复用帧的位置确定出来。这也叫做帧同步。下图给出了这两种不同的帧同步的示意图。

               

图中上面部分的同步通信方式在电信网中使用得非常广泛,其中的一个重要特点是在发送端连续不断地发送比特流中,即使有的时隙没有被用户使用,这些时隙也要保留在时分复用帧中的相应位置上。在同步通信中帧同步的任务就是使接收端能够从收到的连续比特流中确定出每一个时分复用帧的位置。

图中下面部分的异步通信方式在计算机网络中使用得较多。我们可以注意到,数据帧在接收端出现的时间是不规则的。因此在接收端必须进行帧定界。但帧定界也常称为帧同步。因此,当我们看到“帧同步”时,应当弄清这是同步通信中的帧同步,还是异步通信中的帧定界。

这里我们要强调一下,在异步通信时,接收端即使找到了数据帧的开始处,也还必须将数据帧中的所有比特逐个接收下来。因此,接收端必须和数据帧中的各个比特进行比特同步(这就是异步通信中的同步问题)。试想:如果接收端不知道每一个比特要持续多长时间,那怎样能将一个个比特接收下来呢?因此,不管是同步通信还是异步通信,要想接收比特块中的每一个比特,就必须和比特块中的比特进行比特同步。然而在异步通信中,比特同步的方法和同步通信时并不完全一样。

在同步通信中,最精确的同步方法是使全网时钟精确同步。全网的主时钟的长期精度要求达到 ± 1.0 ´ 1011,因此必须采用原子钟(例如,铯原子钟),但这样的同步网络的价格很高(如SDH/SONET网络)。实际上,在同步通信中,也可以采用比较经济的方法实现同步。这种方法就是在接收端设法从收到的比特流中将比特同步的时钟信息提取出来(发送端在发送比特流时,发送时钟的信息就已经在所发送的比特流之中了)。这种同步方式常称为准同步(plesiochronous)。在教材中的2.3.1节中介绍的曼彻斯特编码就能够使接收端很方便地从收到的比特流中将时钟信息提取出来,这样就能够很容易地实现比特同步。在以帧为传送单位的异步通信中,接收端通常也是采用从收到的比特流中提取时钟信息的方法来实现比特同步。

在以字符为单位的异步通信中,由于每一个字符只有8个比特,因此只要收发双方的时钟频率相差不太大,在开始位的触发下,这8个比特的比特同步很容易做到,因此不需要采取其他措施来实现比特同步(但不等于说可以不要比特同步)。


问题3-10在停止等待协议中,A发送的数据帧有差错,被BCRC检验器静悄悄地丢弃了。如果A进行超时重传后,但又连续出错,重传的数据帧又被BCRC检验器丢弃。这样,B总是收不到A发送的数据帧。这种情况是否说明停止等待协议这时不能正常工作?

:不是。

假定这条链路的通信质量不是非常坏,那么不可能每次传输都出现差错。每当成功传输一次后,发送端就再传送下一帧。这样,无非是多花费一些时间(每一帧要反复传送多次),但总是能够把所需传送的数据都传送完毕。

如果每一次(即100%的次数)传送数据都要出错,即发送端不管重传多少次都不能成功地传送一次,那么通信就会失败。但这种通信失败的原因并非是数据链路层协议不正确,而是由于通信线路质量太差,使得发送端没有可用的信道。这时,应当派人检修通信线路,务必使通信线路的误码率降低到可以传送数据的水平。

总之,B对出错帧的处理策略是:静悄悄地丢弃,其他什么也不做。这样处理,不会发生死锁。如果A发送的帧永远出错,导致通信失败,那是通信线路的问题,而不是协议本身的问题。


问题3-11在连续ARQ协议中,如果AB发送数据帧而B只向A发送确认帧(即假定B没有数据帧向A发送),那么这两种帧的序号序列各有什么特点?

在不产生差错的情况下,发送端发送的数据帧的序列是:

DATA0, DATA1, DATA2, DATA3, DATA4, DATA5,…

发送序号是每发送一帧就把序号加1(最后当序号用完时就又返回到零),如用3 bit编码时,序号7的下一个序号就又回到0

…DATA4, DATA5, DATA6, DATA7, DATA0, DATA1, DATA2,…

而接收端发送的确认帧的序列是:

    ACK1, ACK2, …, ACK5, ACK6, ACK7, ACK0, ACK1,…

数据帧的发送序号序列反映了发送端自己所要发送的信息数据块的顺序,而接收端的确认序号反映了接收端期望收到的对方发来的数据帧的序号。

但是当出现传输差错时,这两种帧的序号序列就会发生一些变化。

发送序号可能倒退回来再使用原来已经用过的序号(这种情况发生在超时重传时),如:

DATA0, DATA1, DATA2, DATA3, DATA4, DATA5, DATA2, DATA3, DATA4, DATA5, ,…

上面的DATA2, DATA3, DATA4, DATA54个帧都是重传的帧(Go-back-N协议)

发送序号也可能出现连续重复前面的序号的情况,如:

DATA0, DATA1, DATA2, DATA2, DATA3, DATA3, DATA4, DATA4, DATA4, ,…

连续重复的发送序号表明发送端还没有发送下一帧就超时重传刚才发送过的数据帧。这不一定是在使用停止等待协议,也不一定是超时重传时间设置得太短。例如,当发送完DATA2后,本来应当准备发送下一帧DATA3。但DATA3还没有准备好(即DATA3还没有被送入发送缓存中等待发送)。于是发送端就处于等待状态。在等待了一段时间后,超时重传时间到(即没有收到对DATA2的确认),这时就重传DATA2,因此出现了两个连续的发送序号。

接收端只按序接受数据帧。对序号不正确的帧(这里已经隐含地假定了这个帧已经通过了CRC检验器的检验,没有发现由传输产生的差错),接收端除了丢弃这个帧,还必须重复发送前面已经发送过的最后正确序号的确认帧。等到收到正确序号的数据帧后,接收窗口就向前移动一个帧的位置,准备接收下一个数据帧。因此,在出现重传帧的情况下,确认帧的确认号可能会在某一个序号上连续出现几次(这表明没有收到正确序号的数据帧)。例如:

ACK1, ACK2, ACK2, ACK2, ACK2, ACK2, ACK3, ACK4,…

这一连4ACK2表明接收端一连4次没有收到序号正确的数据帧。

应当指出,当接收端收到序号错误的数据帧的处理策略是一个比较复杂的问题。我们将在“问题3-12”中进一步讨论这个问题(我们将可看到,确认帧的序号序列中还可能缺少几个序号)。


问题3-12在连续ARQ协议中,如果B收到A发送的数据帧的序号没有落在B的接收窗口中,B就应当丢弃这个错误序号的帧。如果B这时不向A发送任何信息而一直静悄悄地等待正确序号的数据帧的到来,那么这种策略是否可行?

在特殊情况下,这种策略会导致协议失败。我们来讨论下面这种很特殊的情况。

设发送序号采用3 bit编码,发送窗口是7,于是A先发送下列数据帧

DATA0, DATA1, DATA2, DATA3, DATA4, DATA5, DATA6

假定以上所有的数据帧都正确到达B,因此B发送的7确认帧是:

ACK1, ACK2, ACK3, ACK4, ACK5, ACK6, ACK7

现在B的接收窗口移动到下一个位置,等待接收7号帧DATA7

不幸的是,以上7个确认帧在传输时都产生了差错,这7个出现差错的确认帧传送到了发送端A,就都被发送端ACRC检验器丢弃。

发送端A的数据链路层协议没有收到任何确认帧,以为自己发送的7个数据帧都丢失了。在经过超时重传时间后,就重传这7个数据帧(DATA0DATA6)。假定传输都正确,它们依次到达B

遗憾的是,这7个序号(06都不是接收端B所期望的B正等待接收DATA7。因此B仍然要把收到的7个传输无差错的数据帧(DATA0DATA6)全部都丢弃,因为这7个帧中没有一个是所期望接收的DATA7。但是,根据我们的假定,“B这时不向A发送任何信息而一直静悄悄地等待正确序号的数据帧的到来”

A继续等待着确认帧。但这是没有希望的,因为按我们的规定,B现在不发送任何信息。A再次进行超时重传,但结果还是一样的。这样,A等待B的确认帧,但B又不能发送确认帧,也收不到所期望的数据帧。于是,这种僵持状态一致持续下去。这就是死锁

因此,B在收到错误序号的数据帧时(这个帧并无由传输引起的比特差错),不能仅仅丢弃这个错误序号的数据帧,而且还必须重复发送前面已经发送过的最后一个确认帧。在我们的情况下,就是发送ACK7。发送ACK7就是表明:“我已经(请注意:这里的已经并不一定是刚刚才收到。也可能是已经收到了一段时间)正确收到了6号帧和6号帧以前的各帧。我现在期望收到7号帧DATA7”。A收到ACK7后,就发送DATA7(以及后续的在发送窗口内的各数据帧),死锁的局面就被打开了。

这样,我们可以得出以下结论:B在收到错误序号的数据帧时,除应丢弃这个错误序号的数据帧外,还必须重复发送前面已经发送过的最后一个确认帧。本书第4版从第2次印刷以后都采用这样更加严格的处理策略。

由此可见,确认帧必须表明这样两个含义:①第n – 1号帧和这以前的各帧收到了。②我期望收到第n号帧。确认帧还可能包含这样的含义:③你发送过来的这个帧,我收到了。有时,一个确认帧同时具有这三个含义,但在很多情况下,一个确认帧仅具有前面两个含义,而并不表示确认刚刚收到的帧。

这里我们也要指出,以上结论并非惟一的策略

AB都有数据帧向对方发送时,确认信息可以放在数据帧中捎带地发送给对方。由于在连续ARQ协议中,确认序号具有累计性。因此没有必要对收到的每一个数据帧都发送确认帧。像以上的例子,如果B也有一个数据帧要发送给A,那么就可以把ACK7的确认信息放在自己发送的数据帧中。当A收到了B的数据帧,就可以知道B已经收到了6号帧和这以前的各帧,因此就可以发送后续的各帧了。

当然还可以这样做:当B在一定时间内没有收到A的正确序号的数据帧时,就向A发送表示期望接收某个帧的信息。这样也可防止死锁的出现。


问题3-13:在问题3-12中,如果B发送的确认帧在传输过程中总是出错,那么A也是一直重复发送DATA0DATA67个数据帧。在这种情况下,连续ARQ协议还正确吗?

:这和连续ARQ协议是否正确并无关系

即使在“只有A有数据要发送给B,而B没有数据要发送给A”的简单情况下。连续ARQ协议的运行也要求通信线路提供两个通信信道——正向信道和反向信道。正向信道传送A发送给B的数据帧,反向信道传送B发送给A的确认帧。

如果B发送的确认帧在传输过程中总是出错(每次传输确认帧时一定出错),那么这就表明反向通信信道根本不能使用(请注意:通信信道在传输数据时“经常出错”和“总是出错”是很不一样的。连续ARQ协议可以对付经常出错的通信信道,但无法对付总是出错的信道)。也就是说,这种情况表明,若通信信道在传输数据时总是出错,那么这时使用连续ARQ协议的物质条件并不具备。

总之,连续ARQ协议的正确与否,和通信信道能不能使用,是两个不同的概念,不可混淆。


问题3-14能否归纳一下连续ARQ协议都有哪些主要功能和特别要注意的地方?

:连续ARQ协议的主要功能可以归结为以下两点:

1.       在不可靠的链路上实现可靠交付。

这点可从用下面的图来说明。

因为出错的帧都被CRC检验器悄悄地丢弃了,因此接收端收下的帧都是无传输差错的帧。数据链路层协议还保证了收到的帧的顺序和发送端发送的顺序一致,因为序号不对的帧都不接受。因此,数据链路层的连续ARQ协议就在不可靠的链路上实现了可靠交付,即发送端发送什么,接收端就收到什么。所有的重传对上面都是透明的。

总之,可靠交付就是:无差错、无丢失、无重复、按顺序

2.       支持了流量控制。

这个问题请详见问题3-7,这里不重复讨论了。在链路层流量控制的思想就是:当接收端来不及接收时(如缓存空间不够或CPU忙不过来),就可以通过暂时不发送确认帧来降低发送端发送数据帧的速率。

 

关于连续ARQ协议特别要注意的地方就是对出错帧和不按序到达的帧的处理。

对出错帧的处理

CRC检验器自动将其丢弃,协议没有其他动作。但为了不白白浪费时间,可以规定,如果一个帧重传多少次都一直出错,那么就不要再继续重传下去,而是报告上层软件,指出通信线路不可用。

对不按序到达的帧的处理(这个帧并无传输差错)

如果接收端没有数据帧要发送,接收端丢弃这个帧,同时向发送端重复发送已经发送过的最后一个确认帧。

如果接收端有数据帧要发送,接收端可以在就是下面要发送的自己的数据帧中,把确认信息捎带发送给对方。这个确认信息就是“期望收到对方的某个编号的数据帧。

接收端也可以每隔一段时间,向发送端重复发送已经发送过的最后一个确认帧。


问题3-2当数据链路层使用PPP协议或CSMA/CD协议时,既然不保证可靠传输,那么为什么对所传输的帧进行差错检验呢?

:当数据链路层使用PPP协议或CSMA/CD协议时,在数据链路层的接收端对所传输的帧进行差错检验是为了不将已经发现了有差错的帧(不管是什么原因造成的)收下来。如果在接收端不进行差错检测,那么接收端上交给主机的帧就可能包括在传输中出了差错的帧,而这样的帧对接收端主机是没有用处的。

换言之,接收端进行差错检测的目的是:“上交主机的帧都是没有传输差错的,有差错的都已经丢弃了”。或者更加严格地说,应当是:“我们以很接近于1的概率认为,凡是上交主机的帧都是没有传输差错的”。


问题3-5除了差错检测外,面向字符的数据链路层协议还必须解决哪些特殊的问题?

:最主要的就是要解决帧定界透明传输的问题。

帧定界就是要使接收端能够知道一帧的开始和结束是在什么地方。面向字符的数据传输就是所传输的数据全都是一个个的字符,例如ASCII字符。因此,在每一帧的开始和结束的地方,必须要有一个特殊的字符来作为标志,如下图所示。

字符SOH代表Start Of Header(首部开始),而EOT代表End Of Transmission(传输结束)。请注意,SOHEOT都是ASCII码中的控制字符。SOH的十六进制编码是01,而EOT的十六进制编码是04。不要误认为SOH是“S”“O”“H”三个字符,也不要误认为EOT是“E”“O”“T”三个字符。

解决了帧定界后,在接收端就可以确定一个帧的开始和结束。剩下的问题就是透明传输的问题。

透明传输实际上就是随便什么字符都可以传输。但设想我们在帧中传送的字符出现了一个控制字符“EOT”。那么接收端收到这样的数据后,就会将原来的SOH和数据中的“EOT”错误地解释为一个帧,但对后面剩下的字符根本就无法解释(见下图)。

像这样的传输显然就不是“透明传输”,因为当遇到数据中的字符“EOT”就传不过去了,它被接收端解释为控制字符。实际上此处的字符“EOT”并非控制字符而是一般数据。

为了解决透明传输问题,就必须设法将数据中可能出现的控制字符“SOH”和“EOT”在接收端不解释为控制字符。方法是:在数据中出现字符“SOH”或“EOT”时就将其转换为另一个字符,而这个字符是不会被错误解释的。但所有字符都有可能在数据中出现。于是就想出这样的办法:将数据中出现的字符“SOH”转换为“ESC”“x”这样两个字符,将数据中出现的字符“EOT”转换为“ESC”“y”这样两个字符。而当数据中出现了控制字符“ESC”时,就将其转换为“ESC”“z”这样两个字符。这种转换方法就能够在接收端正确地还原为原来的数据。“ESC”是转义符,它的十六进制编码是1B

下图表示在数据中出现了四个控制字符“ESC”“EOT”“ESC”“SOH”。按以上规则转换后的数据如下图所示。

  

   读者可以很容易地看出,在接收端只要按照以上转换规则进行相反的转换,就能够还原出原来的数据(例如遇到“ESC”“z”就还原为“ESC”)。

以上就是实现透明传输的原理。


问题3-6为什么计算机进行通信时发送缓存和接收缓存总是需要的?

:当计算机的两个进程(在同一台机器中或在两个不同的机器中)进行通信时,如果发送进程将数据直接发送给接收进程,那么这两个动作(一个是发送,另一个是接收)是非常难协调好的。这是因为计算机的动作很快,如果在某一时刻接收进程开始执行接收的动作,但发送进程的发送动作稍微早了一点或稍微晚了一点(在收发双方事先未进行同步的情况下,发送时刻不可能恰好和接收时刻精确地重合),这都会使接收失败。因此,在计算机进程之间的通信过程中,广泛使用缓存。

缓存就是在计算机的存储器中设置的一个临时存放数据的空间。发送进程将欲发送的数据先写入缓存,然后接收进程在合适的时机读出这些数据。

缓存有点像邮局在街上设立的邮筒。我们可以在我们方便时将欲发送的信件丢到邮筒中。邮局的邮递员按照他的计划在适当时候打开邮筒,将大家投入的信件取走,交到邮局,进行下一步处理。

缓存可以很好地解决发送速率和接收速率不一致的矛盾,还可以很方便地进行串并转换,即比特流串行写入并行读出,或并行写入串行读出。


问题3-7在教材中的3.3.3节提到“发送窗口用来对发送端进行流量控制”。但在发送窗口和接收窗口的共同作用下可以在数据传输时提高对信道的利用率。那么到底应当怎样看待发送窗口的作用?

:在数据传输时,我们总是希望得到较高的信道利用率。如果信道数据率为1 Mb/s,那么我们一般不会故意以很低的数据率(例如,每秒钟发送10 bit)进行数据的传输。实际上,发送端一般总是希望以尽可能高的速率传输数据。但是,不对发送端的发送速率加以限制是不行的,因为若数据发送得太快,则在接收端就可能会来不及接收。此外,如果数据一下子发送得太多,那么当出现差错时就会导致大量已发送出的数据的重传,而这反而降低了传输效率。因此,尽管发送端希望以尽可能高的速率发送数据,但还是要对发送端的发送数据的速率加以限制。这就是“流量控制”。所以流量控制的目的还是要使信道的利用率得到提高。不要一看到流量控制就以为是一种消极的措施,以为是要使信道利用率变得更低。

通常采用的限制发送端发送数据速率的有效方法就是发送窗口。用发送窗口对发送端进行流量控制,使得在接收端能够来得及接收的条件下,尽量提高信道的利用率。实际上,正是有了流量控制,发送端发送数据的速率才和接收端接收数据的能力相适应,这样才最终使得信道的利用率得到提高。

在讨论发送窗口的作用时不应忘记,发送窗口和序号的关系很大。如果发送窗口设置得很大,但序号空间不够大还是不行的(参见教材中的3.3.3节)。

利用发送窗口还可以进行网络的拥塞控制。不过现在因特网都由运输层的TCP协议进行对网络的拥塞控制。


问题3-8在关于数据链路层工作原理的叙述中,经常会见到两个不同的名词——“丢失”和“丢弃”。它们有区别吗?

:有些区别。

“丢失”通常使用在这样的情况:AB发送了数据帧,但B根本没有收到。至于B为什么没有收到,我们不感兴趣,因为我们现在不打算探讨B没有收到数据帧的原因,或者我们也不想弄清楚这个数据帧究竟是在哪一个具体环节上丢失的。这里我们关心只是“B没有收到这个数据帧”。因此,我们就说,这个数据帧丢失了。显然,这里的“丢失”并不是“我们故意把这个帧丢掉”。

“丢弃”通常使用在这样的情况:AB发送了数据帧,B收到后,数据链路层协议使用CRC检验器(硬件)对其进行差错检查。发现有差错,于是我们说,CRC检验器自动把这个数据帧丢弃了。因此,“丢弃”往往会明确“是丢弃了数据帧”,并且是“主动把它丢掉的”。在这里,是CRC检验器主动丢弃了有差错的帧(为什么要主动丢掉这个出错帧呢?因为出错帧已经没有用处了。如果不把它丢掉而继续把它向前转发,并且一直交付到目的主机,那么最终这个出错帧还是要被丢弃的。然而这样会浪费许多网络资源。或者说,现在丢弃出错帧产生的损失小些,而最后才丢弃出错帧产生的损失则更大些)。但这样的“丢弃”在效果上和“B没有收到这个帧”是一样的,B这时也不会发送任何应答信息。因此,人们常常用“静悄悄地丢弃(discard silently)来表述这种对出错帧的丢弃。在这种情况下,我们也可以换一种方法说:“AB发送了数据帧,但B没有收到,这个帧丢失了。”这样说,表明我们不想去追查帧丢失的原因。总之,被“丢弃”的帧也是“丢失”了的帧,但“丢弃”具有“主动丢弃”或“有意丢弃”的意思。

但也还有另一种“丢弃”的方式。A发送的数据帧无差错地传送到B,并顺利地通过了CRC的差错检验。这个帧在传输过程中没有产生差错。但B的链路层协议在进一步检查这个帧时,发现这个帧的序号错了(例如,是个重复帧)。因此,数据链路层协议就丢弃这个重复帧。但与此同时,协议规定,B还要向A发送确认帧,即重复发送原来发送过的最后一个确认帧。这样的“丢弃” 显然和“丢失”是有些区别的。因为这个帧最初还是传送到B了,B先收了下来,但后来发现是个重复帧,就又把它丢弃了。在效果上看,“丢弃”和“丢失”有相似之处。但“丢弃”往往会涉及到丢弃这个帧的原因。


问题3-9停止等待协议中的确认帧如果没有序号会出现什么问题?

:如果发送端对超时重传时间设定得太短,就有可能出现问题。我们用下面的例子说明。

     A发送数据帧DATA0

     A设定的超时重传时间太短(图中蓝色短的竖线表示超时重传时间)。在超时时间到后,因为没有收到确认,就重传DATA0

     B收到DATA0,发送ACK,表示对0号帧的确认。

     A收到B发送的这个确认,于是发送新的数据帧,即1号帧DATA1。但这个数据帧在传输中出错。在到达B时被CRC检验器丢弃。因此B并不知道A发送了DATA1

     B收到A超时重传的DATA0,丢弃这个重复帧,但仍发送确认帧。B必须发送这个确认帧,因为B认为,A发送重复的DATA0有可能是因为上次发送的确认帧丢失了。

     A收到B的确认帧。虽然B认为所发送的这个确认帧是确认A0号帧,但A以为B对自己刚发送过的DATA1的确认。因此,A接着就发送下一个新的数据帧DATA0

     B又收到了DATA0以为又是一个重复帧,再丢弃,同时仍然向A发送确认帧(B认为还是对最早收到的那个DATA0的确认)。

     A收到确认帧,继续发送另一个新的数据帧DATA1。如果传输正确,B就会收下。B以为这是紧接着在一开始的DATA0后面的一个新帧。但实际上,已经有两个新的数据帧没有收到。A也无法发现这点。

A一共发送了5个数据帧:①、②(重复帧)、④、⑥和⑧。但B漏掉了④和⑥。

从以上所述可以看出,我们通过一个例子,说明确认帧不使用序号将使协议失败。因此,为了确保在任何不利的情况下,停止等待协议都能够正常工作,就应当在确认帧中使用序号

当然,由于数据链路层协议是使用在点对点的链路上,而在条件固定的链路上,数据的往返时延一般都比较稳定,不会忽大忽小地大幅度起伏变化。在这种情况下,如果选择合适大小的超时重传时间,那么确认帧没有序号的停止等待协议也是可以工作的。因此,在讨论停止等待协议的原理时,有时也省略了确认帧中的序号

从严格的意义上讲,既然协议应当在任何不利的情况下都能够正常工作,因此完整的停止等待协议的确认帧是应当有序号的。本书第4版从第2次印刷起改成确认帧带序号。

    对上述例子,如果在确认帧中使用序号,那么B发送的前两个确认帧都应当是ACK1ACK1表示“我收到了DATA0,我期望接收DATA1)。A在收到帧⑤后(即收到ACK1),就知道这是BDATA0的确认,而不是对DATA1的确认。因此这时A应当重传DATA1而不是发送新的DATA0。这样就不会出现协议失败的现象。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值