计算机网络实验二 下载本文

内容发布更新时间 : 2024/12/26 22:58:10星期一 下面是文章的全部内容请认真阅读。

哈尔滨工业大学

<<计算机网络>>

实验报告

(2016年度春季学期)

姓名: 蔡鹏 学号: 1130310726 学院: 计算机科学与技术学院 教师: 李晓烽

<<计算机网络>>实验报告 实验二

一、实验目的

理解滑动窗口协议的基本原理; 掌握GBN的工作原理;

掌握基于UDP设计并实现一个GBN协议的过程与技术。

二、实验环境

1.接入internet的实验主机 2.Windows7操作系统

3.Visual stadio2015 c++语言

三、实验内容

1) 基于UDP设计一个简单的GBN协议,实现单向可靠数据传输(服务器到客户的数据传输)。

2) 模拟引入数据包的丢失,验证所设计协议的有效性。

四、实验过程及结果

服务器端:

使用UDP协议传输数据(比如传输一个文件),等待客户端的请求,接收并处理来自客户端的消息(如数据传输请求),当客户端开始请求数据时进入“伪连接”状态(并不是真正的连接,只是一种类似连接的数据发送的状态),将数据打包成数据报发送,然后等待客户端的ACK信息,同时启动计时器。当收到ACK时,窗口滑动,正常发送下一个数据报,计时器重新计时;若在计时器超时前没有收到ACK,则全部重传窗口内的所以已发送的数据报。

具体实现: 1)命令解析

为了测试客户端与服务器端的通信交互,方便操作,设置了此过程。首先,服务器接收客户端发来的请求数据,

“-time”表示客户端请求获取当前时间,服务器回复当前时间; “-quit”表示客户端退出,服务器回复“Good bye!”;

“-testgbn”表示客户端请求开始测试GBN协议,服务器开始进入GBN传输状态; 其他数据,则服务器直接回复原数据。 2)数据传输数据帧格式定义

在以太网中,数据帧的MTU为1500字节,所以UDP数据报的数据部分应小于1472字节(除去IP头部20字节与UDP头的8字节),为此,定义UDP数据报的数据部分格式为:

data

- 1 -

<<计算机网络>>实验报告 Seq 0

Seq为1个字节,取值为0~255,(故序列号最多为256个); Data≤1024个字节,为传输的数据;

最后一个字节放入EOF0,表示结尾。

客户端:

使用UDP协议向服务器端请求数据,接收服务器端发送的数据报并返回确认信息ACK(注意GBN为累积确认,即若ACK=1和3,表示数据帧2已经正确接收),必须能够模拟ACK丢失直至服务器端超时重传的情况。

1) ACK数据帧定义

Ack 0

由于是从服务器端到客户端的单向数据传输,因此ACK数据帧不包含任何数据,只需要将ACK发送给服务器端即可。

ACK字段为一个字节,表示序列号数值; 末尾放入0,表示数据结束。 2)命令设置

客户端的命令和服务器端的解析命令向对应,获取当前用户输入并发送给服务器并等待服务器返回数据,如输入

“-time”得到服务器的当前时间。

“-testgbn [X] [Y]”命令,[X],[y]均为[0,1]的小数,其中: [X]表示客户端的丢包率,模拟网络中报文丢失; [Y]表示客户端的ACK的丢失率。(使用随机函数完成)。 如果用户不输入,则默认丢失率均为0.2。

源代码及注释: Client.cpp:

// GBN_client.cpp : 定义控制台应用程序的入口点。 //

#include #include #include #include

#pragma comment(lib,\)

#define SERVER_PORT 12340 //接收数据的端口号 #define SERVER_IP

const int BUFFER_LENGTH = 1026;

const int SEQ_SIZE = 20;//接收端序列号个数,为 1~20

\ // 服务器的 IP 地址

- 2 -