王 磊,馬 亮
(西南交通大學(xué) 信息科學(xué)與技術(shù)學(xué)院,成都 611756)
鐵路信號(hào)的集中監(jiān)測(cè)(CSM,Centralized Signaling Monitoring) 系統(tǒng)是面向高速鐵路及普速鐵路信號(hào)領(lǐng)域的綜合性維護(hù)支持和信息監(jiān)控網(wǎng)絡(luò)平臺(tái)[1]。根據(jù)鐵路部門運(yùn)營(yíng)管理結(jié)構(gòu),CSM系統(tǒng)應(yīng)用“三級(jí)四級(jí)”的體系結(jié)構(gòu)進(jìn)行系統(tǒng)部署,鐵路局采用交換機(jī)組網(wǎng),車站局域網(wǎng)采用交換機(jī)或者集線器組網(wǎng),電務(wù)段子系統(tǒng)則是整個(gè)網(wǎng)絡(luò)信息與服務(wù)的匯集地[2]。這些網(wǎng)絡(luò)設(shè)備大多布置在信號(hào)機(jī)房?jī)?nèi),規(guī)模龐大復(fù)雜,設(shè)備之間接口眾多,而信號(hào)與通信設(shè)備若各自獨(dú)立則不利于進(jìn)行故障診斷,因此,需要對(duì)CSM系統(tǒng)中的網(wǎng)絡(luò)設(shè)備進(jìn)行集中監(jiān)測(cè)及管理。在信息系統(tǒng)中網(wǎng)絡(luò)設(shè)備之間的通信狀態(tài)監(jiān)測(cè)依賴于網(wǎng)絡(luò)拓?fù)鋄3],目的是通過拓?fù)鋱D直觀地反映網(wǎng)絡(luò)中設(shè)備的連接狀況,并且可基于網(wǎng)絡(luò)拓?fù)鋵?shí)現(xiàn)故障定位、分析和維修[4],因此,在CSM系統(tǒng)中網(wǎng)絡(luò)拓?fù)浼夹g(shù)是關(guān)鍵。文獻(xiàn)[1]中使用CSM平臺(tái)對(duì)信號(hào)設(shè)備進(jìn)行集中監(jiān)控和智能分析,為鐵路信號(hào)設(shè)備實(shí)施“狀態(tài)修”創(chuàng)造了有利條件,但是,需要對(duì)CSM平臺(tái)本身的網(wǎng)絡(luò)設(shè)備進(jìn)行監(jiān)測(cè)與維護(hù)。文獻(xiàn)[5]設(shè)計(jì)了信息系統(tǒng)綜合監(jiān)控平臺(tái),使用ARP表結(jié)合ping掃描的方法實(shí)現(xiàn)信息系統(tǒng)網(wǎng)絡(luò)拓?fù)涞淖詣?dòng)發(fā)現(xiàn),但是網(wǎng)絡(luò)拓?fù)渖蓵r(shí)間較長(zhǎng),影響監(jiān)測(cè)的實(shí)時(shí)性和準(zhǔn)確性,而且如果某些設(shè)備關(guān)閉ping掃描功能,可能會(huì)導(dǎo)致掃描不完整,影響拓?fù)渖傻耐暾浴?/p>
本文以保障CSM系統(tǒng)運(yùn)行可靠性,提高自動(dòng)拓?fù)鋾r(shí)效性、完整性和準(zhǔn)確性為目的,基于SNMP協(xié)議,采用網(wǎng)際控制報(bào)文協(xié)議(ICMP)結(jié)合端口掃描的方法全面地探測(cè)活動(dòng)節(jié)點(diǎn),從而能夠更有效地發(fā)現(xiàn)CSM系統(tǒng)中各網(wǎng)絡(luò)設(shè)備之間的拓?fù)潢P(guān)系,并可依照生成樹原理分析冗余的物理連接,實(shí)現(xiàn)自動(dòng)發(fā)現(xiàn)的拓?fù)渑c實(shí)際網(wǎng)絡(luò)拓?fù)湟恢?,最終通過C#語(yǔ)言編程實(shí)現(xiàn)拓?fù)渥詣?dòng)發(fā)現(xiàn)算法。
SNMP稱為簡(jiǎn)單網(wǎng)絡(luò)管理協(xié)議(Simple Network Management Protocol)[6],是最早的網(wǎng)絡(luò)管理協(xié)議之一。由于SNMP被設(shè)計(jì)成與協(xié)議無關(guān),因而得到了眾多廠商和網(wǎng)絡(luò)管理平臺(tái)的支持,對(duì)它進(jìn)行分析具有重要的意義。SNMP是一種基于用戶數(shù)據(jù)報(bào)協(xié)議 (User Datagram Protocol,UDP)的協(xié)議[7],可通過SNMP協(xié)議從路由器中的MIBⅡ信息庫(kù)或交換機(jī)、網(wǎng)橋中的VLAN-MIB、Bridge-MIB[8]信息庫(kù)中獲取路由設(shè)備列表或主機(jī)列表,從而構(gòu)造網(wǎng)絡(luò)拓?fù)洹?/p>
本文中主要通過SNMP獲取管理信息庫(kù)(MIB)變量,目的是通過相關(guān)的MIB對(duì)象判斷網(wǎng)絡(luò)中設(shè)備的真實(shí)(物理)連接情況,拓?fù)浒l(fā)現(xiàn)過程中需要獲取的MIB中的對(duì)象詳細(xì)見表1~表3。表1主要是得到網(wǎng)絡(luò)中路由器的MAC地址以及IP地址,表2得到交換機(jī)轉(zhuǎn)發(fā)表中MAC地址及對(duì)應(yīng)的端口號(hào),表3是獲得交換機(jī)生成樹協(xié)議中的端口號(hào)、根橋等信息。
表1 ipNetToMediaTable表對(duì)象及說明
表2 dot1dTpFdbTable表對(duì)象及說明
表3 dot1dStpPortTable表對(duì)象及說明
為了方便得到MIB變量,在C#中可調(diào)用針對(duì)SNMP協(xié)議封裝的類庫(kù)SnmpSharpNet.dll,通過GetSNMPTable方法調(diào)用封裝類庫(kù)。
關(guān)鍵代碼如下:
//配置設(shè)備的團(tuán)體名,IP地址,版本號(hào)等信息。
OctetString community = new OctetString(comm);
IpAddress agent = new IpAddress(ip);
AgentParameters param = new AgentParameters(community);
param.Version = SnmpVersion.Ver1;
UdpTarget target = new UdpTarget((IPAddress)agent, 161, 2000, 1)
//根據(jù)Oid找對(duì)應(yīng)的值Oid rootOid = new Oid(oid);
Oid lastOid = (Oid)rootOid.Clone();
//采用GetNext方式獲取,并暫時(shí)保存在temp_list中
Pdu Table_pdu_next = new Pdu(PduType.Get-Next);
List<string> temp_list=new List<string>();
while(lastOid!=null)
{
temp_list.Add(Table_result.Pdu.VbList[0].Value.ToString());
//找完指定表之后,lastOid賦值null
}
生成樹協(xié)議(STP, Spanning Tree Protocol)是一個(gè)網(wǎng)橋到網(wǎng)橋的協(xié)議[9],它隨后被IEEE802 委員會(huì)修訂并發(fā)布在802.1d 規(guī)范[10]中。STP生成樹的使用既保障網(wǎng)橋之間的冗余連接,同時(shí)又可避免網(wǎng)絡(luò)環(huán)路在交換鏈路中的出現(xiàn)。STP基本術(shù)語(yǔ)包括:
(1)網(wǎng)橋協(xié)議數(shù)據(jù)單元(BPDU):STP中的“hello數(shù)據(jù)包”,間隔一定時(shí)間(該時(shí)間可配置)發(fā)送,該消息在各網(wǎng)橋之間交換;
(2)網(wǎng)橋號(hào)(Bridge ID):由2字節(jié)優(yōu)先級(jí)與6字節(jié)MAC地址組成,為網(wǎng)絡(luò)中每一臺(tái)交換機(jī)標(biāo)識(shí)身份, 優(yōu)先級(jí)為 0–65535,缺省為 32768;
(3)根網(wǎng)橋(RB):具有最小網(wǎng)橋號(hào),根網(wǎng)橋并且所有端口都處于轉(zhuǎn)發(fā)狀態(tài);
(4)指定網(wǎng)橋(DB):指到根網(wǎng)橋的累計(jì)路徑花費(fèi)最小的網(wǎng)橋;
(5)根端口(RP):網(wǎng)絡(luò)中在非根網(wǎng)橋上,指定連接到根橋路徑最短的端口;
(6)指定端口(DP):非根網(wǎng)橋?yàn)槊總€(gè)需要連接的網(wǎng)段選出一個(gè)指定端口,根網(wǎng)橋上的端口都是指定端口;
(7)非指定端口(BP):非指定端口將處于阻塞狀態(tài),不轉(zhuǎn)發(fā)任何用戶數(shù)據(jù)。
STP的主要思想是每個(gè)網(wǎng)橋定時(shí)發(fā)送BPDU,在冗余網(wǎng)絡(luò)連接中維持一個(gè)無回路的網(wǎng)絡(luò),阻塞一個(gè)或者多個(gè)冗余的接口。當(dāng)網(wǎng)絡(luò)中某條鏈接故障或者添加新的鏈接,能夠快速發(fā)現(xiàn)網(wǎng)絡(luò)鏈接變化,按照STP配置交換機(jī)接口,避免丟失鏈接或新的回路出現(xiàn)。
1.2.1 STP工作過程
(1)進(jìn)行根橋的選?。好颗_(tái)交換機(jī)定時(shí)向鄰接交換機(jī)發(fā)送BPDU,選出Bridge ID最小的網(wǎng)橋作為網(wǎng)絡(luò)中的根橋;
(2) 確定交換機(jī)指定端口及根端口:通過計(jì)算非根橋的交換機(jī)到根橋的最小路徑開銷,找出根端口(最小的發(fā)送方網(wǎng)橋ID)和指定端口(最小的端口ID);
(3) 裁剪冗余端口:阻塞非根網(wǎng)橋上非指定端口以裁剪冗余的環(huán)路,構(gòu)造一個(gè)無環(huán)路的拓?fù)浣Y(jié)構(gòu)。
如圖1所示,根橋(S1)選作為樹干,在處于穩(wěn)定狀態(tài)的網(wǎng)絡(luò)中,BPDU從根橋沿著無環(huán)的樹枝傳送到網(wǎng)絡(luò)的各個(gè)網(wǎng)段,沒被裁剪的活動(dòng)鏈路作為向外輻射的樹枝,原本S2與S3之間有一條鏈接,圖中虛線為阻塞環(huán)路,此時(shí)S2的端口4或者S3的端口2為阻塞狀態(tài)。經(jīng)過裁剪冗余之后,生成一顆樹結(jié)構(gòu),樹結(jié)構(gòu)是沒有環(huán)路的。
圖1 STP協(xié)議得到生成樹示意圖
1.2.2 STP操作規(guī)則
STP操作之后,最終確定唯一的生成樹,如圖2所示,A為根交換機(jī),每個(gè)網(wǎng)絡(luò)中只有一個(gè)根橋,根橋上的接口全是指定端口(黃色圈),對(duì)于其他非根橋,每個(gè)根橋只有一個(gè)根端口(黑色圈);并且每個(gè)段只有一個(gè)指定端口,其他接口為非指定端口,在圖2中,C交換機(jī)到A交換機(jī),可以通過C-A鏈路,還可以C-B-A鏈路,STP生成樹之后,C的端口2阻塞,那么就只能C-A,此時(shí)該段就只有A交換機(jī)的2端口為指定端口。指定端口才可以轉(zhuǎn)發(fā)數(shù)據(jù),非指定端口(阻塞端口)不能轉(zhuǎn)發(fā)數(shù)據(jù)。
圖2 STP工作過程示意圖
通常在發(fā)現(xiàn)網(wǎng)絡(luò)拓?fù)溥^程中會(huì)涉及到很多表單,甚至有的表單會(huì)多次處理使用,由于各個(gè)設(shè)備性能也存在差異,如果直接使用SNMP協(xié)議反復(fù)獲取路由器、交換機(jī)的網(wǎng)絡(luò)信息表單就會(huì)占用更多的網(wǎng)絡(luò)資源,并且會(huì)增加構(gòu)造拓?fù)涞臅r(shí)間,雖然我們是在局域網(wǎng)中發(fā)現(xiàn)網(wǎng)絡(luò)拓?fù)?,但是需要獲取多個(gè)設(shè)備表單。針對(duì)該情況,本文采用本地表單的形式,在數(shù)據(jù)庫(kù)中保存當(dāng)前活動(dòng)節(jié)點(diǎn)以及所有活動(dòng)節(jié)點(diǎn)的網(wǎng)絡(luò)信息。
(1)需要保存已經(jīng)探測(cè)到的活動(dòng)節(jié)點(diǎn),表項(xiàng)包括:設(shè)備IP、類型及活動(dòng)節(jié)點(diǎn)標(biāo)志,用于存放已經(jīng)被ICMP探測(cè)或端口掃描出的節(jié)點(diǎn)信息;(2)需要一張表存放ICMP沒有探測(cè)到的節(jié)點(diǎn),可用于端口多次掃描使用,表項(xiàng)包括:設(shè)備IP,掃描次數(shù)標(biāo)記。
針對(duì)路由器,我們需要獲取表1中的對(duì)象,與該路由器設(shè)備ID,IP生成表(設(shè)備ID,路由器IP,節(jié)點(diǎn)IP,節(jié)點(diǎn)MAC地址)。
交換機(jī)需要獲取表2及表3中的對(duì)象,構(gòu)造轉(zhuǎn)發(fā)表(設(shè)備ID,交換機(jī)IP,節(jié)點(diǎn)MAC地址,節(jié)點(diǎn)端口號(hào),節(jié)點(diǎn)狀態(tài))和STP生成樹表(設(shè)備ID,設(shè)備IP,Bridge ID,端口號(hào),端口狀態(tài),根橋Bridge ID,指定橋Bridge ID,指定端口ID)。
系統(tǒng)采用ICMP結(jié)合端口掃描的方式作為拓?fù)浒l(fā)現(xiàn)的探測(cè)機(jī)制,避免少數(shù)設(shè)備屏蔽了ICMP功能之后不能被正常發(fā)現(xiàn),導(dǎo)致拓?fù)洳粔蛲暾膯栴},所以需要通過端口掃描作為輔助方法,結(jié)合這兩種方式可以更加快速完整地發(fā)現(xiàn)搜索范圍內(nèi)的所有活動(dòng)節(jié)點(diǎn)。
設(shè)備活動(dòng)節(jié)點(diǎn)的搜索過程如下:
(1)按照管理員要求配置搜索范圍,接著由程序通過多個(gè)線程同時(shí)使用基于ICMP的Ping方法,針對(duì)此范圍內(nèi)的活動(dòng)節(jié)點(diǎn)進(jìn)行發(fā)現(xiàn),把探索到的節(jié)點(diǎn)存入活動(dòng)節(jié)點(diǎn)表中;
(2)針對(duì)不響應(yīng)ICMP的節(jié)點(diǎn),進(jìn)一步使用端口掃描,按照配置文件中的參數(shù)可以重復(fù)掃描的次數(shù),如果達(dá)到掃描次數(shù)的上限仍然沒有響應(yīng)就應(yīng)該放棄此節(jié)點(diǎn),如果在某次掃描中響應(yīng),則此節(jié)點(diǎn)應(yīng)該當(dāng)作被發(fā)現(xiàn)的活動(dòng)節(jié)點(diǎn),加入活動(dòng)節(jié)點(diǎn)表中,待后續(xù)數(shù)據(jù)處理使用?;顒?dòng)節(jié)點(diǎn)的掃描流流程如圖3所示。
圖3 掃描流程圖
采用這樣的方法可以有效地探測(cè)活動(dòng)節(jié)點(diǎn)設(shè)備。端口使用了全TCP連接的掃描方式,與探測(cè)主機(jī)搭建一個(gè)能夠被識(shí)別的對(duì)應(yīng)端口的連接,為了節(jié)約搜索等待的時(shí)間,搜索子模塊可同時(shí)開啟多個(gè)線程來進(jìn)行掃描,并且將搜索發(fā)現(xiàn)的活動(dòng)節(jié)點(diǎn)信息全部保存在活動(dòng)節(jié)點(diǎn)表中。
2.3.1 物理連接判斷
通過 SNMP協(xié)議獲取路由器、交換機(jī)等網(wǎng)絡(luò)設(shè)備的路由表、轉(zhuǎn)發(fā)表數(shù)據(jù),雖然轉(zhuǎn)發(fā)表記錄了節(jié)點(diǎn)的 MAC地址,但是若多臺(tái)交換機(jī)同在一個(gè)交換域內(nèi),不管節(jié)點(diǎn)是否物理連接此交換機(jī),整個(gè)交換域內(nèi)MAC地址都會(huì)被保存在當(dāng)前交換機(jī)中,所以單純地根據(jù)交換機(jī)上的轉(zhuǎn)發(fā)表還無法區(qū)分此交換機(jī)與其他設(shè)備是直連的還是非直連的關(guān)系[11],所以需要進(jìn)一步通過分析生成樹協(xié)議,按照生成樹的方式來判斷設(shè)備直連關(guān)系。
局域網(wǎng)絡(luò)中活動(dòng)節(jié)點(diǎn)探測(cè)完成后,需要先對(duì)各節(jié)點(diǎn)進(jìn)行區(qū)分找出各自的類型,并將類型保存在活動(dòng)節(jié)點(diǎn)表單類型中。根據(jù)設(shè)備類型,可以直接通過SNMP協(xié)議訪問對(duì)應(yīng)需要的MIB信息庫(kù),也就是得到各路由器ARP表及各交換機(jī)的轉(zhuǎn)發(fā)表和STP生成樹表。
從上文1.2.2中已經(jīng)知道STP操作的規(guī)則,可以得出下面幾條結(jié)論。根據(jù)這些STP總結(jié)的結(jié)論,能夠確定出根交換機(jī)、交換機(jī)與交換機(jī)、路由器之間的物理端口連接情況。
結(jié)論1:設(shè)交換機(jī)S1的端口標(biāo)識(shí)為S1i,它的指定網(wǎng)橋?yàn)镾2,若在指定網(wǎng)橋上的端口(指定端口)為S2j,則S2必為交換機(jī),且交換機(jī)S1、S2 通過接口S1i、S2j設(shè)備直連,并且可以確定S1的端口S1i是根端口。
結(jié)論2:若端口上獲得節(jié)點(diǎn)的MAC地址是通過非根交換機(jī)的指定端口或者根端口獲得,則該MAC地址對(duì)應(yīng)的設(shè)備屬于非直連設(shè)備;如果是通過別的端口(處于轉(zhuǎn)發(fā)狀態(tài))獲取,則屬于直連設(shè)備。因?yàn)楦粨Q機(jī)所有端口都是指定端口,所以還需要判斷是不是與交換機(jī)根端口連接,若是,則不是直連,反之則是直連。
結(jié)論3:若阻塞接口的指定網(wǎng)橋是除自身以外的其它交換機(jī),那么該接口必定與其他交換機(jī)存在作為備份使用的冗余鏈路。
結(jié)論4:設(shè)交換機(jī)S 的接口p的轉(zhuǎn)發(fā)表記為ASp。對(duì)于物理直接連接的交換機(jī)S、K 的兩接口a、b,若ASa∩AKb≠φ,則交換機(jī)S與交換機(jī)K是通過集線器間接連接,反之,交換機(jī)S、K 是通過接口a、b直連。
2.3.2 網(wǎng)絡(luò)拓?fù)洳襟E
使用C#語(yǔ)言開發(fā)程序,在內(nèi)存中使用存儲(chǔ)格式如下。
設(shè)備類:
網(wǎng)絡(luò)拓?fù)洳襟E如下:
(1)根據(jù)交換機(jī)STP生成樹表,找到根交換機(jī),再由結(jié)論1,通過查看表單中的指定網(wǎng)橋,可知道對(duì)應(yīng)的根端口,這樣初步找到所有交換機(jī)的直連關(guān)系,再根據(jù)結(jié)論3找到阻塞端口構(gòu)成冗余的連接關(guān)系;
(2)通過步驟(1)已經(jīng)找到所有交換機(jī)之間的物理連接關(guān)系,接下來需要將主機(jī)加入到各交換機(jī)端口上,根據(jù)結(jié)論2,結(jié)合交換機(jī)轉(zhuǎn)發(fā)表中的端口號(hào)和MAC地址,找到直連的主機(jī),到這里物理拓?fù)浠旧贤瓿桑?/p>
(3)完成步驟(2)之后,可根據(jù)結(jié)論4找到交換機(jī)之間是否存在集線器連接,并在內(nèi)存的設(shè)備信息類中修改設(shè)備直連關(guān)系。
根據(jù)電務(wù)段生產(chǎn)力的調(diào)整,未來鐵路信息化有著更大的需求,依據(jù)以數(shù)據(jù)為中心、通信為依靠的布局,建立網(wǎng)絡(luò)通信與信號(hào)設(shè)備為一體的鐵路信號(hào)綜合監(jiān)測(cè)系統(tǒng)??吹贸鼍钟蚓W(wǎng)絡(luò)的正常對(duì)各設(shè)備之間的通信是至關(guān)重要,因此需要對(duì)網(wǎng)絡(luò)中的交換機(jī)、路由器等關(guān)鍵設(shè)備進(jìn)行網(wǎng)絡(luò)拓?fù)?,圖4是在該系統(tǒng)中應(yīng)用該方法得到的網(wǎng)絡(luò)拓?fù)湫Ч故緢D片。用該方法能夠快速有效地發(fā)現(xiàn)網(wǎng)絡(luò)中路由設(shè)備與各交換機(jī)、交換機(jī)與各關(guān)鍵設(shè)備的物理連接關(guān)系,通過拓?fù)鋱D直觀了解網(wǎng)絡(luò)設(shè)備的狀況,便于維護(hù)人員對(duì)設(shè)備進(jìn)行故障分析。
本文通過基于SNMP的ICMP探測(cè)并結(jié)合端口掃描的方法,實(shí)現(xiàn)網(wǎng)絡(luò)拓?fù)浒l(fā)現(xiàn),可減少網(wǎng)絡(luò)開銷,實(shí)現(xiàn)網(wǎng)絡(luò)拓?fù)浒l(fā)現(xiàn),完整地發(fā)現(xiàn)網(wǎng)絡(luò)中所有的活動(dòng)節(jié)點(diǎn),結(jié)合STP生成樹協(xié)議能夠準(zhǔn)確地發(fā)現(xiàn)設(shè)備之間的物理連接鏈路,包括冗余鏈路的發(fā)現(xiàn)。但是由于項(xiàng)目需求,本文的方法也存在不足,目前可用于局域網(wǎng)內(nèi)的拓?fù)浒l(fā)現(xiàn),要想對(duì)廣域網(wǎng)拓?fù)浒l(fā)現(xiàn)還需要進(jìn)一步研究,并結(jié)合其他技術(shù)手段來實(shí)現(xiàn)。針對(duì)目前實(shí)現(xiàn)的網(wǎng)絡(luò)拓?fù)浒l(fā)現(xiàn),下一步將基于該網(wǎng)絡(luò)拓?fù)浞椒ㄑ芯烤W(wǎng)絡(luò)故障定位,實(shí)現(xiàn)綜合監(jiān)測(cè)平臺(tái)的智能故障診斷。
圖4 在實(shí)際中網(wǎng)絡(luò)拓?fù)涞男Ч故?/p>