1、可靠的数据传输协议rdt的模拟实现可靠的数据传输协议rdt的模拟实现本页仅作为文档页封面,使用时可以删除This document is for reference only-rar21 year.March可靠的数据传输协议rdt的模拟实现姓名:陈锋 学号:212008*一、 实验目的:加深对可幕的数据传输协议(包括链路层、传输层和应用层)的理解。二、 实现的功能与要求2.1.功能(1) III一台PC (线程)向另一台PC (线程)发送数据包,界面应显示出双方 帧个数变化,帧序号,发送和接受速度,暂停或重传提示等,界面中必须动态 显示数据帧的发送情况和接受情况,包括在相应窗口详细显示相应的
2、ACK和其 他收发数据帧后发出的消息,以表明模拟协议的正确运作过程。(2) 接收方及发送方应具有按序收发帧的能力;(3) 接受方应有固定大小的窗口,并对收到信息缓存。当发送方速度过快或帧 丢失(超时),接受方应发送消息,要求暂停或重传(停-等协议);(4) 发送方发送速度应可以调节,并可以暂停或重发;(5) 发送方重传时可仅重传需要的(丢失的)幀;(6) 以上几个功能应可视,要求简单界面。2.2、要求(1) Windows或者UNIX环境下,对可靠的数据传输协议的简单实现,程序应在1-2台PC上运行,(2) 演示在两台计算机间传输,允许在同一台机器中用两个独立线程来模拟。三、可靠数据传输协议r
3、dt的传输原理下层信道是完美可靠的,没有bit错误,没有分组丢失。对发送方接收方具有独立的FSMS,发送方发送数据到下层信道,接收方从下层信道接收数据。调用rdt_rcv( packetrdt_send(data)packet = make_pkt(data) udt_send( packet)extract (packet,data) deliver_data(data)发送方 接收方图1、可靠信道上的可靠传输整个协议的工作原理图如下:q爲ay:漳:J或$():由乂曲调用将数据递交给上层udt send()|pac | pocketrdt rev()以9废惑a ():由上层进行调用, (e
4、g.,应用进程)将数据传入发送 方并由其传给接收方的上层购绘虎朗():由匕办调用,荡克也0 :当数据到达接受方时调将分组通过不可靠的信道传到接用收方可靠数据传输协议传输原理示意图图2、a)unrelioblQ cho n 荷四、实验流程图首先,启动服务器,调用SocketO建立一个套接口,然后用bind()将该套接 口与本地网络地址绑定,再调用listen。使套接口做好监听的准备,规定请求队 列的长度,在调用accept。来接收连接。客户在建立套接口后就可调用connect()和服务器建立连接。连接一旦建 立,客户机和服务器之间就可以通过调用read()和write()来发送和接收数据。最后,
5、待数据传送结束后,调用close。关闭套接口。实验流程图如下页图3所Server图3、Socket编程模拟实现rdt协议的流程图五、主要程序片段5. 1 重要的数据结构一lass CRcvSocket 和 class CSndSocket 类class CRcvSocket,用于服务器端的Socket通信。class CRcvSocket : public CSocket/ Attributespublic:/ Operations public:CRcvSocket ();virtual CRcvSocket();/ Overridespublic:void SetNot辻yWnd(HWND
6、 hNtf); void SetNotifyMsg(UINT uMsg); private:HWND hNotifyWnd;UINT uNotifyMsg;类class CSndSocket,用于客户端的Socket通信 class CSndSocket : public CSocket/ Attributespublic:/ Operationspublic:CSndSocket ();virtual CSndSocket();/ Overridespublic:void SetRcvNot辻yMsg(UINT nMsg):UINT uRcvMsg;void SetNotifyWnd(HWN
7、D hNtf);private:HWND hNotifyWnd;;5. 2建立套接字不管是客户端程序,还是服务器端程序,都需要在运行的时候去建立套接 字。唯一的区别是:服务器端建立一个套接字,然后开始无限循环;每当它通 过循环接收到一个连接,则打印出一个信息,客户端建立套接字,然后与命令 行给出的套接字连接;连接结束时,在连接上发送一个消息,然后关闭套接 字。sock = socket(AF_INET, SOCK_STREAM, 0);if (sock ;h_addr, hp-;h_Iength);sever.sin_port = htons(atoi(argv2);if (connect(s
8、ock, (struct sockaddr*)&server, sizeof(server) 0) perrorfconnecting stream socket);exit(3);if (send(sock, DATA, sizeof(DATA) 0)peiTor(usending on stream socket*);closesocket(sock);exit(0);)5. 4在服务器端,使用任意端口命名套接字server.sin_family = AF_INET;server.sin_port = INADDR_ANY;if (bind(sock, (struct sockaddr *
9、)&server, sizeof(server) 0) peiTor(4binding strea m socket”); exit(l);55在服务器端,找出指定的端口号并打印出来length = sizeof(server);if (getsockname(sock, (struct sockaddr *)&server, &length) 0) penorCgetting socket namev);exit(l);printf(usocket port ; ntohs(server.sin_port);5.6客户端先发起一次会话,要求建立通信,服务器端开始接收连接listen(sock
10、, 5);len = sizeof(struct sockaddr);do nisgsock = accept(sock, (struct sockaddr *)&tcpaddr, (int *)&len);if (msgsock = -1)penor(44accepf,);else do memset(buf, 0, sizeof(buf);if (rval = recv(msgsock, buf, 1024) ;%siV buf); while (rval != 0);closesocket(msgsock); while (TRUE);exit(0);注意:因为这个程序已经有了一个无限循
11、环,所以套接字“sock”从来不显式关闭。然而,当进程被杀死或正常终止时,所有套接字都将自动地被关闭。六、结果分析卸 UDTSend数据信息:发送至:I 127 T 00发送图4客户端界面鈴 UDTRecv接收信息:1运行时,同时启动两个线程client和servero其中sever初始为监听状态, 可指定滑动窗口数目和要发送的帧总数,client端发出数据包,一个线程向另一 个线程发送数据包,界面显示出双方帧个数变化,帧序号等,动态显示出数据 帧的发送情况和接受情况,包括在相应窗口详细显示相应的ACK和其他收发数 据帧后发出的消息,表明了模拟协议的正确运作过程。实验结果,如下图6和图7所示:
12、UDTSend数据信息:PKTs send start. n=4To (127.0.0. 1): PXTi a=0Sena receive ack:0To (127. 0.0. 1): PKTii=lSeni receive ack:1To (127. 0.0. 1): PKTi i=2Sen! receive ack:2Tc(12T.0.0. i);picrii=3-sa receive ack:3A.传输结束发送至:.1 127 7 o ToIdle jro-ung, needy old!nLI图6客户端的运行示意图接收信息:accepted! accepted! accepted! !数据:receive pkt from 10.3. 58. 110: i d二 1 receive pkt from 10.3. 58. 110: i d=2 receive pkt from 10.3.58. 110Z i d=3I31e youixg needy oil! 1LJ图7服务器端运行示意图七、总结rdt是一种可靠数据传输协议,但是rdt的发送和接收方都要通过调用 udt-send()发送分组给对方。通过此次实验了解了 rdt掌握传输协议的基本原 理,并进一步加深对可靠的数据传输协议(包括链路层、传输层和应用层)的理 解。
copyright@ 2008-2023 冰点文库 网站版权所有
经营许可证编号:鄂ICP备19020893号-2