一、实验题目:编程模拟实现数据链路层协议中的停等协议
二、实验目的:
1、掌握停止等待协议的基本原理
2、理解数据链路层的主要功能(数据出错控制,数据重复控制,数据丢失控制等等)
3、分析简单的协议数据单元
4、掌握停止等待协议的运行机制
三、停止等待协议的算法,
在发送节点:
(1)从主机取一个数据帧,送交发送缓存。
(2)发送状态变量V(S)初始化,V(S)←0。
(3)将发送状态变量值写入数据帧中的发送序号N(S),N(S)←V(S)。
(4)将发送缓存中的数据帧发送出去。
(5)设置超时计时器(选择适当的超时重传时间Tout )。
(6)等待。
(7)收到确认帧ACKn,
若n=1-V(S),则:从主机取一个新的数据帧,放入发送缓存:V(S)←[1-V(S)];转到(3)。
否则,丢弃这个确认帧,转到(6)。
(8)若超时计时器时间到,则转到(4)。
在接收节点:
(1)接收状态变量初始化,V(R)←0。
(2)等待。
(3)收到一个数据帧:
若N(S)=V(R),则执行(4);
否则丢弃此数据帧,然后转到(6)。
(4)将收到的数据帧中的数据部分送交上层软件。
(5)更新接收状态变量,准备接收下一个数据帧,V(R)←[1-V(R)]。
(6)n←V(R),发送确认帧ACK,转到(2)。
四、程序源代码:
#include
#include <>
#include <>
#include <>
d to %d.%d\n\n",
LOBYTE, HIBYTE,
LOBYTE, HIBYTE);
}
}
void mksock(int type)
{
PrimaryUDP = socket(AF_INET, type,0);
if (PrimaryUDP < 0)
{
throw Exception("create socket error");
}
}
void BindSock() d to %d.%d\n\n",
LOBYTE, HIBYTE,
LOBYTE, HIBYTE);
}
}
void rmksock(int type)
{
PrimaryUDP = socket(AF_INET, type,0);
if (PrimaryUDP < 0)
{
throw Exception("create socket error");
}
}
void rBindSock()
{
sockaddr_in sin;
= INADDR_ANY;
= AF_INET;
= htons(SERVER_PORT);
if (bind(PrimaryUDP, (struct sockaddr*)&sin, sizeof(sin)) < 0)
throw Exception("bind error");
}
DWORD WINAPI rARecv(LPVOIDlpParam)
{
FILE * file = NULL;
sockaddr_in remote;
int sinlen = sizeof(remote);
BSC buffer,bsc;
= STX; = ETX;
memset, 0, MAXBSCLENGTH);
int iread = 0;
unsigned long dwReceived = 0;
bool number =
true;算机网络(第4
版).Andrew
[2]Internet原理与应用刘化君等编着电子工业出版社
[3]计算机网络(第五版)谢希仁编着电子工业出版社
[4]网络编程与开发技术殷肖川等编着西安交通大学