计算机网络实验一报告
GoBackN 协议
姓
学
班
名
号
级
一、实验内容及实验环境描述
(1).实验内容
利用所学数据链路层原理,自己设计一个滑动窗口协议,在仿真环境下编程实现有噪音信道环境下两
站点之间无差错双工通信。信道模型为 8000bps 全双工卫星信道,信道传播时延 270 毫秒,信道误码率
为 10^-5,信道提供字节流传输服务,网络层分组长度固定为 256 字节。
(2).实验环境
Windows10 ,Microsoft Visual Studio 2017 环境。
二 编程环境
protocol.h:库函数中包括的函数原型以及相关的宏定义,调用库 函数的 C 语言源程序应当#include
此文件。protocol.c 是实现这些库 函数的源代码。
datalink.c:应由同学完成的数据链路层程序文件。C 语言源程序书 写格式不要太凌乱,请参阅“附
录一 源程序书写格式要求”。
crc32.c:查表法求 32 位 CRC 校验和。
lprintf.c:日志输出函数 lprintf 的源码。
getopt.c:提供库函数 getopt_long()(在 Linux 中是标准 C 函数),用 于分析命令行参数。
gbn.exe:使用搭载 ACK 技术的 Go-Back-N 协议的一种参考实现。
三 协议设计
1 使用搭载 ACK 技术的 Go-Back-N 协议。
2 成帧方案:采用字节填充的标志字节法。每一帧都用一些特殊的字符 FLAG 作为开始和结束的边界。
当有效载荷中含有标志字节或转义字节时,在每个在有效载荷中出现的标志字节或转义字节前加一个 ESC
转义字节。接收端的数据链路层在将数据送给网络层之前删掉这些转义字符。
协议工作时,两个站点通过互发数据包交换数据,而控制讯息则捎带在数据讯息中传递。
当出现帧丢失时,如收到帧的序号有跳跃,或者出现 CRC 校验出错丢弃了某帧,会主动发送 NAK 否
定帧。若长期未产生反向数据帧,则出现 ACK 超时事件,主动发送 ACK 帧提示确认,对方收到确认后,
滑动窗口继续发送,若一直未收到确认讯息,则出现数据帧超时事件,发送方会自动重发相应的数据帧。
四 软件设计
(1)数据结构
① 帧结构体
struct FRAME
{
unsigned char kind;
/* FRAME_DATA, FRAME_ACK, FRAME_NAK */
unsigned char ack;
/* ACK 或 NAK 的序号 */
unsigned char seq;
/* 数据帧的序号 */
unsigned char data[PKT_LEN];/*帧中的数据段*/
unsigned int padding;
/*填充字段*/
};
DATA Frame
+=========+========+========+===============+========+
| KIND(1) | SEQ(1) | ACK(1) | DATA(240~256) | CRC(4) |
+=========+========+========+===============+========+
ACK Frame
+=========+========+========+
| KIND(1) | ACK(1) | CRC(4) |
+=========+========+========+
NAK Frame
+=========+========+========+
| KIND(1) | ACK(1) | CRC(4) |
+=========+========+========+
KIND:表示帧的类别 ACK:ACK序列号 SEQ:帧序列号 CRC:校验和
② GoBackN 协议变量及常量解释
bool no_nak = true;//判断在最近一段时间内是否发送过NAK
unsigned char ack_expected = 0;//发送窗口下界
unsigned char next_frame_to_send = 0;//发送窗口上界,同时是下一个即将发送的帧序号
unsigned char frame_expected = 0;
//接受窗口
unsigned char nbuffer = 0;
//已发送帧数
unsigned char out_buffer[MAX_SEQ + 1][PKT_LEN];//发送窗口的缓存帧
unsigned char in_buf[PKT_LEN]; //缓存窗口
static physics_ready = 0;//物理层就绪标志
#define DATA_TIMER 2800//数据定时器延迟
#define ACK_TIMER 240 //ack定时器延迟
#define MAX_SEQ 7 //最大发送序号
(2)模块结构
子程序完成的功能及其参数的意义
①static void put_frame(unsigned char *frame, int len)
该函数实现 4 位 CRC 校验和的添加以及数据帧向物理层的传输。其中参数 frame 为指向数据
帧的指针,len 表示当前数据帧的长度。
②bool between(unsigned char a, unsigned char b, unsigned char c)
该函数用于判断当前接收帧是否在接收窗口范围内,决定是否应该缓存或丢弃。若变量 a 在使
用时代表接收窗口的上界,c 代表接收窗口的下界,则 b 代表当前数据帧的序号。若 a 代表当前发
送窗口的上界,c 代表发送窗口的下界,则 b 代表确认序号。
③void send_frame_1(unsigned char kind, unsigned char next_frame_to_send,
unsigned char frame_expected, unsigned char buffer[][PKT_LEN])//帧发送函数。
该函数用于发送数据帧、ACK 帧或 NAK 帧。第一个参数决定发送的帧的种类。
若 kind == FRAME_DATA:当主函数中为 NETWORK_LAYER_READY 事件时,在接收到网络层
传来的数据之后调用该函数,实现数据帧的帧头和校验和的添加,并调用 put_frame()函数发送数
据帧。
若 kind == FRAME_ACK:发送单独的 ACK 帧。当一端向另一端发送了一个正确的帧后,如果
接受端没有回传的数据帧,则不能捎带会 ACK 确认信息,则需要单独发送 ACK 帧防止数据帧的重传。
若 kind == FRAME_NAK:发送单独的 nak 帧。当状态处于数据接受状态时,首先需要进行校
验并判断帧长。若校验出帧传输发生错误且当前状态之前没有传输过 NAK,则需要单独发送 nak 提醒
发送端重新进行当前数据帧的发送,减少等待时间,提高信道的利用率。
(3)算法流程
五 实验结果分析
(1) 描述你所实现的协议软件是否实现了有误码信道环境中无差错传输功能。
答:实现了有误码信道环境中的无差错传输功能,采用了CRC校验和重传技术使错误得以发现和纠正。
(2) 程序的健壮性如何,能否可靠地长时间运行。
答:程序健壮性强,在高负荷和高误码率等条件下均能正常工作,实验测试时运行24小时均未出现问
题。
(3) 协议参数的选取:滑动窗口的大小,重传定时器的时限,ACK 搭载定时器的时限,这些参数是怎样确
定的?根据信道特性数据,分组层分组的大小,以及你的滑动窗口机制,给出定量分析,详细列举出选择
这些参数值的具体原因。
答:实验为我们提供了8000bps全双工卫星信道的模拟环境,分组长度固定为 256 字节,单向传输时
延为270ms,信道误码率(默认)10^-5,帧间间隔1ms。据此数据,我们对两个协议的窗口大小、重传
定时器时限和ACK定时器时限进行了理论讨论和实际测试。
1 滑动窗口的大小:
滑动窗口大小直接涉及到信道利用率和数据拥塞问题,若窗口太小,将导致信道利用率过低,信道中
长时间没有数据传送;若窗口太大,数据发送过快,将造成接收方被数据淹没,发生拥塞现象导致数据丢
失,出错率增加。因此,为得到尽可能大的信道利用率,滑动窗口的大小 N,信道传输时延 a,数据率 c,
帧长度 f 应满足关系式:N>=[2a+2*(f/c)]/(f/c)。同时通过实际测试的结果分析得到合适的 N 值,最终
发现,在 GBN 协议中,N 取 7 效率最高。
2 重传定时器时限和ACK定时器时限:
重传计时器的时限涉及到重传的响应时间,若太大,将导致重传等待的时间过久;若太小,将导致较
为频繁的重传,两种情况均将导致信道利用率下降。
下面预估重传定时器时限的下界 : 根据前面的帧的数据结构可知,一个数据帧包括3字节的帧头、256
字节的数据和4字节的 CRC 校验值,总计 263 字节。由信道传输速率为 8000bps 可算得发送时间为
263ms 。传播时延固定为 270ms 。接收方接收完数据帧后,既可能以捎带 ACK 的方式发送 ACK ,也
可能由于 ACK定时器超时而发送单独的 ACK 帧。为计算时限下界,显然应取 ACK 定时器的时限,即对
方从接收完数据帧到开始发送 ACK 的时间间隔的上界进行计算,记为 t。现在我们考虑 ACK 帧在物理层
队列中排队的等待时间时,以最坏情况进行计算,即在 ACK 帧之前存在等待发送的普通数据帧(已发送0
字节)、重传数据帧和 NAK 帧,总计 263 + 263 + 6 = 532 字节,需要花费 532ms 才能发送完成。
另外,发送这个ACK 帧的时间为6ms,它在信道上的传输时延为270ms 。并且,物理层在发送数据帧时
会在帧与帧之间添加 1ms 的时间间隔,最坏情况下增加 4ms 的时间。以上时间总计为:
263 + 270 + t + 532 + 6 + 270 + 4 = 1345 + t (ms)
由此可得,重传定时器时限与ACK定时器时限 t 有关。我们知道,ACK定时器时限的一个最低的下界
为数据链路层从网络层获得一个数据包的时间,经过多次的测试和分析,我们发现这个下界大约为200ms。
而在实际测试中,当ACK定时器时限高于这个下界时可取得较高的效率。
最终,我们通过多次实验观察的方式,确定了 t 的最优值 : 在 GBN 协议中令ACK定时器时限为 240
ms, 在SR协议中,令ACK定时器时限为1000 ms。由此根据上面推得的重传定时器时间计算公式以及实
际测试得到,重传定时器在 GBN 协议中取 2800ms 最优。
(4)理论分析:根据所设计的滑动窗口工作机制(Go-Back-N 或者选择重传),推导出在无差错信道环境
下分组层能获得的最大信道利用率;推导出在有误码条件下重传操作及时发生等理想情况下分组层能获得
的最大信道利用率。给出理论推导过程。理论推导的目的是得到信道利用率的极限数据。为了简化有误码
条件下的最大利用率推导过程,可以对问题模型进行简化,比如:假定超时重传的数据帧的回馈ACK 帧可
以100%正确传输,但是简化问题分析的这些假设必须不会对整个结论产生较大的误差。
答:在无差错信道上,由于需要携带3字节的控制信息和4字节的校验位,因此最大的信道利用率为256/
(256+3+4)= 97.3%。信道的最大比特率为8000bps,即每个字节的发送时延为1ms。在误码率为 1e-5
的信道上(即每传送 100000 个比特平均会发生 1 个错误),假设信道上始终有数据需要传送,则可以
传送 100000/((256+3+4)*8) 约为 47 个数据包,即每 47 个数据包会有一个出错。假设超时重传的数
据帧的回馈ACK 帧可以100%正确传输,出错的是最后一个数据包,且每出错一次,在限定时间内可以正
确重传该帧。则每传送 47 个数据包需要传送 47+1+1 = 49 次。于是此时的信道利用率为(47 * 256)/(49
*(256+3+4))约为 93.4%。但由于程序设计并不能够达到理想状态,当一个数据包超时后,往往需要重
复多次重传,造成信道浪费。若重传 K 次,则信道利用率为(47*256)/((48 + k) *(256+3+4)) 。若平
均重传10次,信道利用率约为 78.88% 。
(5)实验结果分析:你的程序运行实际达到了什么样的效率,比对理论推导给出的结论,有没有差距?给
出原因。有没有改进的办法?如果没有时间把这些方法付诸编程实施,介绍你的方案。
序号
命令
说明
运行时
间(秒)
GoBackN 算法
线路利用率(%)
Selective 算法
线路利用率(%)
A
B
A
B
1
2
3
-–utopia
无误码信道数据传输
无
–-flood
--utopia
站点 A 分组层平缓方式发出
数据,站点 B 周期性交替“发
送 100 秒,停发 100 秒”
无误码信道,站点 A 和站点
B 的分组层都洪水式产生分
组
53.38
96.95
48.69
88.50
96.97
96.96