0731-84728105
15116127200
二层交换机原型设计与实现(一)
发布时间:2021-04-30
     交换机是我们网络领域应用最为广泛的网络互联设备,其主要功能是完成各端口之间分组的交换功能。交换机仅做分组交换,不对分组进行任何数据修改。交换机的端口没有IP与MAC的属性。端口数据IO一般为全双工模式,即可同时进行分组收发工作。端口速率通常为10/100/1000M自适应模式,更高速率可支持到10G、25G、40G、100G和400G。交换机的端口数量一般大于2,小于64。
     1)二层交换原理
     二层交换的原理是必须熟知的,网络基础课程教材或网络上都能找到。
     2)Linux系统操作
     我们的开发环境都是基于Linux系统,故想要在此学习二层交换机的设计与实现,一些必备的Linux操作方法与常用命令要会。推荐《鸟哥私房菜》一书,可网上搜索。
     3)C语言编程
     平台开发的编程语言全部是C语言,这也是接触计算机学生通常会学习到的语言,更是计算机专业的必学专业课。不求精通,但求普通,一般的C程序编写、库函数调用和基本打印调试等操作要会。
     4)一套OpenBox-S4开发平台
     如题所述,从一开始,便是从一个OpenBox-S4开发平台开始,二层交换的实验和我们后续所有相关的实验基本上是构建在这个开发平台之上。如果没有这个平台也可以学习这些实验的设计与实现过程,只是验证和测试起来会麻烦一些。
     OpenBox-S4是我们用来做实验开发的平台,平台完成了软硬件数据IO的基本功能,提供规范的软件UA编程开发模式,让用户不需要关心平台如何完成软硬件数据IO和系统之间的分组调度与转发功能,可以将全部精力集中在本身业务系统的设计上。所以平台并不是本次网络原理性功能实现的重点,只是一个使用工具。使用该平台需要对其有个基本的了解,会简单的开发编程工作。
      1)整体架构
     OpenBox是湖南新实的主打品牌,该品牌拥有多种不同型号具体产品。OpenBox-S4是一款专为计算机网络实验课程打造的软硬件全功能可编程平台,平台基于FAST架构实现,是一种灵活的软硬件协同方式数据处理模型。整体架构如图1所示,具体的FAST架构介绍与OpenBox-S4设备平台介绍见《FAST简介》《OpenBox网络全功能可编程平台:工欲善其事,必先利其器!》

图1 整体框架图
     2)数据格式
     在FAST框架下,硬件模块之间、软件模块之间和软硬件之间的交互数据采用统一标准定义格式。格式规定在完整的以太网数据帧前增加了32字节的分组metadata内容,用来标识分组的输入端口、长度、输出端口、接收时刻和流标识等等,具体如表1所示:

      3)UA数据处理流程
     UA是用户应用(User Application),运行在用户态的可执行程序。应用程序通过向系统注册和硬件规则配置,将符合业务功能要求的分组从硬件提取到软件,并由FAST架构开发环境的数据路由模块将该特征数据分发给相应的注册用户。程序注册时需要提交一个分组处理的回调函数,当系统接收到本程序的业务分组时,会主动调用程序的回调函数将分组交付给用户的业务逻辑处理。用户处理完分组后可通过系统发送函数将分组转发给其他应用模块(用户应用UA、普通Socket应用CA、内核应用KA和硬件应用HA)进行处理。如果是直接从硬件发送,则分组的发送字段中的dstmid直接填写HA的编号(硬件发送HA的ID为5)。
     4)编程API
     i.注册UA
     fast_ua_init(mid,callback):向系统注册一个UA,是UA编程的核心函数。声明自己的模块ID号和接收到分组后的回调处理函数。
     ii.接收分组
     callback(pkt,len):开源版本的接收分组不是用户主动请求式方法,为系统回调方式,即系统接收到了一个符合UA的模块ID号的分组后,会在系统环境调用UA注册的callback函数,将分组传递给该函数进行处理。
     iii.发送分组
     fast_ua_send(pkt,len):将一个处理完成的分组发送到其他模块,包括其他UA、HA、CA或HA。只需要将分组metadata字段中的目的模块ID号设置为对应模块的编号即可。
     iv.规则配置
     FAST的硬件HA中包含查表匹配功能模块,可以支持硬件规则的配置。规则匹配模块既可支持细粒度的具体流属性配置,也可支持全表默认规则配置。
     在开发自己的二层交换机功能之前,可以先搭建测试环境,验证一下系统自带的二层交换机功能,从其运行输出中进一步了解交换原理与数据处理流程。
      1)构建环境
     测试环境至少需要一台OpenBox-S4设备、两台网络通信测试主机和一台控制主机,控制主机主要用来连接S4设备,运行系统命令、编写代码和编译程序等功能。拓扑连接图如下所示:

二层交换验证拓扑图
     2)开发平台操作
     S4设备支持串口与网口两种登录管理方式,均可使用putty工具连接,工具使用请网上搜索。
     平台是一个小型Linux主机系统,与普通Linux服务差异不大,故在上面的命令操作、代码修改与编译,与学生在虚拟机环境或Linux服务器上的操作使用完全一致。
     3)交换验证
     通过串口或网口登录平台后,直接在命令行终端输入命令,即可启动二层交换机功能。

#l2switch
fastU->REG Version:20180827,OpenBox HW Version:2030200722
FAST UA REG->from pid:902,state:21,mid:129
fastU->Register UA to FAST Kernel! Wait Reply......
fastU->UA->pid:902,mid:129,Register OK!
fastU->libua version:20180827
Create nm08_mac_aging thread OK!
aging[0]->invalid mac:0
fastU->fast_ua_recv......
ID PORT0 PORT1 PORT2 PORT3
0 . . . .
aging[1]->invalid mac:0
ID PORT0 PORT1 PORT2 PORT3
0 . . . .
aging[2]->invalid mac:0

     建议在平台运行命令时使用串口方式登录,断开连线后,系统命令仍可正常工作,而且控制主机也可充当一台网络测试主机。如果是网络连接,必须确保连接网络的通路持续保持,否则管理网络断开后,系统命令也会随着链路断开而被停止,导致系统命令功能无法运行。
     4)观察与分析交换流程
     a)端口接收到一个分组,在回调函数中打印输出

inport:0,dstmid:129,len:130,dmac:B8:27:EB:C1:D1:39,smac:B8:27:EB:D8:83:20

     b)在端口0上学习到一个新MAC地址,存储在表项索引为0的位置

learn_smac->add new MAC,port:0,index:0

     c)根据目的MAC查表,得到返回结果(-1表示没有查到匹配的MAC地址)

find_dmac->ret = -1

     d)泛洪发出分组,分组输入端口为0,4端口设备泛洪到1,2,3端口输出

------pkt_send_flood------
pkt_send_normal->0xb4c00468,outport:1,len:130
pkt_send_normal->0xb4c00468,outport:2,len:130
pkt_send_normal->0xb4c00468,outport:3,len:130

     e)正常发送一个分组,输出端口为0

pkt_send_normal->0xb4c00468,outport:0,len:130

     1)二层交换的数据处理流程
     二层交换的核心是将一个端口输入的分组搬到另一个端口输出,至于如何选择输出端口,则需要根据分组中的目的MAC地址来确定。如何知道一个目的MAC在哪个端口上呢?则需要在接收分组的时候对分组的源MAC进行学习。故二层交换的整体数据处理流程如下:
     1)从端口接收到一个分组,携带了输入端口号、长度和完整以太网帧内容;
     2)提取以太网帧的源MAC地址和输入端口,保存到MAC转发表中;
     3)提取以太网帧的目的MAC地址,到MAC转发表中查找,输出查表结果;
     4)根据查表结果进行转发;单播或泛洪发出。
     2)开发平台编程入门
     所有实验内容均在OpenBox-S4平台进行,其FAST架构的核心优先不多说了,主要是该架构下软件分组与硬件分组格式一致,软件逻辑功能实现后可以很方便的卸载到硬件实现,分组可携带metadata数据在软硬件模块之间传递,保留分组解析状态与处理状态。
     OpenBox-S4只是一个我们设计系统的工具,与具体实现网络原理性功能无关,没有设备的用户也可以在普通电脑上参考本系列分享文章完成二层交换机的设计与实现(仅分组收发有点差异)。下面一篇文章将带领大家熟悉一下UA的编程规范与开发流程(C语言的main函数加一个callbak函数)。
     欢迎您和学生们加入FAST开源项目群沟通与探讨,一起体验不一样的系统设计过程。请先加微信号15116127200后邀请入群。

关注FAST开源社区
FAST一一开源、开放、高速、高效、可编程、可定义!软硬件协同并行处理。