北方交通大學(xué) 馬文彬 張慧勇
自從20世紀(jì)90年代以來(lái),越來(lái)越多的企業(yè)及個(gè)人在加入Internet網(wǎng),使網(wǎng)絡(luò)規(guī)模持續(xù)擴(kuò)大。為了適應(yīng)越來(lái)越多的流量,新節(jié)點(diǎn)、新鏈路不斷的被引進(jìn)到網(wǎng)絡(luò)上,從而使手工維護(hù)很難跟上網(wǎng)絡(luò)的變化,給網(wǎng)絡(luò)管理帶來(lái)困難。
網(wǎng)絡(luò)由一起工作的大量實(shí)體構(gòu)成,向用戶提供某種服務(wù)。這些實(shí)體功能由硬件和軟件執(zhí)行,一些出現(xiàn)在真實(shí)網(wǎng)絡(luò)中實(shí)體的例子有路由器、服務(wù)器、普通主機(jī)、鏈路等,所有這些都影響著網(wǎng)絡(luò)運(yùn)行的方式及提供給最終用戶的服務(wù)質(zhì)量。例如,如果一個(gè)應(yīng)用服務(wù)器(Web Server)出現(xiàn)宕機(jī)而從網(wǎng)絡(luò)上剝離下來(lái),那么用戶將得不到他們所期望的服務(wù)(瀏覽網(wǎng)頁(yè))。提到拓?fù)浒l(fā)現(xiàn),一般是指發(fā)現(xiàn)完成最終用戶服務(wù)所涉及到的所有實(shí)體,不僅要發(fā)現(xiàn)實(shí)體,而且要發(fā)現(xiàn)實(shí)體在網(wǎng)絡(luò)中所起的作用及實(shí)體間互相連接的方式。
網(wǎng)絡(luò)拓?fù)鋵?duì)網(wǎng)絡(luò)管理、網(wǎng)絡(luò)規(guī)劃非常有用。例如,網(wǎng)絡(luò)故障、流量瓶頸等重要信息能直接顯示在網(wǎng)絡(luò)拓?fù)渖,這樣網(wǎng)絡(luò)管理員對(duì)當(dāng)前的網(wǎng)絡(luò)狀況就有一個(gè)清楚的認(rèn)識(shí),對(duì)哪里發(fā)生了故障一目了然。如果網(wǎng)絡(luò)拓?fù)渖巷@示一條鏈路總處于滿負(fù)荷傳輸狀態(tài),那么擴(kuò)大該條鏈路的容量對(duì)提高網(wǎng)絡(luò)性能將有很大幫助。此外,網(wǎng)絡(luò)拓?fù)鋵?duì)網(wǎng)絡(luò)仿真也十分重要,要仿真能否在現(xiàn)有網(wǎng)絡(luò)上新開(kāi)放一種應(yīng)用,必須首先有正確的網(wǎng)絡(luò)拓?fù)洹?/p>
獲得網(wǎng)絡(luò)拓?fù)涞淖詈?jiǎn)單的方法莫過(guò)于讓管理員根據(jù)實(shí)際網(wǎng)絡(luò)手工繪出其拓?fù),但現(xiàn)在網(wǎng)絡(luò)越來(lái)越復(fù)雜,越來(lái)越龐大,并一直在膨脹,而且實(shí)體在網(wǎng)絡(luò)中擔(dān)負(fù)的功能也越來(lái)越復(fù)雜,要跟蹤這樣一個(gè)網(wǎng)絡(luò)需要花費(fèi)很多時(shí)間或精力,而且網(wǎng)絡(luò)一旦有所改變所有工作必須重做。網(wǎng)絡(luò)拓?fù)渥詣?dòng)發(fā)現(xiàn)正是基于這個(gè)原因發(fā)展起來(lái)的,本文對(duì)能用于拓?fù)浒l(fā)現(xiàn)的一些常用的工具和技術(shù)作了簡(jiǎn)要的介紹,并基于筆者的實(shí)踐提供了一個(gè)簡(jiǎn)單的算法實(shí)現(xiàn),該算法主要針對(duì)同一個(gè)管理機(jī)構(gòu)下的IP網(wǎng)絡(luò)的拓?fù)渥詣?dòng)發(fā)現(xiàn),更復(fù)雜的拓?fù)浒l(fā)現(xiàn)算法可在此基礎(chǔ)上進(jìn)一步擴(kuò)展。
一、用于拓?fù)浒l(fā)現(xiàn)的工具
1. Ping
Ping命令是IP網(wǎng)上最古老的一種工具,用來(lái)監(jiān)測(cè)網(wǎng)絡(luò)節(jié)點(diǎn)是否活著,或用于監(jiān)測(cè)到網(wǎng)絡(luò)節(jié)點(diǎn)間的往返時(shí)延(RTT)。通常Ping只涉及網(wǎng)絡(luò)上的源和目的兩節(jié)點(diǎn),而忽略網(wǎng)絡(luò)細(xì)節(jié)。另外我們可以使用廣播Ping,其Ping的地址不是一個(gè)單一的地址,而是子網(wǎng)的廣播地址,所有位于該子網(wǎng)的主機(jī)均對(duì)此Ping包進(jìn)行響應(yīng),從而一次就可得到子網(wǎng)內(nèi)的全部活動(dòng)主機(jī)。
使用Ping的最大問(wèn)題是,當(dāng)Ping一個(gè)活著的主機(jī)時(shí),其往返時(shí)延往往在幾十毫秒左右,但Ping一個(gè)不存在的或宕著的主機(jī),一般比較常用的超時(shí)通常為20秒,再加上為了減少丟包對(duì)測(cè)量結(jié)果的影響而采取發(fā)2~3個(gè)Ping包,這樣對(duì)這類主機(jī)的監(jiān)測(cè)代價(jià)就非常大。這個(gè)問(wèn)題最直接的解決方案是減少超時(shí)值,但是必須注意不要小于網(wǎng)絡(luò)實(shí)際的往返時(shí)延。通過(guò)精心設(shè)計(jì)超時(shí)和重發(fā)策略(隨著跳數(shù)的增多,超時(shí)相應(yīng)增大),可以有效減少等待時(shí)間同時(shí)又減少誤判。
使用廣播Ping的問(wèn)題是,現(xiàn)在實(shí)際網(wǎng)絡(luò)中廣播Ping很少得到完全支持,部分網(wǎng)絡(luò)由路由器代替子網(wǎng)內(nèi)的主機(jī)響應(yīng)。在另外一些網(wǎng)絡(luò)中主機(jī)根本就不對(duì)廣播Ping進(jìn)行響應(yīng),甚至路由器根本不轉(zhuǎn)發(fā)能引起廣播的包。這是基于網(wǎng)絡(luò)安全的考慮,因?yàn)榭梢岳眠@個(gè)特性進(jìn)行拒絕服務(wù)攻擊,例如向幾個(gè)大的子網(wǎng)進(jìn)行廣播Ping,并把源地址設(shè)置為受害者的地址,這樣受害者就會(huì)淹沒(méi)于大量ICMP Ping的響應(yīng)包,從而拒絕提供任何服務(wù)。對(duì)該問(wèn)題的一個(gè)解決方案是設(shè)計(jì)一個(gè)專門的Broadcast Ping程序,其內(nèi)部實(shí)現(xiàn)是直接將子網(wǎng)的廣播地址轉(zhuǎn)變?yōu)槎鄠(gè)主機(jī)地址,然后啟動(dòng)多個(gè)線程或進(jìn)程來(lái)分別向主機(jī)發(fā)送Ping包,從而獲取子網(wǎng)內(nèi)的全部主機(jī)地址。
2. Traceroute
Traceroute命令是TCP/IP家族內(nèi)另一個(gè)比較早的工具,它可用來(lái)發(fā)現(xiàn)測(cè)試點(diǎn)和目標(biāo)主機(jī)之間的路由器。路由器在轉(zhuǎn)發(fā)包之前總是將其TTL值減1,如果TTL降為0,則路由器向源地址發(fā)送TTL-Expired ICMP消息。Traceroute實(shí)現(xiàn)的原理就是應(yīng)用路由器的這個(gè)特性,通過(guò)發(fā)送TTL逐漸增大的探測(cè)包,由測(cè)試點(diǎn)到目標(biāo)間這條路經(jīng)上所有的路由器依次向測(cè)試點(diǎn)發(fā)送TTL-Expired ICMP包,從而發(fā)現(xiàn)所有路由器。因?yàn)閹缀跛械穆酚善髟O(shè)計(jì)時(shí)都實(shí)現(xiàn)了發(fā)送TTL-Expired ICMP消息的功能,所以大多數(shù)情況下Traceroute的結(jié)果是準(zhǔn)確可信的。由于采用逐漸增大TTL值的方法,每探測(cè)一個(gè)目標(biāo)需要依次發(fā)送不同TTL值的多個(gè)包,因此用Traceroute獲取結(jié)果比Ping要慢的多?梢栽O(shè)計(jì)一種并發(fā)式的Traceroute命令,一次發(fā)送不同TTL值的多個(gè)包,從而加速路由器的發(fā)現(xiàn)速度。
3. DNS
IP地址是為網(wǎng)絡(luò)上的路由器或主機(jī)等機(jī)器設(shè)計(jì)的,它不符合人類的記憶習(xí)慣,DNS(Domain Name System)就是為了解決這個(gè)問(wèn)題而開(kāi)發(fā)的。DNS系統(tǒng)主要用于網(wǎng)絡(luò)設(shè)備IP地址到名字的映射,同時(shí)也維護(hù)一些其他信息如設(shè)備的硬件平臺(tái)及操作系統(tǒng)等。
使用DNS服務(wù)器提供的區(qū)域傳輸功能可以一次獲取域內(nèi)許多主機(jī)和路由器,快捷方便,這是它的優(yōu)點(diǎn)。但如果主機(jī)的地址通過(guò)DHCP獲得,則DNS對(duì)此就無(wú)能為力,此外,DNS服務(wù)器提供的信息可能與實(shí)際情況不一致,甚至有些DNS服務(wù)器沒(méi)有提供區(qū)域傳輸功能。盡管有諸多缺點(diǎn),DNS在拓?fù)浒l(fā)現(xiàn)中還是很重要的,我們可以把DNS返回的信息作為其他算法的起點(diǎn);我們還可以在不知道網(wǎng)絡(luò)具體結(jié)構(gòu)的情況下,使用不同時(shí)間返回來(lái)的信息直接用來(lái)估算網(wǎng)絡(luò)的增長(zhǎng)速度。
4. SNMP
SNMP(簡(jiǎn)單網(wǎng)絡(luò)管理協(xié)議)的基本思想是所有的網(wǎng)絡(luò)設(shè)備維護(hù)一個(gè)MIB(管理信息庫(kù))保存其所有運(yùn)行進(jìn)程的相關(guān)信息,并對(duì)管理工作站的查詢進(jìn)行響應(yīng)。SNMP協(xié)議描述了一種從MIB庫(kù)中獲取信息的方法,對(duì)設(shè)備唯一的要求是支持SNMP并且MIB中的信息足夠豐富。
使用SNMP的最大優(yōu)點(diǎn)是信息自動(dòng)隨網(wǎng)絡(luò)的狀況更新,這樣通過(guò)SNMP獲取的拓?fù)湫畔⒖偸欠从尘W(wǎng)絡(luò)最新的狀況。其缺點(diǎn)是并不是所有設(shè)備都支持SNMP協(xié)議,而且除了標(biāo)準(zhǔn)的MIB信息外,各廠家都為自己的設(shè)備開(kāi)發(fā)了專門的MIB,如果在拓?fù)渥詣?dòng)發(fā)現(xiàn)程序中使用了這些MIB,其處理上可能不得不隨廠家的不同而作特殊的處理。因此,我們建議盡量使用標(biāo)準(zhǔn)MIB。本文中用到的MIB組有System組、Interfaces組、IP組,它們均為當(dāng)前MIB-II下的標(biāo)準(zhǔn)組。
5. 其它工具或技術(shù)
除了上面介紹的幾種常用工具外,我們還可利用節(jié)點(diǎn)的ARP表查詢它直連的設(shè)備,利用路由協(xié)議(如OSPF、BGP)發(fā)現(xiàn)所有子網(wǎng)或網(wǎng)絡(luò),發(fā)現(xiàn)所有的路由器,在BGP下還可發(fā)現(xiàn)一條路經(jīng)經(jīng)過(guò)的自治域(Autonomous Systems)。對(duì)于非IP網(wǎng)絡(luò),可利用專門的技術(shù)(對(duì)IPX網(wǎng)絡(luò)可采用SAP)發(fā)現(xiàn)網(wǎng)絡(luò)拓?fù)湫畔。此外,一些廠家專有的技術(shù)如Cisco的CDP(思科發(fā)現(xiàn)協(xié)議,僅用于Cisco設(shè)備)、Netflow技術(shù)等也可用于拓?fù)浒l(fā)現(xiàn)。
二、算法實(shí)現(xiàn)
在本小節(jié),我們給出一個(gè)IP網(wǎng)絡(luò)拓?fù)渥詣?dòng)發(fā)現(xiàn)算法,使用的技術(shù)是ICMP(Ping)和SNMP。本文提供的算法要求輸入SNMP Read-Community,適用于發(fā)現(xiàn)同一個(gè)管理機(jī)構(gòu)下的IP網(wǎng)絡(luò)。算法首先從本地子網(wǎng)開(kāi)始,通過(guò)Ping獲取本地所有活動(dòng)主機(jī),利用SNMP區(qū)分出普通主機(jī)和路由器,然后對(duì)路由器進(jìn)行查詢,下載路由器的System組、Interfaces組、IP組的信息。獲取路由器直連的網(wǎng)絡(luò),進(jìn)行下一輪運(yùn)算,直到發(fā)現(xiàn)所有網(wǎng)絡(luò)或到達(dá)指定的深度(跳數(shù))。程序主要涉及四大模塊:
主循環(huán)控制模塊:程序初始化及算法深度控制,到達(dá)指定深度后跳出循環(huán);
子網(wǎng)搜索模塊:搜索子網(wǎng)內(nèi)的所有活動(dòng)主機(jī)和路由器;
ICMP模塊:處理ECHO請(qǐng)求及應(yīng)答;
SNMP模塊:處理SNMP相關(guān)操作。
程序中兩個(gè)重要的類為RouterClass和NetClass。RouterClass包括兩個(gè)指針?lè)謩e指向IpList和NetList,IpList存放路由器的IP地址,NetList存放路有器連接的網(wǎng)絡(luò)。NetClass包括兩個(gè)指針?lè)謩e指向Rconnect和Hconnect。
本算法使用了兩個(gè)集合:臨時(shí)網(wǎng)絡(luò)集合,已發(fā)現(xiàn)網(wǎng)絡(luò)集合。臨時(shí)網(wǎng)絡(luò)集合用于存放當(dāng)前深度和下一深度中還沒(méi)有被搜索的網(wǎng)絡(luò),對(duì)已搜索的網(wǎng)絡(luò)需要添加到已發(fā)現(xiàn)網(wǎng)絡(luò)集合。算法中為了避免多次發(fā)現(xiàn)同一路由器(因?yàn)槁酚善饔卸鄠(gè)IP地址),需要遍歷路由器的IPList。程序使用的主要算法流程如下:
●子網(wǎng)搜索模塊
。1)利用Ping搜索子網(wǎng)內(nèi)所有的活動(dòng)IP地址。
(2)利用SNMP區(qū)分路由器和普通主機(jī),并分別添加到NetClass的Rconnect和Hconnect。
(3)針對(duì)每一個(gè)路由器,下載有關(guān)MIB變量(System組,Interfaces組,IP組),對(duì)MIB變量分析,分別寫入RouterClass的IPList和NetList。
。4)為防止路由器被多次發(fā)現(xiàn),要遍歷RouterClass的IPList。
。5)將在(3)中發(fā)現(xiàn)的而又沒(méi)有搜索的網(wǎng)絡(luò)添加到深度為n+1的臨時(shí)網(wǎng)絡(luò)集合中。
●主循環(huán)控制模塊
(1)從深度為n的臨時(shí)網(wǎng)絡(luò)集合中抽取一個(gè)子網(wǎng)進(jìn)行子網(wǎng)搜索(調(diào)用子網(wǎng)搜索模塊)。
。2)將(1)中搜索的網(wǎng)絡(luò)添加到已發(fā)現(xiàn)網(wǎng)絡(luò)集合。
(3)重復(fù)進(jìn)行(1)和(2)直到臨時(shí)網(wǎng)絡(luò)集合為空。
。4)如果n小于指定深度(n
本文提供了一個(gè)可用于IP網(wǎng)絡(luò)的拓?fù)渥詣?dòng)發(fā)現(xiàn)算法。這個(gè)算法使用了路由器的MIB信息和ICMP(Ping)的結(jié)果來(lái)產(chǎn)生拓?fù)洹B酚善鞯腎P地址不需要事先知道,本文給出的算法自動(dòng)找出路由器,并利用SNMP協(xié)議獲取有關(guān)拓?fù)涞腗IB信息,本算法試圖發(fā)現(xiàn)盡量多的網(wǎng)絡(luò),或在到達(dá)指定深度(跳數(shù))后自動(dòng)停止。本文所提供的算法適用于同一個(gè)管理機(jī)構(gòu)下的IP網(wǎng)絡(luò)的拓?fù)渥詣?dòng)發(fā)現(xiàn),屬于不同管理機(jī)構(gòu)的網(wǎng)絡(luò)(如Internet)拓?fù)渥詣?dòng)發(fā)現(xiàn)要復(fù)雜得多,這種情況下就需要采用其它技術(shù)(如Traceroute),編寫新的算法實(shí)現(xiàn),這正是筆者下一步努力的方向。
----《通信世界》