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

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

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

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

#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

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

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

     b)在端口0上學(xué)习到一个新(xīn)MAC地址,存储在表项索引為(wèi)0的位置

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

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

find_dmac->ret = -1

     d)泛洪发出分(fēn)组,分(fēn)组输入端口為(wèi)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)正常发送一个分(fēn)组,输出端口為(wèi)0

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

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

关注FAST开源社區(qū)
FAST一一开源、开放、高速、高效、可(kě)编程、可(kě)定义!软硬件协同并行处理(lǐ)。
服務(wù)热線(xiàn)