资源简介
北京大学计算机网络实验Lab1
1 滑动窗口协议实验
1.1 实验目的 计算机网络的数据链路层协议保证通信双方在有差错的通信线路上进
行无差错的数据传输,是计算机网络各层协议中通信控制功能最典型的一种 协议。
本实验实现一个数据链路层协议的数据传送部分,目的在于使学生更好 地理解数据链路层协议中的“滑动窗口”技术的基本工作原理,掌握计算机网 络协议的基本实现技术。
1.2 实验要求
在一个数据链路层的模拟实现环境中,用 C 语言实现下面三个数据链路
层协议。
1)1 比特滑动窗口协议 2)回退 N 帧滑动窗口协议 3)选择性重传协议
1.3 实验内容 充分理解滑动窗口协议,根据滑动窗口协议,模拟滑动窗口协议中发送
端的功能,对系统发送的帧进行缓存并加入窗口等待确认,并在超时或者错 误时对部分帧进行重传。
编写停等及退回 N 滑动窗口协议函数,响应系统的发送请求、接收帧 消息以及超时消息,并根据滑动窗口协议进行相应处理。
编写选择性重传协议函数,响应系统的发送请求、接受帧消息以及错误 消息,并根据滑动窗口协议进行相应处理。
代码片段和文件信息
#include “sysinclude.h“
#include
#include
ofstream fout(“slide_window.txt“);
extern void SendframePacket(unsigned char* pData unsigned int len);
#include // use queue as buffer
#define WINDOW_SIZE_STOP_WAIT 1
#define WINDOW_SIZE_BACK_N_frame 4
typedef enum {dataacknak} frame_kind;
typedef struct frame_head
{
frame_kind kind;
unsigned int seq;
unsigned int ack;
unsigned char data[100];//数据
};
typedef struct frame
{
frame_head * head; //帧头
unsigned int size; //数据的大小
};
dequeame> Buffer;
/*
* 停等协议测试函数
*/
int stud_slide_window_stop_and_wait(char *pBuffer int bufferSize UINT8 messageType)
{
frame buffer;
static int window = 0;
switch (messageType) {
case MSG_TYPE_SEND:
buffer.head = new frame_head;
*buffer.head = *((frame_head *) pBuffer);
buffer.size = bufferSize;
Buffer.push_back(buffer);
if (window < WINDOW_SIZE_STOP_WAIT) {
if (!Buffer.empty()) {
buffer = Buffer.front();
SendframePacket((unsigned char *)buffer.head buffer.size);
window ++;
fout << “Send:“ << “buffer‘s seq = “ << buffer.head->seq << endl;
}
}
break;
case MSG_TYPE_RECEIVE:
unsigned int ack;
ack = ((frame_head *)pBuffer)->ack;
fout << “Receive:“ << “pframe‘s ack = “ << ack << endl;
buffer = Buffer.front();
fout << “Receive:“ <<“buffer‘s seq = “ << buffer.head->seq << endl;
if (buffer.head->seq == ack) {
window --;
Buffer.pop_front();
if (window < WINDOW_SIZE_STOP_WAIT)
if (!Buffer.empty()) {
buffer = Buffer.front();
SendframePacket((unsigned char *)buffer.head buffer.size);
window ++;
}
}
break;
case MSG_TYPE_TIMEOUT:
buffer = Buffer.front();
SendframePacket((unsigned char *)buffer.head buffer.size);
break;
default:
break;
};
return 0;
}
/*
* 回退n帧测试函数
*/
int stud_slide_window_back_n_frame(char *pBuffer int bufferSize UINT8 messageType)
{
fout << “back n“ << endl;
frame buffer;
static int window = 0;
unsigned int ack;
switch (messageType) {
case MSG_TYPE_SEND:
buffer.head = new frame_head;
*buffer.head = *((frame_head *) pBuffer);
buffer.size = bufferSize;
Buffer.push_back(buffer);
fout << “Send:“ << “buffer‘s seq = “ << buffer.head->seq << endl;
if (window < WINDOW_SIZE_BACK_N_frame) {
评论
共有 条评论