二层交换机原型设计与实现(一)

一、概述

交换机是我们网络领域应用最为广泛的网络互联设备,其主要功能是完成各端口之间分组的交换功能。交换机仅做分组交换,不对分组进行任何数据修改。交换机的端口没有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 FAST整体框架

 

2)数据格式

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

 

表1 FAST架构metadata字段属性表

字段名

功能

备注

pkttype

分组类型

0表示数据分组,1表示控制分组

pktdst

分组目的

0表示送硬件接口,1表示送软件

inport

输入端口

分组输入的端口号

outtype

输出类型

0:单播,1:组播,2:泛洪,3:原端口返回

outport

输出端口

分组输出端口号

priority

分组优先级

映射到输出端口不同优先级队列

discard

分组丢弃

1表示丢弃分组

len

分组长度

metadata和以太网帧长度的和

srcmid

源模块ID

上一级处理模块ID

dstmid

目的模块ID

下一级处理模块ID

pst

分组协议类别

参考硬件定义,为常用分组协议组合格式分类

seq

分组序号

端口汇聚后进行计数编号

flowID

流编号

对流的关键元组进行HASH后的值

pktsrc

分组来源

0表示硬件接口,1表示软件

reserve

保留位

可用来表示时间高位

ts

分组接收时戳

分组进端口时标记

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开源公众号标题

 

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值