您所在的位置:读书频道 > 网络与维护 > 网络协议 > 7.4.5 实用的停止等待协议

7.4.5 实用的停止等待协议

2007-07-05 12:56 王达 电子工业出版社 字号:T | T
一键收藏,随时查看,分享好友!

本章主要介绍局域网、广域网,以及OSI各层主要功能及其工作原理这些基本的计算机网络通信技术,同时还将介绍计算机网络数据通信中常见的技术指标和参数。这些都是我们平常进行各种网络工程施工和系统设计的基础和前提。本节是实用的停止等待协议介绍。

AD:

7.4.5  实用的停止等待协议
去掉上一节中提出的两个假设,实用的数据链路层协议应考虑到:传输数据的信道不是可靠的(即不能保证所传的数据不产生差错),并且还需要对数据的发送端进行流量控制。
在传输过程中不出差错的情况下,接收方在收到一个正确的数据帧后即交付给主机B,同时向主机A发送一个确认帧ACK。当主机A收到确认帧ACK后才能发送一个新的数据帧,这样就实现了接收方对发送方的流量控制。
现在假定数据帧在传输过程中出现了差错。由于通常都在数据帧中加上了循环冗余校验CRC,所以节点B很容易检验出收到的数据帧是否会有差错。当发现差错时,节点B 就向主机A发送一个否认帧NAK,以表示主机A应当重发出现差错的那个数据帧。如多次出现差错,就要多次重发数据帧,直至收到节点B发来的确认帧ACK为止。为此,在发送端必须暂时保存已发送过的数据帧的副本。当通信质量太差时,主机A在重发一定的次数后即不再进行重发,而是将此情况向上一层报告。
有时链路上的干扰很严重,或由于其他一些原因,节点B收不到节点A发来的数据帧,这种情况称为帧丢失。发送帧丢失时节点B当然不会向节点A发送任何应答帧。如果节点A要等到节点B的应答信息后再发送下一个数据帧,那么将永远等待下去,于是就出现了死锁现象。
同理,若节点B发过来的应答帧丢失,也会出现这种死锁现象。要解决死锁问题,可在节点A发送完一个数据帧时就启动一个超时定时器。若在超时定时器所设置的定时时间t到了仍收不到节点B的任何应答帧,则节点A就重传前面所发送的这一数据帧。显然,超时定时器设置的定时时间应仔细选择确定。若定时时间选得太短,则还没有收到应答帧就重发了数据帧。若定时选得太长,则要白白浪费许多时间。一般可将定时时间选为略大于从发完数据帧到收到应答帧所需的平均时间。
然而问题并没有完全解决。如果丢失的是应答帧,超时重发将使主机B收到两个同样的数据帧。由于主机B无法识别重复的数据帧,因而在主机B收到的数据中出现了另一种差错-重复帧。要解决重复帧的问题,必须使每一个数据帧带上不同的发送序号。每发送一个新的数据帧就把它的发送序号加1。若节点B收到发送序号相同的数据帧,就表明出现了重复帧。节点B应当丢弃这重复帧,并向节点A发送一个确认帧ACK,因为节点 B已经知道节点A还没有收到上一次发过去的确认帧ACK(有可能此确认帧在传输过程中出错)。
任何一个编号系统的序号所占用的比特数一定是有限的。因此,经过一段时间后序号就会重复。例如,当发送序号占3比特时,共有8个不同的发送序号,从000到111。 当数据帧的发送序号为111时,下一个发送序号就又是000。因此要进行编号就要考虑序号到底要占用多少比特。序号占用的比特数越少,数据传输的额外开销就越小。对于停止等待协议,由于每发送一个数据帧就停止等待,因此用一比特来编号就够了。这样,数据帧中的发送序号(以后记为N(S),S表示发送)就以0和1交替的方式出现在数据帧中。每发一个新的数据帧,发送序号就和上次发送的不一样。用这样的方法就可以使接收方能够区分开新的数据帧和重发的数据帧了。
为了对上面所述的停止等待协议有一个完整而准确的理解,下面给出此协议的算法,希望大家弄清楚算法中的每一个步骤。

在发送方:
(1)从主机取一个数据帧;
(2)V(S)取0(发送状态变量初始化);
(3)使N(S)等于V(S)(将发送状态变量的数值写入发送序号,将数据帧送交发送缓冲区);
(4)将发送缓冲区中的数据帧发送出去;
(5)设置超时定时器(选择适当的超时时间t);
(6)等待(等待以下步骤中的三个事件中最先出现的一个);
(7)若收到确认帧ACK,则从主机取一个新的数据帧;使V(S)等于"1-V(S)"(更新发送状态变量,变为下一个序号),然后转到执行步骤(3);
(8)若接收到否认帧NAK,则转到执行步骤(4)(重发数据帧);
(9)若超时定时器时间到,则转到执行步骤(5)(重发数据帧)。
在接收方:
(1)V(R)取0(接收状态变量初始化,其数值等于欲接收的数据帧的序号);
(2)等待;
(3)当收到一个数据帧,就检查有无传输差错产生(如用前面介绍的CRC),若检查结果正确无误,则执行后续算法;否则转到步骤(8);
(4)若N(S)等于V(R),则执行后续算法;否则转到步骤(8);
(5)将收到的数据帧中的数据部分送交主机;
(6)使V(R)等于"1-V(R)"(更新接收状态变量,准备接收下一个数据帧);
(7)发送确认帧ACK,并转到步骤(2);
(8)发送否认帧NAK,并转到步骤(2)。
从以上算法可知,停止等待协议中需要特别注意的地方,就是在收发端各设置一个本地状态变量(仅占1比特)。
对于状态变量需要注意以下几点。
每发送一个数据帧,都要将发送状态变量V(R)的值(0或1)写到数据帧的发送序号N(S)上。但只有收到一个确认帧ACK后,才能更新发送状态变量V(R)一次,并发送新的数据帧。
在接收端,每接到一个数据帧,就要将发送方在数据帧上设置的发送序号N(S)与本地的接收状态变量V(R)相比较,若二者相等就表明是新的数据帧,否则为重复帧。
在接收端,若收到一个无传输差错的重复帧,则丢弃之,且接收状态变量不变,但此时仍向发送端发送一个确认帧ACK。
注:发送端在发送完数据帧时,必须在其发送缓冲区中保留此数据帧的副本。这样才能在出现差错时进行重发。只要在收到对方发来的确认帧ACK时,方可清除此副本。由于发送端对出错的数据帧进行重发是自动进行的,所以这种差错控制体制常简称为ARQ(Automatic Repeat reQuest),直译是自动重发请求,但真正的意思是自动请求重发。下节将继续介绍。

回书目   上一节   下一节

分享到:

栏目热门

更多>>

  1. Linux服务器配置全程实录
  2. 揭秘--优秀PPT这样制作

热点职位

更多>>

热点专题

更多>>
  • 互联网运营之道
    互联网运营之道
    《互联网运营之道》内容由运营方法论切入,包括运营的
  • 奔跑吧Ansible
    奔跑吧Ansible
    Ansible是近年用户量急速蹿升的开源配置管理工具。在A
  • Redis实战
    Redis实战
    本书深入浅出地介绍了Redis的5种数据类型,并通过多个

读书

Oracle 10g应用指导与案例精讲
本书作者结合自己多年实践经验,从Oracle开发应用中遇到的问题着手,全面系统地介绍Oracle的安装与卸载、数据字典、安全管理以及

最新热帖

更多>>

51CTO旗下网站

领先的IT技术网站 51CTO 中国首个CIO网站 CIOage 中国首家数字医疗网站 HC3i 51CTO学院 区块链第一聚合媒体 zhijiapro