劉 雋,李 博
(1.中國鐵道科學(xué)研究院 通信信號(hào)研究所, 北京 100081;2.中國鐵路總公司 科技管理部, 北京 100844)
方法與應(yīng)用
利用Wireshark查找進(jìn)程間網(wǎng)絡(luò)通信問題
劉 雋1,李 博2
(1.中國鐵道科學(xué)研究院 通信信號(hào)研究所, 北京 100081;2.中國鐵路總公司 科技管理部, 北京 100844)
本文描述一個(gè)在實(shí)際應(yīng)用中遇到的進(jìn)程間網(wǎng)絡(luò)通信問題,介紹利用Wireshark對(duì)網(wǎng)絡(luò)通信數(shù)據(jù)進(jìn)行捕獲、分析,并定位出問題產(chǎn)生原因的過程。
Wireshark;進(jìn)程間通信;UDP;網(wǎng)絡(luò)協(xié)議分析
進(jìn)程間通信有多種機(jī)制,其中利用套接字(Socket)實(shí)現(xiàn)進(jìn)程間數(shù)據(jù)交換是比較通用的一種。由于通信的進(jìn)程之間隔著多層網(wǎng)絡(luò)協(xié)議以及設(shè)備,如果出現(xiàn)數(shù)據(jù)發(fā)送與接收方面的問題,就需要對(duì)網(wǎng)絡(luò)數(shù)據(jù)進(jìn)行捕獲與分析,弄清楚數(shù)據(jù)出處。
在一臺(tái)主機(jī)上同時(shí)運(yùn)行A、B兩個(gè)軟件,A屬于3層架構(gòu)中的數(shù)據(jù)訪問層,B屬于業(yè)務(wù)邏輯層。B將業(yè)務(wù)邏輯信息發(fā)送給A,再由A通過局域網(wǎng)轉(zhuǎn)發(fā)給其它展現(xiàn)層終端軟件。A同時(shí)還要對(duì)B的運(yùn)行狀態(tài)進(jìn)行實(shí)時(shí)監(jiān)控,在一段時(shí)間內(nèi),例如5 s,如果無法收到B的任何信息,A將終止B的運(yùn)行并重新啟動(dòng)B。A與B的開發(fā)及運(yùn)行環(huán)境如表1所示。
在實(shí)際運(yùn)行過程中,A會(huì)不定期終止B進(jìn)程,而且頻率遠(yuǎn)超出了設(shè)計(jì)所允許的范圍。查看A的運(yùn)行日志,終止B的原因是A的信息接收計(jì)時(shí)器超時(shí),而B的運(yùn)行日志則顯示已經(jīng)按時(shí)向A發(fā)送心跳信息。在排除了A、B信息發(fā)送與接收計(jì)時(shí)出錯(cuò)的可能性之后,問題聚焦在A與B兩進(jìn)程之間的數(shù)據(jù)通信上。
UDP是一種無連接的傳輸層協(xié)議,重效率輕可靠性,不提供數(shù)據(jù)包分組、組裝,不能對(duì)數(shù)據(jù)包進(jìn)行排序,因此當(dāng)報(bào)文發(fā)送之后,是無法得知其是否安全完整到達(dá)的。如此一來,就難以斷定到底是B進(jìn)程的發(fā)送出了問題,還是A進(jìn)程的接收出了問題,因而需要通過其它方法來獲得A、B之間實(shí)際的數(shù)據(jù)發(fā)送與接收情況,也就是要對(duì)網(wǎng)絡(luò)通信數(shù)據(jù)包進(jìn)行截獲與分析。
表1 開發(fā)及運(yùn)行環(huán)境
Wireshark是一個(gè)遵循GNU GPL許可證的開源網(wǎng)絡(luò)協(xié)議分析軟件。Wireshark利用網(wǎng)卡的混雜模式,通過WinPcap接口直接獲取網(wǎng)絡(luò)數(shù)據(jù)包,不影響正常通信,并以易于理解的方式展現(xiàn)給用戶。
Wireshark能夠在多種UNIX、Linux以及Windows操作系統(tǒng)上運(yùn)行,它的特點(diǎn)如下。
(1)多協(xié)議支持:既支持TCP、UDP、HTTP等通用協(xié)議,也支持AppleTalk高級(jí)協(xié)議。(2)實(shí)時(shí)網(wǎng)絡(luò)數(shù)據(jù)分析:能夠獲取網(wǎng)絡(luò)上的實(shí)時(shí)數(shù)據(jù)流,并快速生成與數(shù)據(jù)相關(guān)的協(xié)議、傳輸介質(zhì)、通信通道等信息。(3)友好的用戶界面:具有交互式圖形界面,便于對(duì)獲取的數(shù)據(jù)包進(jìn)行分析。同時(shí)提供數(shù)據(jù)包過濾、導(dǎo)出、名稱解析等高級(jí)選項(xiàng)。(4)開源項(xiàng)目:全球近1 000位程序員參與軟件的開發(fā),每個(gè)用戶都可以依據(jù)各自的需求編寫代碼并將其加入到項(xiàng)目中。
Wireshark擁有的強(qiáng)大而可靠的功能,利用它來分析A、B進(jìn)程間的實(shí)際通信情況是一個(gè)不錯(cuò)的選擇。
在Windows中發(fā)送網(wǎng)絡(luò)數(shù)據(jù)時(shí),如果目的地址就是本機(jī)的IP地址,數(shù)據(jù)包經(jīng)過本機(jī)TCP/IP協(xié)議棧的傳輸層、互聯(lián)網(wǎng)層交給網(wǎng)絡(luò)訪問層內(nèi)的網(wǎng)卡驅(qū)動(dòng)程序處理,隨后通過環(huán)回接口再返回到互聯(lián)網(wǎng)層,因此數(shù)據(jù)不會(huì)出現(xiàn)在相應(yīng)的網(wǎng)絡(luò)上。本文中A、B進(jìn)程之間的通信正是通過主機(jī)的實(shí)際IP地址192.168.1.16進(jìn)行的,因而正常情況下B發(fā)送的數(shù)據(jù)包不會(huì)被Wireshark所獲得。為了確保Wireshark能夠正常發(fā)揮作用,需要修改主機(jī)的路由表,增加一條從本機(jī)IP到默認(rèn)網(wǎng)關(guān)的路由。遵從這條路徑,B進(jìn)程發(fā)送的數(shù)據(jù)包就會(huì)由本機(jī)物理網(wǎng)卡發(fā)送給網(wǎng)關(guān),經(jīng)網(wǎng)關(guān)中轉(zhuǎn)回本機(jī)后再發(fā)給A進(jìn)程。數(shù)據(jù)包一經(jīng)過本機(jī)網(wǎng)卡,就能夠被Wireshark輕松獲取。
增加路由的命令格式如下:
route add <本機(jī)IP> mask 255.255.255.255 <默認(rèn)網(wǎng)關(guān)IP> metric 1
4.1 選擇目標(biāo)接口
Wireshark具備同時(shí)對(duì)一臺(tái)主機(jī)上的多個(gè)不同類型網(wǎng)絡(luò)接口進(jìn)行數(shù)據(jù)捕獲的能力,為了避免有用的信息被淹沒在海量的數(shù)據(jù)中,需要將目標(biāo)接口限定在網(wǎng)卡上,也就是具有192.168.1.16地址的那個(gè)網(wǎng)卡。
4.2 設(shè)置捕獲過濾器(Capture Filter)
通過捕獲過濾器可以讓W(xué)ireshark只捕獲滿足條件的數(shù)據(jù)包。
本文使用的捕獲過濾器表達(dá)式為:udp && host 192.168.1.16。其含義是:只捕獲UDP數(shù)據(jù)包,并且數(shù)據(jù)包的地址是192.168.1.16。
4.3 設(shè)置顯示過濾器(Display Filter)
通過顯示過濾器可以讓W(xué)ireshark對(duì)已捕獲的數(shù)據(jù)進(jìn)一步篩選,并顯示在用戶界面上。
本文使用的顯示過濾器表達(dá)式為:eth.dst == 40:f2:e9:9d:b9:d4 && udp.dstport eq 1024。其含義是:顯示目標(biāo)網(wǎng)卡的MAC地址是“40:f2:e9:9d:b9:d4”(也就是192.168.1.16對(duì)應(yīng)的MAC地址),并且UDP目標(biāo)端口是1024的數(shù)據(jù)包。
4.4 捕獲數(shù)據(jù)包
Wireshark在執(zhí)行實(shí)時(shí)數(shù)據(jù)捕獲時(shí),會(huì)將有效數(shù)據(jù)顯示在界面的數(shù)據(jù)包列表、數(shù)據(jù)包詳情、數(shù)據(jù)包字節(jié)3個(gè)區(qū)域中。數(shù)據(jù)包列表區(qū)中列出了所有符合過濾條件的數(shù)據(jù)包,內(nèi)容為序號(hào)、時(shí)間、源地址、目標(biāo)地址、協(xié)議類型等;數(shù)據(jù)包詳情區(qū)會(huì)將用戶在數(shù)據(jù)包列表區(qū)選中的某數(shù)據(jù)包的詳細(xì)信息展示出來,包括各層協(xié)議的字段內(nèi)容;數(shù)據(jù)包字節(jié)區(qū)以16進(jìn)制形式顯示出選中數(shù)據(jù)包的全部字節(jié)內(nèi)容。
4.5 創(chuàng)建圖表
本文中關(guān)心的是數(shù)據(jù)發(fā)送與時(shí)間的關(guān)系,數(shù)據(jù)統(tǒng)計(jì)圖能更加直觀的反映通信變化的趨勢(shì)。Wireshark提供了IO Graph來繪制這樣的統(tǒng)計(jì)圖。IO Graph的參數(shù)是可以定制的,例如:將X軸定義為實(shí)際時(shí)間軸,1 s/刻度,刻度間隔10像素;Y軸定義為數(shù)據(jù)包數(shù)量軸,1包/刻度,最大刻度為10;數(shù)據(jù)過濾器表達(dá)式與顯示過濾器表達(dá)式一致。
4.6 完成捕獲
如果捕獲到了足夠多的數(shù)據(jù)包,可以停止捕獲,并將全部的捕獲數(shù)據(jù)或者僅數(shù)據(jù)包列表區(qū)的數(shù)據(jù)保存成捕獲文件,以便于進(jìn)行后續(xù)的離線數(shù)據(jù)分析。
通過查看A進(jìn)程的運(yùn)行日志,得知B進(jìn)程在19:06:35出現(xiàn)信息發(fā)送超時(shí)現(xiàn)象。利用Wireshark繪制的相應(yīng)時(shí)段IO Graph如圖1所示。
圖1 B進(jìn)程數(shù)據(jù)發(fā)送IO Graph
圖1 中先出現(xiàn)尖峰,隨后進(jìn)入波谷并探底,最后又恢復(fù)正常。再查看對(duì)應(yīng)時(shí)間段數(shù)據(jù)包列表區(qū)和數(shù)據(jù)包詳情區(qū)顯示的信息,B進(jìn)程在19:06:27~19:06:30發(fā)送大量的業(yè)務(wù)信息,1 s后停止發(fā)送信息,在大約4 s后的19:06:35恢復(fù)正常,繼續(xù)發(fā)送心跳信息。上述情況在后續(xù)長(zhǎng)時(shí)間的捕獲與分析中也多次反復(fù)出現(xiàn),初步結(jié)論是業(yè)務(wù)信息的發(fā)送影響了心跳信息的按時(shí)發(fā)送。
隨后通過復(fù)查B的源代碼印證結(jié)論。B采用兩個(gè)獨(dú)立的線程分別負(fù)責(zé)發(fā)送業(yè)務(wù)信息和心跳信息,線程間共用一個(gè)UdpClient通信對(duì)象。雖然在兩個(gè)線程間設(shè)置了同步鎖,但業(yè)務(wù)信息發(fā)送線程在完成發(fā)送任務(wù)后沒有及時(shí)釋放通信對(duì)象和同步鎖,進(jìn)而造成心跳發(fā)送線程等待時(shí)間過長(zhǎng),后續(xù)心跳發(fā)送超時(shí)。
問題的根源找到了,解決方法就是在業(yè)務(wù)信息發(fā)送線程完成信息發(fā)送后迅速釋放通信對(duì)象,解除同步鎖。
Wireshark可以查找網(wǎng)絡(luò)通信的問題,本文捕獲、分析同主機(jī)進(jìn)程間網(wǎng)絡(luò)數(shù)據(jù)的過程就是Wireshark的基本應(yīng)用方法,這套方法同樣可以用來追蹤主機(jī)間,基于各種協(xié)議的網(wǎng)絡(luò)通信問題。
[1]林沛滿. Wireshark網(wǎng)絡(luò)分析就這么簡(jiǎn)單[M]. 北京:人民郵電出版社,2014.
[2] Singh, Abhinav. Instant Wireshark Starter[M]. Birmingham: Packt Publishing, 2013.
[3] Stevens, W.R. TCP/IP Illustrated, Volume 1: The Protocols[M]. Reading, Mass: Addison-Wesley, 1994.
責(zé)任編輯 陳 蓉
Solving inter-process network communication problem via Wireshark
LIU Jun1, LI Bo2
( 1. Signal & Communication Research Institute, China Academy of Railway Sciences, Beijing 100081, China; 2. Department of Science and Technology, China Railway, Beijing 100844, China )
This paper described an inter-process communication problem encountered in practical application scenario, and introduced in detail the trouble-shooting procedure, which included the capture and analysis of network communication data via Wireshark.
Wireshark; inter-process communication; UDP; network protocol analysis
U285.4∶TP39
A
1005-8451(2015)09-0030-03
2015-01-06
劉 雋,副研究員;李 博,工程師。