交換機是我們網絡領域應用最為廣泛的網絡互聯設備,其主要功能是完成各端口之間分組的交換功能。交換機僅做分組交換,不對分組進行任何數據修改。交換機的端口沒有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一一開源、開放、高速、高效、可編程、可定義!軟硬件協同并行處理。