实验 停止等待协议分析与协议模拟实现_第1页
实验 停止等待协议分析与协议模拟实现_第2页
实验 停止等待协议分析与协议模拟实现_第3页
实验 停止等待协议分析与协议模拟实现_第4页
实验 停止等待协议分析与协议模拟实现_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、实验 停止等待协议分析与协议模拟实现一、实验目的1了解停止等待协议的原理2掌握协议分析的方法和过程3通过程序模拟停止等待协议的工作过程二、实验要求1根据例如,编写停止等待协议的模拟程序,演示停止等待协议的工作过程。2撰写实验报告。三、协议概述如果链路是理想的传输信道,1所传送的任何数据既不会出过失也不会丧失;2如果不管发送方以多快的速率发送数据,接收方总是来得及收下,并及时上交主机。如果存在这样的传输信道,数据链路层协议也是不需要的。信道不会出错,而且接收方缓存的容量为无限大而永远不会溢出;或接收速率与发送速率绝对精确相等。在上述两个假定的情况下,数据链路层当然就不需要任何协议就可以保证数据传

2、输的正确。这就是说,传输数据的信道是不可靠的即不能保证所传的数据不产生过失,并且还需要对数据的发送端进行流量控制。在大多数协议中,流量控制是一组过程,这组过程是用来告诉发送方在等待接收方的应答信号之前最多可以传送多少数据。流量控制有两个要点:1数据流不能使接收方过载。任何接收设备都有一个处理输入数据的速率限制,并且存储输入数据的存储器容量也是有限的。接收设备必须在到达这些限制之前通知发送设备并且请求发送设备发送较少的数据帧或是暂停一会儿。在使用输入数据之前,需要对数据进行校验和处理,因此,每个接收设备都有一块存储器,叫做缓冲区,用于存放未来得及处理的数据帧。如果缓冲区将满,接收方也必须能够通知

3、发送方暂停传输,直到接收方又能接收数据。2应答。随着数据帧的到来,接收方对他们进行应答,可以每收到一帧给一个应答,也可以一次对假设干帧进行应答。如果一个帧到达时已经被破坏,接收方发送一个否认应答帧NAK。在数据链路层,过失控制主要指错误检测和重传方法。在一个帧中出现任何一个错误,接收方就返回一个否认应答帧,出错的帧就被发送方重新传送。这个过程被称作自动重复请求(ARQ)。数据被重传的情况有三种:帧破坏、帧丧失和应答帧丧失。流量控制和过失控制是结合在一起实现的,共有两种实现流量控制和过失控制的技术:停止等待协议和滑动窗口协议。【图解】【总结】使用的链路层传输控制协议发方:发送一个数据帧后,必须等

4、待收方确实认帧才可以发送下一个数据帧;为防止发送的数据或该数据确实认帧丧失,发方内部设置一个定时器,当超过定时时间发方仍未收到确认帧时,发方重发该帧;为防止确认帧丧失而造成收方收到重复帧的情况,发方给每一个数据帧带上一个序列号。1个比特位收方:在收方接收错误时,收方发一否认帧,要求发方重发该帧;收方收到相同的两帧时,丢掉该数据帧并重发确认帧。【流程示意图】发送数据包1接收正确认ACK发送数据包2重发数据包2发送数据包3接收负确认NAK接收正确认ACK接收正确认ACK接收数据包1正确发送正确认ACK接收数据包2错误发送负确认NAK接收数据包2正确发送正确认ACK接收数据包3正确发送正确认ACK发

5、送方接收方发送数据包0接收正确认ACK1发送数据包1超时重传数据包1超时重传数据包1接收正确认ACK0接收数据包0正确发送正确认ACK1接收数据包1正确发送正确认ACK0接收数据包1正确(抛弃)发送正确认ACK0发送方接收方发送数据包0超时超时图a 停止等待协议的根本工作过程 图b 数据包的丧失和确认信息的丧失示意图四、协议分析可以用多种方法来表示一个有限状态机,对协议进行描述。以下是在某种假定条件下的协议分析。1状态迁移图设甲、乙双方进行半双工通信,甲发信息帧,乙回送确认帧。双方约定采用停止等待协议,因此甲方仅需用 1 比特来编号。下面将 0 号帧和 1 号帧分别记为 0 和 1 。当收到有

6、过失的帧时,那么丢弃此帧,同时不发任何应答帧。当收到无过失的帧但序号不正确时,要发确认帧,同时要丢弃此帧,不送主机。我们还假定收方在准备发送确认帧 ACK 时,暂不接收外面发来的帧。这样,我们就得出甲乙双方各自的有限状态机,如下列图所示。图中椭圆形符号为状态符号,其右方数字为状态标号,椭圆形内的字表示状态的意义。带箭头的直线或弧线表示状态的变迁,而直线或弧线旁边的字代表自动机的输入事件。例如,甲方自动机中的 “发 0 就是一个输入事件。图中在某些方面进行了一些简化。例如,当乙方处于 “期望收 0 的状态时,假设收到无过失的 1 帧,仍然应领先进入 “准备发 ACK 状态,然后才发出 ACK 。

7、但这里就将 “收 1 与 “发 ACK 合并成为一个事件。其余局部不再详述。2状态迁移表方法除状态转移图之外,还可用状态迁移表又称为判决表来表示自动机的工作。例如对甲方的自动机,可得出如下表所示的状态变迁表。表中的工程代表 “新的状态输出 。例如在状态为 x1 时,假设输入为 “发 0 ,那么状态从 x1 转为 x2,同时输出为 “ 0 帧 。当输出为 “ 时表示无输出。3混合描述方法比拟实用的方法是合并一些状态,即考虑一些次要的细节。例如,甲方的状态 1 和状态 2,状态 3和状态 4 都可以合并,乙的状态 1 和状态 4,状态 2 和状态 3 也可进行合并。这样可以用 3 个字符 XYZ

8、表示整个系统的状态,其中 X0 或 1,对应于甲方准备发 0 或 1包括发完后等待 ACK 的状态;Y0 或 1,对应于乙方期望收到 0 或 1;Z0、l、A或,对应于信道上传送的是 0、1、ACK 或出现了过失包括丧失。这样,就可得出 图3-24 的有限状态机。在弧线或直线旁边注明的数字为状态变迁的标号,其意义也注明在 图3-24 的右方。假设系统一开始处在000状态。这表示甲发完 0,乙期望收到 0,而信道上传送的也是 0。在无过失的情况下,系统的状态仅在 4 个状态中循环:00001A11110A000 。从理论上讲,应当共有 2 × 2 × 4 = 16 种不同的状

9、态。去掉没有意义的组合后,还剩下 10 种状态,而导致状态变迁的输人事件共有 9 种 标号 0 8 。这种有限状态机可帮助我们检查协议是否正确。例如,检查一下乙方会不会连续将两个 0 号帧送交主机。这相当于检查一下会不会出现这种情况,即在两次出现状态变迁 1 之间不出现状态变迁 3 。仔细检查 图3-24 就可发现这种情况是不会发生的。同样方法也可用来排除连续将两个 1 号帧送交主机的可能。再检查一下会不会发生甲方连续改变状态 2 次 如从 0 到 1,再回到 0 而乙方的状态未改变。这种情况相当于出现了未被发现的报文丧失。可以看出,这种情况也是不存在的。协议必须不出现死锁。死锁的出现是因为存

10、在着这样的一种状态子集,其特点是:从这一子集内变迁到子集外是不可能的,而在这一子集内状态的变迁总是局限于子集内的几个状态。可以看出,图3-24 所示的自动机没有死锁现象。有限状态机模型的缺点就是当描述比拟复杂的协议时,状态的数目将急剧增加,以致很难用它来清晰地描述协议。五、协议验证协议的 “验证 一词包括了“validation与“verification,包括了协议语法和语义的验证。一般说来,协议的验证包括以下几个方面的内容: l可达性reachability 验证协议的各种可能状态之间的可达关系。如果从状态 A 到状态 B 的变迁不可能发生直接或间接,那么从状态 A 到状态 B 是不可达的

11、。如果协议从初始状态到某个状态不可达,那么说明协议有错误。 2死锁 最典型的死锁是协议中各实体都处于这样的一种等待状态,即只有在“某一事件发生后才能做进一步的动作,但在该状态下,这个“某一事件却不可能发生。死锁发生时,协议所处的状态称为死锁状态。 死锁的另一种形式是协议处于无限的死循环中,而没有别的事件可使协议从这一循环中解脱出来。例如,协议无限制地执行超时重发操作,但总是收不到对方确实认信息。这种形式的死锁称为活锁livelock,表示整个协议的状态还是在变化的,不过不能脱离这种死循环状态而已。3有界性检验协议的某些成分或参数例如通道容量、窗口大小是否有界。4完整性检验协议是否缺少应有的处理

12、,以及有无非期待的接收即错收。5可恢复性或自同步性这是当出现过失后,协议能否在有限的步骤内返回到正常状态包括初始态下执行。6状态二义性一个进程在某一时刻只允许具有一个稳定状态。所谓稳定状态是指当通信双方的通道为空时的进程状态。假设在某一时刻进程可以有不只一个的稳定状态,那么称该进程的状态为二义状态。7动作序列将协议的动作按执行顺序组合起来,即构成协议的动作序列。协议的动作序列集合又称为协议的语言。检查协议的动作序列,可以验证协议有无错误动作或无用动作。8通道溢出检查当通道中的数据已到达通道的最大容量后,是否有某个进程仍然试图向通道中放入数据。六、参考代码如下为Java参考代码import ja

13、va.io.*;import .*;public class Sender extends Threadprivate 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

14、.port); try client.connect(isa,10000); ObjectOutputStream out = new ObjectOutputStream(client.getOutputStream(); out.writeObject(data); System.out.println("发送分组 "+data.getN_msg(); BufferedReader br = new BufferedReader(new InputStreamReader(client.getInputStream(); String str = br.readLine

15、(); if(str.equals("resend1") System.out.println("分组丧失,重发"); i-; out.flush(); out.close(); out = null ; data = null ; client.close();client = null ; continue; else if(str.equals("resend2") System.out.println("ACK丧失,重发"); i-; out.flush(); out.close(); out = null

16、 ; data = null ; client.close();client = null ; continue; else System.out.println("n"+"接收ACK"+data.getN_msg()+" 发送分组"+(data.getN_msg()+1)%2); out.flush(); out.close(); out = null ; data = null ; client.close();client = null ; catch(java.io.IOException e) System.out.prin

17、tln("Socket error!" ); System.out.println("IOException :" + e.toString(); try this.sleep(8000); catch (InterruptedException e) e.printStackTrace(); public static void main(String args) new Sender();import java.io.*;import .*;public class Recver extends Thread private boolean OutS

18、erver = false; private static ServerSocket server ; private static int ServerPort = 9878; public static void main(String args) (new Recver().start();public Recver() try server = new ServerSocket(ServerPort); catch(java.io.IOException e) System.out.println("Socket啟動有問題 !" ); System.out.prin

19、tln("IOException :" + e.toString(); public void run() Socket socket; ObjectInputStream in ; System.out.println("伺服器已啟動 !" ); while(!OutServer) socket = null; try synchronized(server) socket = server.accept(); socket.setSoTimeout(15000); in = new ObjectInputStream(socket.getInputS

20、tream(); Msg data = (Msg)in.readObject(); System.out.println("发送端正在发送的内容"+data.getN_msg()+" 状态:"+data.getInfo(); if(data.getInfo().equals("losePackage") System.out.println("分组丧失"); DataOutputStream dos = new DataOutputStream(socket.getOutputStream(); dos.write

21、Bytes("resend1"+'n'); dos.close(); else if(data.getInfo().equals("loseAck") System.out.println("ACK丧失"); DataOutputStream dos = new DataOutputStream(socket.getOutputStream(); dos.writeBytes("resend2"+'n'); dos.close(); else System.out.println(&

22、quot;接收分组 "+data.getN_msg()+" 发送ACK "+data.getN_msg(); DataOutputStream dos = new DataOutputStream(socket.getOutputStream(); dos.writeBytes("ok"+'n'); dos.close(); System.out.println(); in.close(); in = null ; socket.close(); catch(java.io.IOException e) System.out.println("Socket error !" ); System.out.println("IOException :" +

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论