資源簡介
北京大學計算機網絡實驗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?????????????????if?(!Buffer.empty())?{
????????????????????buffer?=?Buffer.front();
????????????????????SendframePacket((unsigned?char?*)buffer.head?buffer.size);
????????????????????window?++;
????????????????????
????????????????????
????????????????????fout?<“Send:“?<“buffer‘s?seq?=?“?<seq?<????????????????}
????????????}
????????????
????????????break;
????????????
????????case?MSG_TYPE_RECEIVE:
????????????unsigned?int?ack;
????????????ack?=?((frame_head?*)pBuffer)->ack;
????????????fout?<“Receive:“?<“pframe‘s?ack?=?“?<????????????buffer?=?Buffer.front();
????????????fout?<“Receive:“?<<“buffer‘s?seq?=?“?<seq?<????????????if?(buffer.head->seq?==?ack)?{
????????????????window?--;
????????????????Buffer.pop_front();
????????????????
????????????????if?(window?????????????????????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“?<????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?=?“?<seq?<????????????if?(window?ame)?{
????????????????
評論
共有 條評論