網絡數據包的協議分析程序的設計開發(fā)畢業(yè)設計_第1頁
已閱讀1頁,還剩23頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、<p>  網絡數據包的協議分析程序的設計開發(fā)</p><p><b>  摘 要</b></p><p>  本文設計與實現了一個基于Linux下Libpcap庫函數的網絡數據包協議分析程序。程序的主要功能包括網絡數據包捕獲和常用網絡協議分析。程序由輸入/輸出模塊、規(guī)則匹配模塊、數據捕獲模塊、協議分析模塊組成。其中數據捕獲模塊和協議分析模塊是本程序最關鍵

2、、最主要的模塊。</p><p>  本文的主要內容如下:首先介紹了網絡數據包協議分析程序的背景和概念。其次進行了程序的總體設計:確定了程序的功能,給出了程序的結構圖和層次圖,描述了程序的工作流程,對實現程序的關鍵技術做出了分析。接著,介紹完數據包捕獲的相關背景和Libpcap函數庫后,闡述了如何利用Libpcap函數庫實現網絡數據包捕獲模塊。然后對協議分析流程進行了詳細的講解,分析了常用網絡協議。最后進行了程序

3、的測試與運行:測試了程序能否按照預期的效果正確執(zhí)行,印證了預期結果。</p><p>  關鍵詞:Libpcap;Linux;數據包捕獲;應用層;協議識別</p><p>  The Design and Development of Network Packet Protocol Analyzing Program</p><p><b>  Abstr

4、act</b></p><p>  The thesis is an attempt to introduce an implementation of network protocol analyzing program which is based on Libpcap, a famous network packet capture library on Linux. It has a rich

5、 feature set which includes capturing network packets and analyzing popular network protocols on Internet. The program is made up of an input/output module, a rules matching module, a packet capturing module and a protoc

6、ol analyzing module. And the last two modules are key modules.</p><p>  The research work was described as followed. firstly, we introduce the background and concepts about network protocol analyzing program

7、s; and we make an integrated design on the program, define functions of it, figure out its structure and hierarchical graphs, describe the workflow of it, and analyze the key techniques used in it; Secondly, after elabor

8、ating on the background of packet capture and the Libpcap library, we state a approach to implement a packet capture module with Libpcap; Thirdly</p><p>  Key words: Libpcap; Linux; Network packet capturing;

9、 Application layer; Protocol identification </p><p><b>  目 錄</b></p><p><b>  論文總頁數:23頁</b></p><p><b>  1引言1</b></p><p>  1.1課題背景

10、1</p><p>  1.2網絡數據包協議分析程序簡介2</p><p>  1.3國內外研究現狀2</p><p>  2網絡數據包協議分析程序的總體設計3</p><p>  2.1網絡數據包協議分析程序的功能分析3</p><p>  2.2系統(tǒng)的組成結構和工作流程3</p>

11、<p>  2.2.1系統(tǒng)的結構框圖3</p><p>  2.2.2系統(tǒng)的結構和功能4</p><p>  2.2.3程序的工作流程5</p><p>  2.3系統(tǒng)實現的關鍵技術分析6</p><p>  3網絡數據包捕獲模塊的實現7</p><p>  3.1網絡數據包捕獲簡介

12、7</p><p>  3.2基于Libpcap的網絡數據包捕獲的實現8</p><p>  3.2.1Libpcap安裝8</p><p>  3.2.2Libpcap中基本的數據結構和函數8</p><p>  3.3數據捕獲模塊的實現11</p><p>  4協議分析模塊的實現11</

13、p><p>  4.1網絡協議分析的總體流程12</p><p>  4.2對TCP/IP模型中各層協議的分析14</p><p>  4.2.1以太網首部的分析與提取14</p><p>  4.2.2IP首部的分析與提取15</p><p>  4.2.3TCP/UDP首部的分析與提取16</

14、p><p>  4.2.4應用層協議的識別與分析18</p><p>  5程序運行與測試20</p><p>  5.1測試環(huán)境20</p><p>  5.1.1硬件環(huán)境20</p><p>  5.1.2程序運行環(huán)境20</p><p>  5.2測試步驟20</

15、p><p>  5.3測試結果評價20</p><p><b>  結 論20</b></p><p><b>  參考文獻21</b></p><p><b>  致 謝22</b></p><p><b>  聲 明

16、23</b></p><p><b>  引言</b></p><p><b>  課題背景</b></p><p>  隨著計算機網絡的不斷發(fā)展,全球信息化已成為當今社會發(fā)展的趨勢。但由于計算機網絡自身所特具有的特點,比如聯結形式多樣性和網絡的開放性、互連性等特征,所以導致網絡易受黑客還有一些病毒的攻擊。所

17、以網上信息的安全和保密是一個至關重要的問題。對于軍用的自動化指揮網絡和銀行等傳輸敏感數據的計算機網絡系統(tǒng)而言,其網上信息的安全和保密尤為重要。因此,網絡必須有足夠強的安全措施,否則該網絡將是個無用、甚至會危及國家安全的網絡。在計算機網絡的世界里,存在著很多潛在的威脅,因此網絡的安全措施應能全方位地應對各種不同的威脅,這樣才可以真正的做到網絡服務于社會,體現網絡的先進性。</p><p>  計算機網絡所面臨的威脅

18、大體可分為兩種:一是對網絡中信息的威脅;二是對網絡中設備的威脅。影響計算機網絡的因素很多,有些因素可能是有意的,也可能是無意的;可能是人為的,也可能是非人為的;可能是外來黑客對網絡系統(tǒng)資源的非法使有,歸結起來,針對網絡安全的威脅主要有三種:</p><p>  (1)人為的無意失誤:如操作員安全配置不當造成的安全漏洞,用戶安全意識不強,用戶口令選擇不慎,用戶將自己的帳號隨意轉借他人或與別人共享等都會對網絡安全帶來

19、威脅。</p><p>  (2)人為的惡意攻擊:這是計算機網絡所面臨的最大威脅,敵手的攻擊和計算機犯罪就屬于這一類。此類攻擊又可以分為以下兩種:一種是主動攻擊,它以各種方式有選擇地破壞信息的有效性和完整性;另一類是被動攻擊,它是在不影響網絡正常工作的情況下,進行截獲、竊取、破譯以獲得重要機密信息。這兩種攻擊均可對計算機網絡造成極大的危害,并導致機密數據的泄漏。</p><p>  (3)

20、網絡軟件的漏洞和“后門”:網絡軟件不可能是百分之百的無缺陷和無漏洞的,然而,這些漏洞和缺陷恰恰是黑客進行攻擊的首選目標,曾經出現過黑客攻入網絡內部的事件,這些事件的大部分就是因為安全措施不完善所招致的苦果。另外,軟件的“后門”都是軟件公司的設計編程人員為了自便而設置的,一般不為外人所知,但一旦“后門”洞開,其造成的后果將不堪設想。</p><p>  為了及早發(fā)現并制止網絡上的各種攻擊,我們需要通過對網絡上的數據

21、進行分析來發(fā)現并找出問題,提前預防。這也是本論文的一個重要目的。網絡安全管理員運用網絡封包截獲技術,抓取網絡中有用的數據包,然后通過對數據包內容進行分析,確定哪些是有害的或者含有攻擊企圖的包,以此來達到對網絡攻擊的預防。同時許多防火墻也是基于包過濾技術的。本文將介紹網絡數據包協議分析程序的工作原理以及它的實現。</p><p>  網絡數據包協議分析程序簡介</p><p>  網絡數據包

22、協議分析程序是一種用于收集網絡中有用數據的程序,這些數據可以是用戶的帳號和密碼,也可以是一些商用機密數據等。它是利用計算機的網絡接口截獲目的地為其他計算機的數據報文的一種工具。</p><p>  網絡數據包協議分析程序的正當用處主要是分析網絡的流量,以便找出所關心的網絡中潛在的問題。例如,假設網絡的某一段運行得不是很好,報文的發(fā)送比較慢,而我們又不知道問題出在什么地方,此時就可以用網絡數據包協議分析程序來作出精

23、確的問題判斷。在合理的網絡中,網絡數據包協議分析程序的存在對系統(tǒng)管理員是至關重要的,系統(tǒng)管理員通過網絡數據包協議分析程序可以診斷出大量的不可見模糊問題,這些問題涉及兩臺乃至多臺計算機之間的異常通訊,有些甚至牽涉到各種的協議,借助于網絡數據包協議分析程序系統(tǒng)管理員可以方便的確定出多少的通訊量屬于哪個網絡協議、占主要通訊協議的主機是哪一臺、大多數通訊目的地是哪臺主機、報文發(fā)送占用多少時間、或著相互主機的報文傳送間隔時間等等,這些信息為管理員

24、判斷網絡問題、管理網絡區(qū)域提供了非常寶貴的信息。</p><p><b>  國內外研究現狀</b></p><p>  現在國內外已經有很多成熟并且功能強大的網絡數據包協議分析軟件。比較著名的網絡數據包協議分析軟件有:開源軟件:Wireshark、TcpDump。商用軟件:EtherPeek下面對這幾種軟件進行簡要的介紹:</p><p> 

25、 Wireshark: Wireshark是一個開放源碼的網絡分析系統(tǒng),也是是目前最好的開放源碼的網絡協議分析器,支持Linux和Windows平臺。Wireshark起初由Gerald Combs開發(fā),隨后由一個松散的Wireshark團隊組織進行維護開發(fā)。它目前所提供的強大的協議分析功能完全可以媲美商業(yè)的網絡分析系統(tǒng),自從1998年發(fā)布最早的0.2版本至今,大量的志愿者為Wireshark添加新的協議解析器,如今Wireshark已

26、經支持五百多種協議解析。很難想象如此多的人開發(fā)的代碼可以很好的融入系統(tǒng)中;并且在系統(tǒng)中加入一個新的協議解析器很簡單,一個不了解系統(tǒng)的結構的新手也可以根據留出的接口進行自己的協議開發(fā)。這都歸功于Wireshark良好的設計結構。事實上由于網絡上各種協議種類繁多,各種新的協議層出不窮。一個好的協議分析器必需有很好的可擴展性和結構。這樣才能適應網絡發(fā)展的需要不斷加入新的協議解析器。</p><p>  TcpDump:

27、顧名思義,TcpDump可以將網絡中傳送的數據包的“頭”完全截獲下來提供分析。它支持針對網絡層、協議、主機、網絡或端口的過濾,并提供and、or、not等邏輯語句來幫助你去掉無用的信息。用盡量簡單的話來定義TcpDump,就是:dump the traffic on a network,根據使用者的定義對網絡上的數據包進行截獲的包分析工具。TcpDump以其強大的功能,靈活的截取策略,成為每個高級的系統(tǒng)管理員分析網絡,排查問題等所必備的

28、工具之一。</p><p>  EtherPeek:這個工具軟件開始只是一個網絡分析器型的數據包監(jiān)測軟件,經過這些年的發(fā)展已經成為一個真正的網絡管理工具并具有網站監(jiān)視和分析等新的功能,被美國聯邦調查局用來追蹤逃犯、販賣毒品的人、電腦黑客和一些被懷疑為外國間諜的人。是一個直觀,功能強大的以太網網絡和協議分析器。支持Macintosh和Windows平臺。EtherPeek把查找和修復多平臺上的復雜網絡任務變得簡單化

29、。EtherPeek采用工業(yè)標準,非常容易使用,提供解碼、過濾和診斷網絡的功能。以友好圖形界面出名,EtherPeek提供非常詳細且多樣化的網絡使用信息,網絡結點的會話和數據包內容。在有問題的局域網絡中使用EtherPeek執(zhí)行一個自定的診斷測試,監(jiān)控網絡的通信和事件,跟蹤非法的網絡活動,測試和調試網絡軟硬件。</p><p>  網絡數據包協議分析程序的總體設計</p><p>  網絡

30、數據包協議分析程序的功能分析</p><p>  對于網絡數據包協議分析程序進行功能分析的第一步是要確立程序所要實現的目標,也就是程序最終要解決的問題。本程序所要實現的目標就是在共享式以太網中捕獲根據過濾規(guī)則設置的流經本地網卡的數據包,并且對數據包中的信息進行分析。</p><p>  網絡數據包協議分析程序必須完成對常用協議的識別和分析:要求至少實現TCP/IP協議簇幾個基本協議的分析(

31、ARP、RARP、TCP、UDP),以及應用層的常用協議分析。為了減少設計的復雜度,程序采用字符界面。對網絡數據包的捕獲、規(guī)則過濾和對數據包的分析是本程序的主要功能。</p><p>  系統(tǒng)的組成結構和工作流程</p><p><b>  系統(tǒng)的結構框圖</b></p><p>  基于以上分析,本文設計了網絡數據包協議分析程序,圖2-1是程

32、序的結構框圖。</p><p>  圖2-1網絡數據包協議分析程序結構框圖</p><p>  下面對該程序的整體結構進行一下描述:該程序的運行環(huán)境是Fedora Core 4 linux。Fedora Core是linux的一個發(fā)行版,他的前身是Redhat linux。本程序通過調用安裝在linux上的Libpcap函數庫抓取經過本地網卡的數據包,從而完成數據包的捕獲。然后將捕獲后的數

33、據包交給上層的數據處理模塊,進行協議分析。最后將分析后的數據顯示在用戶界面上。</p><p><b>  系統(tǒng)的結構和功能</b></p><p>  網絡數據包的協議分析程序是一個基于Libpcap開發(fā)庫,應用與共享以太網的網絡分析程序如圖2-2所示,系統(tǒng)主要包括4大模塊:</p><p>  圖2-2網絡數據包的協議分析程序的層次圖<

34、;/p><p>  1、數據輸入模塊。該模塊主要功能是接收用戶輸入用于捕獲數據包的信息。其中包括選擇用于捕獲的網絡接口和需要過濾的內容。</p><p>  2、數據捕獲模塊。該模塊的主要功能是捕獲流經本地網卡的所有數據。其原理是通過把網卡設置為混雜模式,使得網卡對所有流經它的數據包都交給上層程序處理。</p><p>  3、規(guī)則匹配模塊,該模塊的主要功能是根據用戶的

35、需求對需要捕獲的數據包進行過濾設置。因為不是所有經過本地網卡的數據報都對我們分析網絡有用,而且如果將所有經過網卡的數據捕獲會增加系統(tǒng)的開銷。因此我們設置了一個規(guī)則匹配模塊,當所捕獲的信息與我們設置的規(guī)則相符時我們就把它交給數據處理模塊,否則就丟棄。</p><p>  4、數據處理模塊。該模塊的主要功能是對捕獲的數據進行分析顯示處理。主要是調用協議分析模塊和顯示模塊。</p><p>  

36、4.1 協議分析模塊。該模塊的主要功能是對捕獲的數據包進行協議分析。把數據包捕獲下來后,我們需要對其分析才能知道網絡中存在的安全問題。該模塊主要是對TCP/IP各層的協議進行分析。</p><p>  4.2 顯示模塊。該模塊的主要功能是將分析的結果顯示給用戶。對數據包進行協議分析后要把結果顯示給用戶本程序才結束。因為數據包中包含的信息太多,如果全部顯示給用戶有所不便,所以我們挑選其中比較重要的信息輸出給用戶。&

37、lt;/p><p><b>  程序的工作流程</b></p><p>  圖2-3為本程序的流程圖,下面其進行簡要的敘述:</p><p>  1、程序開始時首先查找計算機上所有可用的網卡,并讓用戶選擇用于捕獲數據包的網卡。</p><p>  2、用戶輸入用于捕獲數據包的網卡和過濾規(guī)則。只過濾用戶所關心的信息。</

38、p><p>  3、程序判斷該網卡所在的網絡是否為以太網,不是則中止,是則繼續(xù)。因為本程序只能在共享以太網中進行數據捕獲。</p><p>  4、編譯用戶設置的過濾規(guī)則。</p><p>  5、開始進行捕獲,并分析數據,將數據顯示給用戶。當用戶停止時就結束程序,否則繼續(xù)捕獲。</p><p>  圖2-3 網絡數據包的協議分析程序的流程圖&l

39、t;/p><p>  系統(tǒng)實現的關鍵技術分析</p><p>  前面給出了網絡數據包協議分析程序的總體結構、功能模塊和工作流程。要實現程序預定的功能,就必須解決實現程序的關鍵技術。網絡數據包協議分析程序要實現的關鍵技術包括:數據包捕獲技術、對TCP/IP各層基本協議進行分析的技術、協議識別技術。</p><p>  1、數據包捕獲技術:本程序要對網絡中的數據進行分析,

40、首先就要將網絡中的數據包捕獲下來。因此實現數據包捕獲是本程序設計的基礎也是首先要解決的技術問題。要實現共享以太網中的數據捕獲,各個平臺有不同的技術。在Linux有一個專門為程序員編寫數據包捕獲程序而開發(fā)的庫:Libpcap。Libpcap是用戶態(tài)的數據包截獲API,具有獨立性和可移植性,支持BPF過濾機制等。通過調用Libpcap庫函數可以輕易的實現共享以太網中數據包的截獲,而且實時性相當的強,因為Libpcap是處于用戶態(tài)所以減少了系

41、統(tǒng)的開銷。Libpcap是一個基于BPF的開放源碼的捕包函數庫?,F有的大部分Linux捕包系統(tǒng)都是基于這套函數庫或者是在它基礎上做一些針對性的改進。</p><p>  2、對TCP/IP各層基本協議分析的技術:要對TCP/IP各層的基本協議進行分析,主要是要對所要分析的協議有充分的了解,特別是對各種協議的報頭格式要有深入的了解。對各種協議進行分析時主要是將報頭中的重要信息顯示給用戶,還有可能對數據包的正文信息解

42、碼。</p><p>  3、協議識別技術:由于OSI的7層協議模型,協議數據是從上到下封裝后發(fā)送的。對于協議的識別需要從下至上進行。例如,首先對網絡層的協議識別后進行脫去網絡層協議頭。將里面的數據交給傳輸層分析,這樣一直進行下去直到應用層。應用層以下的各種協議一般都可以通過下一層的協議中的關鍵信息來識別。但是應用層的協議種類相當多,無法從下層協議中識別。對于應用層協議識別的方法目前有幾種技術:基于特征串的應用層

43、協議識別、Venus Fast Protocol Recognition、以及端口識別。在本程序中我們采用的是端口識別技術。端口識別的原理是常用協議使用固定端口來進行通信。端口識別的優(yōu)點是:簡單、容易實現。缺點是:一些不常用協議不能被識別,常用協議修改端口后也無法識別。</p><p>  網絡數據包捕獲模塊的實現</p><p><b>  網絡數據包捕獲簡介</b>

44、;</p><p>  網絡數據包截獲一般指通過截獲整個網絡的所有信息流量,根據信息源主機,目標主機,服務協議端口等信息簡單過濾掉不關心的數據,再將用戶感興趣的數據發(fā)送給更高層的應用程序進行分析。一方面要,網絡截取模塊要能保證截取到所有網絡上的數據包,尤其是檢測到被分片的數據包(這可能蘊涵著攻擊)。另方面,數據截取模塊截取數據包的效率也是很重要的。它直接影響整個入侵檢測系統(tǒng)的運行速度。</p>&l

45、t;p>  從廣義的角度上看,一個包捕獲機制包含三個主要部分:最底層是針對特定操作系統(tǒng)的包捕獲機制,最高層是針對用戶程序的接口,第三部分是包過濾機制。不同的操作系統(tǒng)實現的底層包捕獲機制可能是不一樣的,但從形式上看大同小異。數據包常規(guī)的傳輸路徑依次為網卡、設備驅動層、數據鏈路層、IP層、傳輸層、最后到達應用程序。而數據包捕獲機制是在數據鏈路層增加一個旁路處理,對發(fā)送和接收到的數據包做過濾/緩沖等相關處理,最后直接傳遞到應用程序。值得

46、注意的是,包捕獲機制并不影響操作系統(tǒng)對數據包的網絡棧處理。對用戶程序而言,包捕獲機制提供了一個統(tǒng)一的接口,使用戶程序只需要簡單的調用若干函數就能獲得所期望的數據包。這樣一來,針對特定操作系統(tǒng)的捕獲機制對用戶透明,使用戶程序有比較好的可移植性。包過濾機制是對所捕獲到的數據包根據用戶的要求進行篩選,最終只把滿足過濾條件的數據包傳遞給用戶程序。</p><p>  基于Libpcap的網絡數據包捕獲的實現</p&

47、gt;<p><b>  Libpcap安裝</b></p><p>  Libpcap提供了系統(tǒng)獨立的用戶級別網絡數據包捕獲接口,并充分考慮到應用程序的可移植性。Libpcap可以在絕大多數類unix平臺下工作。在windows平臺下,一個與Libpcap很類似的函數包winpcap提供捕獲功能,其官方網站是http://winpcap.polito.it/ Libpcap軟

48、件包可從http://www.tcpdump.org/下載,解壓后依此執(zhí)行下列三條命令即可安裝。</p><p>  ./configure</p><p><b>  make</b></p><p>  make install</p><p>  但如果希望Libpcap能在linux上正常工作,則必須使內核支持“

49、packet”協議,也即在編譯內核時打開配置選項CONFIG_PACKET(選項缺省為打開)。</p><p>  Libpcap中基本的數據結構和函數</p><p><b>  主要函數:</b></p><p>  int pcap_findalldevs(pcap_if_t *alldevsp, char *errbuf)</p&

50、gt;<p>  功能:枚舉系統(tǒng)所有網絡設備的信息</p><p>  參數:alldevsp:是一個pcap_if_t結構體的指針,如果函數pcap_findalldevs函數執(zhí)行成功,將獲得一個可用網卡的列表,而里面存儲的就是第一個元素的指針。Errbuf:存儲錯誤信息的字符串。返回值:int,如果返回0則執(zhí)行成功,錯誤返回-1。</p><p>  pcap_t *pc

51、ap_open_live(char *device, int snaplen, int promisc, int to_ms, char *ebuf)</p><p>  功能:設置一個抓包描述符</p><p>  參數:其第一個參數是我們在上一節(jié)中指定的設備,snaplen是整形的,它定義了將被pcap捕獲的最大字節(jié)數。當promisc設為true時將置指定接口為混雜模式(然而,當它置

52、為false時接口仍處于混雜模式的特殊情況也是有可能的)。to_ms是讀取時的超時值,單位是毫秒(如果為0則一直嗅探直到錯誤發(fā)生,為-1則不確定)。最后,ebuf是一個我們可以存入任何錯誤信息的字符串(就像上面的errbuf)。</p><p>  int pcap_compile(pcap_t *p, struct bpf_program *fp, char *str, int optimize, bpf_u_

53、int32 netmask)</p><p><b>  功能:編譯過濾規(guī)則</b></p><p>  參數:第一個參數是會話句柄(pcap_t *handle在前一節(jié)的示例中)。接下來的是我們存儲被編譯的過濾器版本的地址的引用。再接下來的則是表達式本身,存儲在規(guī)定的字符串格式里。再下邊是一個定義表達式是否被優(yōu)化的整形量(0為false,1為true,標準規(guī)定)。最

54、后,我們必須指定應用此過濾器的網絡掩碼。函數返回-1為失敗,其他的任何值都表明是成功的。</p><p>  int pcap_setfilter(pcap_t *p, struct bpf_program *fp)</p><p>  功能:設置過濾規(guī)則。</p><p>  參數:這非常直觀,第一個參數是會話句柄,第二個參數是被編譯表達式版本的引用(可推測出它與

55、pcap_compile()的第二個參數相同)。</p><p>  int pcap_loop(pcap_t *p, int cnt, pcap_handler callback, u_char *user)</p><p>  功能:循環(huán)抓包直到用戶中止。</p><p>  參數:第一個參數是會話句柄,接下來是一個整型,它告訴pcap_loop()在返回前應捕

56、獲多少個數據包(若為負值則表示應該一直工作直至錯誤發(fā)生)。第三個參數是回調函數的名稱(正像其標識符所指,無括號)。最后一個參數在有些應用里有用,但更多時候則置為NULL。</p><p><b>  數據結構:</b></p><p>  struct pcap_if{</p><p>  struct pcap_if *next;</p

57、><p>  char *name;</p><p>  char *description;</p><p>  struct pcap_addr *addresses;</p><p>  u_int flags;</p><p><b>  };</b></p><p>

58、  pcap_if *next; 如果非空,指向鏈的下一個元素。如果為空是鏈的最后一個元素。</p><p>  char *name; 指向一個字符串,該字符串是傳給pcap_open_live()函數的設備名;</p><p>  char *description; 如果非空,指向一個對設備的人性化的描述字符串。</p><p>  pcap_addr *ad

59、dresses; 指向網卡地址鏈中的第一個元素。</p><p>  u_int flags; PCAP_IF_網卡的標志?,F在唯一可用的標識是PCAP_IF_LOOKBACK,它被用來標識網卡是不是lookback網卡。</p><p>  struct pcap_pkthdr { </p><p>  struct timeval ts;/*time stamp

60、*/</p><p>  bpf_u_int32 caplen; /*length of portion present*/</p><p>  bpf_u_int32 len; /*length this packet(off wire)*/</p><p><b>  };</b></p><p>  timeval

61、 ts; 數據報時間戳;</p><p>  bpf_u_int32 caplen; 當前分片的長度;</p><p>  dpf_u_int32 len; 這個數據報的長度;</p><p>  細節(jié)描述:在dump文件中的每個數據報都有這樣一個報頭。它用來處理不同數據報網卡的不同報頭問題。</p><p>  struct pcap_st

62、at {</p><p>  u_int ps_recv; /* number of packets received */</p><p>  u_int ps_drop; /* number of packets dropped */</p><p>  u_int ps_ifdrop; /* drops by interface XXX not yet sup

63、ported */</p><p><b>  };</b></p><p>  u_int ps_recv; 接受數據報的數目;</p><p>  u_int ps_drop; 被驅動程序丟棄的數據報的數目;</p><p>  u_int ps_ifdrop; 被網卡丟棄的數據報的數目;</p>&l

64、t;p>  struct pcap_addr{</p><p>  pcap_addr * next;</p><p>  sockaddr * addr;</p><p>  sockaddr * netmask;</p><p>  sockaddr *broadaddr;</p><p>  sockadd

65、r *dstaddr;</p><p><b>  };</b></p><p>  pcap_addr * next; 如果非空,指向鏈表中一個元素的指針;空表示鏈表中的最后一個元素。</p><p>  sockaddr * addr; 指向包含一個地址的sockaddr的結構的指針。</p><p>  socka

66、ddr * netmask; 如果非空,指向包含相對于addr指向的地址的一個網絡掩碼的結構。</p><p>  sockaddr * broadaddr; 如果非空,指向包含相對于addr指向的地址的一個廣播地址,如果網絡不支持廣播可能為空。</p><p>  sockaddr * dstaddr; 如果非空,指向一個相對于addr指向的源地址的目的地址,如果網絡不支持點對點通訊,則

67、為空。</p><p><b>  數據捕獲模塊的實現</b></p><p>  第一步調用pcap_findalldevs查找出所有可用的網卡,顯示出來,并接收用戶選擇網卡。</p><p>  第二步用戶輸入用于捕獲數據包的網卡后,調用pcap_open_live生成一個抓包描述符。</p><p>  第三步通過

68、調用pcap_datalink檢查該網卡所在網絡是不是以太網,如果不是則中止程序。</p><p>  第四步接收用戶輸入的過濾條件,調用pcap_compile和pcap_setfilter生成過濾規(guī)則。</p><p>  第五步調用pcap_loop進行循環(huán)捕獲數據包,直到用戶中止。</p><p>  具體流程入下圖所示:</p><p&

69、gt;  圖3-1數據捕獲模塊流程圖</p><p><b>  協議分析模塊的實現</b></p><p>  雖然到此為止已經可以順利完成數據包的監(jiān)聽工作,但這并不意味著己經大功告成了,因為從前面的數據包監(jiān)聽的原理中可以知道,數據包捕獲程序工作在網絡底層,將網卡設置為混雜模式以后,從網絡底層捕獲到的數據包會直接往上發(fā)給應用程序進行處理,而不再像普通的數據包那樣經過

70、操作系統(tǒng)的層層過濾。這樣一來,應用程序收到的數據包是最原始的數據包,也就是說監(jiān)聽主機接收到的數據包中,除了數據包本身的內容之外,還帶有從對方主機中的傳輸層、網絡層以及數據鏈路層的數據包頭信息,所以要想獲得數據包里的應用數據,是需要我們自己來按照每一層的協議剝離數據包頭中的每一層首部內容的,這就是協議分析需要完成的工作。</p><p>  網絡協議分析的總體流程</p><p>  網絡功

71、能的分層帶來了網絡協議的層次結構,網絡數據在傳送時,同樣也是被分解成一個個的數據報逐層傳送的,在兩臺主機的實際通信過程中,從邏輯上講,是兩臺主機的對等層直接通信。而實際上,數據包并不是從某一計算機網絡系統(tǒng)的第N層直接傳導另一計算機網絡系統(tǒng)的第N層的,而是從這臺計算機的某一層直接傳送N十1層,直至到達物理層最后分解為比特流流經物理介質到達另一臺計算機,然后在從另一臺計算機中的底層逐層向上傳送的。</p><p> 

72、 當數據包被傳輸到某一層的時候,該層都會對數據包進行加工,在發(fā)送方通常是加上一個與該層協議有關的控制或標志信息,即數據包的包頭或包尾;而在接受方則是需要逐層拆下本層標志,即去掉數據包的包頭或包尾,根據控制信息進行相應的處理,將分解后的數據報逐層上傳,直至應用程序獲得最終數據。比如發(fā)送方在數據鏈路層通常會在包頭加上目的MAC地址、源MAC地址、其他一些具體網絡信息及幀定界符,在包尾加上循環(huán)冗余碼,并使用字節(jié)填充或位填充,由接收方數據鏈路層

73、去掉包頭與包尾進行相關解釋工作。數據包的加工工作如圖4-1所示:</p><p>  圖4-1 數據封裝示意</p><p>  TCP傳給IP的數據單元稱作TCP報文段或簡稱為TCP段(TCP Segment);IP傳給網絡接口層的數據單元稱作IP數據報(IP datagram);通過以太網傳輸的比特流稱作幀,分組既可以是一個IP數據報也可以是IP數據報的一個片(fragment)。協議

74、分析就是數據封裝的逆過程。協議分析的流程圖如圖4-2所示:</p><p>  圖4-2 網絡協議分析流程圖</p><p>  從圖可以看到,對于監(jiān)聽程序捕獲到的數據報,需要按以下步驟分層次進行協議分析:</p><p>  (1)首先是讀取數據鏈路層的報頭,從報頭中可以得到:計算機的源MAC地址和目的MAC地址、數據包的長度以及上層協議的類型。</p>

75、;<p>  (2)然后需要去掉數據鏈層的報頭,此時可以獲得IP數據報、arp、rarp數據包,在這一層中可以對IP數據報做一定的統(tǒng)計和分析等等;對arp、rarp數據包可以獲得發(fā)送端IP和目的IP等重要信息。</p><p>  (3)對于IP數據報去除網絡層的報頭以后,可以獲得傳輸層數據報,對TCP/UDP數據包的報頭進行分析在這一層中還可以獲得數據報的端口號信息,根據端口號進一步判斷數據報屬于

76、何種應用層協議。</p><p>  (4)對數傳輸層數據報去除掉傳輸層報頭以后,就獲得了應用層數據報,在應用層進行協議分析的工作就是按照應用層的工作原理、協議規(guī)范,還原獲得應用層的內容,如SMTF/POP3協議分析可以還原出正在傳輸的郵件信息,FTP協議分析可以還原出傳輸中的文件名以及用戶名口令密碼等信息,HTTP協議分析可以還原出目標主機瀏覽網頁的原貌等等。</p><p>  (5)

77、對所有的數據報頭分析處理后,取出其中的主要信息然后顯示給用戶。</p><p>  對TCP/IP模型中各層協議的分析</p><p>  前面的內容已經提到過,我們在對數據包根據應用層協議進行分析的時候都需要首先剝離數據包中的包頭并且需要根據包頭信息判斷是何種應用層協議。下面就按照數據鏈路層、網絡層到傳輸層再到應用層的順序詳細的講解每層包頭的結構以及如何對每層的數據報進行協議分析。<

78、;/p><p>  以太網首部的分析與提取</p><p>  因為每一個使用Libpcap捕獲的數據包,都會有一個指向原始報文頭的指針。假設這個指針為p。把這個指針強制轉換為以太幀格式:(struct ether_header *) p。我們就得到了以太幀的報文頭,就可以對該層協議進行分析和處理。</p><p>  由于在定義IEEE 802.3以前,以太網就存在,

79、因為有多個以太網標準,所以TCP/IP可以支持多種不同的鏈路層協議,如以太網、令牌環(huán)網、FDDI(光纖分布式數據接口)等。以太網是當今TCP/IP采用的主要的局域網技術,它采用一種稱作CSMA/CD的媒體接入方法,其意思是帶沖突檢測的載波偵聽多路接入(Carrier Sense Multiple Access with Collision Detection),發(fā)送端在傳輸之前要偵聽信道。在以太網內的IP和ARP數據報或者使用以太網II

80、的或者使用IEEE:802.3子網訪問協議(SNAP)來封裝數據。這里我們只討論最為常用的以太網II數據報格式,這是在RFC894中定義的,如圖4-3所示,這是以太網II的封裝格式:</p><p>  字節(jié) 6 6 2 46~1500 4</p><p>  圖4-

81、3以太網II的封裝格式</p><p>  其中每個字段的含義如下:</p><p>  (1)幀初始同步((Preamble):8字節(jié)長,提供接收端的同步和分隔幀的功能。需要注意的是,幀初始同步字段在網絡監(jiān)視器中是不可見的。</p><p>  (2)目的地址(Destination Address):6字節(jié)長,指明目的地址。目的地址可以是單播、多播或者以太網的廣

82、播地址。其中,單播地址也稱為MAC地址。</p><p>  (3)源地址((Source Address):6字節(jié)長,指明發(fā)送節(jié)點的單播地址。</p><p>  (4)以太網類型(Ether Type):2字節(jié)長,指明在以太網幀中上層協議的類型。這個字段被用來將以太網的有效載荷傳給正確的上層協議實體。如果在該字段中未注明有上層協議實體接收有效載荷幀。該幀將被丟棄。比如,對于IP數據報,

83、這個字段的值為0x0800;對于ARP消息,該字段的值被設置為0x0806。</p><p>  (5)有效載荷(Payload):以太網II的幀的有效載荷由上層協議的協議數據單元組成,是數據包本身的具體內容。以太網II能發(fā)送最大1500字節(jié)的有效載荷。因為以太網具有沖突檢測機制,以太網II的最小幀有效載荷為46字節(jié)。如果上層的協議數據單元小于46字節(jié),則必須填充到46字節(jié)。</p><p&g

84、t;  (6)幀校驗序列(Frame Check Sequence, FCS):4字節(jié)長,提供位級別的完整性校驗,也被稱為循環(huán)冗余校驗(CRC)。本子段對于網絡監(jiān)視器來說同樣是不可見的。</p><p>  IP首部的分析與提取</p><p>  因為以太幀報頭的長度都是一樣的。所以在提取IP包頭的時候可以將指針P加上以太幀包頭的長度后,把格式強制轉化為IP包頭格式即:(struct i

85、p *) (p + sizeof (struct ether_header))。就得到了指向IP報頭的指針,我們就可以進行相應的分析了。</p><p>  IP網絡上的主機是通過IP數據報來交換數據的,IP數據報包括數據單元和首部字段,其中,數據單元包含要交換的所有信息,首部字段描述這個信息和數據報本身。只要設備需要通過IP網絡向其他網絡發(fā)送數據,它就會創(chuàng)建一個數據報來發(fā)送數據。</p><

86、p>  實際上,IP數據報是作為IP包來發(fā)送的,IP包將IP數據報通過交換設備一跳一跳地中繼到目的系統(tǒng)。雖然很多時候一個IP數據報就是一個IP包,但它們在概念上是不同的實體。如圖4-4是IP數據報在RFC791中定義的封裝格式:</p><p><b>  比特</b></p><p>  0 4 8

87、 16 20 24 31</p><p>  圖4-4 IP數據報格式</p><p>  其中每個字段的含義如下:</p><p>  (1)版本(version):長度為4位,顯示IP報頭的版本。目前在所有互聯網絡和Internet中使用的標準IP版本號是4(即IPv4)。&l

88、t;/p><p>  (2)報頭長(header length):長度為4位,表示IP頭的長度。典型的IP頭不包括任何選項,長度為20字節(jié)。</p><p>  (3)服務類型(type of service):長度為8位,表示按照優(yōu)先權、安全性以及吞吐量等數據包的服務類型。</p><p>  (4)數據包總長(total length):長度為2位,表示IP數據報總

89、的字節(jié)數,包括IP頭和有效載荷。</p><p>  (5)標識(identifier):長度為2位,作為分割以及組裝數據包時的識別標志來使用,被分割的數據包被分配有同一數值標識。</p><p>  (6)標志(flags):長度為3位,包含兩個用于分片的標志。其中一個標志是用于表示IP有效載荷是否符合分片的標準,而另一個是表示對于已分片的IP數據報是否還有更多的分片。</p>

90、;<p>  (7)片偏移(fragment offset):長度為13位,表示分片相對于原始IP數據報有效載荷的偏移量。</p><p>  (8)生存時間(time to live):長度為1字節(jié),表示IP數據包的壽命,目的是廢棄掉在網絡中循環(huán)著的IP數據包,一般地,每通過一次路由器,生存時間就被減去1,當生存時間為0時,數據包將被拋棄。</p><p>  (9)協議(

91、protocol):長度為1字節(jié),表示包含在有效載荷中的上層協議。IP協議字段的一般值有:1表示ICMP,2表示IGMP,6表示TCP,17表示UDP等等。</p><p>  (10)報頭校驗和(header checksum):長度為2字節(jié),是用于確認IP數據包是否己毀壞的字段。</p><p>  (11)源目的IP地址(source/destination address):長度為

92、4字節(jié),包含源/目的主機的IP地址。</p><p>  (12)選項和填充:此字段跟在IP頭之后,但必須是以4個字節(jié)為增量單位,以使IP頭的大小能用報頭長度字段表示。</p><p>  TCP/UDP首部的分析與提取</p><p>  TCP/UDP報文頭部的獲取跟IP報文頭部的獲取類似,將P指針的位置向后移IP報文長度個位置即可(struct tcphdr

93、*) (p + sizeof (struct ether_header) + 4 * iph->ip_hl)。然后就可以對TCP/UDP數據包進行分析了。</p><p>  TCP(傳輸控制協議)為面向事務的應用提供了可靠的面向連接的傳輸協議。TCP正為目前Intemet上幾乎所有的應用協議所利用,這是因為大部分應用程序都需要可靠的、可糾錯的傳輸協議以保證不丟失或破壞數據。盡管IP已經做了大部分的搜集工作

94、,并且根據需要在Internet上發(fā)送數據報和數據包,但是IP是不可靠的協議,并不能保證數據報或者數據包能夠原封不動的到達其目的地,TCP作為IP的上層協議,為IP提供了可靠性服務,確保了IP數據報中的數據的正確性。如圖4-5所示,是TCP段的封裝結構。</p><p><b>  比特</b></p><p>  0 8

95、 16 24 31 </p><p>  圖4-5 TCP數據報格式</p><p>  其中,每一段的含義如下:</p><p>  (1)源端口(source port):指示發(fā)送TCP段的源應用層協議,是一個2字節(jié)的字段。IP頭中的源地址和TCP頭

96、中的源端口聯合起來提供一個源套接字。TCP端口為TCP連接數據的傳送定義了一種位置,表明段被發(fā)送至的應用層進程的一個目的端口。在一般情況下,應用層協議的服務器端在己知的端口上偵聽。表4-1顯示了常用的應用層協議對應的端口號。</p><p>  (2)目的端口(destination port):指示目的應用層協議,是一個2字節(jié)字段。IP頭中的目的IP地址和TCP頭中的端口聯合起來提供一個目的套接字。</p

97、><p>  (3)序列號(sequence number):指示段的第一個8位組的輸出字節(jié)流的序列號,是一個4字節(jié)字段。用于保證數據的到達順序與可靠性。利用隨機值確定初始值,以字節(jié)為單位表示所發(fā)送數據的位置。</p><p>  (4)確認號(acknowledgment number):一個4位的字段,指示接收方希望收到的輸入字節(jié)流中下一個8位組的序列號。是用于保證可靠性的確認號碼。<

98、;/p><p>  (5)數據偏移(data offset):表示TCP數據的起始位置,以4字節(jié)的整數倍表示,數據偏移字段也是TCP頭的大小。在不包括選項的情況下,TCP報頭是20個字節(jié),offset的值為5。</p><p>  (6)保留(reserved):一個6字節(jié)字段,為了未來的使用而保留。</p><p>  (7)標志(flags):一個6字節(jié)字段,指示6

99、個TCP標志。這6個標志是:URG(緊急)、ACK(確訓)、PSH(推)、RST(復句)、SYN(同步)、FIN(結束)。</p><p>  (8)窗口(window):一個2字節(jié)的字段,表明該段的發(fā)送方的接收緩沖區(qū)中可供使用的空間有多少字節(jié)數。窗口大小的廣告是一種實現接收流流控制的方式。</p><p>  (9)校驗和(checksum):一個2字節(jié)的字段,為TCP段提供位級別的完整

100、性校驗。</p><p>  (10)緊急指針(urgent pointer):一個2字節(jié)字段,它表明段中緊急數據的位置。</p><p>  (11)選項(option):為提高利用TCP的通信性能所準備的選項。</p><p>  用戶數據報協議(UDP)是定義用來在互連網絡環(huán)境中提供包交換的計算機通信的協議。此協議默認認為網路協議(IP)是其下層協議。此協議提

101、供了向另一用戶程序發(fā)送信息的最簡便的協議機制。此協議是面向操作的,未提供提交和復制保護。以下是UDP協議的報文頭格式:</p><p><b>  比特</b></p><p>  0 16 31</p><p>  圖4-6 TCP數據包格式</p><p>  (1)源端

102、口—16位。源端口是可選字段。當使用時,它表示發(fā)送程序的端口,同時它還被認為是沒有其它信息的情況下需要被尋址的答復端口。如果不使用,設置值為0。</p><p>  (2)目的端口—16位。目標端口在特殊因特網目標地址的情況下具有意義。</p><p>  (3)長度—16位。該用戶數據報的八位長度,包括協議頭和數據。長度最小值為8。</p><p>  (4)校驗

103、和—16位。IP協議頭、UDP協議頭和數據位,最后用0填補的信息假協議頭總和。如果必要的話,可以由兩個八位復合而成。</p><p>  應用層協議的識別與分析</p><p>  對于應用層協議本程序采用的是端口識別技術。端口是應用程序在網絡通信上使用的數據輸入輸出口。端口分為兩種。一種為公認端口,另一種為短暫端口。公認端口被分配給網絡上的服務程序。當某一網絡客戶端利用其他計算機上的服務

104、程序時,在根據IP地址指定服務計算機的同時,也指定了被分配的服務程序的公認端口號。由此,可以利用與端口號對應的特定的網絡服務。公認端口號有很多,工人端口號被定義在unix類操作系統(tǒng)下的/etc/services文件中下表列出了其中的一部分。</p><p>  表4-1 常用協議和對應的端口號</p><p>  短暫端口號是客服端程序與服務器程序進行通信時,短暫使用端口號。短暫端口號是不

105、可再生的,被運行系統(tǒng)分配給客戶端程序。因為常用端口和常用協議對應,我們可以利用這個原理來識別應用層協議。關鍵代碼如下</p><p>  void getportname (int portn, char portch[], char *protocol){</p><p>  if (getservbyport (htons (portn), protocol) != NULL){<

106、;/p><p>  strcpy(portch, getservbyport(htons(portn),protocol)->s_name);</p><p><b>  }</b></p><p>  else{ //短暫端口等找不到名稱時 </p><p>  sprintf (portch, "e&qu

107、ot;);</p><p><b>  }</b></p><p><b>  }</b></p><p>  現在介紹一下getportname()函數。此函數完成的是取得端口號和區(qū)別TCP/UDP類別的兩個參數并返回端口名稱的工作。getportname()函數的核心是調用getservbyport()函數。用這個函數

108、來檢索與端口相關的信息,吧結果作為指向servent型的結構體的指針并返回。servent型的結構體在netdb.h頭文件中被聲明。在這里使用的s_name成員。把端口名稱賦給s_name。getportname()函數檢索端口名稱失敗時,返回NULL。這是因為得到的端口號是短暫端口號,沒有檢索到它的端口名稱。這時,常把端口號作為端口的名稱來用。</p><p><b>  程序運行與測試</b&

109、gt;</p><p><b>  測試環(huán)境</b></p><p><b>  硬件環(huán)境</b></p><p>  處理器P3 800Mhz以上;內存128M以上;多臺普通搭載網卡的PC、經過集線器互聯。</p><p><b>  程序運行環(huán)境</b></p>

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論