可靠的数据传输协议rdt的模拟实现

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

可靠的数据传输协议rdt的模拟实现姓名:陈锋学号:212008081202005一、实验目的:加深对可靠的数据传输协议(包括链路层、传输层和应用层)的理解。二、实现的功能与要求2.1、功能(1)由一台PC(线程)向另一台PC(线程)发送数据包,界面应显示出双方帧个数变化,帧序号,发送和接受速度,暂停或重传提示等,界面中必须动态显示数据帧的发送情况和接受情况,包括在相应窗口详细显示相应的ACK和其他收发数据帧后发出的消息,以表明模拟协议的正确运作过程。(2)接收方及发送方应具有按序收发帧的能力;(3)接受方应有固定大小的窗口,并对收到信息缓存。当发送方速度过快或帧丢失(超时),接受方应发送消息,要求暂停或重传(停--等协议);(4)发送方发送速度应可以调节,并可以暂停或重发;(5)发送方重传时可仅重传需要的(丢失的)幀;(6)以上几个功能应可视,要求简单界面。2.2、要求(1)Windows或者UNIX环境下,对可靠的数据传输协议的简单实现,程序应在1-2台PC上运行,(2)演示在两台计算机间传输,允许在同一台机器中用两个独立线程来模拟。三、可靠数据传输协议rdt的传输原理下层信道是完美可靠的,没有bit错误,没有分组丢失。对发送方接收方具有独立的FSMs,发送方发送数据到下层信道,接收方从下层信道接收数据。图1、可靠信道上的可靠传输整个协议的工作原理图如下:图2、可靠数据传输协议传输原理示意图四、实验流程图首先,启动服务器,调用Socket()建立一个套接口,然后用bind()将该套接口与本地网络地址绑定,再调用listen()使套接口做好监听的准备,规定请求队列的长度,在调用accept()来接收连接。客户在建立套接口后就可调用connect()和服务器建立连接。连接一旦建立,客户机和服务器之间就可以通过调用read()和write()来发送和接收数据。最后,待数据传送结束后,调用close()关闭套接口。实验流程图如下页图3所示。建立连接ServerClient阻塞,等待处理服务请求图3、Socket编程模拟实现rdt协议的流程图五、主要程序片段5.1重要的数据结构—classCRcvSocket和classCSndSocket类classCRcvSocket,用于服务器端的Socket通信。classCRcvSocket:publicCSocket{//Attributespublic://Operationspublic:CRcvSocket();virtual~CRcvSocket();//OverridesSocket()Bind()Listen()Accept()Socket()connect()Read()Write()请求数据Write()Read()Close()Close()应答数据public:voidSetNotifyWnd(HWNDhNtf);voidSetNotifyMsg(UINTuMsg);private:HWNDhNotifyWnd;UINTuNotifyMsg;};类classCSndSocket,用于客户端的Socket通信classCSndSocket:publicCSocket{//Attributespublic://Operationspublic:CSndSocket();virtual~CSndSocket();//Overridespublic:voidSetRcvNotifyMsg(UINTnMsg);UINTuRcvMsg;voidSetNotifyWnd(HWNDhNtf);private:HWNDhNotifyWnd;};5.2建立套接字不管是客户端程序,还是服务器端程序,都需要在运行的时候去建立套接字。唯一的区别是:服务器端建立一个套接字,然后开始无限循环;每当它通过循环接收到一个连接,则打印出一个信息,客户端建立套接字,然后与命令行给出的套接字连接;连接结束时,在连接上发送一个消息,然后关闭套接字。sock=socket(AF_INET,SOCK_STREAM,0);if(sock0){perror(“openingstreamsocket”);exit(1);}5.3在客户端中,使用命令行中指定的名字连接套接字server.sin_family=AF_INET;hp=gethostbyname(argv[1]);if(hp==0){fprintf(stderr,“%s:unknownhost\n”,argv[1]);exit(2);}memcpy((char*)&server.sin_addr,(char*)hp-;h_addr,hp-;h_length);sever.sin_port=htons(atoi(argv[2]));if(connect(sock,(structsockaddr*)&server,sizeof(server))0){perror(“connectingstreamsocket”);exit(3);}if(send(sock,DATA,sizeof(DATA))0)perror(“sendingonstreamsocket”);closesocket(sock);exit(0);}5.4在服务器端,使用任意端口命名套接字server.sin_family=AF_INET;server.sin_port=INADDR_ANY;if(bind(sock,(structsockaddr*)&server,sizeof(server))0){perror(“bindingstreamsocket”);exit(1);}5.5在服务器端,找出指定的端口号并打印出来length=sizeof(server);if(getsockname(sock,(structsockaddr*)&server,&length)0){perror(“gettingsocketname”);exit(1);}printf(“socketport#%d\n”,ntohs(server.sin_port));5.6客户端先发起一次会话,要求建立通信,服务器端开始接收连接listen(sock,5);len=sizeof(structsockaddr);do{msgsock=accept(sock,(structsockaddr*)&tcpaddr,(int*)&len);if(msgsock==-1)perror(“accept”);elsedo{memset(buf,0,sizeof(buf));if((rval=recv(msgsock,buf,1024))0)perror(“readingstreammessage”);if(rval==0)printf(“endingconnection\n”);elseprintf(“--;%s\n”,buf);}while(rval!=0);closesocket(msgsock);}while(TRUE);exit(0);}注意:因为这个程序已经有了一个无限循环,所以套接字“sock”从来不显式关闭。然而,当进程被杀死或正常终止时,所有套接字都将自动地被关闭。六、结果分析图4客户端界面图5服务器端界面运行时,同时启动两个线程client和server。其中sever初始为监听状态,可指定滑动窗口数目和要发送的帧总数,client端发出数据包,一个线程向另一个线程发送数据包,界面显示出双方帧个数变化,帧序号等,动态显示出数据帧的发送情况和接受情况,包括在相应窗口详细显示相应的ACK和其他收发数据帧后发出的消息,表明了模拟协议的正确运作过程。实验结果,如下图6和图7所示:图6客户端的运行示意图图7服务器端运行示意图七、总结rdt是一种可靠数据传输协议,但是rdt的发送和接收方都要通过调用udt-send()发送分组给对方。通过此次实验了解了rdt掌握传输协议的基本原理,并进一步加深对可靠的数据传输协议(包括链路层、传输层和应用层)的理解。

1 / 8
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功