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

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

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

關(guān)注FAST開源社區(qū)
FAST一一開源、開放、高速、高效、可編程、可定義!軟硬件協(xié)同并行處理。