摘要
本文为选择性重复 ARQ(Selective Repeat ARQ) 模拟实验的实验报告。src 中包括两个程序, 发送发 S 和接收方 R,二者使用基于 TCP 的 socket 进行通信, 使用随机帧损坏和超时故障来反映出程序的差错控制。S 将用户输入数据组装成帧、缓存、发送、定时、可以接受 ACK 和NAK 应答,删除数据帧,停止计时。R 程序可以接受数据帧,根据是否损坏和帧序号,回应ACK 或者 NAK。
关键词: 选择性重发 ARQ,socket 通信,流量控制与差错控制
目录
摘要 1
1 设计与实现 1
1.1 总体设计 1
1.2 发送方程序实现 2
1.3 接收方程序实现 6
1.4 界面设计 8
2 展示与分析 9
2.1 窗口滑动 9
2.2 差错控制 9
2.3 超时重发 11
1设计与实现
1.1总体设计
实验采用 python 语言进行实现,主要分为三部分:
1.发送方 S:采用 socket 中的客户机模型。
•使用用户输入数据模拟上层数据,将其加入一个队列实现缓冲;
•创建一个连接守护线程,实现与服务器的连接,在此线程中再创建两个守护线程:1 个为处理来自接收者返回帧的线程,另 1 个为检查已发送的帧是否超时的线程;
•连接守护线程:若缓冲区不为空,则取出数据打包成帧、存帧、定时、发送;
•接收守护线程:接收到来自接收着的帧后,首先检查是否破损 (CRC 校验),然后根据帧类型为 ACK 或者 NAK 进行经一步的处理;
•检查超时线程:对滑动窗中已发送的帧进行超时检查,超时则重发。
2.接收方 R:采用 socket 中的服务器模型;
•采用单线程的实现方式,接收到来自发送者的帧后首先检查帧是否破损,然后检查帧 是否在接收窗口中,然后检查帧是否为 Rn,即是否为这一步所期望接收的帧。
•根据以上信息决定向接收者是否发送 NAK 和 ACK 帧。
•最后将接收到的数据输出到终端,表示传送给上层。
3.界面:采用 qt5(pyside2)进行实现。
•对发送方开发了图形界面,方便用户在输入的同时能够观察到滑动窗口的状态,和发 送帧的历史信息,同时图形界面在一定层面上,避免了多线程下需要对输入输出加锁 的繁琐;
•未对接收方开发图形界面,出于以下两个原因:
(a)接收方程序较为简单,没有输入,只有输出信息可展示;
(b)在图形界面中,要动态展示数据的处理,需要大量的延时信号,否则人眼很难观 测到变化。
1.2发送方程序实现
发送方采用多线程,异步的方式实现缓存、成帧、定时、存帧、发送、校验、接受 ACK 和
NAK、超时重发的功能。
实现图形界面展示的同时,终端也会输出详细的收发过程信息,多线程下终端的输出需要加锁。