概述
注意:下述程序并没有实现ACK和NAK帧的单独组帧,而是使用和普通帧一样大小的帧,也就是说传输了很多无用的数据部分,信道利用率还可以再提高。
如果需要单独帧,需要另外定义帧结构FRAME_ACK,然后写函数send_ack_frame发送
本实验所有内容的传送门
Part 1.实验环境与软件设计
Part 2.实验结果的理论分析与实测
Part 3.研究与探索的问题
Part 4.源程序
文章目录
- 1.实验内容与实验环境
- 1.1 实验内容
- 1.2 实验环境
- 2.软件设计
- 2.1 数据结构设计
- 2.1.1 数据帧的设计
- 2.2 程序结构设计
- 2.2.1 整体结构框图
- 2.2.2 函数表
- 2.3 算法流程
- 2.3.1 流程图
- 2.3.2 分层描述
1.实验内容与实验环境
1.1 实验内容
利用所学数据链路层原理,自己设计一个滑动窗口协议,在仿真环境下编程实现有噪音信道环境下两站点之间无差错双工通信。信道模型为 8000 b p s 8000bps 8000bps全双工卫星信道,信道传播时延 270 270 270毫秒,信道误码率为 1 0 − 5 10^{-5} 10−5,信道提供字节流传输服务,网络层分组长度固定为 256 256 256字节 。
本次实验选用的滑动窗口协议为选择重传协议,并且使用了NAK通知机制。
1.2 实验环境
- Microsoft Windows 10.0.18362
- Microsoft Visual Studio Community 2019 16.2.0
2.软件设计
2.1 数据结构设计
各区段标识符含义表:
KIND | ACK | SEQ | CRC |
---|---|---|---|
帧类别标识 | ACK序列号 | 帧序列号 | CRC32校验码 |
括号内为各区段的长度
2.1.1 数据帧的设计
结构描述
DATA/ACK/NAK Frame
+=========+========+========+===============+========+
| KIND(1) | SEQ(1) | ACK(1) | DATA(240~256) | CRC(4) |
+=========+========+========+===============+========+
代码描述
struct FRAME {
unsigned char kind;
unsigned char ack;
unsigned char seq;
unsigned char data[PKT_LEN];
unsigned int padding;
};
2.2 程序结构设计
2.2.1 整体结构框图
CSDN的mermaid语法似乎和typora不一样,此处有bug
2.2.2 函数表
static void inc(unsigned char* pnum)
作用:使得一个字节在[0,MAX_SEQ)范围内循环自增。
参数:pnum,单字节数字的指针
static int between(unsigned char a, unsigned char b, unsigned char c)
作用:判断某一帧的序号是否落在发送/接收窗口内。
参数:a,b,c,单字节数字。其中a,c为队列长为MAX_SEQ+1的循环队列的首尾序号,b为某一帧的序号。在发送窗口中,a,c分别为ack_expected和frame_nr;在接收窗口中,a,c分别为frame_expected和too_far。
static void put_frame(unsigned char* frame, int len)
作用:输入某一帧及其长度,在帧后添加其CRC32校验值,并将该帧递交给数据链路层准备发送。
参数:frame,某一帧的指针,传入前为某一帧除了padding域的内容。len,整型,为帧当前的长度,不含padding域。
static void send_data_frame(unsigned char frame_kind, unsigned char frame_nr, unsigned char frame_expected)
作用:构造数据帧/ACK帧/NAK帧,并发送。
参数:frame_kind,帧类型,有FRAME_DATA, FRAME_ACK, FRAME_NAK三个取值。frame_nr,帧序号,为要发送的帧在out_buf[]数组中的下标。frame_expected,为希望收到的帧的编号。
int main(int argc, char** argv)
作用:主程序,执行选择重传协议。
参数:argc,表示命令行参数的个数。argv,二维字符数组,表示输入参数的内容。
2.3 算法流程
2.3.1 流程图
此处的mermaid有bug
2.3.2 分层描述
物理层:为数据链路层提供 8000 b p s 8000bps 8000bps, 270 m s 270ms 270ms传播延时, 1 0 − 5 10^{-5} 10−5误码率的字节流传输通道。为了仿真实现上述服务质量的信道,利用在同一台计算机上TCP socket完成两个站点之间的通信。由于同一台计算机上TCP通信传播时延短、传播速度快、没有误码,物理层仿真程序在发送端利用“令牌桶”算法限制发送速率以仿真 8000 b p s 8000bps 8000bps线路;在接收端误码插入模块利用一个伪随机数“随机地”篡改从TCP收到的数据,使得所接收到的每个比特出现差错的概率为 1 0 − 5 10^{-5} 10−5;接收到的数据缓冲后延时 270 m s 270ms 270ms才提交给数据链路层程序,以仿真信道的传播时延特性。为了简化程序,省略了“成帧”功能,数据链路层利用接口函数send_frame()和recv_frame()发送和接收一帧。
数据链路层:每个站点都有发送窗口和接受窗口,窗口内记录序列号。对于发送窗口,其在物理层就绪并且网络层有帧要发送时发送帧,当收到ACK时向右滑动。发送的帧有单独的帧定时器,如果长时间未收到ACK信息,则产生超时事件(DATA_TIMEOUT),此时自动重传未确认帧。对于接收窗口,其将正确的数据帧缓存起来,将顺序正确的帧提交给网络层,窗口向右滑动。ACK帧采用捎带确认的机制,但是有单独的ACK定时器。如果长时间没有数据帧发送,会产生ACK超时事件(ACK_TIMEOUT),此时将单独发送ACK帧。当出现帧丢失或者校验错误时,主动发送NAK帧提示发送方立即重传。但是,在信道上同时只传输一个NAK帧。
数据链路层通过网络层提供的函数来利用网络层提供的服务,通过get_packet()函数从网络层得到一个分组;当数据链路层成功接收到一个分组后,通过put_packet()函数提交给网络层。
网络层:利用数据链路层提供的“可靠的分组传输”服务,在站点A与站点B之间交换长度固定为256字节的数据分组。 网络层把产生的分组交付数据链路层,并接受数据链路层提交来的数据分组。
最后
以上就是重要月光为你收集整理的计算机网络 Exp1.数据链路层ARQ协议设计 Part 1.实验环境与软件设计的全部内容,希望文章能够帮你解决计算机网络 Exp1.数据链路层ARQ协议设计 Part 1.实验环境与软件设计所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复