注:此为由我担任组长的课程小组在《高等计算机网络》课程上完成的项目,并最终获得最佳项目称号。组员还包括高一川、何家傲。此报告首先作为项目报告发布在 “赛博新经济”公众号 上。此外何家傲也撰写了 相关的博客,推荐阅读。
项目背景与目标
计算机系本科核心课程《计算机网络原理》的实验要求学生完成软件(基于树莓派和 Linux 操作系统)或者硬件(基于 ThinRouter FPGA 开发板)路由器,功能包括分组转发(校验、查表、修改、ICMP 协议)与简单路由协议(RIP v2 的一个子集)。对于学生的路由器实现,助教需要进行验收与检查,包括转发正确性、静态路由连通性、路由协议正确性,以及转发性能(可见 https://lab.cs.tsinghua.edu.cn/router/doc/joint/eval/)。考虑到四口 GbE 路由器的理论转发性能上限可达 5.952 Mpps(而使用 FPGA 实现也很容易达到这一速率),普通 PC / 服务器不借助特殊手段(如 Intel DPDK)无法进行正确的发送/接收,专用网络测试仪通常价格昂贵且可定制性不足。基于上述原因,我们基于 ThinRouter 路由器开发板设计了硬件测试平台,满足测试需求。
整体架构
项目的整体架构如上图所示。ThinRouter 开发板的硬件部分主要由 Xilinx Artix-7 FPGA 与 ZYNQ SoC 两部分构成,其中 ZYNQ SoC 又分为 PS(ARM 处理器)和 PL(FPGA)两部分。Artix FPGA 上运行核心测速逻辑,其控制的四个 SFP 端口与学生路由器连接;ZYNQ 的 PS 部分运行 Linux 操作系统,运行测速软件并通过 HTTP 暴露用户界面;ZYNQ 的 PL 部分连接 Artix FPGA,并虚拟出四个网络接口供 Linux 使用,在 Artix 与 PS 间转发非测速流量与测速控制信号。
ZYNQ SoC 的系统集成工作主要由高一川完成,Artix FPGA 上的测速逻辑编写主要由陈晟祺完成,测试软件前后端的编写与测速具体实现主要由何家傲完成。
Artix FPGA 测速逻辑实现
上图是 Artix-7 FPGA 上的核心测速逻辑实现,主要分为三大部分:测试控制器、帧生成器(frame generator)、帧检查器(frame checker)。测试控制器可设置测速的各类元数据(如每个端口使用的源和目标 IP、MAC,帧大小,测试时间)、控制生成器与检查器启动和停止测试、收集测试数据。对于任意的合法帧大小(包含以太网头不含 FCS 的合法范围时 60~1500 字节),帧的检查和生成都能达到线速,具体原理描述如下:
帧的生成遵循一定的规则(如利用 IP 头的 TOS 与协议字段进行特殊标记,内容是可从 ID 推断的随机数序列),直接发送到各个接口的发送端(TX)上。为了使得 ZYNQ PS 通过 PL 发来的非测速流量不被测速流量干扰,各个接口的发送端都进行了仲裁,对测速帧设置了较低的优先级。
帧检查器从各个接口的接收端(RX)不断接收以太网帧,当匹配到测速帧特有的标记时,会进一步对内容进行检查,并分别统计正确与错误的测速帧数量。帧检查器收到的所有测速帧无论内容是否正确,都会被静默消耗,而非测速帧会被不加改动地送进下一级,最终通过 PL 到达 ZYNQ PS,被 Linux 网络栈正常处理。
上面两图为测速逻辑通过 Vivado 综合后 FPGA 的布线和占用情况,可见四个端口的测速逻辑与控制器比较均匀地分布在 FPGA 的各个器件上,FPGA 上的各类的硬件资源(如查找表、BRAM)也得到了比较充分的利用。
ZYNQ SoC 上的测试控制
我们使用的 ThinRouter 开发板上,具有用于管理控制功能的 ZYNQ SoC 芯片,与 Artix-7 FPGA 通过数根信号线相连。其 PS 部分为双核 Cortex-A9 处理器,同时配备 DDR 内存,可以支持嵌入式 Linux 操作系统的运行;而 PL 部分为可编程的 FPGA 逻辑,可以实现自定义的接口逻辑等。我们使用这一 SoC 芯片,完成测试仪自身的管理和控制功能。
PS 端 Linux 系统上运行 Web 服务和测速服务,其中 Web 服务与前端交互,将前端控制请求发送至测速服务;测速服务与 PL 逻辑进行交互,进而间接地与 Artix-7 上的测速控制逻辑通讯。同时 PS 端还负责运行 ping 等常用网络测试程序,以及 BIRD 等路由软件,这些软件通过四个虚拟以太网接口,与被测试的学生路由器进行通讯,同时受到测速服务软件的控制,以便捷地完成各类基本连通性、路由功能测试。
PL 端上实现了虚拟以太网接口的逻辑,该逻辑通过标准 AXI4 总线与 PS 相连,在 Linux 侧体现为四个标准以太网接口,分别对应被测路由器的四个接口;而该接口上收发的数据,使用逻辑转换为 AXI4-Stream 协议,发送至 Artix-7 FPGA 上的测试逻辑。PL 同时完成对测速逻辑控制寄存器 AXI 总线请求的转发。
值得一提的是,我们在 ZYNQ PL 处使用了开源的 PonyLink 项目,通过单根信号线完成 ZYNQ 与 Artix-7 两个芯片间的高速双向通讯,同时对两侧暴露 AXI4-Stream 接口,提供了便捷且稳定的通讯方式,在此处向该项目的开发者 Claire Wolf 表示感谢。
前端与硬件接口设计
为了方便助教与同学们使用,我们提供了一套基于 Web 的前端,集成了对路由表项注入、连通性测试、转发速度测试的配置与控制功能,并设计了美观的结果可视化界面。使用该前端,既可以分别进行某一项特定测试以方便调试,也可以一键运行最终检查时所需运行的所有测例,并生成报告。其某次一键测试的报告如此图所示。
我们使用了 BIRD 路由管理工具来进行路由表项的管理。为了模拟真实网络环境,我们使用 Route Views 抓取了真实世界的 IPv4 路由表,并从中随机选取与同学所实现的路由器容量相当的表项,随机从四个端口中的一个发向同学路由器,检测所有端口是否都可集齐发出的所有路由。值得一提的是,由于同学的路由器上运行的 RIP 路由表项插入算法运行在同学们自己实现的 CPU 上,性能可能较低,故我们在测试仪系统中使用 iproute2
的 tc
(traffic control) 功能对收发路由表进行了限速和缓冲,从而避免由于测试仪端丢包而导致的结果误差。有趣的是,在测试中我们发现某位网原助教给出的参考软件路由器实现中,对 IP 地址掩码长度处理有误,导致非 8 的整数倍的掩码不能被正确处理。这说明我们的测试逻辑是十分有效的。
连通性测试模块提供不同源/目标端口的组合。测试软件会从配置的路由表项中随机抽取一个合法的 ip,配置到对应网口,然后从另一个网口使用 ping 命令对其进行测试。
测速模块通过特定寄存器与软件逻辑进行交互。软件可以根据需求对测速逻辑的目标地址,测速长度,测速帧大小等参数进行配置,并在测速完成后读取测速的结果,反馈给前端。
关于测速软件端的实现细节和开发过程中遇到的一些问题,何家傲的博客中有详细的记录(和吐槽)。限于篇幅和文风限制,此处就不再展开了。
Demo
下面的视频展示了测速仪对一个软路由器进行性能测试的过程。
下图展示了测试时的设备连接方式。测速仪与同学所使用的硬件实验开发板相同,通过四条网线与被测路由器相连。在此测试场景中,被测路由器运行在一个 Rasoberry Pi 3b+ 上,故使用了四个 USB 以太网适配器作为被测路由器的四个网口。
访问 https://lab.cs.tsinghua.edu.cn/tanlabs-speed-tester/ 可以查看一个展示着真实测试结果的前端,但此前端并没有接入可以运行测速的后端。
测试效果
截至 2020/12/24,我们已经使用该测试仪对于全部六组硬件组的实现和部分软件实现进行了测试,均成功地发现了实现正确性问题。共有三组硬件组修复问题后通过了全部测试(即能够存储一定容量的路由表、双路双工小包线速转发、能够在一定的拓扑下交换路由表)。测试仪发现的一些典型问题包括:
- IP checksum 增量更新错误(仅有 2/65536 概率,通过软件多次测试未能发现)
- IP 包头 1 bit 覆盖错误(50% 概率,软件测试亦未发现)
- 路由表前缀长度处理方式错误(混淆字节序与比特序的概念)
- RIP 字段填写逻辑错误、RIP 包发送逻辑错误(未遵循 RFC 实现)
未来展望
在本学期结束后,我们将根据学生反馈、助教使用体验进一步地改善测试仪的设计,并提高其稳定性。下学期,测试仪将与其他网原助教研制的测试控制服务器、软件测试仪等项目集成为新版路由器实验测试平台,能够对学生的软件和硬件高效地、完全自动化地进行功能与性能测试。相信这一实验平台将给学生带来更好的实验体验,进一步激发学生对于学习网络原理、培养系统能力的兴趣。