停止等待协议的编程模拟_第1页
停止等待协议的编程模拟_第2页
停止等待协议的编程模拟_第3页
停止等待协议的编程模拟_第4页
停止等待协议的编程模拟_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

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

文档简介

1、青岛农业大学理学与信息科学学院计算机网络与通信课程设计报告 设 计 题 目 停止等待协议的编程模拟 学生专业班级 计本05 学生姓名(学号) 指 导 教 师 完 成 时 间 2007年10月17日 实 习(设计)地点 机房 2007年 10月 17日停止等待协议的编程模拟一、课程设计目的和任务计算机网络与通信课程讲述计算机网络的原理,尤其是TCP/IP协议栈的原理和应用,是一门理论性、应用性、实践性都比较强的课程。计算机网络与通信实习是学习完计算机网络与通信课程后进行的一次全面的综合实习,是本专业实践性重要环节之一。计算机网络与通信实习是从原理和实践的角度,在计算机上编程模拟实现计算机网络的基

2、本协议。通过本实习,使我们对计算机网络的原理能有更加深刻的认识和理解,同时进一步锻炼自己的动手能力。在这次课程设计中,我设计的的是通过编译语言,编程模拟实现数据链路层协议中的停止等协议。二、分析与设计1.设计任务分析:停止等待协议是数据链路层的几个协议中最简单的协议,是具有最简单流量控制的数据链路层协议,是数据链路层各种协议的基础。此课程设计是基于winsock编程,是在VC+6.0的MFC界面下和控制台下实现的。它采用客户机/服务器(C/S)模型,即发送数据的一端为客户端,接收数据的一端为服务器端。停止等待协议就是通过双方的收发数据而达到相互通信的目的。本课程设计通过编程模拟实现停止等待协议

3、,随机的发送数据,通过服务器的的接受结果和客户端的接受结果显示理解停止等待协议的原理,掌握其应用。2 设计方案论证当收方收到一个正确的数据帧后,便会向发方发送一个确认帧ACK,表示发送的数据正确接收。当发方收到确认帧后才能发送一个新的数据帧,这样就实现了接收方对发送方的流量控制。由于通信线路质量各方面的影响,数据帧从发送方到接收方传输的过程中可能会出现差错。为了保证数据的正确性和完整性,接收方在收到数据后,会用一定的方法对接收到的数据进行差错检验,所以接收方很容易检测出收到的数据帧是否出现差错。当接收方发现收到的数据出现差错时,就会向发送方发送一个否认帧NAK,表示对方发送的数据错误。发送方会

4、根据接收方发来的信息做出相应的操作。采用这样的有效的检错机制,数据链路层可以对上面的网络层提供了可靠的传输的服务。3 详细设计停止等待协议的算法如下:为了对停止等待算法有一个完整而准确的理解,下面给出此协议的算法。 具有最简单流量控制的数据链路层协议假定 1: 链路是理想的传输信道,所传送的任何数据既不会出差错也不会丢失。假定 2: 不管发方以多快的速率发送数据,收方总是来得及收下,并及时上交主机。这个假定就相当于认为:接收端向主机交付数据的速率永远不会低于发送端发送数据的速率。 现在去掉上述的第二个假定。但是,仍然保留第一个假定,即主机 A 向主机 B传输数据的信道仍然是无差错的理想信道。然

5、而现在不能保证接收端向主机交付数据的速率永远不低于发送端发送数据的速率。由收方控制发方的数据流,乃是计算机网络中流量控制的一个基本方法。 简单解释:收方每接受到发方一帧后,回复确认帧,让发方继续发送下一帧,并且收方将数据帧交给上层软件识别,出现错误就将帧丢掉.在接收结点:(1) 等待。(2) 若收到由发送结点发过来的数据帧,则将其放入数据链路层的接收缓存。(3) 将接收缓存中的数据帧上交主机。(4) 向发送结点发一信息,表示数据帧已经上交给主机。(5) 转到(1)在发送结点:(1) 从主机取一个数据帧。(2) 将数据帧送到数据链路层的发送缓存。(3) 将发送缓存中的数据帧发送出去。(4) 等待

6、。(5) 若收到由接收结点发过来的信息(此信息的格式与内容可由双方事先商定好),则从主机取一个新的数据帧,然后转到(2)。因此,在设计编程模拟实现停止等待协议时,因具体考虑有关帧的一些知识。帧的结构: 帧的类型 帧的序号 帧的确认号 数据信息(可变) 校验位 帧的结构 帧的类型(frame_kind)分为数据帧(data_frame),确认帧(ack_frame)和否认帧(nak_frame)三种。发送方向接收方发送数据,是以帧为单位的,就称为数据帧。它的数据信息是可变的,但最佳的帧长为1500个字节。 接收方接收数据后,会对收到的数据帧进行差错校验,当数据正确时,就会向发送方发送一个确认帧,

7、以表示发送方发送的数据正确接收了,反之,就会向发送方发送一个否认帧,并把这个出错的数据帧丢弃。帧的序号(seq):由于采用的是单工通信,帧的结构中用的控制域也很少,这个域会随着帧类型的不同而不同: 对数据帧来说:序号(seq)表示的是发送端发送的帧的序号。 对确认帧来说:序号(seq)表示的是接收方希望接收到的帧的序号,它表示seq以前的各帧都已经正确接收,希望收到序号为seq的帧。 对否认帧来说:序号(seq)也是表示接收方希望收到的数据帧的序号,表示接收方已经收到序号为seq的帧,但是这个帧出现错误,希望发送方重新发送该数据帧。 停止等待协议采用的是单工通信,接收端向发送端发送的确认帧和否

8、认帧中没有数据信息,它们的数据域为空。由于是单工通信,发送方只发送数据,所以发送方帧的“帧的确认号”中并没有包含任何的确认信息。4 源代码:发送端:(client.cpp)#include #include #include #pragma comment(lib,Ws2_32.lib) #define SERVER_PORT7300struct BAGchar packet;void main(int argc, char *argv)WORD wVersionRequested;WSADATA wsaData;int ret,i,ra,data=0;SOCKET sClient,sList

9、en; struct sockaddr_in saServer;struct BAG bag;char *ptr = (char *)&bag;BOOL fSuccess = TRUE;WinSock初始化:wVersionRequested = MAKEWORD(2, 2);ret = WSAStartup( wVersionRequested, &wsaData );if (ret != 0)printf(WSAStartup() failed!n);return;if (LOBYTE(wsaData.wVersion) != 2 | HIBYTE( wsaData.wVersion )

10、!= 2 )WSACleanup();printf(Invalid Winsock version!n);return;sClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);sListen = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);if(sClient = INVALID_SOCKET)WSACleanup();printf(socket() failed!n);return;saServer.sin_family = AF_INET;saServer.sin_port = htons(SERVER

11、_PORT);ret = connect(sClient, (struct sockaddr *)&saServer, sizeof(saServer);if (ret = SOCKET_ERROR)printf(connect() successed!n);closesocket(sClient);WSACleanup();return;for(i=97;i=104;i+)ra = rand()%11;if(ra%5 = 1) data+=i;else data=i;bag.packet=data;ret = send(sClient, (char *)&bag, sizeof(bag),

12、0);ret = recv(sListen, ptr, sizeof(bag), 0);if(bag.packet!=i)i-;printf(send()failed!n);continue;else if(bag.packet=i)printf(packet %d has been sent!n,i+1);closesocket(sClient);WSACleanup();接受端():#include #include #include #include #pragma comment(lib,Ws2_32.lib) #define SERVER_PORT7300struct BAGchar

13、 packet;void main()WORD wVersionRequested;WSADATA wsaData;int ret,nLeft,length;SOCKET sListen, sServer;struct sockaddr_in saServer, saClient; struct BAG bag;char *ptr,*pp;wVersionRequested = MAKEWORD(2, 2); ret = WSAStartup(wVersionRequested, &wsaData);if (ret != 0)printf(WSAStartup() failed!n);retu

14、rn;if (LOBYTE(wsaData.wVersion) != 2 | HIBYTE( wsaData.wVersion ) != 2 )WSACleanup();printf(Invalid Winsock version!n);return;sListen = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);if(sListen = INVALID_SOCKET)WSACleanup();printf(socket() failed!n);return;saServer.sin_family = AF_INET;saServer.sin_port

15、= htons(SERVER_PORT);saServer.sin_addr.S_un.S_addr = htonl(INADDR_ANY);ret = bind(sListen, (struct sockaddr *)&saServer, sizeof(saServer);if (ret = SOCKET_ERROR)printf(bind() failed! code:%dn, WSAGetLastError();closesocket(sListen);WSACleanup();return;ret = listen(sListen, 5);if (ret = SOCKET_ERROR)

16、printf(listen() failed! code:%dn, WSAGetLastError();closesocket(sListen);WSACleanup();return;printf(Waiting for client connecting!n);printf(tips : Ctrl+c to quit!n);length = sizeof(saClient);sServer = accept(sListen, (struct sockaddr *)&saClient, &length);if(sServer = INVALID_SOCKET)printf(accept()

17、failed! code:%dn, WSAGetLastError();closesocket(sListen);WSACleanup();return;printf(Accepted client: %s:%dn, inet_ntoa(saClient.sin_addr), ntohs(saClient.sin_port);nLeft = sizeof(bag);ptr = (char *)&bag;for(int i=97;i=104;i+)pp=ptr;ret = recv(sServer, ptr, nLeft, 0);if(ret = SOCKET_ERROR)printf(recv

18、() failed!n);break;else if(bag.packet!=i)printf(wrong packet!n);i-;ret = send(sServer, pp, nLeft, 0); continue;else if(bag.packet=i)printf(recv() %c successd!n,i);ret = send(sServer, ptr, nLeft, 0);if(ret = 0) printf(client has closed the connection!n);break;closesocket(sListen);closesocket(sServer)

19、;WSACleanup();三、系统实施此次课程设计通过C+编程基本上模拟实现了数据链路层中的停止等待协议,但是程序中存在一定的不足,没有能够完全的体现停止等待协议的的工作原理。在此课程设计中,数据的发送是随机生成的。运行结果截图如下所示:服务器端的运行截图:图1客户端的运行截图:图2结果如下所示:客户端:图3服务器端:图4四 、总结与体会“停止等待”就是每发送完一个分组就停止发送,等待对方的确认。是一种简单的可靠通信协议。可靠传输协议是这样设计的:发送方只要超过了一段时间仍然没有收到确认,就认为刚才发送的分组丢失了,因而重传前面发送过的分组。这里应注意三点:第一,发送方在发送完一个分组后,必须暂时保留已发送的分组副本(以发生超时重传时使用)。第二,分组和确

温馨提示

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

评论

0/150

提交评论