滑动窗口协议报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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) //绑定端口