李山松
(河北遠(yuǎn)東哈里斯通信有限公司河北石家莊050200)
通信設(shè)備之間的組網(wǎng)都是通過標(biāo)準(zhǔn)的信令協(xié)議達(dá)成的。處理聯(lián)網(wǎng)故障,可以通過分析2 臺設(shè)備之間收發(fā)的信令消息找到故障點(diǎn)。但是這些信令數(shù)據(jù)的可讀性比較差,要想了解信令包含的具體內(nèi)容,商業(yè)化的信令分析儀是一個很好的工具,但是價格比較高,攜帶也不是很方便,不能在工程人員中進(jìn)行大面積推廣。這里就探討一下如何使用開源軟件W ireshark 為工程聯(lián)網(wǎng)故障的排查提供服務(wù),進(jìn)而加快聯(lián)網(wǎng)問題的排查速度。
W ireshark 軟件,以前稱為Ethereal 軟件。1997年底,由Gerald Combs 完成了最初版本的編寫,并將其置于GNU GPL通用許可證的保障范圍之下,使用者可以免費(fèi)獲得軟件和其源代碼,并擁有針對其源代碼修改和完善的權(quán)利。之后,眾多程序員參與了軟件的編寫和完善。2006年6月,因?yàn)樯虡?biāo)的問題,Ethereal 更名為W ireshark。目前,W ireshark 已經(jīng)是全世界使用最廣泛的信令分析軟件之一。
W ireshark 軟件相當(dāng)優(yōu)秀,但是他本身并不能直接讀取通信設(shè)備輸出的信令消息。如果能夠解決這個問題,其他問題皆可迎刃而解。通過分析,發(fā)現(xiàn)W ireshark 支持讀取PCAP 格式的封包捕獲文件,接下來的問題就是如何能把通信設(shè)備輸出的信令消息轉(zhuǎn)換為PCAP 封包格式。下面以交換機(jī)PR I 中繼使用的Q.931 協(xié)議為例子,詳細(xì)介紹這一轉(zhuǎn)換是如何完成的。
為了生成PCAP 文件,首先需要了解PCAP 文件的結(jié)構(gòu)。PCAP 文件格式是一種在協(xié)議分析中用到的數(shù)據(jù)包存儲格式。但是,目前還沒有現(xiàn)成的工具軟件能把交換機(jī)輸出的信令信息打包為PCAP 格式的文件。因此,這一轉(zhuǎn)換過程需要自己編程解決。PCAP 文件由一個文件頭和若干個數(shù)據(jù)包構(gòu)成。每個數(shù)據(jù)包前面還有一個頭部結(jié)構(gòu),記錄數(shù)據(jù)包的捕獲時間、長度等內(nèi)容,下面是用C 語言描述的數(shù)據(jù)包頭部結(jié)構(gòu):
其中:
GMTtime 和m icroTime 是數(shù)據(jù)包的捕獲時間。
caplen 和len 是所捕獲數(shù)據(jù)的長度。
下面是PCAP 文件頭的C 語言結(jié)構(gòu)定義:
其中:
magic 為標(biāo)識位:取值為0xD 4C3B2A1
version_major 為主版本號:默認(rèn)值為0x02
version_m inor 為副版本號:默認(rèn)值為0x04
thiszone 是區(qū)域時間:可以設(shè)置為0
sigfigs 是精確時間戳:可以設(shè)置為0
snaplen 是數(shù)據(jù)包最大長度:可以設(shè)置為0
linktype 是鏈路層類型:將此值設(shè)置為0xB1,表示后面的數(shù)據(jù)包都是按照DLT_LINUX_LAPD 的幀格式進(jìn)行存儲。之所以選擇這種幀格式,主要是因?yàn)镈LT_LINUX_LAPD 在標(biāo)準(zhǔn)LAPD 幀格式的基礎(chǔ)上,擴(kuò)展出了一些額外的信息字節(jié),通過這些字節(jié),可以標(biāo)識出數(shù)據(jù)包的收發(fā)方向。到這里,又涉及到了一個新的數(shù)據(jù)結(jié)構(gòu)DLT_LINUX_LAPD 幀,下面介紹一下這個幀結(jié)構(gòu)。
DLT_LINUX_LAPD 是linux 操作系統(tǒng)為了處理LAPD幀而定義的一個數(shù)據(jù)結(jié)構(gòu),這里借用一下這個結(jié)構(gòu)來封裝交換機(jī)輸出的信令消息??梢允褂孟旅娴腃 語言來描述這個幀的頭部結(jié)構(gòu)[3]:
sll_pkttype 為數(shù)據(jù)包類型,如果數(shù)據(jù)包是對端設(shè)備發(fā)送給本機(jī)的,取值為0。如果數(shù)據(jù)包是發(fā)往其他設(shè)備的,取值為4。
sll_protocol 為協(xié)議類型,取值0x0030
其他項(xiàng)目在程序中不使用,都置為0。
數(shù)據(jù)的封裝分2 步完成。
①首先在交換機(jī)跟蹤到的信令消息前面加上一個4 字節(jié)的LAPD_HDR,構(gòu)成標(biāo)準(zhǔn)的LAPD 數(shù)據(jù)幀[4]。然后,在LAPD幀前面加上一個DLT_LINUX_HDR,構(gòu)成DLT_LINUX_LAPD 數(shù)據(jù)幀。最后,在DLT_LINUX_LAPD 數(shù)據(jù)幀的前面加上PKT_HDR,構(gòu)成PCAP 文件的一個基本數(shù)據(jù)單元。其數(shù)據(jù)單元結(jié)構(gòu),可以表示如下:
Packet= [PKT_HDR][DLT_LINUX_HDR][LAPD_HDR][原始信令消息]
②將封裝好的數(shù)據(jù)單元存入PCAP 文件。這個過程比較簡單:先創(chuàng)建一個文件,然后在文件中寫入文件頭PCAP_FILE_HDR,之后順序?qū)懭氲? 步生成的數(shù)據(jù)包,最后關(guān)閉文件。生成的PCAP 文件,其結(jié)構(gòu)可以表示如下:FILE=[PCAP_FILE_HDR][Packet_1]…[Packet_n]
根據(jù)上面的描述,制作了一個格式轉(zhuǎn)換工具,用于將交換機(jī)跟蹤到的PR I 信令消息封裝成W ireshark 軟件可以讀取的PCAP 格式,然后用W ireshark 進(jìn)行解碼[5]。下面是解碼前后的數(shù)據(jù)對比:解碼之前的原始數(shù)據(jù):
原始數(shù)據(jù)包含"信令標(biāo)識"、"承載能力"、"電路標(biāo)識"、"主被叫"等信息,這些信息都是以十六進(jìn)制代碼的形式進(jìn)行顯示的。原始數(shù)據(jù)的可讀性比較差,在工程實(shí)踐中使用起來比較困難,往往需要求助開發(fā)人員對信令數(shù)據(jù)進(jìn)行人工解讀。為了提高工作效率,可以使用轉(zhuǎn)換工具將跟蹤到的信令源碼打包到一個PCAP 文件,然后使用W ireshare 對這個文件進(jìn)行解碼。
下面是解碼后的主叫部分:
從上面的例子可以直觀看到,解碼出的數(shù)據(jù)的可讀性大大提高。那么解碼的結(jié)果是否正確呢?參照技術(shù)規(guī)范《YDN 034.2-1997 ISDN 用戶-網(wǎng)絡(luò)接口規(guī)范第2 部分:數(shù)據(jù)鏈路層技術(shù)規(guī)范》對以上解析出的數(shù)據(jù)進(jìn)行驗(yàn)證,以上關(guān)于消息類型,主被叫號碼[6]等描述均正確。從以上的例子可以看到,通過構(gòu)建PCAP 數(shù)據(jù)包的方式,可以很直觀地對信令數(shù)據(jù)進(jìn)行解碼。有了這個工具的幫助,可以極大地提升工作效率。
W ireshark 軟件可以解析的協(xié)議非常多,并且可以通過Lua 工具方便的添加對于新協(xié)議的支持。上面僅僅演示的是通過構(gòu)建數(shù)據(jù)包,讓W(xué) ireshark 幫助解析PR I 中繼的Q.931 協(xié)議。同樣,也可以通過構(gòu)建數(shù)據(jù)包的形式,讓W(xué) ireshark 分析其他的通信協(xié)議。在W ireshark 的幫助下,工作肯定更有效率。特別是在一些工程調(diào)試時,由于還要顧及到成本問題,昂貴的信令分析儀很難普及。在這些領(lǐng)域,掌握自己構(gòu)建PCAP 文件的技術(shù),進(jìn)而利用W ireshark 對信令數(shù)據(jù)進(jìn)行解析,更能發(fā)揮這一自由軟件的價值。
[1]CHR IS S.W ireshark 數(shù)據(jù)包分析實(shí)戰(zhàn)[M].北京:人民郵電出版社,2013:39-40.
[2]呂雪峰,彭文波,宋澤宇.網(wǎng)絡(luò)分析技術(shù)揭秘[M].北京:機(jī)械工業(yè)出版社,2012:361-363.
[3]于 躍,朱程榮.基于Linux 嵌入式嗅探器的設(shè)計(jì)與實(shí)現(xiàn)[J].計(jì)算機(jī)應(yīng)用與軟件,2007,24(6):162-164.
[4]YDN 034.2-1997ISDN.數(shù)據(jù)鏈路層技術(shù)規(guī)范[S].
[5]白 潔.用W ireshark 抓包分析幀格式[J].電腦知識與技術(shù),2011,07(28):6831-6832.
[6]YDN 034.3ISDN.第三層基本呼叫控制技術(shù)規(guī)范[S].