




已阅读5页,还剩6页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
实验 停止等待协议分析与协议模拟实现一、实验目的1)了解停止等待协议的原理2)掌握协议分析的方法和过程3)通过程序模拟停止等待协议的工作过程二、实验要求1)根据示例,编写停止等待协议的模拟程序,演示停止等待协议的工作过程。2)撰写实验报告。三、协议概述如果链路是理想的传输信道,1)所传送的任何数据既不会出差错也不会丢失;2)如果不管发送方以多快的速率发送数据,接收方总是来得及收下,并及时上交主机。如果存在这样的传输信道,数据链路层协议也是不需要的。信道不会出错,而且接收方缓存的容量为无限大而永远不会溢出;或接收速率与发送速率绝对精确相等。在上述两个假定的情况下,数据链路层当然就不需要任何协议就可以保证数据传输的正确。这就是说,传输数据的信道是不可靠的(即不能保证所传的数据不产生差错),并且还需要对数据的发送端进行流量控制。在大多数协议中,流量控制是一组过程,这组过程是用来告诉发送方在等待接收方的应答信号之前最多可以传送多少数据。流量控制有两个要点:(1)数据流不能使接收方过载。任何接收设备都有一个处理输入数据的速率限制,并且存储输入数据的存储器容量也是有限的。接收设备必须在达到这些限制之前通知发送设备并且请求发送设备发送较少的数据帧或是暂停一会儿。在使用输入数据之前,需要对数据进行校验和处理,因此,每个接收设备都有一块存储器,叫做缓冲区,用于存放未来得及处理的数据帧。如果缓冲区将满,接收方也必须能够通知发送方暂停传输,直到接收方又能接收数据。(2)应答。随着数据帧的到来,接收方对他们进行应答,可以每收到一帧给一个应答,也可以一次对若干帧进行应答。如果一个帧到达时已经被破坏,接收方发送一个否定应答帧(NAK)。在数据链路层,差错控制主要指错误检测和重传方法。在一个帧中出现任何一个错误,接收方就返回一个否定应答帧,出错的帧就被发送方重新传送。这个过程被称作自动重复请求(ARQ)。数据被重传的情况有三种:帧破坏、帧丢失和应答帧丢失。流量控制和差错控制是结合在一起实现的,共有两种实现流量控制和差错控制的技术:停止等待协议和滑动窗口协议。【图解】【总结】使用的链路层传输控制协议发方:发送一个数据帧后,必须等待收方的确认帧才可以发送下一个数据帧;为防止发送的数据或该数据的确认帧丢失,发方内部设置一个定时器,当超过定时时间发方仍未收到确认帧时,发方重发该帧;为防止确认帧丢失而造成收方收到重复帧的情况,发方给每一个数据帧带上一个序列号。(1个比特位)收方:在收方接收错误时,收方发一否认帧,要求发方重发该帧;收方收到相同的两帧时,丢掉该数据帧并重发确认帧。【流程示意图】发送数据包1接收正确认ACK发送数据包2重发数据包2发送数据包3接收负确认NAK接收正确认ACK接收正确认ACK接收数据包1正确发送正确认ACK接收数据包2错误发送负确认NAK接收数据包2正确发送正确认ACK接收数据包3正确发送正确认ACK发送方接收方发送数据包0接收正确认ACK1发送数据包1超时重传数据包1超时重传数据包1接收正确认ACK0接收数据包0正确发送正确认ACK1接收数据包1正确发送正确认ACK0接收数据包1正确(抛弃)发送正确认ACK0发送方接收方发送数据包0超时超时图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 表示整个系统的状态,其中 X0 或 1,对应于甲方准备发 0 或 1(包括发完后等待 ACK 的状态);Y0 或 1,对应于乙方期望收到 0 或 1;Z0、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.javaimport java.io.*;import .*;public class Sender extends Threadprivate String address = ; private int port = 9878; public Sender() Socket client = null ; for(int i=0;i10; i+) client = new Socket() ; Msg data = new Msg(i%2); InetSocketAddress isa = new InetSocketAddress(this.address,this.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(); 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 ; 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.println(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();2)Recver.javaimport java.io.*;import .*;public class Recver extends Thread private boolean OutServer = 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.println(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.getInputStream(); 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.writeBytes(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(接收分组 +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
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 劳动仲裁签协议书劳动关系仲裁书(13篇)
- 2025年事业单位工勤技能-湖南-湖南公路养护工一级(高级技师)历年参考题库典型考点含答案解析
- 2025年事业单位工勤技能-湖北-湖北家禽饲养员二级(技师)历年参考题库典型考点含答案解析
- 2025-2030中国线上超市行业经营效益与未来运营模式分析报告
- 医疗与医药行业:医疗信息化在智慧医疗建设中的应用报告
- 2025年事业单位工勤技能-浙江-浙江工程测量员二级(技师)历年参考题库含答案解析(5套)
- 2025年事业单位工勤技能-河南-河南热处理工五级(初级工)历年参考题库含答案解析
- 2025年事业单位工勤技能-河南-河南图书资料员四级(中级工)历年参考题库典型考点含答案解析
- 2024版出租果树合同范本
- 2024-2025年度上海市设备监理师之设备监理合同题库与答案
- 多媒体教室使用的课件
- 2025年军队专业技能岗位文职人员招聘考试(工程机械驾驶员)历年参考题库含答案详解(5卷)
- 2025年下半年广西现代物流集团社会招聘校园招聘笔试参考题库附带答案详解(10套)
- 2025年粉笔辅警考试题库
- 水声传感器技术研究与应用
- 2025年小学教研室教学计划
- 2025年上海市建筑工程施工合同模板
- 手术室护理业务学习
- 贩卖人口罪与强迫劳动罪
- 新员工入职职业道德培训
- 宽带宣传活动方案
评论
0/150
提交评论