交換機是(shì)我們網絡領域應用最爲(wéi / wèi)廣泛的(de)網絡互聯設備,其主要(yào / yāo)功能是(shì)完成各端口之(zhī)間分組的(de)交換功能。交換機僅做分組交換,不(bù)對分組進行任何數據修改。交換機的(de)端口沒有IP與MAC的(de)屬性。端口數據IO一般爲(wéi / wèi)全雙工模式,即可同時(shí)進行分組收發工作。端口速率通常爲(wéi / wèi)10/100/1000M自适應模式,更高速率可支持到(dào)10G、25G、40G、100G和(hé / huò)400G。交換機的(de)端口數量一般大(dà)于(yú)2,小于(yú)64。
1)二層交換原理
二層交換的(de)原理是(shì)必須熟知的(de),網絡基礎課程教材或網絡上(shàng)都能找到(dào)。
2)Linux系統操作
我們的(de)開發環境都是(shì)基于(yú)Linux系統,故想要(yào / yāo)在(zài)此學習二層交換機的(de)設計與實現,一些必備的(de)Linux操作方法與常用命令要(yào / yāo)會。推薦《鳥哥私房菜》一書,可網上(shàng)搜索。
3)C語言編程
平台開發的(de)編程語言全部是(shì)C語言,這(zhè)也(yě)是(shì)接觸計算機學生通常會學習到(dào)的(de)語言,更是(shì)計算機專業的(de)必學專業課。不(bù)求精通,但求普通,一般的(de)C程序編寫、庫函數調用和(hé / huò)基本打印調試等操作要(yào / yāo)會。
4)一套OpenBox-S4開發平台
如題所述,從一開始,便是(shì)從一個(gè)OpenBox-S4開發平台開始,二層交換的(de)實驗和(hé / huò)我們後續所有相關的(de)實驗基本上(shàng)是(shì)構建在(zài)這(zhè)個(gè)開發平台之(zhī)上(shàng)。如果沒有這(zhè)個(gè)平台也(yě)可以(yǐ)學習這(zhè)些實驗的(de)設計與實現過程,隻是(shì)驗證和(hé / huò)測試起來(lái)會麻煩一些。
OpenBox-S4是(shì)我們用來(lái)做實驗開發的(de)平台,平台完成了(le/liǎo)軟硬件數據IO的(de)基本功能,提供規範的(de)軟件UA編程開發模式,讓用戶不(bù)需要(yào / yāo)關心平台如何完成軟硬件數據IO和(hé / huò)系統之(zhī)間的(de)分組調度與轉發功能,可以(yǐ)将全部精力集中在(zài)本身業務系統的(de)設計上(shàng)。所以(yǐ)平台并不(bù)是(shì)本次網絡原理性功能實現的(de)重點,隻是(shì)一個(gè)使用工具。使用該平台需要(yào / yāo)對其有個(gè)基本的(de)了(le/liǎo)解,會簡單的(de)開發編程工作。
1)整體架構
OpenBox是(shì)衡阳小九的(de)主打品牌,該品牌擁有多種不(bù)同型号具體産品。OpenBox-S4是(shì)一款專爲(wéi / wèi)計算機網絡實驗課程打造的(de)軟硬件全功能可編程平台,平台基于(yú)FAST架構實現,是(shì)一種靈活的(de)軟硬件協同方式數據處理模型。整體架構如圖1所示,具體的(de)FAST架構介紹與OpenBox-S4設備平台介紹見
《FAST簡介》和(hé / huò)
《OpenBox網絡全功能可編程平台:工欲善其事,必先利其器!》。

圖1 整體框架圖
2)數據格式
在(zài)FAST框架下,硬件模塊之(zhī)間、軟件模塊之(zhī)間和(hé / huò)軟硬件之(zhī)間的(de)交互數據采用統一标準定義格式。格式規定在(zài)完整的(de)以(yǐ)太網數據幀前增加了(le/liǎo)32字節的(de)分組metadata内容,用來(lái)标識分組的(de)輸入端口、長度、輸出(chū)端口、接收時(shí)刻和(hé / huò)流标識等等,具體如表1所示:
3)UA數據處理流程
UA是(shì)用戶應用(User Application),運行在(zài)用戶态的(de)可執行程序。應用程序通過向系統注冊和(hé / huò)硬件規則配置,将符合業務功能要(yào / yāo)求的(de)分組從硬件提取到(dào)軟件,并由FAST架構開發環境的(de)數據路由模塊将該特征數據分發給相應的(de)注冊用戶。程序注冊時(shí)需要(yào / yāo)提交一個(gè)分組處理的(de)回調函數,當系統接收到(dào)本程序的(de)業務分組時(shí),會主動調用程序的(de)回調函數将分組交付給用戶的(de)業務邏輯處理。用戶處理完分組後可通過系統發送函數将分組轉發給其他(tā)應用模塊(用戶應用UA、普通Socket應用CA、内核應用KA和(hé / huò)硬件應用HA)進行處理。如果是(shì)直接從硬件發送,則分組的(de)發送字段中的(de)dstmid直接填寫HA的(de)編号(硬件發送HA的(de)ID爲(wéi / wèi)5)。
4)編程API
i.注冊UA
fast_ua_init(mid,callback):向系統注冊一個(gè)UA,是(shì)UA編程的(de)核心函數。聲明自己的(de)模塊ID号和(hé / huò)接收到(dào)分組後的(de)回調處理函數。
ii.接收分組
callback(pkt,len):開源版本的(de)接收分組不(bù)是(shì)用戶主動請求式方法,爲(wéi / wèi)系統回調方式,即系統接收到(dào)了(le/liǎo)一個(gè)符合UA的(de)模塊ID号的(de)分組後,會在(zài)系統環境調用UA注冊的(de)callback函數,将分組傳遞給該函數進行處理。
iii.發送分組
fast_ua_send(pkt,len):将一個(gè)處理完成的(de)分組發送到(dào)其他(tā)模塊,包括其他(tā)UA、HA、CA或HA。隻需要(yào / yāo)将分組metadata字段中的(de)目的(de)模塊ID号設置爲(wéi / wèi)對應模塊的(de)編号即可。
iv.規則配置
FAST的(de)硬件HA中包含查表匹配功能模塊,可以(yǐ)支持硬件規則的(de)配置。規則匹配模塊既可支持細粒度的(de)具體流屬性配置,也(yě)可支持全表默認規則配置。
在(zài)開發自己的(de)二層交換機功能之(zhī)前,可以(yǐ)先搭建測試環境,驗證一下系統自帶的(de)二層交換機功能,從其運行輸出(chū)中進一步了(le/liǎo)解交換原理與數據處理流程。
1)構建環境
測試環境至少需要(yào / yāo)一台OpenBox-S4設備、兩台網絡通信測試主機和(hé / huò)一台控制主機,控制主機主要(yào / yāo)用來(lái)連接S4設備,運行系統命令、編寫代碼和(hé / huò)編譯程序等功能。拓撲連接圖如下所示:

二層交換驗證拓撲圖
2)開發平台操作
S4設備支持串口與網口兩種登錄管理方式,均可使用putty工具連接,工具使用請網上(shàng)搜索。
平台是(shì)一個(gè)小型Linux主機系統,與普通Linux服務差異不(bù)大(dà),故在(zài)上(shàng)面的(de)命令操作、代碼修改與編譯,與學生在(zài)虛拟機環境或Linux服務器上(shàng)的(de)操作使用完全一緻。
3)交換驗證
通過串口或網口登錄平台後,直接在(zài)命令行終端輸入命令,即可啓動二層交換機功能。
#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
建議在(zài)平台運行命令時(shí)使用串口方式登錄,斷開連線後,系統命令仍可正常工作,而(ér)且控制主機也(yě)可充當一台網絡測試主機。如果是(shì)網絡連接,必須确保連接網絡的(de)通路持續保持,否則管理網絡斷開後,系統命令也(yě)會随着鏈路斷開而(ér)被停止,導緻系統命令功能無法運行。
4)觀察與分析交換流程
a)端口接收到(dào)一個(gè)分組,在(zài)回調函數中打印輸出(chū)
inport:0,dstmid:129,len:130,dmac:B8:27:EB:C1:D1:39,smac:B8:27:EB:D8:83:20
b)在(zài)端口0上(shàng)學習到(dào)一個(gè)新MAC地(dì / de)址,存儲在(zài)表項索引爲(wéi / wèi)0的(de)位置
learn_smac->add new MAC,port:0,index:0
c)根據目的(de)MAC查表,得到(dào)返回結果(-1表示沒有查到(dào)匹配的(de)MAC地(dì / de)址)
find_dmac->ret = -1
d)泛洪發出(chū)分組,分組輸入端口爲(wéi / wèi)0,4端口設備泛洪到(dào)1,2,3端口輸出(chū)
------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)正常發送一個(gè)分組,輸出(chū)端口爲(wéi / wèi)0
pkt_send_normal->0xb4c00468,outport:0,len:130
1)二層交換的(de)數據處理流程
二層交換的(de)核心是(shì)将一個(gè)端口輸入的(de)分組搬到(dào)另一個(gè)端口輸出(chū),至于(yú)如何選擇輸出(chū)端口,則需要(yào / yāo)根據分組中的(de)目的(de)MAC地(dì / de)址來(lái)确定。如何知道(dào)一個(gè)目的(de)MAC在(zài)哪個(gè)端口上(shàng)呢?則需要(yào / yāo)在(zài)接收分組的(de)時(shí)候對分組的(de)源MAC進行學習。故二層交換的(de)整體數據處理流程如下:
1)從端口接收到(dào)一個(gè)分組,攜帶了(le/liǎo)輸入端口号、長度和(hé / huò)完整以(yǐ)太網幀内容;
2)提取以(yǐ)太網幀的(de)源MAC地(dì / de)址和(hé / huò)輸入端口,保存到(dào)MAC轉發表中;
3)提取以(yǐ)太網幀的(de)目的(de)MAC地(dì / de)址,到(dào)MAC轉發表中查找,輸出(chū)查表結果;
4)根據查表結果進行轉發;單播或泛洪發出(chū)。
2)開發平台編程入門
所有實驗内容均在(zài)OpenBox-S4平台進行,其FAST架構的(de)核心優先不(bù)多說(shuō)了(le/liǎo),主要(yào / yāo)是(shì)該架構下軟件分組與硬件分組格式一緻,軟件邏輯功能實現後可以(yǐ)很方便的(de)卸載到(dào)硬件實現,分組可攜帶metadata數據在(zài)軟硬件模塊之(zhī)間傳遞,保留分組解析狀态與處理狀态。
OpenBox-S4隻是(shì)一個(gè)我們設計系統的(de)工具,與具體實現網絡原理性功能無關,沒有設備的(de)用戶也(yě)可以(yǐ)在(zài)普通電腦上(shàng)參考本系列分享文章完成二層交換機的(de)設計與實現(僅分組收發有點差異)。下面一篇文章将帶領大(dà)家熟悉一下UA的(de)編程規範與開發流程(C語言的(de)main函數加一個(gè)callbak函數)。
歡迎您和(hé / huò)學生們加入FAST開源項目群溝通與探讨,一起體驗不(bù)一樣的(de)系統設計過程。請先加微信号15116127200後邀請入群。

關注FAST開源社區
FAST一一開源、開放、高速、高效、可編程、可定義!軟硬件協同并行處理。