当前位置:文档之家› 课程设计报告-滑动窗口协议仿真

课程设计报告-滑动窗口协议仿真

滁州学院

课程设计报告

课程名称:计算机网络

设计题目:滑动窗口协议仿真

系别:计算机与信息工程学院

专业:计算机科学与技术

组别:第五组

起止日期: 2011年11月24日~2011年12月7日指导教师:赵国柱

计算机与信息工程学院二○一一年制

课程设计任务书

一. 引言

二. 基本原理

2.1 窗口机制

2.2 1bit滑动窗口协议

2.3 后退N协议

2.4 选择重传协议

2.5 流量控制

三. 需求分析

3.1 课程设计题目

3.2 开发环境

3.3 运行环境

3.4 课程设计任务及要求

3.5 界面要求

3.6 网络接口要求

四. 详细设计

4.1 结构体的定义

4.2 发送方的主要函数

4.3 接受方的主要函数

五.源代码

5.1 发送方的主要代码

5.2 接收方的主要代码

六. 调试与操作说明

致谢

[参考文献]

课程设计的主要内容

1.引言

早期的网络通信中,通信双方不会考虑网络的拥挤情况直接发送数据。由于大家

不知道网络拥塞状况,一起发送数据,导致中间结点阻塞掉包,谁也发不了数据。在

数据传输过程中,我们总是希望数据传输的更快一些,但如果发送方把数据发送的过快,

接收方就可能来不及接收,这就造成数据的丢失。因此就有了滑动窗口机制来解决这些

问题。早期我们使用的是1bit滑动窗口协议,一次只发送一个帧,等收到ack确认

才发下一个帧,这样对信道的利用率太低了。因此提出了一种采用累积确认的连续ARQ

协议,接收方不必对收到的帧逐个发送ack确认,而是收到几个帧后,对按序到达的最后一

个帧发送ack确认。同1bit滑动窗口协议相比,大大减少了ack数量,并消除了延迟ack

对传输效率的影响。但是,这会产生一个新的问题,如果发送方发送了5个帧,而中间的第

3个帧丢失了。这时接收方只能对前2个帧发出确认。发送方无法知道后面三个帧的下落,

只好把后面的3个帧再重传一次,这就是回退N协议。为了解决这个问题,又提出了选择重

传协议。当接收方发现某帧出错后,继续接受后面送来的正确的帧,只是不交付它们,

存放在自己的缓冲区中,并且要求发送方重传出错的那一帧。一旦收到重传来的帧后,

就可以将存于缓冲区中的其余帧一并按正确的顺序递交给主机。

2.基本原理

2.1 窗口机制

滑动窗口协议的基本原理就是在任意时刻,发送方都维持了一个连续的允许发送的帧的序号,称为发送窗口;同时,接收方也维持了一个连续的允许接收的帧的序号,称为接收窗口。发送窗口和接收窗口的序号的上下界不一定要一样,甚至大小也可以不同。不同的滑动窗口协议窗口大小一般不同。发送方窗口内的序号代表了那些已经被发送,但是还没有被确认的帧,或者是那些可以被发送的帧。接受方为其窗口内的每一个序号保留了一个缓冲区。与每个缓冲区相关联的还有一位,用来指明该缓冲区是满的还是空的。

若从滑动窗口的观点来统一看待1比特滑动窗口、后退n及选择重传三种协议,它们的差别仅在于各自窗口尺寸的大小不同而已。1比特滑动窗口协议:发送窗口=1,接收窗口=1;后退N协议:发送窗口>1,接收窗口=1;选择重传协议:发送窗口>1,接收窗口>1。

2.2 1bit滑动窗口协议

当发送窗口和接收窗口的大小固定为1时,滑动窗口协议退化为停等协议(stop-and-wait)。该协议规定发送方每发送一帧后就要停下来,等待接收方已正确接收的确认(acknowledgement)返回后才能继续发送下一帧。由于接收方需要判断接收到的帧是新发的帧还是重新发送的帧,因此发送方要为每一个帧加一个序号。由于停等协议规定只有一帧完全发送成功后才能发送新的帧,因而只用一比特来编号就够了。其发送方和接收方运行的流程图如图所示。

2.3 后退N协议

由于停等协议要为每一个帧进行确认后才继续发送下一帧,大大降低了信道利用率,因此又提出了后退n协议。后退n协议中,发送方在发完一个数据帧后,不停下

来等待应答帧,而是连续发送若干个数据帧,即使在连续发送过程中收到了接收方发

来的应答帧,也可以继续发送。且发送方在每发送完一个数据帧时都要设置超时定时器。只要在所设置的超时时间内仍收到确认帧,就要重发相应的数据帧。如:当发送

方发送了N个帧后,若发现该N帧的前一个帧在计时器超时后仍未返回其确认信息,

则该帧被判为出错或丢失,此时发送方就不得不重新发送出错帧及其后的N帧。

从这里不难看出,后退n协议一方面因连续发送数据帧而提高了效率,但另一方面,在重传时又必须把原来已正确传送过的数据帧进行重传(仅因这些数据帧之前有

一个数据帧出了错),这种做法又使传送效率降低。由此可见,若传输信道的传输质

量很差因而误码率较大时,连续测协议不一定优于停止等待协议。此协议中的发送窗

口的大小为k,接收窗口仍是1。

2.4 选择重传协议

在后退n协议中,接收方若发现错误帧就不再接收后续的帧,即使是正确到达的帧,这显然是一种浪费。另一种效率更高的策略是当接收方发现某帧出错后,其后继续送来

的正确的帧虽然不能立即递交给接收方的高层,但接收方仍可收下来,存放在一个缓冲区中,同时要求发送方重新传送出错的那一帧。一旦收到重新传来的帧后,就可以原已存于缓冲区中的其余帧一并按正确的顺序递交高层。这种方法称为选择重发(SELECTICE REPEAT),其工作过程如图所示。显然,选择重发减少了浪费,但要求接收方有足够大的缓冲区空间。

2.5 流量控制

TCP的特点之一是提供体积可变的滑动窗口机制,支持端到端的流量控制。TCP

的窗口以字节为单位进行调整,以适应接收方的处理能力。处理过程如下:

(1)TCP连接阶段,双方协商窗口尺寸,同时接收方预留数据缓存区;

(2)发送方根据协商的结果,发送符合窗口尺寸的数据字节流,并等待对方的确认;(3)发送方根据确认信息,改变窗口的尺寸,增加或者减少发送未得到确认的字节

流中的字节数。调整过程包括:如果出现发送拥塞,发送窗口缩小为原来的一半,同

时将超时重传的时间间隔扩大一倍。

(4)滑动窗口机制为端到端设备间的数据传输提供了可靠的流量控制机制。然而,

它只能在源端设备和目的端设备起作用,当网络中间设备(例如路由器等)发生拥塞时,滑动窗口机制将不起作用。

3.需求分析

3.1 课程设计题目:滑动窗口协议仿真

3.2 开发环境:Visual C++ 6.0

3.3 运行环境:Windows操作系统

3.4 课程设计任务及要求:

(1)程序按照滑动窗口协议实现端对端的数据传送。包括协议的各种策略,如包丢失、停等应答、超时等都应有所仿真实现。

(2)显示数据传送过程中的各项具体数据。双方帧的个数变化,帧序号,发送和接受速度,暂停或重传提示等。

3.5 界面要求:

此次课程设计要求的所有功能应可视,我们组主要是用VC++编写的,运行在DOS环境下,观察发送方(sender)发送数据包到接收方(receive)时。界面应显示出双方帧个数

的变化,帧序号,发送和接受速度,暂停或重传提示等,界面中必须动态显示数据帧的发送

和接受情况,包括在相应的窗口详细显示相应的ACK和其他收发数据帧后发出的消息,以表

明模拟协议的正确运作过程。在各种情况下,接受方和发送方窗口应实时显示帧的发送和接

受情况,包括序号,时间戳,内容等。以及窗口的填充和清空情况。

3.6 网络接口要求:

两台机器或是一台机器中两个独立的线程模拟发送方与接受方,接收数据的端口初始应为监

听状态。发送方向接受方发起连接,成功后开始发送数据。

4.概要设计

4.1 结构体定义如下:

typedef enum {data = 1,ack,nak,tout} frame_kind; //帧类型typedef struct frame_head

{

frame_kind kind; //帧类型

unsigned int seq; //序列号

unsigned int ack; //确认号

unsigned char data[MAX_LENGTH]; //数据

}Head;

typedef struct frame

{

frame_head head; //帧头

unsigned int size; //数据的大小

} Frame;

typedef struct framenode //队列节点类型

{

frame head_data;

struct framenode *next;

} Framenode;

typedef struct

{

Framenode *front; //队头指针

Framenode *rear; //队尾指针

} LinkQueue;

4.2 发送方的主要函数实现:

函数名:void InitLine(LinkQueue *q);

功能:初始化队列。

函数名:void GetFrameFromHost(LinkQueue *q);

功能:从主机取数据帧,由于实验需要,假设主机有足够多的数据帧要发送。

void DeLine(LinkQueue *q);

功能:数据帧发送完毕(收到确认帧)后,删除发送的数据帧(队头)。

函数名:int QueueEmpty(LinkQueue *q);

功能:判断队列是否为空。

函数名:frame QueueFront(LinkQueue *q);

功能:取队头,首帧是准备好待发送的帧。

函数名:int QueueLen(LinkQueue *q);

功能:计算队列长度。

函数名:DWORD WINAPI ReceiveFun(LPVOID pArg);

功能:发送线程调用的函数,pArg参数存接收帧指针。

函数名:void main();

功能:发送方主函数,首先和接收方(本机"127.0.0.1")建立socket连接并初始化发送队列。然后重复下面的步骤:

(1)从主机取数据帧;

(2)发送数据帧,含超时重发(接收方未收到或未收到接收方ack)和错误重发(收到接收方nak);

(3)设置超时计时器,这里是5秒;

(4)等待确认,调用CreateThread()函数创建一个线程,超时则调用TerminateThread()函数结束线程并再次发送数据帧。收到数据帧则做后续处理;

(5)收到否认帧nak则再次发送数据帧,收到确认帧ack则发送下一个数据帧;

(6)如果发送的测试时间达到20秒,则提示是否继续测试,按‘q’或‘Q’退出测试。

4.3接收方的主要函数实现:

函数名:void InitLine(LinkQueue *q);

功能:初始化队列。

函数名:void GetFrameFromHost(LinkQueue *q);

功能:准备好接收帧的缓冲池,首帧是待接收的帧,尾帧是已经接收的待提交主机的帧。由于实验需要,假设数据帧送往主机是足够快的。

int DeLine(LinkQueue *q, frame *pf, unsigned int curw)

功能:将帧数据保存供提交主机,curw是打开的待接收数据的窗口。

函数名:int QueueEmpty(LinkQueue *q);

功能:判断队列是否为空。

函数名:int QueueLen(LinkQueue *q);

功能:计算队列长度。

函数名:void main();

功能:接收方主函数,首先和发送方建立socket连接并初始化初始化接收窗口。然后重复下面的步骤:

(1)等待,接收数据帧;

(2)校验数据帧,假定产生随机结果,20%的概率校验错误或发送方发送数据帧超时;(3)校验错误时,丢弃数据帧,并发送否认帧nak;

(4)如果出现接收超时(假定未收到发送方发送的数据帧),则不给发送发任何回应;

(5)如果校验正确,首先判断是否是上一帧的重发。是上一帧的重发,则丢弃数据帧,并发送确认帧ack;是新的数据帧,则保存数据帧到当前接收窗口,并发送确认帧ack。(6)送数据帧至主机。

5.源代码

5.1 发送方的主要代码:

void InitLine(LinkQueue *q)

{

q->front = q->rear = NULL;

}

int QueueEmpty(LinkQueue *q)

{

return q->front == NULL && q->rear == NULL;

}

frame QueueFront(LinkQueue *q)

{

if (QueueEmpty(q))

{

printf("队列为空!\n");

Sleep(SLEEPMS);

exit(0);

}

return q->front->head_data;

}

int QueueLen(LinkQueue *q)

{

if (QueueEmpty(q))

{

return 0;

}

int num = 0;

Framenode *p = q->front;

while(p != NULL)

{

num++;

p = p->next;

}

return num;

}

void GetFrameFromHost(LinkQueue *q)

{

if(QueueLen(q) >= MAXPOOL)

{

printf("data %d 已准备好\n", q->front->head_data.head.seq);

return;

}

Framenode *p=(Framenode *)malloc(sizeof(Framenode));

memset(p->head_data.head.data, 0, MAX_LENGTH);

srand((unsigned)time(NULL));

p->head_data.size = rand() % MAX_LENGTH; // 帧大小随机生成memset(p->head_data.head.data, '1', p->head_data.size);

p->head_data.head.ack = -1;

p->head_data.head.kind = data;

p->head_data.head.seq = 0;

p->next =NULL;

if(QueueEmpty(q))

q->front = q->rear=p; // 首帧是待发送的帧

else

{

p->head_data.head.seq = (q->rear->head_data.head.seq + 1)%MAXPOOL;

q->rear->next =p;

q->rear =p;

}

printf("从主机得到:data %d,放入缓存\n", p->head_data.head.seq);

GetFrameFromHost(q); // 由于实验需要,假设主机有足够多的数据帧要发送

}

void DeLine(LinkQueue *q)

{

Framenode *p = NULL;

if(QueueEmpty(q))

{

printf("队列为空!\n");

}

else

{

p = q->front;

q->front = p->next;

if (q->rear == p) q->rear = NULL;

printf("发送data %d, %d 成功!从缓存中删除\n", p->head_data.head.seq, p->head_data.size);

free(p);

p = NULL;

}

}

void main()

{

printf("建立连接... \n");

Begin:

WORD wVersionRequested;

WSADATA wsaData; //初始化socket库

wVersionRequested=MAKEWORD(1,1); //两个byte型合并成一个WORD型

int err=WSAStartup(wVersionRequested,&wsaData);

if(err!=0)

{

Sleep(SLEEPMS);

return;

}

if ( LOBYTE( wsaData.wVersion ) != 1 || HIBYTE( wsaData.wVersion ) != 1 )

{

WSACleanup(); //中止Windows Sockets服务WSAStartup()成对使用

Sleep(SLEEPMS);

return;

}

socketClient = socket(AF_INET,SOCK_STREAM,0);//监听的套接字

SOCKADDR_IN clientadd;

clientadd.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");

clientadd.sin_family = AF_INET;

clientadd.sin_port = htons(7001);//设置连接端的IP、端口

if(SOCKET_ERROR==

connect(socketClient,(SOCKADDR*)&clientadd,sizeof(SOCKADDR)) ) //连接

{

WSACleanup();

Sleep(SLEEPMS);

goto Begin;

}

char getData[RECEIVE_MAX_LENGTH];

memset(getData, 0, RECEIVE_MAX_LENGTH); //清零

if(recv(socketClient,getData,RECEIVE_MAX_LENGTH,0) == SOCKET_ERROR) //接受{

printf("接受连接提示信息出错!\n");

}

else

{

printf("%s\n",getData);

}

char sendData[SEND_MAX_LENGTH];

memset(sendData, 0, SEND_MAX_LENGTH);

strcpy(sendData, "你好接收方,我是发送方!");

if( SOCKET_ERROR == send(socketClient,sendData,strlen(sendData)+1,0) ) //发送

{

printf("发送连接提示信息出错!\n");

WSACleanup();

closesocket(socketClient);

Sleep(SLEEPMS);

return;

}

printf("按任意键继续!\n");

while (!kbhit()) {}; //等待开始

Sleep(SLEEPMS);

printf("1bit滑动窗口协议:发送方,发送窗口=1\n");

LinkQueue QueueQ;

InitLine(&QueueQ);

frame packetsend; //data

frame packetreceive; // ack,nak

unsigned long tick = GetTickCount();

int ret = 0;

HANDLE hThread;

while(1)

{

GetFrameFromHost(&QueueQ); //从主机取数据帧

memset(&packetsend, 0, sizeof(packetsend));

Sleep(SLEEPMS);

printf("\n");

packetsend = QueueFront(&QueueQ); //取数据帧

ret = send(socketClient, (char *)&packetsend, sizeof(packetsend), 0);//发送data if(ret == SOCKET_ERROR)

{

printf("发送数据出错!\n");

continue;

}

printf("发送数据帧:data %d, %d\n", packetsend.head.seq, packetsend.size);

const unsigned long timeOut = 5 * 1000; //设置超时计时器5秒超时

memset(&packetreceive, 0, sizeof(packetreceive));

Sleep(SLEEPMS);

printf("\n");

InitializeCriticalSection(&gCS); // 初始化临界区

hThread=CreateThread(NULL, 0, ReceiveFun, (LPVOID)&packetreceive, 0, NULL);

int r = WaitForMultipleObjects(1, &hThread, TRUE, timeOut);

DeleteCriticalSection(&gCS); //与InitializeCriticalSection(&gCS);成对使用

if(ret == SOCKET_ERROR || ret == SOCKET_DISCONN)

{

printf("接受出错!Press any key to continue\n");

while (!kbhit()) {};

continue;

}

if(r == WSA_W AIT_TIMEOUT) //判断超时

{

TerminateThread(hThread, 0); //终止线程

printf("超时重传:data %d, %d\n", packetsend.head.seq,packetsend.size);

}

else if(packetsend.head.seq == packetreceive.head.ack)

{

srand((unsigned)time(NULL));

switch(rand() % 5) //假定产生随机结果,20%的概率超时

{

case 0:

printf("接收方发送回复超时(ack丢失模拟):%d\n", packetsend.head.seq);

printf("超时重传:data %d, %d\n", packetsend.head.seq,packetsend.size);

break;

default:

if(packetreceive.head.kind == ack)

{

printf("接受ack帧:ack %d\n", packetreceive.head.ack);

DeLine(&QueueQ);

}

else if(packetreceive.head.kind == nak)

{

printf("接受nak帧:nak %d\n", packetsend.head.seq);

}

break;

}

}

else printf("帧序号出错:%d\n", packetreceive.head.ack);

if(GetTickCount() - tick > 20 * TIMEOUT) //设置时间20秒

{

printf("持续时间20s. 按q退出,其他键继续\n");

int kbc = getch();

if(kbc == 'q' || kbc == 'Q')

break;

}

}

printf("按任意键退出!\n");

while (!kbhit()) {};

Sleep(SLEEPMS);

printf("谢谢使用!\n");

WSACleanup();

closesocket(socketClient);

Sleep(SLEEPMS);

DWORD WINAPI ReceiveFun(LPVOID pArg)

{

EnterCriticalSection(&gCS);//进入critical section

frame *packetreceive = (frame *)pArg;

ret = recv(socketClient, (char *)packetreceive, sizeof(*packetreceive), 0);

LeaveCriticalSection(&gCS); //线程用毕,离开critical section

return ret;

}

5.2 接收方的主要代码:

void InitLine(LinkQueue *q)

{

q->front = q->rear = NULL;

}

int QueueEmpty(LinkQueue *q)

{

return q->front == NULL && q->rear == NULL;

}

frame QueueFront(LinkQueue *q)

{

if (QueueEmpty(q))

{

printf("队列为空!\n");

Sleep(SLEEPMS);

exit(0);

}

return q->front->head_data;

int QueueLen(LinkQueue *q)

{

if (QueueEmpty(q))

{

return 0;

}

int num = 0;

Framenode *p = q->front;

while(p != NULL)

{

num++;

p = p->next;

}

return num;

}

int GetFrameFromHost(LinkQueue *q)

{

if(QueueLen(q) >= MAXPOOL)

{

printf("准备接受:data %d \n", q->front->head_data.head.seq);

return q->front->head_data.head.seq;

}

Framenode *p=(Framenode *)malloc(sizeof(Framenode));

memset(p->head_data.head.data, 0, MAX_LENGTH);

p->head_data.head.ack = -1;

p->head_data.head.kind = ack;

p->next =NULL;

if(QueueEmpty(q))

q->front = q->rear=p;

else

{

p->head_data.head.seq = (q->rear->head_data.head.seq + 1)%MAXPOOL;

q->rear->next =p;

q->rear = p;

}

return GetFrameFromHost(q);

}

int DeLine(LinkQueue *q, frame *pf, unsigned int curw) //假设数据帧送往主机是足够快的

{

Framenode *p = NULL;

if(curw == q->front->head_data.head.seq)

p = q->front;

else

p = q->rear;

if(p->head_data.head.ack != -1) //假定数据已经提交主机

{

printf("向主机交付data %d, %d 成功!\n", p->head_data.head.ack, p->head_data.size);

}

memset(p->head_data.head.data, 0, MAX_LENGTH);

memcpy(p->head_data.head.data, pf->head.data, pf->size);

p->head_data.size = pf->size;

p->head_data.head.ack = pf->head.seq; //保存发送帧序号

}

frame QueueAnswer(LinkQueue *q, unsigned int curw)

{

if(curw == q->front->head_data.head.seq)

{

return q->front->head_data;

}

else

{

return q->rear->head_data;

}

}

void main()

{

Begin:

WORD wVersionRequested;

WSADATA wsaData; //初始化socket库

wVersionRequested = MAKEWORD( 1, 1 ); //两个byte型合并成一个WORD型int err = WSAStartup(wVersionRequested, &wsaData );//使用sockets之前要调用一次if ( err != 0 )

{

Sleep(SLEEPMS);

return;

}

if ( LOBYTE( wsaData.wVersion ) != 1 || HIBYTE( wsaData.wVersion ) != 1 )

{

课程设计报告滑动窗口协议仿真

课程设计报告滑动窗口 协议仿真 公司内部档案编码:[OPPTR-OPPT28-OPPTL98-OPPNN08]

滁州学院 课程设计报告课程名称:计算机网络 设计题目:滑动窗口协议仿真 系别:计算机与信息工程学院 专业:计算机科学与技术 组别:第五组 起止日期: 2011年11月24日~2011年12月7日 指导教师:赵国柱 计算机与信息工程学院二○一一年制

课程设计任务书 一. 引言 二. 基本原理 窗口机制 1bit滑动窗口协议

后退N协议 选择重传协议 流量控制 三. 需求分析 课程设计题目 开发环境 运行环境 课程设计任务及要求 界面要求 网络接口要求 四. 详细设计 结构体的定义 发送方的主要函数 接受方的主要函数 五. 源代码 发送方的主要代码 接收方的主要代码 六. 调试与操作说明 致谢 [参考文献] 课程设计的主要内容1.引言

早期的网络通信中,通信双方不会考虑网络的拥挤情况直接发送数据。由于大家不知道网络拥塞状况,一起发送数据,导致中间结点阻塞掉包,谁也发不了数据。在数据传输过程中,我们总是希望数据传输的更快一些,但如果发送方把数据发送的过快,接收方就可能来不及接收,这就造成数据的丢失。因此就有了滑动窗口机制来解决这些问题。早期我们使用的是1bit滑动窗口协议,一次只发送一个帧,等收到ack确认才发下一个帧,这样对信道的利用率太低了。因此提出了一种采用累积确认的连续ARQ协议,接收方不必对收到的帧逐个发送ack 确认,而是收到几个帧后,对按序到达的最后一个帧发送ack确认。同1bit滑动窗口协议相比,大大减少了ack数量,并消除了延迟ack对传输效率的影响。但是,这会产生一个新的问题,如果发送方发送了5个帧,而中间的第3个帧丢失了。这时接收方只能对前2个帧发出确认。发送方无法知道后面三个帧的下落,只好把后面的3个帧再重传一次,这就是回退N协议。为了解决这个问题,又提出了选择重传协议。当接收方发现某帧出错后,继续接受后面送来的正确的帧,只是不交付它们,存放在自己的缓冲区中,并且要求发送方重传出错的那一帧。一旦收到重传来的帧后,就可以将存于缓冲区中的其余帧一并按正确的顺序递交给主机。 2.基本原理 窗口机制

课程设计报告-滑动窗口协议仿真

滁州学院 课程设计报告 课程名称:计算机网络 设计题目:滑动窗口协议仿真 系别:计算机与信息工程学院 专业:计算机科学与技术 组别:第五组 起止日期: 2011年11月24日~2011年12月7日指导教师:赵国柱 计算机与信息工程学院二○一一年制

课程设计任务书

一. 引言 二. 基本原理 2.1 窗口机制 2.2 1bit滑动窗口协议 2.3 后退N协议 2.4 选择重传协议 2.5 流量控制 三. 需求分析 3.1 课程设计题目 3.2 开发环境 3.3 运行环境 3.4 课程设计任务及要求 3.5 界面要求 3.6 网络接口要求 四. 详细设计 4.1 结构体的定义 4.2 发送方的主要函数 4.3 接受方的主要函数 五.源代码 5.1 发送方的主要代码 5.2 接收方的主要代码 六. 调试与操作说明 致谢 [参考文献] 课程设计的主要内容

1.引言 早期的网络通信中,通信双方不会考虑网络的拥挤情况直接发送数据。由于大家 不知道网络拥塞状况,一起发送数据,导致中间结点阻塞掉包,谁也发不了数据。在 数据传输过程中,我们总是希望数据传输的更快一些,但如果发送方把数据发送的过快, 接收方就可能来不及接收,这就造成数据的丢失。因此就有了滑动窗口机制来解决这些 问题。早期我们使用的是1bit滑动窗口协议,一次只发送一个帧,等收到ack确认 才发下一个帧,这样对信道的利用率太低了。因此提出了一种采用累积确认的连续ARQ 协议,接收方不必对收到的帧逐个发送ack确认,而是收到几个帧后,对按序到达的最后一 个帧发送ack确认。同1bit滑动窗口协议相比,大大减少了ack数量,并消除了延迟ack 对传输效率的影响。但是,这会产生一个新的问题,如果发送方发送了5个帧,而中间的第 3个帧丢失了。这时接收方只能对前2个帧发出确认。发送方无法知道后面三个帧的下落, 只好把后面的3个帧再重传一次,这就是回退N协议。为了解决这个问题,又提出了选择重 传协议。当接收方发现某帧出错后,继续接受后面送来的正确的帧,只是不交付它们, 存放在自己的缓冲区中,并且要求发送方重传出错的那一帧。一旦收到重传来的帧后, 就可以将存于缓冲区中的其余帧一并按正确的顺序递交给主机。 2.基本原理 2.1 窗口机制 滑动窗口协议的基本原理就是在任意时刻,发送方都维持了一个连续的允许发送的帧的序号,称为发送窗口;同时,接收方也维持了一个连续的允许接收的帧的序号,称为接收窗口。发送窗口和接收窗口的序号的上下界不一定要一样,甚至大小也可以不同。不同的滑动窗口协议窗口大小一般不同。发送方窗口内的序号代表了那些已经被发送,但是还没有被确认的帧,或者是那些可以被发送的帧。接受方为其窗口内的每一个序号保留了一个缓冲区。与每个缓冲区相关联的还有一位,用来指明该缓冲区是满的还是空的。 若从滑动窗口的观点来统一看待1比特滑动窗口、后退n及选择重传三种协议,它们的差别仅在于各自窗口尺寸的大小不同而已。1比特滑动窗口协议:发送窗口=1,接收窗口=1;后退N协议:发送窗口>1,接收窗口=1;选择重传协议:发送窗口>1,接收窗口>1。 2.2 1bit滑动窗口协议 当发送窗口和接收窗口的大小固定为1时,滑动窗口协议退化为停等协议(stop-and-wait)。该协议规定发送方每发送一帧后就要停下来,等待接收方已正确接收的确认(acknowledgement)返回后才能继续发送下一帧。由于接收方需要判断接收到的帧是新发的帧还是重新发送的帧,因此发送方要为每一个帧加一个序号。由于停等协议规定只有一帧完全发送成功后才能发送新的帧,因而只用一比特来编号就够了。其发送方和接收方运行的流程图如图所示。

滑动窗口协议分析与实现

滑动窗口协议分析与实现 目录 1 引言 (2) 1.1 滑动窗口协议概述 (2) 1.2 本次设计任务 (2) 2 滑动窗口协议介绍 (3) 2.1 滑动窗口协议工作原理 (3)

1 引言 1.1 滑动窗口协议概述 滑动窗口协议可能是计算机网络中最著名的算法,它是TCP使用的一种流量控制方法。滑动窗口协议也称为回退N步协议Go-Back-N(GBN)协议,它可以有三个不同的功能,第一个功能,即在不可靠链路上可靠地传输帧。(一般来说,该算法被用于在一个不可靠的网络上可靠地传输消息。)这是该算法的核心功能。 滑动窗口算法的第二个功能是用于保持帧的传输顺序。这在接收方比较容易实现,因为每个帧有一个序号,接收方要保证已经向上层协议传递了所有序号比当前帧小的帧,才向上传送该当前帧。即,接收方缓存了(即没有传送)错序的帧。 滑动窗口算法的第三个功能是,它有时支持流量控制(flowcontrol),它是一种接收方能够控制发送方使其降低速度的反馈机制。这种机制用于抑制发送方发送速度过快,即抑制传输比接收方所能处理的更多的数据。 滑动窗口协议,允许发送方传输多个分组而不需等待确认,但它也受限于在流水账中未确认的分组数不能超过最大允许数N。只有在接收窗口向前滑动,即接收方向发送方发送了确认反馈,同时发送方收到确认消息时,发送窗口才能向前滑动。 1.2 本次设计任务 本次的设计任务是根据滑动窗口协议的工作原理,在WebRTC的基础上,用C++语言编写一个滑动窗口协议的程序。 要求该程序实现滑动窗口协议的基本功能功能,如:发送帧被接收与否的判断,帧超时重发,帧缓存等。同时需要设计一个测试机制,以检测该程序的正确性、可靠性。

课程设计报告滑动窗口协议仿真

滁州学院 课程设计报告 课程名称: 计算机网络 第五组 起止日期:2011年n 月24 口~2011年12月7 n 指导教师: 设计题目: 滑动窗口协议仿贞 别: 计算机与信息工程学院 业: 计算机科学与技术 计算机与信息工程学院二O —一年制 别: 赵国柱

课程设计任务书 一.引言二-基本原理 窗口机制 Ibit滑动窗口协议后退N协议选择重传协议流量控制三.需求分析 课程设计题目开发环境

运行环境 课程设计任务及要求 界面要求 网络接口要求 0. 详细设计 结构体的定义 发送方的主要函数 接受方的主要函数 五. 源代码 发送方的主要代码 接收方的主要代码 调试与操作说明 致谢 [参考文献] 课程设计的主要内容 L引言 早期的网络通信中,通信双方不会考虑网络的拥挤情况直接发送数据。由于大家不知道网络拥塞状况,一起发送数据,导致中间结点阻塞掉包,谁也发不了数据。在数据传输过程中,我们总是希望数据传输的更快一些,但如果发送方把数据发送的过快,接收方就可能來不及接收,这就造成数据的丢失。因此就有了滑动窗口机制来解决这些问题。早期我们使用的是Ibit滑动窗口协议,一次只发送一个帧, 等收到ack确认才发下一个帧,这样对信道的利用率太低了。因此提出了一种采用累积确认的连续ARQ协议,接收方不必对收到的帧逐个发送 ack确认,而是收到儿个帧后,对按序到达的最后一个帧发送ack确认。 同Ibit滑动窗口协议相比,大大减少了 ack数量,并消除了延迟ack对传输效率的影响。但是,这会产生一个新的问题,如果发送方发送了 5个帧,而中间的第3个帧丢失了。这时接收方只能对前2个帧发出确认。发送方无法知道后面三个帧的下落,只好把后面的3个帧再重传一次,这就是回退N协议。为了解决这个问题,乂提出了

滑动窗口协议模拟程序的设计与实现

长沙理工大学 《网络协议编程》课程设计报告 梁碧莹 学院计算机与通信工程专业网络工程 班级网络08-02 学号200858080205 学生姓名梁碧莹指导教师王静 课程成绩完成日期2011年7 月 2 日

课程设计任务书 计算机与通信工程学院网络工程专业

课程设计成绩评定 学院计算机通信工程专业网络工程 班级网络08-02 班学号200858080205 学生姓名梁碧莹指导教师王静 课程成绩完成日期2011年7 月2 日指导教师对学生在课程设计中的评价 指导教师对课程设计的评定意见

滑动窗口协议模拟程序的设计与实现 学生:梁碧莹指导老师:王静 摘要:本文主要介绍如何根据滑动窗口协议的原理,在Visual C++的平台上设计一个滑动窗口协议模拟程序,并最终使该程序得以实现。本次程序设计分两部分:第一部分是发送方,第二部分是接收方。通过发送方和接收方之间的数据帧传输模拟,学习滑动窗口协议控制流量的原理和方法,以及滑动窗口协议的工作机制。 关键词:滑动窗口协议流量控制工作机制模拟程序 Design and Implementation of Sliding Window Protocol Procedures Student: Liang Biying Instructor: Wang Jing Abstract: This paper describes the principle of Sliding Window Protocol and how to design and implement a procedure about the Sliding Window Protocol. The program design in two parts, one is the sender, the other is the receiver. After all, studying the principle and method of how the Sliding Window Protocol control the flow, and how the Sliding Window Protocol works through the transmission of data between the sender and the receiver. Keywords: Sliding window protocol Flow control Working mechanism Simulation program

滑动窗口的仿真协议书范本

计算机网络课程设计书

计算机网络课程设计说明书 (封面) 学院名称:计算机与信息工程学院班级名称:网络工程一班 学生: 学号: 201321 题目:滑动窗口协议仿真指导教师 姓名:邵雪梅 起止日期: 2015.6.23-2015.6.29

第一部分:正文部分 一,选题背景 早期的网络通信中,通信双方不会考虑网络的拥挤情况直接发送数据。由于大家不知道网络拥塞状况,一起发送数据,导致中间结点阻塞掉包,谁也发不了数据。在数据传输过程中,我们总是希望数据传输的更快一些,但如果发送方把数据发送的过快,接收方就可能来不及接收,这就造成数据的丢失。因此就有了滑动窗口机制来解决这些问题。早期我们使用的是1bit滑动窗口协议,一次只发送一个帧,等收到ack确认才发下一个帧,这样对信道的利用率太低了。因此提出了一种采用累积确认的连续ARQ协议,接收方不必对收到的帧逐个发送ack确认,而是收到几个帧后,对按序到达的最后一个帧发送ack确认。 同1bit滑动窗口协议相比,大大减少了ack数量,并消除了延迟ack对传输效率的影响。但是,这会产生一个新的问题,如果发送方发送了5个帧,而中间的第3个帧丢失了。这时接收方只能对前2个帧发出确认。发送方无法知道后面三个帧的下落,只好把后面的3个帧再重传一次,这就是回退N协议。为了解决这个问题,又提出了选择重传协议。当接收方发现某帧出错后,继续接受后面送来的正确的帧,只是不交付它们,存放在自己的缓冲区中,并且要求发送方重传出错的那一帧。一旦收到重传来的帧后,就可以将存于缓冲区中的其余帧一并按正确的顺序递交给主机。本文主要介绍如何根据滑动窗口协议的原理,在Visual C++的平台上设计一个滑动窗口协议模拟程序,并最终使该程序得以实现。本次程序设计分两部分:第一部分是发送方,第二部分是接收方。通过发送方和接收方之间的数据帧传输模拟,学习滑动窗口协议控制流量的原理和方法,以及滑动窗口协议的工作机制。

课程设计报告滑动窗口协议仿真精编

课程设计报告滑动窗口 协议仿真精编 Document number:WTT-LKK-GBB-08921-EIGG-22986

滁州学院 课程设计报告 课程名称:计算机网络 设计题目:滑动窗口协议仿真 系别:计算机与信息工程学院 专业:计算机科学与技术 组别:第五组 起止日期: 2011年11月24日~2011年12月7日指导教师:赵国柱 计算机与信息工程学院二○一一年制

课程设计任务书 一. 引言 二. 基本原理 窗口机制 1bit滑动窗口协议 后退N协议 选择重传协议 流量控制

三. 需求分析 课程设计题目 开发环境 运行环境 课程设计任务及要求 界面要求 网络接口要求 四. 详细设计 结构体的定义 发送方的主要函数 接受方的主要函数五. 源代码 发送方的主要代码 接收方的主要代码六. 调试与操作说明 致谢 [参考文献]

课程设计的主要内容 1.引言 早期的网络通信中,通信双方不会考虑网络的拥挤情况直接发送数据。由于大家不知道网络拥塞状况,一起发送数据,导致中间结点阻塞掉包,谁也发不了数据。在数据传输过程中,我们总是希望数据传输的更快一些,但如果发送方把数据发送的过快,接收方就可能来不及接收,这就造成数据的丢失。因此就有了滑动窗口机制来解决这些问题。早期我们使用的是1bit滑动窗口协议,一次只发送一个帧,等收到ack确认才发下一个帧,这样对信道的利用率太低了。因此提出了一种采用累积确认的连续ARQ 协议,接收方不必对收到的帧逐个发送ack确认,而是收到几个帧后,对按序到达的最后一个帧发送ack确认。同1bit滑动窗口协议相比,大大减少了ack数量,并消除了延迟ack对传输效率的影响。但是,这会产生一个新的问题,如果发送方发送了5个帧,而中间的第3个帧丢失了。这时接收方只能对前2个帧发出确认。发送方无法知道后面三个帧的下落,只好把后面的3个帧再重传一次,这就是回退N协议。为了解决这个问题,又提出了选择重传协议。当接收方发现某帧出错后,继续接受后面送来的

数据链路层滑动窗口协议的设计和实现样本

数据链路层滑动窗口协议的设计和实现样本数据链路层滑动窗口协议的设计和实现本文档所提供的信息仅供参考之用,不能作为科学依据,请勿模仿。 文档如有不当之处,请联系本人或网站删除。 数据链路层滑动窗口协议的设计与实现实验报告 一、实验任务及内容利用所学数据链路层原理,设计一个滑动窗口协议并在仿真环境下编程实现有噪音信道环境下的可靠的双工通信。 信道模型为8000bps全双工卫星信道,信道传播时延270毫秒,信道误码率为10--55,信道提供字节流传输服务,网络层分组长度在240~256字节范围。 (1)实现有噪音信道环境下的无差错传输。 (2)运行程序并检查在信道没有误码和存在误码两种情况下的信道利用率。 (3)提高滑动窗口协议信道利用率,根据信道实际情况合理地为协议配置工作参数,包括滑动窗口的大小和重传定时器时限以及ACK搭载定时器的时限。 实验环境Windows7环境PC,机,Microsoft VisualC++集成化开发环境 二、协议设计协议的分层结构及层服务::包括物理层,数据链路层和网络层三层。

该实验主要设计数据链路层协议,为实现有噪声环境下高信道利用率传输,我们采用回本文档所提供的信息仅供参考之用,不能作为科学依据,请勿模仿。 文档如有不当之处,请联系本人或网站删除。 退n n帧(go backn)技术的协议。 发送方窗口大小为31;通过捎带确认来完成可靠的数据通信;出现信道误码导致收帧出错时,接受方丢弃所有后续帧,待定时器超时后发送方重发。 该层提供服务::从网络层接受要发送的数据包,将之分拆成数据帧;按一定的成帧方案完成分帧,加校验码,加ack等操作;进行适当的流量判断和拥塞控制;启动定时器将之传递给物理层。 数据帧经信道传送给接受方,接受方数据链路层执行与成帧相逆的操作;处理ack信息,终止定时器(或启动ack定时器,ack成帧传送);判断是否为欲接受数据,数据是否出错,提交给网络层。 退回N N步工作原理示意图::本文档所提供的信息仅供参考之用,不能作为科学依据,请勿模仿。 文档如有不当之处,请联系本人或网站删除。 实验所形成帧((成帧方案))::DATA Framen+=========+========+========+===============+======== +|KIND (1)|ACK (1)|SEQ

滑动窗口的仿真协议

计算机网络课程设计书 学 院 计算机与信息工程学院专业网络工程 课程名称计算机网络题目滑动窗口协议仿真完成期限自2015年6月23日至2015年6月29日共1周 内容及任务一、项目的目的 掌握滑动窗口协议的工作原理,并能够用所学计算机高级 语言进行编程模拟其运行过程;培养学生的动手实践和思考能力。 二,项目任务的主要内容和要求 (1)本次设计任务是根据滑动窗口协议的工作原理,在Visual C++ 6.0的平台上用C++语言编写一个基本TCP滑动窗口协议的模拟程序。 (2)要求该程序能够实现滑动窗口协议的发送和接收数据帧 功能,在此功能上体现滑动窗口协议的运作。 (3) 程序按照滑动窗口协议实现端对端的数据传送。包括协议的各种策略,如包丢失、停等应答、超时等都应有所仿真实现; (4) 显示数据传送过程中的各项具体数据。双方帧的个数变化,帧序号,发送和接受速度,暂停或重传提示等; 三、项目设计(研究)思路 (1) 查阅相关资料,理解滑动窗口协议的工作原理; (2) 设计滑动窗口协议实现端对端数据传送的功能流程图; (3) 编写代码实现滑动窗口协议工作的模拟程序,包括包丢失、停等应答、超时等; (4) 测试程序功能的实现情况。 四、具体成果形式和要求 (1)滑动窗口协议实现端对端数据传送的模拟程序。 (2)按照要求撰写课程设计报告并准备答辩。

进度安排 起止日期工作内容 2015.6.23-2015 .6.24 了解网络协议编程的基本知识; 2015.6.25-2015 .6.26 了解滑动窗口协议的工作机制; 2015.6.27-2015 .6.28 使用编程语言编写一个滑动窗口协议的模拟 程序,按要求实现程序。 2015.6.29最后汇总,调试,答辩 主要参考资料[1] 谢希仁. 计算机网络[M]. 4版. 北京:电子工业出版社, 2003. [2] 李仁发.何彦. 基于虚拟实验方法的滑动窗口协议分析[J]. 系统仿真学报. 2002. 8 (14) ; 1026 - 1063. [3] 李建中,张冬冬. 滑动窗口规模的动态调整算法[J]. 软件学报. 2004. 12 (15) : 1800 - 1814. [4] 王栩,李建中,王伟平. 基于滑动窗口的数据流压缩技术及连续查询处理方法[ J ]. 计算机研究与发展. 2004. 10 (41) : 1639- 1644. [5] 特南鲍姆. 计算机网络(第四版). 清华出版社 指导教师 意见 (签字):×年×月×日 系(教研 室)主任 意见 (签字):×年×月×日

窗口协议

ARQ与滑动窗口概念 滑动窗口协议,是TCP使用的一种流量控制方法。该协议允许发送方在停止并等待确认前可以连续发送多个分组。由于发送方不必每发一个分组就停下来等待确认,因此该协议可以加速数据的传输。 自动重传请求(Automatic Repeat-reQuest,ARQ)是OSI模型中数据链路层的错误纠正协议之一。它通过使用确认和超时这两个机制,在不可靠服务的基础上实现可靠的信息传输。如果发送方在发送后一段时间之内没有收到确认帧,它通常会重新发送。ARQ可能包括停止等待ARQ协议、回退ARQ和连续ARQ协议,错误检测(Error Detection)、正面确认(Positive Acknowledgment)、超时重传(Retransmission after Timeout)和负面确认及重传(Negative Acknowledgment and Retransmission)等机制。 他们的概念是差不多的只是作用于不同的网络层。数据链路层的滑动窗口是“个数固定”的。而TCP的滑动窗口是“个数可变”的,可以由接收端设置WIN字段来修改。 传统自动重传请求分成为三种,即停等式(stop-and-wait)ARQ,回退n帧(Go-back-n)ARQ,以及选择性重传(selective repeat)ARQ。后两种协议是滑动窗口技术与请求重发技术的结合,由于窗口尺寸开到足够大时,帧在线路上可以连续地流动,因此又称其为连续ARQ协议。三者的区别在于对于出错的数据报文的处理机制不同。三种ARQ协议中,复杂性递增,效率也递增。除了传统的ARQ,还有混合ARQ(Hybrid-ARQ)。 当发送窗口和接收窗口的大小都等于1时,就是停止等待协议。 当发送窗口大于1,接收窗口等于1时,就是回退N步协议。 当发送窗口和接收窗口的大小均大于1时,就是选择重发协议

计算机网络原理 一位滑动窗口协议

计算机网络原理一位滑动窗口协议 一位滑动窗口协议是指发送窗口和接收窗口尺寸都是1。也就是说发送端在未接收到确认前只能发1数据帧;接收方也只能接收落在当前窗口内的1数据帧,并给出确认数据帧。停-等协议就属于1位滑动窗口协议,但它只适用于数据单向传输,向反方向发送确认数据帧的情况。而1位滑动窗口协议支持数据的双向传输,即支持双工通信。 在实际的双工通信中,是在数据帧中增加一个字段,用来携带给对方的应答信息。这种将应答信息搭载在数据帧上发送给对方的应答方式称为捎带应答。采取捎带应答的全双工通信的工作过程,是由通信双方的某一方首先开始发送数据,它从网络层获得一个分组,将该分组封装成帧,通过物理层发送出去。接收方收到后检查是否有错和重复,如果有错或重复就丢弃;如果无错就交给网络层。然后查看有无数据帧要发送,如果有就将应答信息捎带在数据帧上发送出去,如果没有就发一个独立的确认帧。发送方收到应答数据帧后,检验对方发来的数据帧,如果无误上交给网络层,在确认自己发送的上一帧已经被妥收后,准备发送下一帧,并将对对方数据帧的应答信息搭载在上面,一起发送给对方。图4-4给出了一位滑动窗口协议的工作情况。 发 01A0收 01A0 收 01A0 发 00B0 发 10A1收 10A1 收 11B1 发 11B1 发 01A2收 01A2 收 00B2发 00B2 发 10A3收 10A3 图4-4 一位滑动窗口协议的工作情况 在正常情况下,通过检查所接收的数据帧的发送序号,判定是否是重复帧,如果是重复帧就丢弃,否则就接收下来;通过检查应答序号,可以判定上次所发的帧是否被正确接收,如果未得到应答,就要超时重发。

TCP滑动窗口协议

TCP 滑动窗口协议 详解 滑动窗口机制 (1).窗口机制 滑动窗口协议的基本原理就是在任意时刻,发送方都维持了一个连续的允许发送的帧的序号,称为发送窗口;同时,接收方也维持了一个连续的允许接收的帧的序号,称为接收窗口。发送窗口和接收窗口的序号的上下界不一定要一样,甚至大小也可以不同。不同的滑动窗口协议窗口大小一般不同。发送方窗口内的序列号代表了那些已经被发送,但是还没有被确认的帧,或者是那些可以被发送的帧。下面举一个例子(假设发送窗口尺寸为2,接收窗口尺寸为1): 分析:①初始态,发送方没有帧发出,发送窗口前后沿相重合。接收方0号窗口打开,等待接收0号帧;②发送方打开0号窗口,表示已发出0帧但尚确认返回信息。此时接收窗口状态不变;③发送方打开0、1号窗口,表示0、1号帧均在等待确认之列。至此,发送方打开的窗口数已达规定限度,在未收到新的确认返回帧之前,发送方将暂停发送新的数据帧。接收窗口此时状态仍未变;④接收方已收到0号帧,0号窗口关闭,1号窗口打开,表示准备接收1号帧。此时发送窗口状态不变;⑤发送方收到接收方发来的0号帧确认返回信息,关闭0号窗口,表示从重发表中删除0号帧。此时接收窗口状态仍不变;⑥发送方继续发送2号帧,2号窗口打开,表示2号帧也纳入待确认之列。至此,发送方打开的窗口又已达规定限度,在未收到新的确认返回帧之前,发送方将暂停发送新的数据帧,此时接收窗口状态仍不变;⑦接收方已收到1号帧,1号窗口关闭,2号窗口打开,表示准备接收2号帧。此时发送窗口状态不变;⑧发送方收到接收方发来的1号帧收毕的确认信息,关闭1号窗口,表示从重发表中删除1号帧。此时接收窗口状态仍不变。 若从滑动窗口的观点来统一看待1比特滑动窗口、后退n及选择重传三种协议,它们的差别仅在于各自窗口尺寸的大小不同而已。1比特滑动窗口协议:发送窗口=1,接收窗口=1;后退n协议:发窗口>1,接收

滑动窗口协议模拟

实验8滑动窗口协议模拟 一、实验目的 1.模拟实现滑窗协议在数据链路层上的数据传输过程,加深对滑 窗协议的理解 2.掌握滑动窗口协议基本原理与基本算法; 二、要求: 1.掌握滑动窗口协议的概念、原理与基本算法; 2.实现“选择性重传策略或连续自动重传策略(后退N帧)”的滑 动窗口协议模拟程序; 3.了解传输层和链路层滑动窗口协议的区别与联系及TCP中滑动 窗口协议的实现原理。 三、实验原理 滑窗协议工作原理 由于停等协议要为每一个帧进行确认后才继续发送下一个帧,大大降低了信道利用率,因此又提出来回退N帧的滑窗协议。回退N帧协议中,发送方在发送完一个数据帧后,不停下来等待应答帧,而是连续发送若干个数据帧,即使在连续发送过程中收到了接收方发来的应答帧,也可以继续发送。由于减少了等待时间,必然提高通信的吞吐量和信道利用率。 回退N帧的滑窗协议(GO-DACK-N)基本原理是,当接收方检测出错的信息帧后,丢弃出错帧后的所有信息帧,而不管这些帧是否正确。待发送方收到对出错帧的否定应答(NAK)时,将重发从出错后的所有数据帧;若应答帧出错,

则超时重发。因此,发送方在每发完一个数据帧时都要设置超时计时器。只要在所设置的计时器超时而仍未收到确认帧,就要重发相应的数据帧,若等不到1号帧的确认应答而重发1号数据帧时,虽然发送方已经发送完3号帧,但仍必须将1号帧及其以后的各帧全部进行重传。因此,后退N帧协议一方面因连续发送数据帧而提高了效率,但另一方面,在重传时又必须把原来已正确传送过的数据帧进行重传,这种做法又使传送率降低。 四、实验要求 1.Windows XP环境下运行,程序在1~2台PC上运行。 2.具体实现的协议可以采用回退N帧技术或者选择性重发技术的协议。 3.采用.NET平台中的C#、C++或其他编程语言实现。 五、实验内容 模拟滑窗协议的实现过程为; (1)程序客户端线程发送连接请求。 (2) 服务器连接并返回连接信息。 (3) 客户端发送数据帧(窗口大小自行设定)。 (4) 服务器对每一个收到数据帧都返回收到信息或者返回数据接收超时信息。 (5) 客户端根据返回信息确定是否重传数据还是选择重传数据。 【实验过程】(实验步骤、记录、数据、分析) 客户端的主程序流程图:

计算机网络滑动窗口协议

《计算机通信原理》课程项目 实施报告 题目(3):滑动窗口协议的模拟 组号: 任课教师: 组长: 成员: 20% 成员: 20% 成员: 20% 成员: 20% 联系方式:

目录 一、项目要求 (3) 二、项目成果 (3) 三、程序原理 (3) 1、滑动窗口协议 (3) A、窗口机制 (3) B、1比特滑动窗口协议 (5) C、后退停等协议 (6) D、选择重传协议 (7) 2、用户数据报协议UDP (7) 四、程序设计说明 (8) 五、主要数据结构说明及主要函数 (8) 六、收获建议 (17)

一、项目要求 本课题通过设计软件,实现对滑动窗口协议的模拟. 设计要求: 1. Windows 环境下运行,程序应在1-2台PC上运行; 2. 演示在两台计算机间传输文件。允许在同一台机器中用两个独立线程来模拟; 3. 功能: 1)由一台PC(线程)向另一台PC(线程)发送数据包,界面应显示出双方帧个数变化,帧序号,发送和接受速度,暂停或重传提示等,界面中必须动态显示数据帧的发送情况和接受情况,包括在相应窗口详细显示相应的ACK和其他收发数据帧后发出的消息,以表明模拟协议的正确运作过程。 2)接收方及发送方应具有按序收发帧的能力; 3)接受方应有固定大小的滑动窗口,并对收到信息缓存。当发送方速度过快或帧丢失(超时),接受方应发送消息,要求暂停或重传; 4)发送方发送速度应可以调节,并可以暂停或重发; 5)发送方重传时可仅重传帧(丢失帧); 4. 以上几个功能应可视,要求有简单界面; 二、项目成果 三、程序原理 1、滑动窗口协议 A、窗口机制

滑动窗口协议的基本原理就是在任意时刻,发送方都维持了一个连续的允许发送的帧的序号,称为发送窗口;同时,接收方也维持了一个连续的允许接收的帧的序号,称为接收窗口。发送窗口和接收窗口的序号的上下界不一定要一样,甚至大小也可以不同。不同的滑动窗口协议窗口大小一般不同。发送方窗口内的序列号代表了那些已经被发送,但是还没有被确认的帧,或者是那些可以被发送的帧 以发送窗口尺寸为2,接收窗口尺寸为1 分析: ①初始态,发送方没有帧发出,发送窗口前后沿相重合。接收方0号窗口打开,等待接收0号帧; ②发送方打开0号窗口,表示已发出0帧但尚确认返回信息。此时接收窗口状态不变; ③发送方打开0、1号窗口,表示0、1号帧均在等待确认之列。至此,发送方打开的窗口数已达规定限度,在未收到新的确认返回帧之前,发送方将暂停发送新的数据帧。接收窗口此时状态仍未变; ④接收方已收到0号帧,0号窗口关闭,1号窗口打开,表示准备接收1号帧。此时发送窗口状态不变;

滑动窗口协议报告

滑动窗口协议设计报告 2010 级计科一班2010117214 张晓宇

滑动窗口协议设计 1、引言 随着网络的不断壮大,用户数量、信息量的需求不断增加,网络负荷越来越重。此时,我们迫切需要一种机制来控制网络的流量,减少网络拥堵的几率,提高传输的效率。因此,一种名为滑动窗口的协议应运而生。 滑动窗口协议,是TCP使用的一种流量控制方法。该协议允许发送方在停止并等待确认前可以连续发送多个分组。由于发送方不必每发一个分组就停下来等待确认,因此该协议可以加速数据的传输。经测试证明,该协议还能有效地解决TCP的高协议处理开销和UDP的低可靠性之间的矛盾。 2、实验目的 基本原理2.1 窗口机制滑动窗口协议的基本原理就是在任意时刻,发送方都维持了一个连续的允许发送的帧的序号,称为发送窗口;同时,接收方也维持了一个连续的允许接收的帧的序号,称为接收窗口。发送窗口和接收窗口的序号的上下界不一定要一样,甚至大小也可以不同。不同的滑动窗口协议窗口大小一般不同。发送方窗口内的序号代表了那些已经被发送,但是还没有被确认的帧,或者是那些可以被发送的帧。接受方为其窗口内的每一个序号保留了一个缓冲区。与每个缓冲区相关联的还有一位,用来指明该缓冲区是满的还是空的。 3、实验原理

TCP滑动窗口用来暂存两台计算机问要传送的数据分组。每台运行TCP协议的计算机有两个滑动窗口:一个用于数据发送,另一个用于数据接收。发送端待发数据分组在缓冲区排队等待送出。被滑动窗口框入的分组,是可以在未收到接收确认的情况下最多送出的部分。滑动窗口左端标志X的分组,是已经被接收端确认收到的分组。随着新的确认到来,窗口不断向右滑动 4、实验代码 #include #include #include "winsock.h" #pragma comment(lib,"ws2_32.lib") using namespace std ; int main() { ::WSADATA wsa ; ::WSAStartup(MAKEWORD(1,1),&wsa) ; SOCKET s=::socket(AF_INET,SOCK_STREAM,0) ; SOCKADDR_IN addr ; cout<<"请输入要连接的IP正确地址:"; char ipaddr[100]; ZeroMemory(ipaddr,sizeof(ipaddr)/sizeof(char)); cin.get(ipaddr,30); addr.sin_addr.S_un.S_addr=inet_addr(ipaddr); //将服务器地址转换为网络字节序的ULONG类型 addr.sin_family=AF_INET;

滑动窗口协议实验报告

滑动窗口协议实验报告 篇一:实验二滑动窗口协议实验报告2 <滑动窗口协议的模拟> 项目设计报告 作者:完成日期: 签收人:签收日期: 1 需求分析 实验目的:加深对滑动窗口协议的理解 实验任务:实现对于滑动窗口协议的模拟 实验环境:PC机 操作系统:Windows XP 开发环境:Microsoft Visual C++ ,可以使用MFC类库 问题重述 界面要求: 项目要求的所有功能应可视,要有

简单的界面。 由一台PC(或线程)向另一台PC (或线程)发送数据包时,界面应显示出双方帧个数的变化,帧序号,发送和接受速度,暂停或重传提示等,界面中必须动态显示数据帧的发送和接受情况,包括在相应的窗口详细显示相应的ACK和其他收发数据帧后发出的消息,以表明模拟协议的正确运作过程。 在各种情况下,接受方和发送方窗口应实时显示帧的发送和接受情况,包括序号,时间戳,内容等。以及窗口的填充和清空情况。 网络接口要求: 两台机器或是一台机器中两个独立的线程模拟发送方与接受方,接收数据的端口初始应为监听状态。 发送方向接受方发起连接,成功后开始发送数据。 接受方要求: 接受方应由固定大小的滑动窗口,并对收到信息缓存。当发送方速度过快

或帧丢失(超时),接受方应发送消息,要求暂停或是重传(停---等协议)。 接受方要求按序向网络层提交收到的帧。 发送方要求: 发送方发送速度可以调节,并可以暂停或是重发。 发送方重传时可仅重传需要的帧。 可指定滑动窗口数目和要发送的帧的总数,停等的超时时间间隔以及发送类型(正常发送,错序发送,以 及缺帧,丢帧的现象),发送速率等参数。 2 概要设计 原理概述 发送方和接受方都维持了一个窗口,窗口内部包含了那些可以接受的序列号。 发送方的窗口大小从0开始,以后可以增大到某一个预设的最大值。由于发送方可能在将来的某个时刻重传未被确认的帧,所以它必须把已经送出去的

实验一 滑动窗口协议实验

实验一滑动窗口协议实验 ◆实验目的: 在NetRiver实验系统中,用C语言实现滑动窗口协议中的1比特滑动窗口协议和后退N帧协议,理解滑动窗口协议 ◆实验原理和说明: (1).窗口机制 滑动窗口协议的基本原理就是在任意时刻,发送方都维持了一个连续的允许发送的帧的序号,称为发送窗口;同时,接收方也维持了一个连续的允许接收的帧的序号,称为接收窗口。发送窗口和接收窗口的序号的上下界不一定要一样,甚至大小也可以不同。不同的滑动窗口协议窗口大小一般不同。发送方窗口内的序列号代表了那些已经被发送,但是还没有被确认的帧,或者是那些可以被发送的帧。下面举一个例子(假设发送窗口尺寸为2,接收窗口尺寸为1): 分析:①初始态,发送方没有帧发出,发送窗口前后沿相重合。接收方0号窗口打开,等待接收0号帧;②发送方打开0号窗口,表示已发出0帧但尚确认返回信息。此时接收窗口状态不变;③发送方打开0、1号窗口,表示0、1号帧均在等待确认之列。至此,发送方打开的窗口数已达规定限度,在未收到新的确认返回帧之前,发送方将暂停发送新的数据帧。接收窗口此时状态仍未变;④接收方已收到0号帧,0号窗口关闭,1号窗口打开,表示准备接收1号帧。此时发送窗口状态不变;⑤发送方收到接收方发来的0号帧确认返回信息,关闭0号窗口,表示从重发表中删除0号帧。此时接收窗口状态仍不变;⑥发送方继续发送2号帧,2号窗口打开,表示2号帧也纳入待确认之列。至此,发送方打开的窗口又已达规定限度,在未收到新的确认返回帧之前,发送方将暂停发送新的数据帧,此时接收窗口状态仍不变;⑦接收方已收到1号帧,1号窗口关闭,2号窗口打开,表示准备接收2号帧。此时发送窗口状态不变;⑧发送方收到接收方发来的1号帧收毕的确认信息,关闭1号窗口,表示从重发表中删除1号帧。此时接收窗口状态仍不变。 若从滑动窗口的观点来统一看待1比特滑动窗口、后退n及选择重传三种协议,它们的差别仅在于各自窗口尺寸的大小不同而已。1比特滑动窗口协议:发送窗口=1,接收窗口=1;后退n协议:发窗口>1,接收窗口>1;选择重传协议:发送窗口>1,接收窗口>1。 (2).1比特滑动窗口协议

滑动窗口协议模拟程序的设计与实现

理工大学 《网络协议编程》课程设计报告 梁碧莹 学院计算机与通信工程专业网络工程 班级网络08-02 学号200858080205 学生梁碧莹指导教师王静

课程成绩完成日期2011年7 月2 日 课程设计任务书 计算机与通信工程学院网络工程专业

课程设计成绩评定 学院计算机通信工程专业网络工程 班级网络08-02 班学号200858080205 学生梁碧莹指导教师王静 课程成绩完成日期2011年7 月2 日指导教师对学生在课程设计中的评价

指导教师对课程设计的评定意见 滑动窗口协议模拟程序的设计与实现 学生:梁碧莹指导老师:王静 摘要:本文主要介绍如何根据滑动窗口协议的原理,在Visual C++的平台上设计一个滑动窗口协议模拟程序,并最终使该程序得以实现。本次程序设计分两部分:第一部分是发送方,第二部分是接收方。通过发送方和接收方之间的数据帧传输模拟,学习滑动窗口协议控制流量的原理和方法,以及滑动窗口协议的工作机制。

关键词:滑动窗口协议流量控制工作机制模拟程序 Design and Implementation of Sliding Window Protocol Procedures Student: Liang Biying Instructor: Wang Jing Abstract: This paper describes the principle of Sliding Window Protocol and how to design and implement a procedure about the Sliding Window Protocol. The program design in two parts, one is the sender,the other is the receiver. After all, studying the principle and method of how the Sliding Window Protocol control the flow, and how the Sliding Window Protocol works through the transmission of data between the sender and the receiver. Keywords: Sliding window protocol Flow control Working mechanism Simulation program

课程设计报告-滑动窗口协议仿真

滁州学院 课程设计报告课程名称:计算机网络 设计题目:滑动窗口协议仿真 系别:计算机与信息工程学院 专业:计算机科学与技术 组别:第五组 起止日期: 2011年11月24日~2011年12月7日指导教师:赵国柱 计算机与信息工程学院二○一一年制

课程设计任务书 一. 引言 二. 基本原理 窗口机制 1bit滑动窗口协议 后退N协议 选择重传协议 流量控制 三. 需求分析 课程设计题目 开发环境 运行环境 课程设计任务及要求 界面要求 网络接口要求 四. 详细设计 结构体的定义 发送方的主要函数

接受方的主要函数 五.源代码 发送方的主要代码 接收方的主要代码 六. 调试与操作说明 致谢 [参考文献] 课程设计的主要内容 1.引言 早期的网络通信中,通信双方不会考虑网络的拥挤情况直接发送数据。由于大家 不知道网络拥塞状况,一起发送数据,导致中间结点阻塞掉包,谁也发不了数据。在 数据传输过程中,我们总是希望数据传输的更快一些,但如果发送方把数据发送的过快, 接收方就可能来不及接收,这就造成数据的丢失。因此就有了滑动窗口机制来解决这些 问题。早期我们使用的是1bit滑动窗口协议,一次只发送一个帧,等收到ack确认 才发下一个帧,这样对信道的利用率太低了。因此提出了一种采用累积确认的连续ARQ 协议,接收方不必对收到的帧逐个发送ack确认,而是收到几个帧后,对按序到达的最后一 个帧发送ack确认。同1bit滑动窗口协议相比,大大减少了ack数量,并消除了延迟ack 对传输效率的影响。但是,这会产生一个新的问题,如果发送方发送了5个帧,而中间的第 3个帧丢失了。这时接收方只能对前2个帧发出确认。发送方无法知道后面三个帧的下落, 只好把后面的3个帧再重传一次,这就是回退N协议。为了解决这个问题,又提出了选择重 传协议。当接收方发现某帧出错后,继续接受后面送来的正确的帧,只是不交付它们, 存放在自己的缓冲区中,并且要求发送方重传出错的那一帧。一旦收到重传来的帧后, 就可以将存于缓冲区中的其余帧一并按正确的顺序递交给主机。 2.基本原理 窗口机制 滑动窗口协议的基本原理就是在任意时刻,发送方都维持了一个连续的允许发送的帧的序号,称为发送窗口;同时,接收方也维持了一个连续的允许接收的帧的序号,称为接收窗口。发送窗口和接收窗口的序号的上下界不一定要一样,甚至大小也可以不同。不同的滑动窗口协议窗口大小一般不同。发送方窗口内的序号代表了那些已经被发送,但是还没有被确认的帧,或者是那些可以被发送的帧。接受方为其窗口内的每一个序号保留了一个缓冲区。与每个缓冲区相关联的还有一位,用来指明该缓冲区是满的还是空的。 若从滑动窗口的观点来统一看待1比特滑动窗口、后退n及选择重传三种协议,它们的差别仅在于各自窗口尺寸的大小不同而已。1比特滑动窗口协议:发送窗口=1,接收窗口=1;后退N协议:发送窗口>1,接收窗口=1;选择重传协议:发送窗口>1,接收窗口>1。 1bit滑动窗口协议

相关主题
文本预览
相关文档 最新文档