- 截止日期:2023年5月22日23:59
- 提交邮箱:hongzhuyu@stu.xmu.edu.cn
- 逾期提交每天会扣除5%的分数,最高扣35%
到目前为止,我们主要在学习物理层,已经设计了帧同步算法和离线OFDM接收机的信号处理模块。在本次实验中,我们将开始学习链路层,特别是在物理层不可避免出现错误情况下,在链路层实现可靠传输。具体来说,我们将首先设计一个“ 发送机 与 接收机 ”,并构建两个单向通信的节点(节点A作为发送机,节点B作为接收机);接着设计两个“收发机”,其中收发机既有发送模块也有接收模块,并构建两个双向通信的节点。
为了简化实现,本实验将使用简化的物理层,不进行物理层信号处理。即采用Socket直接模拟双向物理层通信链路传输数据包(该链路将有时延与丢包),然后要求同学们在非可靠物理层基础上实现ARQ可靠传输协议。该协议未来是可以在Pluto SDR平台上运行,将会用于大项目。这里 Socket 是计算机网络课程中介绍的一个重要概念,它是互联网多样应用程序的基石。Socket本身是应用层与传输层的接口,在传输层之下会有网络层、链路层与物理层。本实验只是用Socket在本地用来模拟两个收发机的通信链路,我们将会提供参考代码,同学们只需要简单的把它抽象成不可靠的通信链路即可。
此外,为了帮助实现收发机,我们将提供了一个基于多线程架构的参考实现,即代码分为链路层(即LLC)和物理层(即PHY),中间使用队列进行交互。在发送方向上,链路层负责根据协议状态生成帧,然后放入队列,物理层负责发送;在接收方向上,物理层负责接收,然后放入队列,链路层提取帧更新协议状态。同学们只需要在这个框架内完成一些函数实现,就能完成本次实验。这里线程是并发编程中的一个基本概念,是一种可以充分利用多核CPU进行处理的方法。
在这一部分中,节点A只有发送机,节点B只有接收机。在我们提供的参考代码中,节点A发送,节点B接收。
(py37)$ python test_nodeB.py -p socket -l single # run first (py37)$ python test_nodeA.py -p socket -l single
tx_packet_queue
和 rx_packet_queue
的功能 (5%)tx_packet_queue_watcher_thread
和 rx_packet_queue_watcher_thread
的功能 (5%)在这一部分中,节点A和B都具有收发机。在我们提供的参考代码中,节点A触发包传输,并且在节点B接收到包后,它将回馈一个随机的包。然后节点A对随机包进行解码。整个过程继续。
(py37)$ python test_nodeB.py -p socket -l double # run first (py37)$ python test_nodeA.py -p socket -l double
(py37)$ python test_nodeB.py -p socket --arq-mode stop-and-wait-ARQ # run first (py37)$ python test_nodeA.py -p socket --arq-mode stop-and-wait-ARQ
simu_pkt_loss_delay()
。此外还存在比特错误的可能性。请找出模拟比特错误的代码位置,我们的系统是否要处理这种错误,该如何处理?(10%)simu_pkt_loss_delay()
中的pkt_loss_rate
参数的值。(5%)send()
函数以使用停止等待ARQ协议来传输从图像中提取的数据包。记录控制台输出以及你使用的图像。提交你开发的程序。(5%)recv()
函数来接收图像的数据包。记录控制台输出,并保存图片。提交你开发的程序。 (10%)dec2bin
和 bin2dec
实现十进制数与二进制数之间的转换