Ad hoc路由協(xié)議實(shí)現(xiàn)研究
在類Unix操作系統(tǒng)中,路由功能一般包括2部分。一部分駐留在操作系統(tǒng)內(nèi)核中,用以基于表驅(qū)動(dòng)的進(jìn)程,根據(jù)路由表信息,設(shè)定正確的地址,將數(shù)據(jù)分組發(fā)往對(duì)應(yīng)的網(wǎng)絡(luò)接口,這部分稱為“分組轉(zhuǎn)發(fā)功能模塊”;另一部分實(shí)現(xiàn)路由協(xié)議的邏輯計(jì)算,通過(guò)與其他主機(jī)交換信息計(jì)算出到其他節(jié)點(diǎn)的正確路由,實(shí)現(xiàn)真正的尋找路由和維護(hù)路由功能,這部分稱為“分組尋址功能模塊”。分組轉(zhuǎn)發(fā)路由模塊在內(nèi)核中基于一個(gè)內(nèi)核路由表來(lái)工作,每次發(fā)送數(shù)據(jù)分組都要查詢內(nèi)核路由表,取得對(duì)應(yīng)的下一跳鄰居節(jié)點(diǎn)的地址和對(duì)應(yīng)的網(wǎng)絡(luò)接口。內(nèi)核路由表一般由分組尋路功能模塊操作維護(hù)。在查找內(nèi)核路由表時(shí)根據(jù)路由表項(xiàng)轉(zhuǎn)發(fā)。如果找不到匹配的路由表項(xiàng),則按缺省路由發(fā)送,一般將網(wǎng)關(guān)作為缺省路由的下一跳節(jié)點(diǎn)。如果缺省路由不存在則操作系統(tǒng)將直接丟棄數(shù)據(jù)分組。分組尋路模塊功能負(fù)責(zé)尋路,它和其他節(jié)點(diǎn)交換信息,采用一定的路由算法計(jì)算和維護(hù)內(nèi)核路南表。分組尋路功能模塊既可在內(nèi)核實(shí)現(xiàn),也可在用戶空間實(shí)現(xiàn),Linux系統(tǒng)自帶的分組尋路模塊在內(nèi)核中。分組轉(zhuǎn)發(fā)功能和分組尋路功能分開(kāi)后,可在分組轉(zhuǎn)發(fā)功能模塊不變的情況下,通過(guò)修改分組尋路功能模塊用其他路由協(xié)議代替現(xiàn)有的路由協(xié)議。
4.3 Netfilter/iptables網(wǎng)絡(luò)分組的處理
Netfilter是嵌入在內(nèi)核IP協(xié)議棧的一系列調(diào)用入口,設(shè)置在數(shù)據(jù)報(bào)處理的路徑上。Netfilter為每種網(wǎng)絡(luò)協(xié)議定義一套鉤子函數(shù)(IPv4定義5個(gè)子函數(shù)),這些鉤子函數(shù)在數(shù)據(jù)分組流過(guò)協(xié)議棧的幾個(gè)關(guān)鍵點(diǎn)時(shí)被調(diào)用。在這幾個(gè)關(guān)鍵點(diǎn)上,協(xié)議把網(wǎng)絡(luò)數(shù)據(jù)分組、鉤子函數(shù)及鉤子函數(shù)標(biāo)號(hào)作為參數(shù)調(diào)用 Netfilter框架。內(nèi)核的任何模塊可對(duì)每種協(xié)議的一個(gè)或多個(gè)鉤子進(jìn)行注冊(cè)。當(dāng)某個(gè)數(shù)據(jù)報(bào)被傳送至Netfilter框架時(shí),內(nèi)核能夠檢測(cè)是否有模塊對(duì)該協(xié)議和鉤子進(jìn)行注冊(cè)。若已注冊(cè)則調(diào)用該模塊注冊(cè)時(shí)使用的回調(diào)函數(shù),這些模塊就有機(jī)會(huì)檢查、修改或丟棄該分組及指示Netfilter將該數(shù)據(jù)分組傳入用戶空間的隊(duì)列。排隊(duì)的數(shù)據(jù)分組被傳遞至用戶空間,在用戶空間異步進(jìn)行處理。
一個(gè)用戶空間進(jìn)程能夠檢查數(shù)據(jù)分組、修改數(shù)據(jù)分組,甚至還可重新將該數(shù)據(jù)分組通過(guò)離開(kāi)內(nèi)核的同一個(gè)鉤子函數(shù)重新注入內(nèi)核中。
綜上所述,由于Linux的Netfilter/iptables功能強(qiáng)大,并且與內(nèi)核結(jié)合完美,因此受到廣泛關(guān)注并應(yīng)用于Ad hoc路由協(xié)議的實(shí)現(xiàn)。
4.4 基本問(wèn)題的解決
Linux體系結(jié)構(gòu)下,在處理無(wú)路由分組和更新路由緩存時(shí)具有較好的解決途徑。
通過(guò)使用一個(gè)本地隧道設(shè)備Universal TUN/TAP作為這些地址‘接口’過(guò)濾無(wú)路由分組。再將這些分組緩存在一張由目的地IP地址為索引的Hash隊(duì)列。
當(dāng)路由發(fā)現(xiàn)完成成功后,使用新發(fā)現(xiàn)的路由,內(nèi)核中的這些分組被恰當(dāng)?shù)芈酚沙鋈ィ瑥亩^好處理了沒(méi)有路由分組。為每個(gè)路南表?xiàng)l目在內(nèi)核外面維護(hù)一個(gè)時(shí)間戳來(lái)更新路由緩存。
設(shè)計(jì)一個(gè)route_check的簡(jiǎn)單核心模塊維護(hù)該表,每個(gè)路由出去的分組都將經(jīng)該模塊,還可查看分組頭并更新對(duì)應(yīng)的時(shí)間戳。本文引用地址:http://www.biyoush.com/article/202642.htm
5 結(jié)束語(yǔ)
由于Linux操作系統(tǒng),通過(guò)分析當(dāng)前操作系統(tǒng)的網(wǎng)絡(luò)模塊,列出實(shí)現(xiàn)Ad hoc路由協(xié)議所面臨的問(wèn)題并提出了一種可行的解決方案。
評(píng)論