您好,欢迎访问三七文档
仪器科学与工程学院信息通信网络概论第一次实验董元220112071/7信息通信网络概论实验报告实验名称:停止等待协议姓名:董元学号:22011207仪器科学与工程学院信息通信网络概论第一次实验董元220112072/7一.实验目的停止等待协议是一种最简单的(但效率较低的)差错和流量控制协议。其基本原理:发送方发完一数据包后,需要等待接收方的应答信息,发送方收到正确认信息ACK认为接收方接收正确,发送方可发送下一数据包;发送方收到负确认信息NAK则认为接收方接收错误,发送方应重发出错的数据包。最终完成数据的传送。本实验基于以上原理,设计一个停等协议传输文件的程序,实现以下目的:1.掌握停止等待协议的基本原理;2.理解数据链路层的主要功能(数据出错控制,数据重复控制,数据丢失控制等等;)3.分析简单的协议数据单元;4.掌握停止等待协议的运行机制;·二.实验条件和环境1.实验基于visualstudio2012的控制台程序,选择这样的平台是因为我们对于该平台更为熟悉,也更方便进行编程和操作,实现相关功能。2.实验采用最基本的文件传输来实践停等协议。3.经实验验证,传输实验可以在单机上本机对本机进行传输,也可在不同的计算机上传输文件。三.实验内容实验中利用虚拟串口在一台电脑上运行两个程序模拟双机通讯。选择虚拟串口,设置合适的波特率实现两程序的通信。停止等待就是在发送方发完数据报后,需要等待接收方应答信息的到来。发送方收到正确认信息ACK:接收方接收正确,发送方可发送下一数据包;发送方收到负确认信息NAK:接收方接收错误,发送方应重发出错的数据包。我们需要做的是:1、通过改变传输速率、数据包长度、模拟长线路等操作定性地观察停止等待协议的效率。2、简化的停止等待协议使用奇偶校验码对传输的正文信息进行校验。奇偶校验实现简单但检错率不高。请查阅相关资料,将本实验的奇偶校验改为循环冗余校验,以提高检错率。四.实验原理CyclicRedundancyCheck循环冗余检验,是基于数据计算一组效验码,用于核对数据传输过程中是否被更改或传输错误。CRC校验码的生成算法主要有直接计算法、查表法和反向生成法。在本次实验中,我采用了查表法计算CRC校验码。它的优点是算法更快捷,便;生成RC校验码速度优于直接计算法;缺点是查表法中的表会占据一部分额外的内存。如何直接计算CRC校验码,就不在此赘述;而反向生成法顾名思义就是将左边的数据看作低位,右边的数据看作高位,与直接计算法类似。下面我就以一个例子为载体,简要介绍一下查表法的原理。假设数据传输过程中需要发送15位的二进制信息g=101001110100001,这串二进制码可表示为代数多项式g(x)=x^14+x^12+x^9+x^8+x^7+x^5+1,其中g中第k位的值,对应g(x)中x^k的系数。将g(x)乘以x^m,既将g后加m个0,然后除以m阶多项式h(x),得到的(m-1)阶余项r(x)对应的二进制码r就是CRC编码。我们将数据按每4位组成1个block,这样g就被分成6个block。如下图示:仪器科学与工程学院信息通信网络概论第一次实验董元220112073/7图一下面的图展示了4次迭代计算步骤,灰色背景的位是保存在寄存器中的。图二经4次迭代,B1被移出寄存器。被移出的部分,不我们关心的,我们关心的是这4次迭代对B2和B3产生了什么影响。注意表中红色的部分,先作如下定义:B23=00111010b1=00000000b2=01010100b3=10101010b4=11010101b'=b1xorb2xorb3xorb44次迭代对B2和B3来说,实际上就是让它们与b1,b2,b3,b4做了xor计算,即:B23xorb1xorb2xorb3xorb4可以证明xor运算满足交换律和结合律,于是:B23xorb1xorb2xorb3xorb4=B23xor(b1xorb2xorb3xorb4)=B23xorb'b1是由B1的第1位决定的,b2是由B1迭代1次后的第2位决定(既是由B1的第1和第2位决定),同理,b3和b4都是由B1决定。通过B1就可以计算出b'。另外,B1由4位组成,其一共2^4有种可能值。于是我们就可以想到一种更快捷的算法,事先将b'所有可能的值,16个值可以看成一个表;这样就可以不必进行那4次迭代,而是用B1查表得到b'值,将B1移出,B3移入,与b'计算,然后是下一次迭代。仪器科学与工程学院信息通信网络概论第一次实验董元220112074/7图三可看到每次迭代,寄存器中的数据以4位为单位移入和移出,关键是通过寄存器前4位查表获得,这样的算法可以大大提高运算速度。上面的方法是半字节查表法,另外还有单字节和双字节查表法,原理都是一样的——事先计算出2^8或2^16个b'的可能值,迭代中使用寄存器前8位或16位查表获得b'。五.主要模块代码所给奇偶校验示例程序中,用变量CRC代表校验码,在整体程序中,用到CRC的主要只有两部分。一是程序处于发送数据状态时,对数据按照挺等协议的格式做预处理,即voidFormPacket()函数内的少量代码内容;二是当程序处于接收数据状态时,对传来的数据计算CRC值以检验所传数据是否出错,即主循环程序中的少量代码内容。故我们只需要把相应的奇偶校验生成CRC的部分改成循环冗余校验即可。(见所附程序代码StopWaitCommDlg.cpp中相应部分)(一)CRC8校验码生成函数首先定义查表法中所需要的查询表,如下图所示:图四然后我将查表法生成循环冗余校验码封装成函数unsignedcharCRC8_Table(unsignedchar*p,charcounter);它的入口参数是指向数组指针*p,校验字节个数counter;输出为8位仪器科学与工程学院信息通信网络概论第一次实验董元220112075/7CRC校验码。如下图所示:图五(二)数据发送时的CRC校验码生成类比示例程序中数据发送时奇偶校验的代码,调用封装好的CRC8_Table函数生成相应的CRC校验码。在FormPacket中的代码只有一行,如下图所示:图六(三)数据接收时的CRC校验码生成修改这部分代码要结合相应数据读取内容理解,修改后如下图所示:仪器科学与工程学院信息通信网络概论第一次实验董元220112076/7图七这样就基本完成了奇偶校验到循环冗余校验的修改。六.实验结果运行程序,弹出图八所示的对话框,可以选择串行口COM1或COM2,自定义发送前延迟,波特率,数据包长度。然后点击“确定”按钮。图八开启两个程序,可以相互传输数据,运行结果如下图所示:图九打开相应的receive.txt文件夹可以看到数据确实已被写入。七.心得与体会停止等待协议是一种最简单的(但效率较低的)差错和流量控制协议。其基本原理是发送方发完一数据包后,需要等待接收方的应答信息:发送方收到正确认信息ACK则接收方仪器科学与工程学院信息通信网络概论第一次实验董元220112077/7接收正确,发送方可发送下一数据包;发送方收到负确认信息NAK则接收方接收错误,发送方应重发出错的数据包。经过这个实验,我对于停等协议的理解加深了。这是一个比较容易实现但效率较低的传输协议。程序编制中参考了一些网上的程序。对此,我深深感觉到网络资源的丰富。能够学会利用网络资源学习,也是一项重要的自学能力。
本文标题:停止等待协议
链接地址:https://www.777doc.com/doc-6208060 .html