王 磊,馬 亮
(西南交通大學 信息科學與技術學院,成都 611756)
鐵路信號的集中監測(CSM,Centralized Signaling Monitoring) 系統是面向高速鐵路及普速鐵路信號領域的綜合性維護支持和信息監控網絡平臺[1]。根據鐵路部門運營管理結構,CSM系統應用“三級四級”的體系結構進行系統部署,鐵路局采用交換機組網,車站局域網采用交換機或者集線器組網,電務段子系統則是整個網絡信息與服務的匯集地[2]。這些網絡設備大多布置在信號機房內,規模龐大復雜,設備之間接口眾多,而信號與通信設備若各自獨立則不利于進行故障診斷,因此,需要對CSM系統中的網絡設備進行集中監測及管理。在信息系統中網絡設備之間的通信狀態監測依賴于網絡拓撲[3],目的是通過拓撲圖直觀地反映網絡中設備的連接狀況,并且可基于網絡拓撲實現故障定位、分析和維修[4],因此,在CSM系統中網絡拓撲技術是關鍵。文獻[1]中使用CSM平臺對信號設備進行集中監控和智能分析,為鐵路信號設備實施“狀態修”創造了有利條件,但是,需要對CSM平臺本身的網絡設備進行監測與維護。文獻[5]設計了信息系統綜合監控平臺,使用ARP表結合ping掃描的方法實現信息系統網絡拓撲的自動發現,但是網絡拓撲生成時間較長,影響監測的實時性和準確性,而且如果某些設備關閉ping掃描功能,可能會導致掃描不完整,影響拓撲生成的完整性。
本文以保障CSM系統運行可靠性,提高自動拓撲時效性、完整性和準確性為目的,基于SNMP協議,采用網際控制報文協議(ICMP)結合端口掃描的方法全面地探測活動節點,從而能夠更有效地發現CSM系統中各網絡設備之間的拓撲關系,并可依照生成樹原理分析冗余的物理連接,實現自動發現的拓撲與實際網絡拓撲一致,最終通過C#語言編程實現拓撲自動發現算法。
SNMP稱為簡單網絡管理協議(Simple Network Management Protocol)[6],是最早的網絡管理協議之一。由于SNMP被設計成與協議無關,因而得到了眾多廠商和網絡管理平臺的支持,對它進行分析具有重要的意義。SNMP是一種基于用戶數據報協議 (User Datagram Protocol,UDP)的協議[7],可通過SNMP協議從路由器中的MIBⅡ信息庫或交換機、網橋中的VLAN-MIB、Bridge-MIB[8]信息庫中獲取路由設備列表或主機列表,從而構造網絡拓撲。
本文中主要通過SNMP獲取管理信息庫(MIB)變量,目的是通過相關的MIB對象判斷網絡中設備的真實(物理)連接情況,拓撲發現過程中需要獲取的MIB中的對象詳細見表1~表3。表1主要是得到網絡中路由器的MAC地址以及IP地址,表2得到交換機轉發表中MAC地址及對應的端口號,表3是獲得交換機生成樹協議中的端口號、根橋等信息。

表1 ipNetToMediaTable表對象及說明

表2 dot1dTpFdbTable表對象及說明

表3 dot1dStpPortTable表對象及說明
為了方便得到MIB變量,在C#中可調用針對SNMP協議封裝的類庫SnmpSharpNet.dll,通過GetSNMPTable方法調用封裝類庫。
關鍵代碼如下:
//配置設備的團體名,IP地址,版本號等信息。
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)
//根據Oid找對應的值Oid rootOid = new Oid(oid);
Oid lastOid = (Oid)rootOid.Clone();
//采用GetNext方式獲取,并暫時保存在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
}
生成樹協議(STP, Spanning Tree Protocol)是一個網橋到網橋的協議[9],它隨后被IEEE802 委員會修訂并發布在802.1d 規范[10]中。STP生成樹的使用既保障網橋之間的冗余連接,同時又可避免網絡環路在交換鏈路中的出現。STP基本術語包括:
(1)網橋協議數據單元(BPDU):STP中的“hello數據包”,間隔一定時間(該時間可配置)發送,該消息在各網橋之間交換;
(2)網橋號(Bridge ID):由2字節優先級與6字節MAC地址組成,為網絡中每一臺交換機標識身份, 優先級為 0–65535,缺省為 32768;
(3)根網橋(RB):具有最小網橋號,根網橋并且所有端口都處于轉發狀態;
(4)指定網橋(DB):指到根網橋的累計路徑花費最小的網橋;
(5)根端口(RP):網絡中在非根網橋上,指定連接到根橋路徑最短的端口;
(6)指定端口(DP):非根網橋為每個需要連接的網段選出一個指定端口,根網橋上的端口都是指定端口;
(7)非指定端口(BP):非指定端口將處于阻塞狀態,不轉發任何用戶數據。
STP的主要思想是每個網橋定時發送BPDU,在冗余網絡連接中維持一個無回路的網絡,阻塞一個或者多個冗余的接口。當網絡中某條鏈接故障或者添加新的鏈接,能夠快速發現網絡鏈接變化,按照STP配置交換機接口,避免丟失鏈接或新的回路出現。
1.2.1 STP工作過程
(1)進行根橋的選取:每臺交換機定時向鄰接交換機發送BPDU,選出Bridge ID最小的網橋作為網絡中的根橋;
(2) 確定交換機指定端口及根端口:通過計算非根橋的交換機到根橋的最小路徑開銷,找出根端口(最小的發送方網橋ID)和指定端口(最小的端口ID);
(3) 裁剪冗余端口:阻塞非根網橋上非指定端口以裁剪冗余的環路,構造一個無環路的拓撲結構。
如圖1所示,根橋(S1)選作為樹干,在處于穩定狀態的網絡中,BPDU從根橋沿著無環的樹枝傳送到網絡的各個網段,沒被裁剪的活動鏈路作為向外輻射的樹枝,原本S2與S3之間有一條鏈接,圖中虛線為阻塞環路,此時S2的端口4或者S3的端口2為阻塞狀態。經過裁剪冗余之后,生成一顆樹結構,樹結構是沒有環路的。

圖1 STP協議得到生成樹示意圖
1.2.2 STP操作規則
STP操作之后,最終確定唯一的生成樹,如圖2所示,A為根交換機,每個網絡中只有一個根橋,根橋上的接口全是指定端口(黃色圈),對于其他非根橋,每個根橋只有一個根端口(黑色圈);并且每個段只有一個指定端口,其他接口為非指定端口,在圖2中,C交換機到A交換機,可以通過C-A鏈路,還可以C-B-A鏈路,STP生成樹之后,C的端口2阻塞,那么就只能C-A,此時該段就只有A交換機的2端口為指定端口。指定端口才可以轉發數據,非指定端口(阻塞端口)不能轉發數據。

圖2 STP工作過程示意圖
通常在發現網絡拓撲過程中會涉及到很多表單,甚至有的表單會多次處理使用,由于各個設備性能也存在差異,如果直接使用SNMP協議反復獲取路由器、交換機的網絡信息表單就會占用更多的網絡資源,并且會增加構造拓撲的時間,雖然我們是在局域網中發現網絡拓撲,但是需要獲取多個設備表單。針對該情況,本文采用本地表單的形式,在數據庫中保存當前活動節點以及所有活動節點的網絡信息。
(1)需要保存已經探測到的活動節點,表項包括:設備IP、類型及活動節點標志,用于存放已經被ICMP探測或端口掃描出的節點信息;(2)需要一張表存放ICMP沒有探測到的節點,可用于端口多次掃描使用,表項包括:設備IP,掃描次數標記。
針對路由器,我們需要獲取表1中的對象,與該路由器設備ID,IP生成表(設備ID,路由器IP,節點IP,節點MAC地址)。
交換機需要獲取表2及表3中的對象,構造轉發表(設備ID,交換機IP,節點MAC地址,節點端口號,節點狀態)和STP生成樹表(設備ID,設備IP,Bridge ID,端口號,端口狀態,根橋Bridge ID,指定橋Bridge ID,指定端口ID)。
系統采用ICMP結合端口掃描的方式作為拓撲發現的探測機制,避免少數設備屏蔽了ICMP功能之后不能被正常發現,導致拓撲不夠完整的問題,所以需要通過端口掃描作為輔助方法,結合這兩種方式可以更加快速完整地發現搜索范圍內的所有活動節點。
設備活動節點的搜索過程如下:
(1)按照管理員要求配置搜索范圍,接著由程序通過多個線程同時使用基于ICMP的Ping方法,針對此范圍內的活動節點進行發現,把探索到的節點存入活動節點表中;
(2)針對不響應ICMP的節點,進一步使用端口掃描,按照配置文件中的參數可以重復掃描的次數,如果達到掃描次數的上限仍然沒有響應就應該放棄此節點,如果在某次掃描中響應,則此節點應該當作被發現的活動節點,加入活動節點表中,待后續數據處理使用。活動節點的掃描流流程如圖3所示。

圖3 掃描流程圖
采用這樣的方法可以有效地探測活動節點設備。端口使用了全TCP連接的掃描方式,與探測主機搭建一個能夠被識別的對應端口的連接,為了節約搜索等待的時間,搜索子模塊可同時開啟多個線程來進行掃描,并且將搜索發現的活動節點信息全部保存在活動節點表中。
2.3.1 物理連接判斷
通過 SNMP協議獲取路由器、交換機等網絡設備的路由表、轉發表數據,雖然轉發表記錄了節點的 MAC地址,但是若多臺交換機同在一個交換域內,不管節點是否物理連接此交換機,整個交換域內MAC地址都會被保存在當前交換機中,所以單純地根據交換機上的轉發表還無法區分此交換機與其他設備是直連的還是非直連的關系[11],所以需要進一步通過分析生成樹協議,按照生成樹的方式來判斷設備直連關系。
局域網絡中活動節點探測完成后,需要先對各節點進行區分找出各自的類型,并將類型保存在活動節點表單類型中。根據設備類型,可以直接通過SNMP協議訪問對應需要的MIB信息庫,也就是得到各路由器ARP表及各交換機的轉發表和STP生成樹表。
從上文1.2.2中已經知道STP操作的規則,可以得出下面幾條結論。根據這些STP總結的結論,能夠確定出根交換機、交換機與交換機、路由器之間的物理端口連接情況。
結論1:設交換機S1的端口標識為S1i,它的指定網橋為S2,若在指定網橋上的端口(指定端口)為S2j,則S2必為交換機,且交換機S1、S2 通過接口S1i、S2j設備直連,并且可以確定S1的端口S1i是根端口。
結論2:若端口上獲得節點的MAC地址是通過非根交換機的指定端口或者根端口獲得,則該MAC地址對應的設備屬于非直連設備;如果是通過別的端口(處于轉發狀態)獲取,則屬于直連設備。因為根交換機所有端口都是指定端口,所以還需要判斷是不是與交換機根端口連接,若是,則不是直連,反之則是直連。
結論3:若阻塞接口的指定網橋是除自身以外的其它交換機,那么該接口必定與其他交換機存在作為備份使用的冗余鏈路。
結論4:設交換機S 的接口p的轉發表記為ASp。對于物理直接連接的交換機S、K 的兩接口a、b,若ASa∩AKb≠φ,則交換機S與交換機K是通過集線器間接連接,反之,交換機S、K 是通過接口a、b直連。
2.3.2 網絡拓撲步驟
使用C#語言開發程序,在內存中使用存儲格式如下。
設備類:

網絡拓撲步驟如下:
(1)根據交換機STP生成樹表,找到根交換機,再由結論1,通過查看表單中的指定網橋,可知道對應的根端口,這樣初步找到所有交換機的直連關系,再根據結論3找到阻塞端口構成冗余的連接關系;
(2)通過步驟(1)已經找到所有交換機之間的物理連接關系,接下來需要將主機加入到各交換機端口上,根據結論2,結合交換機轉發表中的端口號和MAC地址,找到直連的主機,到這里物理拓撲基本上完成;
(3)完成步驟(2)之后,可根據結論4找到交換機之間是否存在集線器連接,并在內存的設備信息類中修改設備直連關系。
根據電務段生產力的調整,未來鐵路信息化有著更大的需求,依據以數據為中心、通信為依靠的布局,建立網絡通信與信號設備為一體的鐵路信號綜合監測系統。看得出局域網絡的正常對各設備之間的通信是至關重要,因此需要對網絡中的交換機、路由器等關鍵設備進行網絡拓撲,圖4是在該系統中應用該方法得到的網絡拓撲效果展示圖片。用該方法能夠快速有效地發現網絡中路由設備與各交換機、交換機與各關鍵設備的物理連接關系,通過拓撲圖直觀了解網絡設備的狀況,便于維護人員對設備進行故障分析。
本文通過基于SNMP的ICMP探測并結合端口掃描的方法,實現網絡拓撲發現,可減少網絡開銷,實現網絡拓撲發現,完整地發現網絡中所有的活動節點,結合STP生成樹協議能夠準確地發現設備之間的物理連接鏈路,包括冗余鏈路的發現。但是由于項目需求,本文的方法也存在不足,目前可用于局域網內的拓撲發現,要想對廣域網拓撲發現還需要進一步研究,并結合其他技術手段來實現。針對目前實現的網絡拓撲發現,下一步將基于該網絡拓撲方法研究網絡故障定位,實現綜合監測平臺的智能故障診斷。

圖4 在實際中網絡拓撲的效果展示