滑动窗口协议报告

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

滑动窗口协议设计报告

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;

addr.sin_port=htons(9999) ; //将端口转换为网路字节序

cout<<"正在连接服务器,请等待......";

::connect(s,(SOCKADDR*)&addr,sizeof(SOCKADDR));

system("cls");

cout<<"服务器已连接!";

//TCHAR sendbuf[100];

string sendbuf;

char recvbuf[100] ;

int i=0;

cout<<"请输入要传达的指令:";

do

{ cin>>sendbuf;

if(strcmp(sendbuf.c_str(),"quit")==0)

return FALSE;

send(s,sendbuf.c_str(),strlen(sendbuf.c_str())+1,0) ;

recv(s,recvbuf,100,0) ;

cout<<"服务器回复:"<

if(strcmp(recvbuf,"服务器已经接收到关机指令!")==0)

{

cout<<"正常退出客户端!"<

break;

return;

}

cout<<"请输入要传输的指令:";

i++;

}

while(i<100);

}

#include

#include

#include

#include "winsock.h"

#pragma comment(lib,"ws2_32.lib")

using namespace std ;

class SocketSrv

{

public :

SOCKET m_socket ;

SOCKET tem ;

SOCKADDR_IN addr;

int len;

BOOL InitSocketLibrary() //初始化套接字库

{

WSADATA wsa ;

if(WSAStartup(MAKEWORD(1,1),&wsa) )

return FALSE ;

return TRUE ;

}

void CreateSocket()

{

m_socket=::socket(AF_INET,SOCK_STREAM,0) ; //创建一个套接字}

BOOL Bind(int port) //绑定端口

相关文档
最新文档