实验 停止等待协议分析与协议模拟实现
一、实验目的
1)了解停止等待协议的原理
2)掌握协议分析的方法和过程
3)通过程序模拟停止等待协议的工作过程
二、实验要求
1)根据示例,编写停止等待协议的模拟程序,演示停止等待协议的工作过程。
2)撰写实验报告。
三、协议概述
如果链路是理想的传输信道,1)所传送的任何数据既不会出差错也不会丢失;2)如果不管发送方以多快的速率发送数据,接收方总是来得及收下,并及时上交主机。
如果存在这样的传输信道,数据链路层协议也是不需要的。信道不会出错,而且接收方缓存的容量为无限大而永远不会溢出;或接收速率与发送速率绝对精确相等。在上述两个假定的情况下,数据链路层当然就不需要任何协议就可以保证数据传输的正确。
这就是说,传输数据的信道是不可靠的(即不能保证所传的数据不产生差错),并且还需要对数据的发送端进行流量控制。
在大多数协议中,流量控制是一组过程,这组过程是用来告诉发送方在等待接收方的应答信号之前最多可以传送多少数据。流量控制有两个要点:
(1)数据流不能使接收方过载。任何接收设备都有一个处理输入数据的速率限制,并且存储输入数据的存储器容量也是有限的。接收设备必须在达到这些限制之前通知发送设备并且请求发送设备发送较少的数据帧或是暂停一会儿。在使用输入数据之前,需要对数据进行校验和处理,因此,每个接收设备都有一块存储器,叫做缓冲区,用于存放未来得及处理的数据帧。如果缓冲区将满,接收方也必须能够通知发送方暂停传输,直到接收方又能接收数据。
(2)应答。随着数据帧的到来,接收方对他们进行应答,可以每收到一帧给一个应答,也可以一次对若干帧进行应答。如果一个帧到达时已经被破坏,接收方发送一个否定应答帧(NAK)。
在数据链路层,差错控制主要指错误检测和重传方法。在一个帧中出现任何一个错误,接收方就返回一个否定应答帧,出错的帧就被发送方重新传送。这个过程被称作自动重复请求(ARQ)。数据被重传的情况有三种:帧破坏、帧丢失和应答帧丢失。
流量控制和差错控制是结合在一起实现的,共有两种实现流量控制和差错控制的技术:停止等待协议和滑动窗口协议。
【图解】
【总结】使用的链路层传输控制协议
发方:
发送一个数据帧后,必须等待收方的确认帧才可以发送下一个数据帧;
为防止发送的数据或该数据的确认帧丢失,发方内部设置一个定时器,当超过定时时间发方仍未收到确认帧时,发方重发该帧;
为防止确认帧丢失而造成收方收到重复帧的情况,发方给每一个数据帧带上一个序列号。(1个比特位)
收方:
在收方接收错误时,收方发一否认帧,要求发方重发该帧;
收方收到相同的两帧时,丢掉该数据帧并重发确认帧。
【流程示意图】
图a 停止等待协议的基本工作过程 图b 数据包的丢失和确认信息的丢失示意图
四、协议分析
可以用多种方法来表示一个有限状态机,对协议进行描述。以下是在某种假定条件下的协议分析。
1)状态迁移图
设甲、乙双方进行半双工通信,甲发信息帧,乙回送确认帧。双方约定采用停止等待协议,因此甲方仅需用 1 比特来编号。下面将 0 号帧和 1 号帧分别记为 [0] 和 [1] 。当收到有差错的帧时,则丢弃此帧,同时不发任何应答帧。当收到无差错的帧但序号不正确时,要发确认帧,同时要丢弃此帧,不送主机。我们还假定收方在准备发送确认帧 ACK 时,暂不接收外面发来的帧。这样,我们就得出甲乙双方各自的有限状态机,如下图所示。
图中椭圆形符号为状态符号,其右方数字为状态标号,椭圆形内的字表示状态的意义。带箭头的直线或弧线表示状态的变迁,而直线或弧线旁边的字代表自动机的输入事件。例如,甲方自动机中的 “发 [0] ” 就是一个输入事件。图中在某些方面进行了一些简化。例如,当乙方处于 “期望收 [0] ” 的状态时,若收到无差错的 [1] 帧,仍然应当先进入 “准备发 ACK ” 状态,然后才发出 ACK 。但这里就将 “收 [1] ” 与 “发 ACK ” 合并成为一个事件。其余部分不再详述。
2)状态迁移表方法
除状态转移图之外,还可用状态迁移表(又称为判决表)来表示自动机的工作。例如对甲方的自动机,可得出如下表所示的状态变迁表。表中的项目代表 “新的状态/输出” 。例如在状态为 x1 时,若输入为 “发 [0] ” ,则状态从 x1 转为 x2,同时输出为 “ [0] 帧 ” 。当输出为 “-” 时表示无输出。
3)混合描述方法
比较实用的办法是合并一些状态,即考虑一些次要的细节。例如,甲方的状态 1 和状态 2,状态 3和状态 4 都可以合并,乙的状态 1 和状态 4,状态 2 和状态 3 也可进行合并。这样可以用 3 个字符 XYZ 表示整个系统的状态,其中 X=0 或 1,对应于甲方准备发 [0] 或 [1](包括发完后等待 ACK 的状态);Y=0 或 1,对应于乙方期望收到 [0] 或 [1];Z=0、l、A或-,
对应于信道上传送的是 [0]、[1]、ACK 或出现了差错(包括丢失)。这样,就可得出 图3-24 的有限状态机。在弧线(或直线)旁边注明的数字为状态变迁的标号,其意义也注明在 图3-24 的右方。
假设系统一开始处在(000)状态。这表示甲发完 [0],乙期望收到 [0],而信道上传送的也是 [0]。在无差错的情况下,系统的状态仅在 4 个状态中循环:(000)→(01A)→(111)→(10A)→(000)→ ‥‥。从理论上讲,应当共有 2 × 2 × 4 = 16 种不同的状态。去掉没有意义的组合后,还剩下 10 种状态,而导致状态变迁的输人事件共有 9 种( 标号 0 ~ 8 )。
这种有限状态机可帮助我们检查协议是否正确。例如,检查一下乙方会不会连续将两个 0 号帧送交主机。这相当于检查一下会不会出现这种情况,即在两次出现状态变迁 1 之间不出现状态变迁 3 。仔细检查 图3-24 就可发现这种情况是不会发生的。同样方法也可用来排除连续将两个 1 号帧送交主机的可能。
再检查一下会不会发生甲方连续改变状态 2 次( 如从 0 到 1,再回到 0 )而乙方的状态未改变。这种情况相当于出现了未被发现的报文丢失。可以看出,这种情况也是不存在的。
协议必须不出现死锁。死锁的出现是因为存在着这样的一种状态子集,其特点是:从这一子集内变迁到子集外是不可能的,而在这一子集内状态的变迁总是局限于子集内的几个状态。可以看出,图3-24 所示的自动机没有死锁现象。
有限状态机模型的缺点就是当描述比较复杂的协议时,状态的数目将急剧增加,以致很难用它来清晰地描述协议。
五、协议验证
协议的 “验证” 一词包括了“validation”与“verification”,包括了协议语法和语义的验证。一般
说来,协议的验证包括以下几个方面的内容:
(l)可达性(reachability) 验证协议的各种可能状态之间的可达关系。如果从状态 A 到状态 B 的变迁不可能发生(直接或间接),则从状态 A 到状态 B 是不可达的。如果协议从初始状态到某个状态不可达,则表明协议有错误。
(2)死锁 最典型的死锁是协议中各实体都处于这样的一种等待状态,即只有在“某一事件”发生后才能做进一步的动作,但在该状态下,这个“某一事件”却不可能发生。死锁发生时,协议所处的状态称为死锁状态。
死锁的另一种形式是协议处于无限的死循环中,而没有别的事件可使协议从这一循环中解脱出来。例如,协议无限制地执行超时重发操作,但总是收不到对方的确认信息。这种形式的死锁称为活锁(livelock),表示整个协议的状态还是在变化的,不过不能脱离这种死循环状态而已。
(3)有界性
检验协议的某些成分或参数(例如通道容量、窗口大小)是否有界。
(4)完整性
检验协议是否缺少应有的处理,以及有无非期待的接收(即错收)。
(5)可恢复性或自同步性
这是当出现差错后,协议能否在有限的步骤内返回到正常状态(包括初始态)下执行。
(6)状态二义性
一个进程在某一时刻只允许具有一个稳定状态。所谓稳定状态是指当通信双方的通道为空时的进程状态。若在某一时刻进程可以有不只一个的稳定状态,则称该进程的状态为二义状态。
(7)动作序列
将协议的动作按执行顺序组合起来,即构成协议的动作序列。协议的动作序列集合又称为协议的语言。检查协议的动作序列,可以验证协议有无错误动作或无用动作。
(8)通道溢出
检查当通道中的数据已达到通道的最大容量后,是否有某个进程仍然试图向通道中放入数据。
六、参考代码
如下为Java参考代码
1)Sender.java
import java.io.*;
import java.*;
public class Sender extends Thread{
private String address = "127.0.0.1";
private int port = 9878;
public Sender() {
Socket client = null ;
for(int i=0;i<10; i++)
{
client = new Socket() ;
Msg data = new Msg(i%2);
InetSocketAddress isa = new InetSocketAddress(this.address,this.port);
try
validation verification {
t(isa,10000);
ObjectOutputStream out = new OutputStream());
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论