李山松
(河北遠東哈里斯通信有限公司河北石家莊050200)
通信設備之間的組網都是通過標準的信令協議達成的。處理聯網故障,可以通過分析2 臺設備之間收發的信令消息找到故障點。但是這些信令數據的可讀性比較差,要想了解信令包含的具體內容,商業化的信令分析儀是一個很好的工具,但是價格比較高,攜帶也不是很方便,不能在工程人員中進行大面積推廣。這里就探討一下如何使用開源軟件W ireshark 為工程聯網故障的排查提供服務,進而加快聯網問題的排查速度。
W ireshark 軟件,以前稱為Ethereal 軟件。1997年底,由Gerald Combs 完成了最初版本的編寫,并將其置于GNU GPL通用許可證的保障范圍之下,使用者可以免費獲得軟件和其源代碼,并擁有針對其源代碼修改和完善的權利。之后,眾多程序員參與了軟件的編寫和完善。2006年6月,因為商標的問題,Ethereal 更名為W ireshark。目前,W ireshark 已經是全世界使用最廣泛的信令分析軟件之一。
W ireshark 軟件相當優秀,但是他本身并不能直接讀取通信設備輸出的信令消息。如果能夠解決這個問題,其他問題皆可迎刃而解。通過分析,發現W ireshark 支持讀取PCAP 格式的封包捕獲文件,接下來的問題就是如何能把通信設備輸出的信令消息轉換為PCAP 封包格式。下面以交換機PR I 中繼使用的Q.931 協議為例子,詳細介紹這一轉換是如何完成的。
為了生成PCAP 文件,首先需要了解PCAP 文件的結構。PCAP 文件格式是一種在協議分析中用到的數據包存儲格式。但是,目前還沒有現成的工具軟件能把交換機輸出的信令信息打包為PCAP 格式的文件。因此,這一轉換過程需要自己編程解決。PCAP 文件由一個文件頭和若干個數據包構成。每個數據包前面還有一個頭部結構,記錄數據包的捕獲時間、長度等內容,下面是用C 語言描述的數據包頭部結構:

其中:
GMTtime 和m icroTime 是數據包的捕獲時間。
caplen 和len 是所捕獲數據的長度。
下面是PCAP 文件頭的C 語言結構定義:

其中:
magic 為標識位:取值為0xD 4C3B2A1
version_major 為主版本號:默認值為0x02
version_m inor 為副版本號:默認值為0x04
thiszone 是區域時間:可以設置為0
sigfigs 是精確時間戳:可以設置為0
snaplen 是數據包最大長度:可以設置為0
linktype 是鏈路層類型:將此值設置為0xB1,表示后面的數據包都是按照DLT_LINUX_LAPD 的幀格式進行存儲。之所以選擇這種幀格式,主要是因為DLT_LINUX_LAPD 在標準LAPD 幀格式的基礎上,擴展出了一些額外的信息字節,通過這些字節,可以標識出數據包的收發方向。到這里,又涉及到了一個新的數據結構DLT_LINUX_LAPD 幀,下面介紹一下這個幀結構。
DLT_LINUX_LAPD 是linux 操作系統為了處理LAPD幀而定義的一個數據結構,這里借用一下這個結構來封裝交換機輸出的信令消息。可以使用下面的C 語言來描述這個幀的頭部結構[3]:

sll_pkttype 為數據包類型,如果數據包是對端設備發送給本機的,取值為0。如果數據包是發往其他設備的,取值為4。
sll_protocol 為協議類型,取值0x0030
其他項目在程序中不使用,都置為0。
數據的封裝分2 步完成。
①首先在交換機跟蹤到的信令消息前面加上一個4 字節的LAPD_HDR,構成標準的LAPD 數據幀[4]。然后,在LAPD幀前面加上一個DLT_LINUX_HDR,構成DLT_LINUX_LAPD 數據幀。最后,在DLT_LINUX_LAPD 數據幀的前面加上PKT_HDR,構成PCAP 文件的一個基本數據單元。其數據單元結構,可以表示如下:
Packet= [PKT_HDR][DLT_LINUX_HDR][LAPD_HDR][原始信令消息]
②將封裝好的數據單元存入PCAP 文件。這個過程比較簡單:先創建一個文件,然后在文件中寫入文件頭PCAP_FILE_HDR,之后順序寫入第1 步生成的數據包,最后關閉文件。生成的PCAP 文件,其結構可以表示如下:FILE=[PCAP_FILE_HDR][Packet_1]…[Packet_n]
根據上面的描述,制作了一個格式轉換工具,用于將交換機跟蹤到的PR I 信令消息封裝成W ireshark 軟件可以讀取的PCAP 格式,然后用W ireshark 進行解碼[5]。下面是解碼前后的數據對比:解碼之前的原始數據:

原始數據包含"信令標識"、"承載能力"、"電路標識"、"主被叫"等信息,這些信息都是以十六進制代碼的形式進行顯示的。原始數據的可讀性比較差,在工程實踐中使用起來比較困難,往往需要求助開發人員對信令數據進行人工解讀。為了提高工作效率,可以使用轉換工具將跟蹤到的信令源碼打包到一個PCAP 文件,然后使用W ireshare 對這個文件進行解碼。
下面是解碼后的主叫部分:


從上面的例子可以直觀看到,解碼出的數據的可讀性大大提高。那么解碼的結果是否正確呢?參照技術規范《YDN 034.2-1997 ISDN 用戶-網絡接口規范第2 部分:數據鏈路層技術規范》對以上解析出的數據進行驗證,以上關于消息類型,主被叫號碼[6]等描述均正確。從以上的例子可以看到,通過構建PCAP 數據包的方式,可以很直觀地對信令數據進行解碼。有了這個工具的幫助,可以極大地提升工作效率。
W ireshark 軟件可以解析的協議非常多,并且可以通過Lua 工具方便的添加對于新協議的支持。上面僅僅演示的是通過構建數據包,讓W ireshark 幫助解析PR I 中繼的Q.931 協議。同樣,也可以通過構建數據包的形式,讓W ireshark 分析其他的通信協議。在W ireshark 的幫助下,工作肯定更有效率。特別是在一些工程調試時,由于還要顧及到成本問題,昂貴的信令分析儀很難普及。在這些領域,掌握自己構建PCAP 文件的技術,進而利用W ireshark 對信令數據進行解析,更能發揮這一自由軟件的價值。
[1]CHR IS S.W ireshark 數據包分析實戰[M].北京:人民郵電出版社,2013:39-40.
[2]呂雪峰,彭文波,宋澤宇.網絡分析技術揭秘[M].北京:機械工業出版社,2012:361-363.
[3]于 躍,朱程榮.基于Linux 嵌入式嗅探器的設計與實現[J].計算機應用與軟件,2007,24(6):162-164.
[4]YDN 034.2-1997ISDN.數據鏈路層技術規范[S].
[5]白 潔.用W ireshark 抓包分析幀格式[J].電腦知識與技術,2011,07(28):6831-6832.
[6]YDN 034.3ISDN.第三層基本呼叫控制技術規范[S].