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

圖1 整體框架圖
     2)數據格式
     在FAST框架下,硬件模塊之間、軟件模塊之間和(hé)軟硬件之間的(de)交互數據采用統一(yī)标準定義格式。格式規定在完整的(de)以太網數據幀前增加了32字節的(de)分組metadata內(nèi)容,用來标識分組的(de)輸入端口、長(cháng)度、輸出端口、接收時刻和(hé)流标識等等,具體如(rú)表1所示:

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

二層交換驗證拓撲圖
     2)開發平台操作
     S4設備支持串口與網口兩種登錄管理(lǐ)方式,均可(kě)使用putty工具連接,工具使用請網上搜索。
     平台是一(yī)個小型Linux主機(jī)系統,與普通Linux服務差異不大,故在上面的(de)命令操作、代碼修改與編譯,與學(xué)生在虛拟機(jī)環境或Linux服務器上的(de)操作使用完全一(yī)緻。
     3)交換驗證
     通過串口或網口登錄平台後,直接在命令行(xíng)終端輸入命令,即可(kě)啓動二層交換機(jī)功能。

#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

     建議在平台運行(xíng)命令時使用串口方式登錄,斷開連線後,系統命令仍可(kě)正常工作,而且控制主機(jī)也可(kě)充當一(yī)台網絡測試主機(jī)。如(rú)果是網絡連接,必須确保連接網絡的(de)通路持續保持,否則管理(lǐ)網絡斷開後,系統命令也會随着鏈路斷開而被停止,導緻系統命令功能無法運行(xíng)。
     4)觀察與分析交換流程
     a)端口接收到一(yī)個分組,在回調函數中打印輸出

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

     b)在端口0上學(xué)習到一(yī)個新MAC地(dì)址,存儲在表項索引為(wèi)0的(de)位置

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

     c)根據目的(de)MAC查表,得到返回結果(-1表示沒有(yǒu)查到匹配的(de)MAC地(dì)址)

find_dmac->ret = -1

     d)泛洪發出分組,分組輸入端口為(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)正常發送一(yī)個分組,輸出端口為(wèi)0

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

     1)二層交換的(de)數據處理(lǐ)流程
     二層交換的(de)核心是将一(yī)個端口輸入的(de)分組搬到另一(yī)個端口輸出,至于如(rú)何選擇輸出端口,則需要根據分組中的(de)目的(de)MAC地(dì)址來确定。如(rú)何知道(dào)一(yī)個目的(de)MAC在哪個端口上呢(ne)?則需要在接收分組的(de)時候對分組的(de)源MAC進行(xíng)學(xué)習。故二層交換的(de)整體數據處理(lǐ)流程如(rú)下:
     1)從端口接收到一(yī)個分組,攜帶了輸入端口号、長(cháng)度和(hé)完整以太網幀內(nèi)容;
     2)提取以太網幀的(de)源MAC地(dì)址和(hé)輸入端口,保存到MAC轉發表中;
     3)提取以太網幀的(de)目的(de)MAC地(dì)址,到MAC轉發表中查找,輸出查表結果;
     4)根據查表結果進行(xíng)轉發;單播或泛洪發出。
     2)開發平台編程入門
     所有(yǒu)實驗內(nèi)容均在OpenBox-S4平台進行(xíng),其FAST架構的(de)核心優先不多說了,主要是該架構下軟件分組與硬件分組格式一(yī)緻,軟件邏輯功能實現後可(kě)以很方便的(de)卸載到硬件實現,分組可(kě)攜帶metadata數據在軟硬件模塊之間傳遞,保留分組解析狀态與處理(lǐ)狀态。
     OpenBox-S4隻是一(yī)個我們設計系統的(de)工具,與具體實現網絡原理(lǐ)性功能無關,沒有(yǒu)設備的(de)用戶也可(kě)以在普通電腦上參考本系列分享文章(zhāng)完成二層交換機(jī)的(de)設計與實現(僅分組收發有(yǒu)點差異)。下面一(yī)篇文章(zhāng)将帶領大家熟悉一(yī)下UA的(de)編程規範與開發流程(C語言的(de)main函數加一(yī)個callbak函數)。
     歡迎您和(hé)學(xué)生們加入FAST開源項目群溝通與探讨,一(yī)起體驗不一(yī)樣的(de)系統設計過程。請先加微信号15116127200後邀請入群。

關注FAST開源社區
FAST一(yī)一(yī)開源、開放、高(gāo)速、高(gāo)效、可(kě)編程、可(kě)定義!軟硬件協同并行(xíng)處理(lǐ)。