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

上传人:b****2 文档编号:679399 上传时间:2023-04-29 格式:DOCX 页数:10 大小:72.03KB
下载 相关 举报
可靠的数据传输协议rdt的模拟实现.docx_第1页
第1页 / 共10页
可靠的数据传输协议rdt的模拟实现.docx_第2页
第2页 / 共10页
可靠的数据传输协议rdt的模拟实现.docx_第3页
第3页 / 共10页
可靠的数据传输协议rdt的模拟实现.docx_第4页
第4页 / 共10页
可靠的数据传输协议rdt的模拟实现.docx_第5页
第5页 / 共10页
可靠的数据传输协议rdt的模拟实现.docx_第6页
第6页 / 共10页
可靠的数据传输协议rdt的模拟实现.docx_第7页
第7页 / 共10页
可靠的数据传输协议rdt的模拟实现.docx_第8页
第8页 / 共10页
可靠的数据传输协议rdt的模拟实现.docx_第9页
第9页 / 共10页
可靠的数据传输协议rdt的模拟实现.docx_第10页
第10页 / 共10页
亲,该文档总共10页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

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

《可靠的数据传输协议rdt的模拟实现.docx》由会员分享,可在线阅读,更多相关《可靠的数据传输协议rdt的模拟实现.docx(10页珍藏版)》请在冰点文库上搜索。

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

可靠的数据传输协议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掌握传输协议的基本原理,并进一步加深对可靠的数据传输协议(包括链路层、传输层和应用层)的理解。

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 法律文书 > 调解书

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2