可靠的数据传输协议rdt的模拟实现.docx
《可靠的数据传输协议rdt的模拟实现.docx》由会员分享,可在线阅读,更多相关《可靠的数据传输协议rdt的模拟实现.docx(10页珍藏版)》请在冰点文库上搜索。
可靠的数据传输协议rdt的模拟实现
可靠的数据传输协议rdt的
模拟实现
本页仅作为文档页封面,使用时可以删除
Thisdocumentisforreferenceonly-rar21year.March
可靠的数据传输协议rdt的模拟实现
姓名:
陈锋学号:
212008*********
一、实验目的:
加深对可幕的数据传输协议(包括链路层、传输层和应用层)的理解。
二、实现的功能与要求
2.1.功能
(1)III一台PC(线程)向另一台PC(线程)发送数据包,界面应显示出双方帧个数变化,帧序号,发送和接受速度,暂停或重传提示等,界面中必须动态显示数据帧的发送情况和接受情况,包括在相应窗口详细显示相应的ACK和其他收发数据帧后发出的消息,以表明模拟协议的正确运作过程。
(2)接收方及发送方应具有按序收发帧的能力;
(3)接受方应有固定大小的窗口,并对收到信息缓存。
当发送方速度过快或帧丢失(超时),接受方应发送消息,要求暂停或重传(停-等协议);
(4)发送方发送速度应可以调节,并可以暂停或重发;
(5)发送方重传时可仅重传需要的(丢失的)幀;
(6)以上几个功能应可视,要求简单界面。
2.2、要求
(1)Windows或者UNIX环境下,对可靠的数据传输协议的简单实现,程序应
在1-2台PC上运行,
(2)演示在两台计算机间传输,允许在同一台机器中用两个独立线程来模拟。
三、可靠数据传输协议rdt的传输原理
下层信道是完美可靠的,没有bit错误,没有分组丢失。
对发送方接收方
具有独立的FSMS,发送方发送数据到下层信道,接收方从下层信道接收数据。
调用
rdt_rcv(packet
rdt_send(data)
packet=make_pkt(data)udt_send(packet)
extract(packet,data)deliver_data(data)
发送方接收方
图1、可靠信道上的可靠传输
整个协议的工作原理图如下:
q爲ay:
漳:
J或$():
由乂曲调
用将数据递交给上层
udtsend()
|pac®|
|pocket
rdtrev()
以9废惑a():
由上层进行调用,(eg.,应用进程・)・将数据传入发送方并由其传给接收方的上层
购绘虎朗◎():
由匕办调用,
荡克也0:
当数据到达接受方时调
将分组通过不可靠的信道传到接
用
收方
可靠数据传输协议传输原理示意图
图2、
a)unrelioblQchon荷
四、实验流程图
首先,启动服务器,调用SocketO建立一个套接口,然后用bind()将该套接口与本地网络地址绑定,再调用listen。
使套接口做好监听的准备,规定请求队列的长度,在调用accept。
来接收连接。
客户在建立套接口后就可调用connect()和服务器建立连接。
连接一旦建立,客户机和服务器之间就可以通过调用read()和write()来发送和接收数据。
最
后,待数据传送结束后,调用close。
关闭套接口。
实验流程图如下页图3所
Server
图3、Socket编程模拟实现rdt协议的流程图
五、主要程序片段
5.1重要的数据结构一lassCRcvSocket和classCSndSocket类classCRcvSocket,用于服务器端的Socket通信。
classCRcvSocket:
publicCSocket
{
//Attributes
public:
//Operationspublic:
CRcvSocket();
virtual^CRcvSocket();
//Overrides
public:
voidSetNot辻yWnd(HWNDhNtf);voidSetNotifyMsg(UINTuMsg);private:
HWNDhNotifyWnd;
UINTuNotifyMsg;
};
类classCSndSocket,用于客户端的Socket通信classCSndSocket:
publicCSocket
//Attributes
public:
//Operations
public:
CSndSocket();
virtual^CSndSocket();
//Overrides
public:
voidSetRcvNot辻yMsg(UINTnMsg):
UINTuRcvMsg;
voidSetNotifyWnd(HWNDhNtf);
private:
HWNDhNotifyWnd;
};
5.2建立套接字
不管是客户端程序,还是服务器端程序,都需要在运行的时候去建立套接字。
唯一的区别是:
服务器端建立一个套接字,然后开始无限循环;每当它通过循环接收到一个连接,则打印出一个信息,客户端建立套接字,然后与命令行给出的套接字连接;连接结束时,在连接上发送一个消息,然后关闭套接字。
sock=socket(AF_INET,SOCK_STREAM,0);
if(sock<0){
peiTorfopeningstreamsocket^);
exit(l);)
5.3在客户端中,使用命令行中指定的名字连接套接字
server.sin_family=AF_INET;
hp=gethostbyname(argv[1]);
if(hp==0){
fprintf(stderr,“%s:
unknownhost\nn,argvfl]);
exit
(2);
}
memcpy((char*)&server.sin_addr,(char*)hp->;h_addr,hp->;h_Iength);
sever.sin_port=htons(atoi(argv[2]));
if(connect(sock,(structsockaddr*)&server,sizeof(server))<0){perrorf'connectingstreamsocket^);
exit(3);
}
if(send(sock,DATA,sizeof(DATA))<0)
peiTor(usendingonstreamsocket*');
closesocket(sock);
exit(0);
)
5.4在服务器端,使用任意端口命名套接字
server.sin_family=AF_INET;
server.sin_port=INADDR_ANY;
if(bind(sock,(structsockaddr*)&server,sizeof(server))<0){peiTor('4bindingstreamsocket”);exit(l);
}
5・5在服务器端,找出指定的端口号并打印出来
length=sizeof(server);
if(getsockname(sock,(structsockaddr*)&server,&length)<0){
penorC'gettingsocketnamev);
exit(l);
}
printf(usocketport;ntohs(server.sin_port));
5.6客户端先发起一次会话,要求建立通信,服务器端开始接收连
接
listen(sock,5);
len=sizeof(structsockaddr);
do{
nisgsock=accept(sock,(structsockaddr*)&tcpaddr,(int*)&len);
if(msgsock==-1)
penor(44accepf,);
elsedo
{memset(buf,0,sizeof(buf));
if((rval=recv(msgsock,buf,1024))<0)
peiTor(44readingstreammessage^);
if(rval==0)
priiitf(44endingconnection\n");
else
priiitf(u—>;%s\iV\buf);}while(rval!
=0);
closesocket(msgsock);
}while(TRUE);
exit(0);
}
注意:
因为这个程序已经有了一个无限循环,所以套接字“sock”从来不显
式关闭。
然而,当进程被杀死或正常终止时,所有套接字都将自动地被关闭。
六、结果分析
卸UDTSend
数据信息:
发送至:
I127T0—~0—~
发送⑸
图4客户端界面
鈴UDTRecv
接收信息:
1
□
□
运行时,同时启动两个线程client和servero其中sever初始为监听状态,可指定滑动窗口数目和要发送的帧总数,client端发出数据包,一个线程向另一个线程发送数据包,界面显示出双方帧个数变化,帧序号等,动态显示出数据帧的发送情况和接受情况,包括在相应窗口详细显示相应的ACK和其他收发数据帧后发出的消息,表明了模拟协议的正确运作过程。
实验结果,如下图6和图7所示:
UDTSend
数据信息:
PKTssendstart..n=4
To(127.0.0.1):
PXTia=0~Senareceiveack:
0
To(127.0.0.1):
PKTii=l—Senireceiveack:
1
To(127.0.0.1):
PKTii=2—Sen!
receiveack:
2
Tc(12T.0.0.i);picrii=3-s^areceiveack:
3
A.
传输结束
•
发送至:
.11277oTo—~
Idlejro-ung,needyold!
n
LI
图6客户端的运行示意图
接收信息:
accepted!
!
accepted!
!
accepted!
!
数据:
receivepktfrom10.3.58.110:
id二1receivepktfrom10.3.58.110:
id=2receivepktfrom10.3.58.110Zid=3
I<31eyouixg^needyoil!
▲1
LJ
图7服务器端运行示意图
七、总结
rdt是一种可靠数据传输协议,但是rdt的发送和接收方都要通过调用udt-send()发送分组给对方。
通过此次实验了解了rdt掌握传输协议的基本原理,并进一步加深对可靠的数据传输协议(包括链路层、传输层和应用层)的理解。