陳 麓,鹿 瑾,徐 曼
(1.中國(guó)電信股份有限公司 徐州分公司 網(wǎng)絡(luò)維護(hù)中心,江蘇 徐州221000;2.中國(guó)礦業(yè)大學(xué) 信息與電氣工程學(xué)院,江蘇 徐州221008)
Linux2.4x內(nèi)核中與生成樹(shù)協(xié)議相關(guān)的程序由透明網(wǎng)橋模塊完成,Linux的透明網(wǎng)橋協(xié)議是以Linux內(nèi)核為數(shù)據(jù)交換中心,而在實(shí)際工作中,網(wǎng)絡(luò)數(shù)據(jù)的交換與轉(zhuǎn)發(fā)都由交換芯片Marvell 88E6095完成。因此在不改變STA算法的前提下,移植Linux內(nèi)核透明網(wǎng)橋中與STP協(xié)議相關(guān)部分,能實(shí)現(xiàn)應(yīng)用于千兆以太網(wǎng)交換機(jī)的STP模塊。
生成樹(shù)協(xié)議STP(Spanning Tree Protocol)應(yīng)用于環(huán)路網(wǎng)絡(luò),通過(guò)一定的算法實(shí)現(xiàn)路徑冗余,同時(shí)將環(huán)路網(wǎng)絡(luò)修剪成無(wú)環(huán)路的樹(shù)型網(wǎng)絡(luò),從而避免報(bào)文在環(huán)路網(wǎng)絡(luò)中的增生和無(wú)限循環(huán)[1]。生成樹(shù)協(xié)議的基本原理是通過(guò)在交換機(jī)之間傳遞一種特殊的協(xié)議報(bào)文確定網(wǎng)絡(luò)的拓?fù)浣Y(jié)構(gòu)。
STP協(xié)議采用的算法稱(chēng)為生成樹(shù)算法STA[2](Spanning Tree Alogorithm),生成樹(shù)算法很復(fù)雜,但是其過(guò)程可以歸納為選擇根橋、選項(xiàng)根端口、選擇指定端口三個(gè)部分。
STP協(xié)議中用于網(wǎng)絡(luò)拓?fù)涔芾淼臄?shù)據(jù)流稱(chēng)為BPDU(Bridge Protocol Data Unit),網(wǎng)卡芯片則將 BPDU封裝成MGMT幀,MGMT幀與普通數(shù)據(jù)包的最大區(qū)別在于可以自由進(jìn)出已經(jīng)阻塞的端口,方便網(wǎng)絡(luò)拓?fù)涞墓芾怼?/p>
在Linux2.4x內(nèi)核中,驅(qū)動(dòng)程序并不支持類(lèi)似于MGMT幀的多播協(xié)議數(shù)據(jù)流,為使MGMT幀自由進(jìn)出系統(tǒng),需要兩個(gè)條件:(1)交換芯片 Marvell 88E6095必須支持IEEE 802.1D協(xié)議,且工作在該模式下;(2)驅(qū)動(dòng)程序需要開(kāi)啟對(duì)多播數(shù)據(jù)的支持,即開(kāi)啟MULTICAST關(guān)鍵字。

網(wǎng)絡(luò)數(shù)據(jù)在Linux系統(tǒng)的處理流程如圖1所示,以太網(wǎng)數(shù)據(jù)與MGMT幀混合并自由進(jìn)出系統(tǒng),Linux網(wǎng)絡(luò)驅(qū)動(dòng)將分離出以太網(wǎng)幀由系統(tǒng)正常處理,而對(duì)于MGMT幀則需要處理DSA_Tag;當(dāng)接收時(shí)去掉該標(biāo)記,而在發(fā)送時(shí)添加標(biāo)記。
當(dāng)硬件設(shè)置支持STP協(xié)議后,所有網(wǎng)絡(luò)數(shù)據(jù)在網(wǎng)卡接收時(shí)會(huì)添加DSA_Tag,而在發(fā)送時(shí)去掉相應(yīng)的DSA_Tag,如圖 2 所示[3]。
添加DSA_Tag的以太網(wǎng)幀會(huì)比正常以太網(wǎng)幀多4個(gè)字節(jié),其中 b16~b31為 STA算法所用,其他則應(yīng)用于VLAN模塊,此外CPU發(fā)送與接收的幀所含的DSA_Tag也不一樣,因此網(wǎng)絡(luò)驅(qū)動(dòng)也要做出相應(yīng)改變,否則由于位數(shù)的偏差正常以太網(wǎng)幀會(huì)被當(dāng)成錯(cuò)包丟棄。
以太網(wǎng)交換機(jī)實(shí)現(xiàn)STP模塊必須通過(guò)STA算法計(jì)算出根端口與指定端口,分析網(wǎng)路拓?fù)浣Y(jié)構(gòu),最終目標(biāo)是要在網(wǎng)絡(luò)中生成一顆無(wú)環(huán)狀的樹(shù),以期消除廣播風(fēng)暴以及單播數(shù)據(jù)幀對(duì)網(wǎng)絡(luò)的影響[4]。
STP協(xié)議規(guī)定了兩種類(lèi)型的MGMT幀,一種用于交換配置信息的CONFIG_BPDU幀,另一種則是通知網(wǎng)絡(luò)拓?fù)渥兓腡CN幀。
如圖3所示,在接收端,Linux內(nèi)核接收 MGMT幀會(huì)依次執(zhí)行以下任務(wù):更新CONFIG_BPDU幀、執(zhí)行STA收斂算法、設(shè)置寄存器;而在發(fā)送端MGMT幀由定時(shí)器定時(shí)發(fā)送,實(shí)時(shí)監(jiān)控網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu)。


Linux內(nèi)核中,每個(gè)交換機(jī)對(duì)應(yīng)一個(gè)與網(wǎng)橋有關(guān)的數(shù)據(jù)結(jié)構(gòu)Struct Net_Bridge,包含該交換機(jī)全部的端口信息與狀態(tài),并通過(guò)BPDU包實(shí)時(shí)更新。而每個(gè)交換機(jī)端口對(duì)應(yīng)一個(gè) Struct Bridge_Port,由 port_list串成鏈表,存放于Struct Net_Bridge中,如圖4所示。

其中Net_Bridge包含與標(biāo)準(zhǔn)STP有關(guān)的參數(shù),如定時(shí) 器 參 數(shù) Hello Time、Max Age、Forwarding Delay 等 ,Bridge_Port則只包含交換機(jī)端口信息。
STP模塊是千兆以太網(wǎng)交換機(jī)系統(tǒng)開(kāi)發(fā)中必不可少的一部分,與VLAN共同組成了交換機(jī)的網(wǎng)絡(luò)模塊。
交換機(jī)系統(tǒng)架構(gòu)如圖5所示,系統(tǒng)整體上分為應(yīng)用層、內(nèi)核層、硬件層。在實(shí)際設(shè)計(jì)中,STP模塊被編譯成驅(qū)動(dòng)插進(jìn)系統(tǒng)Linux內(nèi)核中。模塊化的管理將更為有效地提高系統(tǒng)穩(wěn)定性,方面系統(tǒng)的維護(hù)與版本的更新。

通過(guò)對(duì)Linux2.4x內(nèi)核中透明網(wǎng)橋代碼分析,利用Marvell 88E6095交換芯片,實(shí)現(xiàn)了千兆以太網(wǎng)交換機(jī)STP模塊的開(kāi)發(fā),并提出了嵌入式Linux下STP模塊開(kāi)發(fā)的設(shè)計(jì)方法與設(shè)計(jì)思路。由于篇幅所限,文章無(wú)法細(xì)致分析STA算法,且設(shè)計(jì)時(shí)遇到的具體困難也無(wú)法詳盡說(shuō)明。總而言之,STP模塊開(kāi)發(fā)是以太網(wǎng)交換機(jī)軟件系統(tǒng)開(kāi)發(fā)中必不可少的環(huán)節(jié),將極大增加交換機(jī)的可靠性與穩(wěn)定性。且由于Linux系統(tǒng)的免費(fèi)開(kāi)源等優(yōu)點(diǎn),基于Linux的STP模塊的開(kāi)發(fā)在嵌入式領(lǐng)域有廣闊的前景。
[1]李雪梅,孫旭.以太網(wǎng)交換機(jī)中 STP算法的優(yōu)化設(shè)計(jì).微電子學(xué)與計(jì)算機(jī),2006,23(5):53-55.
[2]張勁松,徐志根.快速生成樹(shù)協(xié)議端口角色選擇算法的研究[J].西南民族大學(xué)學(xué)報(bào)(自然科學(xué)版),2005,31(02):289-293.
[3]Link Street 88E6092/88E6095/88E6095F Datasheet.2006.9.
[4]李延冰,馬躍,王煒,等.基于生成樹(shù)的鏈路層拓?fù)浒l(fā)現(xiàn)算法[J].計(jì)算機(jī)工程,2006(18):38-41.