2023年全國(guó)碩士研究生考試考研英語(yǔ)一試題真題(含答案詳解+作文范文)_第1頁(yè)
已閱讀1頁(yè),還剩63頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、<p><b>  畢業(yè)設(shè)計(jì)(論文)</b></p><p>  題 目 局域網(wǎng)的IP數(shù)據(jù)包 </p><p>  監(jiān)控分析軟件實(shí)現(xiàn) </p><p>  學(xué)院名稱 計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院

2、 </p><p>  指導(dǎo)教師 </p><p>  職 稱 </p><p>  班 級(jí) </p><p>  學(xué) 號(hào)

3、 </p><p>  學(xué)生姓名 </p><p><b>  2011年5月26</b></p><p><b>  目錄</b></p><p><b>  摘 要ii</b></p&

4、gt;<p>  Abstractiii</p><p><b>  第一章 緒論1</b></p><p>  1.1 選題背景及意義1</p><p>  1.2 研究現(xiàn)狀1</p><p><b>  1.3實(shí)現(xiàn)方法2</b></p><p> 

5、 第二章 技術(shù)背景4</p><p>  2.1 Winsock基本概念4</p><p>  2.2 IP數(shù)據(jù)包的構(gòu)成4</p><p>  2.2.1 IP地址5</p><p>  2.2.2 數(shù)據(jù)包的封裝與分用6</p><p>  2.2.3 IP數(shù)據(jù)報(bào)7</p><p>

6、  2.3網(wǎng)絡(luò)數(shù)據(jù)包捕獲原理9</p><p>  2.4 Raw Socket9</p><p>  2.4.1 WSAStartup()函數(shù)10</p><p>  2.4.2 socket()函數(shù)10</p><p>  2.4.3 bind()函數(shù)10</p><p>  2.4.4 WSAIoctl

7、()函數(shù)11</p><p>  2.4.5 recv()函數(shù)11</p><p>  2.5 網(wǎng)絡(luò)編程接口12</p><p>  第三章 系統(tǒng)整體分析與設(shè)計(jì)13</p><p>  3.1 基本情況分析13</p><p>  3.2 程序需求概述13</p><p>  3.2

8、.1 設(shè)計(jì)目標(biāo)13</p><p>  3.2.2 功能需求13</p><p>  3.2.3 用戶特點(diǎn)13</p><p>  3.2.4 制約因素14</p><p>  3.3 概要設(shè)計(jì)14</p><p>  3.3.1 概要設(shè)計(jì)目標(biāo)15</p><p>  3.3.2 系

9、統(tǒng)功能模塊劃分15</p><p>  3.3.3 系統(tǒng)模塊描述15</p><p>  3.3.4 功能模塊圖16</p><p>  第四章 系統(tǒng)詳細(xì)設(shè)計(jì)及實(shí)現(xiàn)17</p><p>  4.1 系統(tǒng)設(shè)計(jì)思想17</p><p>  4.2 程序各模塊的詳細(xì)設(shè)計(jì)17</p><p>

10、;  4.3系統(tǒng)類圖19</p><p>  4.3.1系統(tǒng)類關(guān)系圖19</p><p>  4.3.2關(guān)鍵類的說(shuō)明21</p><p>  4.4 系統(tǒng)流程圖23</p><p>  4.5 安全控制24</p><p>  4.6 程序具體運(yùn)行步驟24</p><p>  第五章

11、 總結(jié)與展望29</p><p><b>  5.1 總結(jié)29</b></p><p><b>  5.2 展望29</b></p><p><b>  參考文獻(xiàn)31</b></p><p><b>  結(jié)束語(yǔ)32</b></p>

12、<p><b>  附錄33</b></p><p><b>  摘 要</b></p><p>  本論文主要討論基于共享以太網(wǎng)(Ethernet)環(huán)境下的TCP/IP(其中IP協(xié)議的版本是IPv4)數(shù)據(jù)包的探測(cè)與分析技術(shù)。在這里,不僅介紹了大量網(wǎng)絡(luò)應(yīng)用相關(guān)知識(shí),包括套接字、TCP/IP協(xié)議、捕包技術(shù)等,還對(duì)本次軟件設(shè)計(jì)的需求分析、

13、概要設(shè)計(jì)、詳細(xì)設(shè)計(jì)等進(jìn)行了詳細(xì)論敘。</p><p>  本系統(tǒng)開(kāi)發(fā)主要基于Windows XP操作系統(tǒng)和Visual C++ 6.0開(kāi)發(fā)環(huán)境,是以Raw Socket(原始套接字)為核心的局域網(wǎng)IP數(shù)據(jù)包監(jiān)控分析軟件。本系統(tǒng)能夠?qū)崿F(xiàn)對(duì)網(wǎng)卡信息的捕獲,并能以圖形的方式統(tǒng)計(jì)出流量信息。此外,為了方便日后分析,本系統(tǒng)還提供了保存捕包結(jié)果的功能。本系統(tǒng)采用多線程編程技術(shù),可以很方便的對(duì)系統(tǒng)的執(zhí)行或停止進(jìn)行操作,而不必?fù)?dān)

14、心,當(dāng)系統(tǒng)開(kāi)始抓取數(shù)據(jù)包時(shí),會(huì)因?yàn)槌绦蛞恢碧幱诠ぷ鳡顟B(tài),而不接受其它的命令,最后導(dǎo)致系統(tǒng)的崩潰。</p><p>  關(guān)鍵詞: IP數(shù)據(jù)包;TCP/IP協(xié)議;數(shù)據(jù)包探測(cè);流量特征分析; 原始套接字</p><p><b>  Abstract</b></p><p>  This thesis mainly discussed the Ethe

15、rnet TCP/IP (in which the version of IP protocol is IPv4) packet detection and analysis technique under the LAN environment. Here, not only the related knowledge about network application , including socket, TCP/IP prot

16、ocol, and packet capture, but also the requirement analysis of software, general design, detailed design has been introduced.</p><p>  The development of the system mainly based on Windows XP operating syste

17、m and Visual C++ 6.0 software development environment, and it is the LAN IP packet inspection that based on analysis raw socket . This system can capture nic information, and draw the traffic pattern diagram. In addition

18、, in order to facilitate future analysis, this system also provides the function of saving packets which have been catched before. The system use the multi-threading technique, so it can be very convenient to</p>

19、<p>  Key words: IP data packet; TCP/IP protocol; data packet probe; traffic pattern analysis; raw socket</p><p><b>  第一章 緒論</b></p><p>  1.1 選題背景及意義</p><p>  

20、隨著信息技術(shù)的快速發(fā)展,網(wǎng)絡(luò)已成為信息交換的主要手段,一些網(wǎng)絡(luò)新業(yè)務(wù)在不斷地興起,如電子商務(wù)、移動(dòng)支付等,這些都對(duì)網(wǎng)絡(luò)安全提出了較高的要求。與此同時(shí),黑客對(duì)網(wǎng)絡(luò)的攻擊從未停止,有的利用網(wǎng)絡(luò)盜取他人個(gè)人信息,如網(wǎng)上銀行賬號(hào)密碼等,對(duì)他人的財(cái)產(chǎn)安全構(gòu)成了嚴(yán)重威脅,網(wǎng)絡(luò)的安全問(wèn)題變得日趨嚴(yán)峻。因此,必須加強(qiáng)安全意識(shí),并及早防范,防范這種現(xiàn)象的方法和工具有很多,按時(shí)間元素歸納起來(lái)大致有三類,事先預(yù)警,事中防范和事后監(jiān)督,其中,事中防范是目前正在

21、流行的一種安全措施,主要作用是在根據(jù)正在發(fā)生的事件判斷風(fēng)險(xiǎn)程度和防范水平。</p><p>  而網(wǎng)絡(luò)監(jiān)聽(tīng)是正是它的一個(gè)典型例子,網(wǎng)絡(luò)監(jiān)聽(tīng)又稱網(wǎng)絡(luò)竊聽(tīng),它引起人們普遍注意是從94年開(kāi)始的。實(shí)現(xiàn)網(wǎng)絡(luò)監(jiān)聽(tīng)的主要工具是sniffer,中文名稱叫做嗅探器。隨著以太網(wǎng)這種局域網(wǎng)技術(shù)的日漸成熟,網(wǎng)絡(luò)監(jiān)聽(tīng)也日漸成熟,它在協(xié)助網(wǎng)絡(luò)管理員監(jiān)測(cè)網(wǎng)絡(luò)傳輸數(shù)據(jù),排除網(wǎng)絡(luò)故障等方面具有不可替代的作用,因而一直倍受網(wǎng)絡(luò)管理員的青睞,局域網(wǎng)的

22、IP數(shù)據(jù)包監(jiān)控分析軟件,就是網(wǎng)絡(luò)監(jiān)聽(tīng)技術(shù)的一種實(shí)現(xiàn)方式,該實(shí)現(xiàn)主要運(yùn)用sniffer原理來(lái)嗅探出網(wǎng)絡(luò)有效信息,并經(jīng)過(guò)windows網(wǎng)絡(luò)編程,從中提取出有效數(shù)據(jù),以實(shí)現(xiàn)對(duì)IP數(shù)據(jù)包的監(jiān)控,以達(dá)到安全防范的目的。</p><p><b>  1.2 研究現(xiàn)狀</b></p><p>  一般來(lái)講,Windows環(huán)境下有三種方案可供選擇以編程實(shí)現(xiàn)IP數(shù)據(jù)包的捕獲:</

23、p><p>  Raw Socket,原始套接字是Windows Socket 2.2版本中定義的套接字結(jié)構(gòu),目前只有一個(gè)WinSocket2.h運(yùn)行時(shí)庫(kù)提供對(duì)它的支持,原始套接字能夠生成自己的數(shù)據(jù)報(bào)文,包括報(bào)頭和數(shù)據(jù)報(bào)本身的內(nèi)容。通過(guò)原始套接字可以自如的控制Windows下的多種協(xié)議,而且能夠?qū)Φ讓拥膫鬏敊C(jī)制進(jìn)行控制[1]??梢杂迷继捉幼謥?lái)發(fā)送和接收IP層以上的原始數(shù)據(jù)包,如ICMP(Internet互聯(lián)網(wǎng)控制報(bào)

24、文協(xié)議),TCP(Transmission Control Protocal, 傳輸控制協(xié)議),UDP(User Datagram Protocal, 用戶數(shù)據(jù)報(bào)協(xié)議),而且能夠?qū)Φ讓拥膫鬏敊C(jī)制進(jìn)行控制。Raw Socket的作用主要有三個(gè)方面:1)接收發(fā)向本機(jī)的ICMP,IGMP(Internet組管理協(xié)議)協(xié)議包,或者發(fā)送這些協(xié)議包;2)接收發(fā)向本機(jī)的IP包;3)發(fā)送自定義的IP包。</p><p>  (2

25、)NDIS(Network Driver Interface Specification,網(wǎng)絡(luò)驅(qū)動(dòng)程序接口規(guī)范),為傳輸層提供標(biāo)準(zhǔn)的網(wǎng)絡(luò)接口,所有的傳輸驅(qū)動(dòng)程序都需要調(diào)用NDIS接口來(lái)訪問(wèn)網(wǎng)絡(luò)[2]。由Microsoft和3Com公司聯(lián)合開(kāi)發(fā),是Windows中的“通信協(xié)議程序”和“網(wǎng)絡(luò)設(shè)備驅(qū)動(dòng)”之間通信的規(guī)范,它為協(xié)議控制程序提供標(biāo)準(zhǔn)的接口,它支持計(jì)算機(jī)通過(guò)不同的協(xié)議棧與網(wǎng)絡(luò)相連。</p><p> ?。?)W

26、inPcap(windows packet capture),是一個(gè)基于Win32的捕獲數(shù)據(jù)包和網(wǎng)絡(luò)分析的體系結(jié)構(gòu),它包括一個(gè)內(nèi)核級(jí)的包過(guò)濾器,一個(gè)底層的動(dòng)態(tài)鏈接庫(kù)(Packet.dll),一個(gè)高層并且與系統(tǒng)無(wú)關(guān)的庫(kù)(WPcap)[3]。WinPcap提供了以下四項(xiàng)功能:1)捕獲原始數(shù)據(jù)包,包括共享網(wǎng)絡(luò)上各主機(jī)發(fā)送/接收的以及相互之間交互的數(shù)據(jù)報(bào);2)在數(shù)據(jù)報(bào)發(fā)往應(yīng)用程序之前,按照自定義的規(guī)則將某些特殊的數(shù)據(jù)報(bào)過(guò)濾掉;3)在網(wǎng)絡(luò)上發(fā)送原

27、始數(shù)據(jù)包;4.收集網(wǎng)絡(luò)通信過(guò)中的統(tǒng)計(jì)信息。</p><p>  表1.1對(duì)它們各自的優(yōu)缺點(diǎn)進(jìn)行了簡(jiǎn)單比較:</p><p>  表1.1 Windows下捕包方案比較</p><p><b>  1.3實(shí)現(xiàn)方法</b></p><p>  在以太網(wǎng)上通訊的每張網(wǎng)卡上都擁有一個(gè)全球唯一的物理地址,也叫MAC地址。該地址是一

28、個(gè)48比特的二進(jìn)制數(shù)。在以太網(wǎng)卡中內(nèi)建有一個(gè)數(shù)據(jù)包過(guò)濾器。該數(shù)據(jù)包過(guò)濾器的作用是保留以本身網(wǎng)卡的MAC地址為通訊目的的數(shù)據(jù)包和廣播數(shù)據(jù)包,丟棄所有其它無(wú)關(guān)的數(shù)據(jù)包,以免CPU對(duì)無(wú)關(guān)的數(shù)據(jù)報(bào)作無(wú)謂的處理[4]。這是以太網(wǎng)卡在一般情況下的工作方式。因此在正常情況下,一個(gè)合法的網(wǎng)絡(luò)接口應(yīng)該只響應(yīng)這樣的兩種數(shù)據(jù)包(幀): </p><p>  (1)幀的目標(biāo)地址具有和本地網(wǎng)絡(luò)接口相匹配的硬件地址。 </p>

29、<p>  (2)幀的目標(biāo)地址是“廣播地址”(代表所有的接口地址),格式為“FFFFFFFFFFFF”。 </p><p>  在接收到上面兩種情況的數(shù)據(jù)幀時(shí),網(wǎng)卡通過(guò)CPU產(chǎn)生中斷,操作系統(tǒng)進(jìn)行中斷處理后將幀中包含的數(shù)據(jù)傳送給上層系統(tǒng)進(jìn)行進(jìn)一步處理。在其他情況下數(shù)據(jù)幀將被丟棄而不作處理。 </p><p>  要想捕獲到流經(jīng)網(wǎng)卡的不屬于本主機(jī)的數(shù)據(jù),必須繞過(guò)系統(tǒng)正常

30、工作的處理機(jī)制,直接訪問(wèn)網(wǎng)絡(luò)底層。我們可以把網(wǎng)卡的狀態(tài)設(shè)為“混雜”(promiscuous)模式,當(dāng)網(wǎng)卡工作在這種“混雜”模式時(shí),該網(wǎng)卡就具備了“廣播地址”,它對(duì)所接收到的每一個(gè)幀都產(chǎn)生一個(gè)硬件中斷以提醒操作系統(tǒng)處理流經(jīng)該網(wǎng)卡上的每一個(gè)報(bào)文包。操作系統(tǒng)通過(guò)直接訪問(wèn)鏈路層,截獲相關(guān)數(shù)據(jù),由應(yīng)用程序而非上層協(xié)議(如IP層、TCP層)對(duì)數(shù)據(jù)過(guò)濾處理,這樣就可以捕獲到流經(jīng)網(wǎng)卡的所有數(shù)據(jù)。</p><p>  本次研究是在

31、共享局域網(wǎng)環(huán)境下,共享式以太網(wǎng)的典型代表是使用10Base5的總線型網(wǎng)絡(luò)和以集線器(HUB)為核心的星型網(wǎng)絡(luò)。另外,本次只對(duì)TCP/IP的抓包研究,不涉及數(shù)據(jù)報(bào)的截獲或攔截。</p><p><b>  第二章 技術(shù)背景</b></p><p>  2.1 Winsock基本概念</p><p>  Windows下網(wǎng)絡(luò)編程的規(guī)范--Windo

32、ws Socket是Windows下得到廣泛應(yīng)用的、開(kāi)放的、支持多種協(xié)議的的網(wǎng)絡(luò)編程接口。該規(guī)范以U.C.Berkeley大學(xué)BSD UNIX中流行的Socket接口為范例定義了一套Micosoft Windows下網(wǎng)絡(luò)編程接口。它不僅包含了Berkeley Socket風(fēng)格的庫(kù)函數(shù),也包含了一組針對(duì)Windows的擴(kuò)展庫(kù)函數(shù),以使程序員能充分利用Windows消息驅(qū)動(dòng)機(jī)制進(jìn)行編程。Windows在Internet支配域中的TCP/IP

33、協(xié)議定義了Winsock網(wǎng)絡(luò)編程規(guī)范,融入了許多新特點(diǎn)。使用Socket的目的是使用戶在網(wǎng)絡(luò)協(xié)議上工作而不必對(duì)該網(wǎng)絡(luò)協(xié)議有非常深入的了解。此外,編寫(xiě)的程序還可被迅速地移植到任何支持Socket的網(wǎng)絡(luò)系統(tǒng)中去。Winsock提供了一種可為指定傳輸協(xié)議打開(kāi)、計(jì)算和關(guān)閉會(huì)話的能力。在Windows下,TCP/IP上層模型在很大程度上與用戶的Winsock應(yīng)用有關(guān);換言之,用戶的Winsock應(yīng)用控制了會(huì)話的方方面面,必要時(shí),還會(huì)根據(jù)程序的需要

34、格式化數(shù)據(jù)。</p><p>  套接字,是通信的基石,是支持TCP/IP協(xié)議的網(wǎng)絡(luò)通信的基本操作單元[5]。可以將套接字看作不同主機(jī)間的進(jìn)程進(jìn)行雙向通信的端口。一個(gè)套接口就是通信的一端,套接口,就是一個(gè)指向傳輸提供者的句柄。套接字有三種類型:流式套接字、數(shù)據(jù)報(bào)套接字及原始套接字。流式套接字定義了一種可靠的面向連接的服務(wù),實(shí)現(xiàn)了無(wú)差錯(cuò)無(wú)重復(fù)的順序數(shù)據(jù)傳輸。數(shù)據(jù)報(bào)套接字定義了一種無(wú)連接的服務(wù),數(shù)據(jù)通過(guò)相互獨(dú)立的報(bào)文

35、進(jìn)行傳輸,是無(wú)序的,并且不保證可靠和無(wú)差錯(cuò)。原始套接字允許對(duì)低層協(xié)議如IP或ICMP直接訪問(wèn),主要用于新的網(wǎng)絡(luò)協(xié)議實(shí)現(xiàn)的測(cè)試等,本次系統(tǒng)就是使用的該套接字。</p><p>  2.2 IP數(shù)據(jù)包的構(gòu)成</p><p>  2.2.1 IP地址</p><p>  通常所說(shuō)IP地址是指現(xiàn)在所使用的第四版本的Ipv4地址協(xié)議。其中的IP是以32位的二進(jìn)制數(shù)來(lái)表示的,它

36、惟一地定義了一個(gè)在因特網(wǎng)上的主機(jī)或路由器。通常按8位分成4段,用十進(jìn)制的數(shù)值表示,中間用點(diǎn)號(hào)分開(kāi)。因此IP地址的數(shù)值可以從0.0.0.0到255.255.255.255。</p><p>  計(jì)算機(jī)地址除了0和全部為1的數(shù)值外都可以使用。計(jì)算機(jī)地址為0時(shí),在網(wǎng)絡(luò)地址中指定為指向網(wǎng)絡(luò)本身。計(jì)算機(jī)地址全部為1時(shí),網(wǎng)絡(luò)地址指定為向全體網(wǎng)絡(luò)進(jìn)行通信廣播。網(wǎng)絡(luò)地址使用多少位取決于一個(gè)局域網(wǎng)能容納的計(jì)算機(jī)臺(tái)數(shù)。因此,網(wǎng)絡(luò)地址

37、的位數(shù)決定了IP地址的分類,總共分為A,B,C,D和E五類。</p><p>  A類地址中網(wǎng)絡(luò)地址有7位,計(jì)算機(jī)地址被分配為24位。即具有A類地址的網(wǎng)絡(luò)在全世界只有100個(gè)左右,是能夠容納1600萬(wàn)臺(tái)計(jì)算機(jī)的網(wǎng)絡(luò)。</p><p>  B類地址使用方便,網(wǎng)絡(luò)數(shù)量和可容納的主機(jī)數(shù)都比較合適,造成現(xiàn)在B類地址資源不足,申請(qǐng)分配十分困難。</p><p>  C類地址目

38、前還有大量剩余,但是由于一個(gè)單位中使用一個(gè)C類地址,常常不能容納自己網(wǎng)絡(luò)上所有的計(jì)算機(jī),因此必須分配給相應(yīng)的多個(gè)C類地址。這種情況下,需要使用把這些計(jì)算機(jī)作為一個(gè)網(wǎng)絡(luò)的無(wú)類別域際路由選擇(CIDR: Classless Inter-Domain Routing)技術(shù),使用不受本來(lái)類別制約的地址,進(jìn)行地址空間的再分配會(huì)擴(kuò)大網(wǎng)絡(luò)地址的使用,在此種情況下分配的網(wǎng)絡(luò)稱為子網(wǎng)。使用子網(wǎng)時(shí)不能從IP地址的類別上區(qū)分IP地址中哪部分是網(wǎng)絡(luò)地址。<

39、;/p><p>  D類地址是多點(diǎn)傳送地址,向多方傳送IP數(shù)據(jù)包。廣播會(huì)向所有的網(wǎng)絡(luò)設(shè)備傳送IP數(shù)據(jù)包,但是在多點(diǎn)傳送中希望接收數(shù)據(jù)的多臺(tái)計(jì)算機(jī)可以接受到IP數(shù)據(jù)包。這種多點(diǎn)傳送可以將聲音、圖像等向多臺(tái)網(wǎng)絡(luò)設(shè)備同時(shí)傳送,因此常被使用在利用網(wǎng)絡(luò)進(jìn)行廣播的應(yīng)用程序上。</p><p>  E類地址保留為今后用。</p><p>  在因特網(wǎng)中使用的IP地址,在世界范圍內(nèi)是不

40、重復(fù)的。但是對(duì)于因特網(wǎng)沒(méi)有對(duì)外公開(kāi)的IP地址和其他網(wǎng)絡(luò)中發(fā)生重復(fù)是沒(méi)有關(guān)系的。因此,作為沒(méi)有公開(kāi)的內(nèi)部私有地址,要規(guī)定其使用范圍。RFC1918中對(duì)私有地址的規(guī)定是:</p><p>  10.0.0.0~10.255.255.255</p><p>  172.16.0.0~172.31.255.255</p><p>  192.168.0.0~192.168.

41、255.255</p><p>  因此在內(nèi)部私有網(wǎng)中的IP常常會(huì)是在以上范圍內(nèi)。</p><p>  下一代的IP地址為Ipv6,IP地址的位數(shù)達(dá)到128位,IP地址的個(gè)數(shù)可以達(dá)到現(xiàn)在的296倍,這樣Ipv4地址資源不足的問(wèn)題將得到解決。</p><p>  2.2.2 數(shù)據(jù)包的封裝與分用</p><p>  當(dāng)應(yīng)用程序用TCP傳送數(shù)據(jù)時(shí),

42、數(shù)據(jù)被送入?yún)f(xié)議棧中,然后逐個(gè)通過(guò)每一層直到被當(dāng)做一串比特流送入網(wǎng)絡(luò)。其中每一層對(duì)收到的數(shù)據(jù)都要增加一些首部信息(有時(shí)還要增加一些尾部信息),該過(guò)程如圖2.1[6]所示。</p><p>  圖2.1 數(shù)據(jù)包的封裝過(guò)程示意圖</p><p>  TCP傳給IP的數(shù)據(jù)單元為T(mén)CP報(bào)文段,IP傳給網(wǎng)絡(luò)接口層的數(shù)據(jù)單元為IP數(shù)據(jù)報(bào)(IP datagram),通過(guò)以太網(wǎng)傳輸?shù)谋忍亓鞣Q作幀(Frame

43、),以太網(wǎng)數(shù)據(jù)幀的長(zhǎng)度必須在46~1500字節(jié)之間。</p><p>  UDP數(shù)據(jù)與TCP數(shù)據(jù)基本一致。唯一不同的是UDP傳給IP的信息單元稱作UDP數(shù)據(jù)報(bào)(UDP Datagram),而且UDP 的首部長(zhǎng)為8字節(jié)。由于TCP、UDP、ICMP和IGMP都要向IP傳送數(shù)據(jù),因此IP必須在生成的IP首部中加入某種標(biāo)識(shí),以表明數(shù)據(jù)屬于哪一層。為此,IP 首部中存入一個(gè)長(zhǎng)度為8bit的數(shù)據(jù),即協(xié)議域。1表示ICMP協(xié)

44、議,2表示IGMP,6表示TCP,17表示UDP。</p><p>  許多應(yīng)用程序都可以使用TCP或UDP來(lái)傳送數(shù)據(jù),傳輸層協(xié)議在生成報(bào)文首部時(shí)要存入一個(gè)應(yīng)用程序的標(biāo)識(shí)符,TCP和UDP都用一個(gè)16位的端口號(hào)來(lái)表示不同的應(yīng)用程序,TCP和UDP把源端口號(hào)和目的端口號(hào)分別存入報(bào)文首部中。網(wǎng)絡(luò)接口要發(fā)送和接收IP、ARP(Address Resolution Protocol,地址解析協(xié)議)和RARP(Revers

45、e Address Resolution Protocol, 逆向地址解析協(xié)議)數(shù)據(jù),也必須在以太網(wǎng)的幀首部中加入某種形式的標(biāo)識(shí),以指明生成數(shù)據(jù)的網(wǎng)絡(luò)層協(xié)議,為此,以太網(wǎng)的首部也有一個(gè)16bit的幀類型域。當(dāng)目的主機(jī)收到一個(gè)以太網(wǎng)數(shù)據(jù)幀時(shí),數(shù)據(jù)就開(kāi)始從協(xié)議棧中由底向上升,同時(shí)去掉各層協(xié)議加上的報(bào)文首部。每層協(xié)議盒都要去檢查報(bào)文首部中的協(xié)議標(biāo)識(shí),以確定接收數(shù)據(jù)的上層協(xié)議。這個(gè)分用過(guò)程如圖2.2[6] 所示。</p><

46、p>  圖2.2 數(shù)據(jù)分用過(guò)程</p><p>  2.2.3 IP數(shù)據(jù)報(bào)</p><p>  IP數(shù)據(jù)報(bào),是Internet上數(shù)據(jù)通信的基本單元。IP數(shù)據(jù)報(bào)文的格式如圖2.3所示:</p><p>  圖2.3 IP數(shù)據(jù)報(bào)格式</p><p>  其中,版本字段用于指定IP協(xié)議的版本號(hào),本次系統(tǒng)使用環(huán)境即為版本4。報(bào)頭長(zhǎng)度字段用于指定

47、IP數(shù)據(jù)頭的長(zhǎng)度,它以4B為單位,且至少為5,即20個(gè)字節(jié)或160個(gè)比特;需要注意的是,IP報(bào)頭長(zhǎng)度不包含數(shù)據(jù)區(qū)中的數(shù)據(jù)。服務(wù)器類型(TOS)字段共占用了8bit,其分配方法為:優(yōu)先級(jí)DTR字段未用;優(yōu)先級(jí)字段用于指定IP數(shù)據(jù)包在網(wǎng)絡(luò)中的優(yōu)先級(jí),優(yōu)先級(jí)可以影響一個(gè)信息包通過(guò)網(wǎng)橋的速度,以及目的主機(jī)翻譯的方式;字段D為延遲標(biāo)志位;T為流量標(biāo)志位;R為質(zhì)量標(biāo)志位??傞L(zhǎng)度字段用于指定IP數(shù)據(jù)包的總長(zhǎng)度(包含數(shù)據(jù)區(qū)中的數(shù)據(jù)),它以字節(jié)為單位,理

48、論最大長(zhǎng)度為65535,然而,如今大多數(shù)應(yīng)用程序允許最大長(zhǎng)度為8192[7]。信息包標(biāo)識(shí),用來(lái)判斷分段屬于哪一個(gè)數(shù)據(jù)包。標(biāo)志,共分3位,其中第一位未用;第二位為DF,若DF等于1,則表明不對(duì)該數(shù)據(jù)包進(jìn)行分段;第三位為MF,若為MF等于1,則表明該分段不是最后一個(gè)包,即還有其他分段存在,若MF等于0,則表明該分段是最后一個(gè)分段,利用MF標(biāo)志位可以判斷是否所用的分段都已到達(dá)。分段偏移量,用于指明分段在整個(gè)數(shù)據(jù)包中的位置。生命周期(TTL)字

49、段用于控制IP數(shù)據(jù)包在網(wǎng)絡(luò)存在時(shí)</p><p>  本程序中定義的IP數(shù)據(jù)結(jié)構(gòu)為:</p><p>  typedef struct _IPHeader</p><p><b>  {</b></p><p>  unsigned char ver_len; //版本+報(bào)頭長(zhǎng)度</p><p>

50、;  unsigned char tos;//服務(wù)類型</p><p>  unsigned short len;//總長(zhǎng)度</p><p>  unsigned short ident;//信息包標(biāo)志</p><p>  unsigned short flag_frag;//標(biāo)志(3) + 分段偏移(13)</p><p>

51、;  unsigned char ttl;//生命周期</p><p>  unsigned char proto;//協(xié)議</p><p>  unsigned short checksum;//校驗(yàn)和</p><p>  unsigned int src;//源IP地址</p><p>  unsigned int ds

52、t;//目的IP地址</p><p>  _IPHeader()</p><p><b>  {</b></p><p>  memset(this, 0, sizeof(_IPHeader));//初始化</p><p><b>  }</b></p><p>  }

53、IPHeader, *PIPHeader;</p><p>  2.3網(wǎng)絡(luò)數(shù)據(jù)包捕獲原理</p><p>  目前有兩種方法可以從網(wǎng)絡(luò)中捕獲數(shù)據(jù)包,一種是采用專用硬件,另一種是利用普通計(jì)算機(jī)與網(wǎng)絡(luò)連接的通用硬件網(wǎng)絡(luò)適配器,即網(wǎng)卡,由軟件來(lái)完成數(shù)據(jù)包的捕獲。雖然由軟件來(lái)捕獲數(shù)據(jù)包的方法在性能上比不上專用硬件,但其實(shí)現(xiàn)成本相對(duì)更低,且易于修改和更新?;谝陨显?采用軟件的捕獲方法得到了廣泛的

54、使用和認(rèn)同。在以太網(wǎng)中,所有的通信都是廣播方式,即在同一網(wǎng)段上的所有網(wǎng)絡(luò)接口都可以訪問(wèn)在物理媒體上傳輸?shù)臄?shù)據(jù)。</p><p>  數(shù)據(jù)的收發(fā)由網(wǎng)卡來(lái)完成,網(wǎng)卡的工作模式起著至關(guān)重要的作用,一般網(wǎng)卡有四種方式:(1)廣播方式,此方式下網(wǎng)卡可以接收網(wǎng)絡(luò)中的廣播信息;(2)組播方式,此方式下網(wǎng)卡可以接收網(wǎng)絡(luò)中的組播信息;(3)直接方式,此方式下只有目的網(wǎng)卡才能接收該數(shù)據(jù);(4)混雜模式,此模式下網(wǎng)卡能夠接收一切通過(guò)它

55、的數(shù)據(jù),不論是否傳給它[8]。網(wǎng)卡的缺省工作模式包含廣播模式和直接模式,即它只接收廣播幀和發(fā)給自己的幀。如果采用混雜模式,一個(gè)站點(diǎn)的網(wǎng)卡將接受同一網(wǎng)絡(luò)內(nèi)所有站點(diǎn)所發(fā)送的數(shù)據(jù)包這樣就可以到達(dá)對(duì)于網(wǎng)絡(luò)信息監(jiān)視捕獲的目的。</p><p>  2.4 Raw Socket</p><p>  原始套接字提供管理下層傳輸?shù)哪芰?,它們可能?huì)被惡意利用,這是一個(gè)安全問(wèn)題,僅Administrator組

56、的成員能夠創(chuàng)建SOCK_RAW類型套接字。任何人都可以在NT下穿件套接字,但沒(méi)有Administrator權(quán)限的人不能用它做任何事,因?yàn)閎ind函數(shù)將會(huì)失敗,出錯(cuò)碼為WSAEACCESS[9]。要使用原始套接字,必須經(jīng)過(guò)創(chuàng)建原始套接字、設(shè)置套接字選項(xiàng)和創(chuàng)建并填充相應(yīng)協(xié)議頭這三個(gè)步驟,然后用send、WSASend函數(shù)將組裝好的數(shù)據(jù)發(fā)送出去[10]。接收的過(guò)程也很相似,只是需要用recv或WSARecv函數(shù)接收數(shù)據(jù)。</p>

57、<p>  2.4.1 WSAStartup()函數(shù)</p><p>  Winsock的服務(wù)是以動(dòng)態(tài)鏈接庫(kù)Winsock DLL形式實(shí)現(xiàn)的,必須先調(diào)用WSAStartup函數(shù)對(duì)Winsock DLL進(jìn)行初始化,協(xié)商Winsock的版本支持,分配必要的資源。WSAStartup函數(shù)的原型如下:</p><p>  int WSAStartup(WORD wVersionRequ

58、ested, LPWSADATA lpWSAData);</p><p>  其中,參數(shù)wVersionRequested用于指定準(zhǔn)備加載的Winsock庫(kù)的版本,高字節(jié)指定Winsock庫(kù)的副版本,而低位字節(jié)則是主版本。lpWSAData參數(shù)是指向LPWSADATA結(jié)構(gòu)的指針,該結(jié)構(gòu)包含了加載的版本有關(guān)信息。</p><p>  2.4.2 socket()函數(shù)</p>&

59、lt;p>  使用套接字之前,必須使用socket()函數(shù)創(chuàng)建一個(gè)套接字對(duì)象,此函數(shù)調(diào)用成功將返回一個(gè)套接字對(duì)象。該函數(shù)原型如下:</p><p>  SOCKET socket(int af, int type, int protocol);</p><p>  其中,參數(shù)af用于指定網(wǎng)絡(luò)地址類型,在Internet域中,取AF_INET。參數(shù)type用于用于指定套接字類型,流式套

60、接字取SOCK_STREAM,數(shù)據(jù)報(bào)套接字取SOCK_DGRAM,而本次系統(tǒng)取值SOCK_RAM, 即原始套接字。參數(shù)protocol用于指定網(wǎng)絡(luò)協(xié)議,一般取0,表示默認(rèn)為T(mén)CP/IP協(xié)議。</p><p>  2.4.3 bind()函數(shù)</p><p>  通過(guò)調(diào)用bind()函數(shù)將本地地址綁定到所創(chuàng)建的套接字上以在網(wǎng)絡(luò)上標(biāo)識(shí)該套接字。該函數(shù)原型如下:</p><p

61、>  int bind(SOCKET s, const struct sockaddr* name, int namelen);</p><p>  其中,第一個(gè)參數(shù)s標(biāo)識(shí)一個(gè)未捆綁套接字的句柄。第三個(gè)參數(shù)namelen為地址的長(zhǎng)度。第二個(gè)參數(shù)name是賦予套接字的地址,由struct socketaddr結(jié)構(gòu)表示,結(jié)構(gòu)如下:</p><p>  struct sockaddr<

62、;/p><p><b>  {</b></p><p>  u_short sa_family;//設(shè)為AF_INET,表示socket處于Internet域</p><p>  char sa_data[14];//數(shù)據(jù)存儲(chǔ)</p><p><b>  };</b></p><p&

63、gt;  一般情況下,socketaddr_in結(jié)構(gòu)更常用,在TCP/IP協(xié)議下,可以方便地通過(guò)強(qiáng)制類型轉(zhuǎn)換把sockaddr_in結(jié)構(gòu)轉(zhuǎn)換為sockaddr結(jié)構(gòu)。其結(jié)構(gòu)格式如下:</p><p>  struct socketaddr_in</p><p><b>  {</b></p><p>  shor sin_family;//設(shè)為A

64、F_INET,表示socket處于Internet域unsinged short sin_port;//端口號(hào)</p><p>  struct in_addr sin_addr;//存儲(chǔ)一個(gè)4字節(jié)的地址數(shù)</p><p>  char sin_zear[8];//填充項(xiàng),以保持同sockaddr結(jié)構(gòu)長(zhǎng)度一致</p><p><b>  };</b

65、></p><p>  2.4.4 WSAIoctl()函數(shù)</p><p>  該函數(shù)用于控制一個(gè)套接字的模式,函數(shù)的原型為:</p><p>  int WSAIoctl(SOCKET s, DWORD dwIoControlCode, LPVOID lpvInBuffer,</p><p>  DWORD cbInBuffer,

66、LPVOID lpvOutBuffer, DWORD cbOutBuffer,</p><p>  LPDWORD lpcbBytesReturned,LPWSAOVERLAPPED lpOverlapped,</p><p>  LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine);</p><p>  其

67、中,參數(shù)s標(biāo)識(shí)套接字描述字,參數(shù)dwIoControlCode為欲進(jìn)行操作的控制代碼,參數(shù)lpvInBuffer表示輸入緩沖區(qū)的地址,參數(shù)cbInBuffer指定緩沖區(qū)的大小,參數(shù)lpvOutBuffer表示輸出緩沖區(qū)的地址,參數(shù)cbOutBuffer指定輸出緩沖區(qū)的大小,參數(shù)lpcbBytesReturned用于輸出實(shí)際字節(jié)數(shù)的地址,參數(shù)lpOverlapped為WSAOVERLAPPED結(jié)構(gòu)的地址,參數(shù)lpCompletionRou

68、tine指向操作結(jié)束后調(diào)用的例程指針。</p><p>  2.4.5 recv()函數(shù)</p><p>  使用該函數(shù)來(lái)接收我們想要的數(shù)據(jù)包,函數(shù)的原型為:</p><p>  int recv(SOCKET s, char* buf, int len, int flags);</p><p>  其中,參數(shù)s為準(zhǔn)備接收數(shù)據(jù)的套接字。第二個(gè)

69、參數(shù)buf是即將收到數(shù)據(jù)的字符緩沖區(qū),而len是準(zhǔn)備接收的字節(jié)數(shù)。Flags參數(shù)可以是0、MSG_PEEK或MSG_OOB或這些標(biāo)志的按位“或”運(yùn)算,0表示無(wú)特殊行為;MSG_PEEK使有用的數(shù)據(jù)復(fù)制到所提供的接收端緩沖區(qū)內(nèi),但沒(méi)有從系統(tǒng)緩沖區(qū)中將其刪除。recv函數(shù)返回發(fā)送字節(jié)數(shù)。</p><p>  2.5 網(wǎng)絡(luò)編程接口</p><p>  在網(wǎng)絡(luò)中相互通信的主機(jī)其實(shí)質(zhì)是主機(jī)中相對(duì)應(yīng)的

70、進(jìn)程或者線程之間的通信。首先,他們要遵循統(tǒng)一的網(wǎng)絡(luò)協(xié)議。其次,進(jìn)程或者線程與網(wǎng)絡(luò)協(xié)議之間的數(shù)據(jù)傳輸是通過(guò)網(wǎng)絡(luò)編程接口來(lái)實(shí)現(xiàn)的,而網(wǎng)絡(luò)協(xié)議則是依靠操作系統(tǒng)將數(shù)據(jù)最終送到傳輸介質(zhì)上[11],如下圖2.4所示。</p><p>  圖2.4 進(jìn)程、網(wǎng)絡(luò)協(xié)議、網(wǎng)絡(luò)編程接口關(guān)系</p><p>  第三章 系統(tǒng)整體分析與設(shè)計(jì)</p><p>  3.1 基本情況分析</

71、p><p>  網(wǎng)絡(luò)服務(wù)飛速發(fā)展,但同時(shí)網(wǎng)絡(luò)的安全問(wèn)題也迫在眉睫,本系統(tǒng)通過(guò)對(duì)局域網(wǎng)的數(shù)據(jù)進(jìn)行捕獲分析,可以分析網(wǎng)絡(luò)中存在的安全問(wèn)題及流量查看。同時(shí)通過(guò)實(shí)踐來(lái)提高自己的動(dòng)手能力。本系統(tǒng)適用于通過(guò)以太網(wǎng)和共享HUB的上網(wǎng)方式對(duì)局域網(wǎng)中的數(shù)據(jù)進(jìn)行捕獲分析。其目的通過(guò)此監(jiān)控平臺(tái),提高上網(wǎng)的安全控制。</p><p>  3.2 程序需求概述</p><p>  3.2.1 設(shè)

72、計(jì)目標(biāo)</p><p>  通過(guò)學(xué)習(xí)數(shù)據(jù)包捕獲相關(guān)知識(shí),以及借鑒國(guó)內(nèi)外的成功經(jīng)驗(yàn),完成一個(gè)基本的局域網(wǎng)抓包分析工具,以幫助管理員及時(shí)發(fā)現(xiàn)局域網(wǎng)網(wǎng)絡(luò)中的異常,做出正確處理。</p><p>  3.2.2 功能需求</p><p>  能夠捕獲流經(jīng)本機(jī)網(wǎng)卡上的所有數(shù)據(jù)包。</p><p>  能夠?qū)Σ东@的數(shù)據(jù)包進(jìn)行分析,分析的結(jié)果以列表形式顯示

73、。</p><p>  提供直觀的數(shù)據(jù)流量統(tǒng)計(jì)圖。</p><p>  提供IP數(shù)據(jù)包分析結(jié)果以日志的形式保存功能。</p><p>  3.2.3 用戶特點(diǎn)</p><p>  由于用戶不一定為具有相關(guān)專業(yè)知識(shí),因此,需要提供一個(gè)友好的操作界面,簡(jiǎn)單的操作步驟和盡可能全面的出錯(cuò)提示。</p><p>  3.2.4

74、制約因素</p><p>  以太網(wǎng)環(huán)境主要分為兩種,共享以太網(wǎng)和交換以太網(wǎng)。在共享式以太網(wǎng)中的典型代表是使用10Base5的總線型網(wǎng)絡(luò)和以集線器(HUB)為核心的星型網(wǎng)絡(luò)。集線器工作在物理層。在使用集線器的以太網(wǎng)中,集線器將很多以太網(wǎng)設(shè)備集中到一臺(tái)中心設(shè)備上,這些設(shè)備都連接到集線器中的同一物理總線結(jié)構(gòu)中。從本質(zhì)上講,以集線器為核心的以太網(wǎng)同原先的總線型以太網(wǎng)無(wú)根本區(qū)別,集線器并不處理或檢查其上的通信量,僅通過(guò)將

75、一個(gè)端口接收的信號(hào)重復(fù)分發(fā)給其他端口來(lái)擴(kuò)展物理介質(zhì)。所有連接到集線器的設(shè)備共享同一介質(zhì),其結(jié)果是它們也共享同一沖突域、廣播和帶寬。因此集線器和它所連接的設(shè)備組成了一個(gè)單一的沖突域。如果一個(gè)節(jié)點(diǎn)發(fā)出一個(gè)廣播信息,集線器會(huì)將這個(gè)廣播傳播給所有同它相連的所有節(jié)點(diǎn),因此它也是一個(gè)單一的廣播域。當(dāng)局域網(wǎng)內(nèi)的主機(jī)通過(guò)HUB連接時(shí),HUB的作用就是局域網(wǎng)上面的一個(gè)共享的廣播媒體,所有通過(guò)局域網(wǎng)發(fā)送的數(shù)據(jù)首先被送到HUB,然后HUB將接收到的所有數(shù)據(jù)向

76、它的每個(gè)端口轉(zhuǎn)發(fā)。因此我們只要將某臺(tái)主機(jī)的網(wǎng)卡設(shè)置為混雜模式,就可以接收到局域網(wǎng)內(nèi)所有主機(jī)間的數(shù)據(jù)流量。 </p><p>  而在交換式以太網(wǎng)中,交換機(jī)根據(jù)收到數(shù)據(jù)幀中的源MAC地址建立該地址同交換機(jī)端口的映射,并將其寫(xiě)入MAC地址表中。當(dāng)有數(shù)據(jù)包發(fā)送到交換機(jī)時(shí),交換機(jī)會(huì)將數(shù)據(jù)包中的目的MAC地址與自己維護(hù)的MAC地址端口映射表中的數(shù)據(jù)進(jìn)行對(duì)照,然后將數(shù)據(jù)包發(fā)送到對(duì)應(yīng)的端口上。對(duì)交換機(jī)而言,僅有兩種情況會(huì)發(fā)送廣

77、播,一是數(shù)據(jù)包的目的MAC地址不在交換機(jī)維護(hù)的數(shù)據(jù)庫(kù)中,此時(shí)數(shù)據(jù)包向所有端口轉(zhuǎn)發(fā),這一過(guò)程稱之為泛洪(flooding);二是數(shù)據(jù)包本身就是廣播包。不同于工作在物理層的集線器,交換機(jī)是工作在數(shù)據(jù)鏈路層的。由于端口間的傳遞的數(shù)據(jù)幀彼此屏蔽,因此節(jié)點(diǎn)就不擔(dān)心自己發(fā)送的幀在通過(guò)交換機(jī)時(shí)是否會(huì)與其他節(jié)點(diǎn)發(fā)送的幀產(chǎn)生沖突。交換機(jī)將沖突隔絕在每一個(gè)端口(每個(gè)端口都是一個(gè)沖突域),避免了沖突的擴(kuò)散。因此,基于交換機(jī)以太網(wǎng)建立的局域網(wǎng)并不是真正的廣播媒

78、體,交換機(jī)限制了被動(dòng)監(jiān)聽(tīng)工具所能截獲的數(shù)據(jù)。因此,要捕獲數(shù)據(jù)包就必須將捕包系統(tǒng)運(yùn)行在網(wǎng)關(guān)或路由器上,如果想在網(wǎng)段的任意一臺(tái)主機(jī)上實(shí)現(xiàn)捕包功能,就需要采取其它的方法,如端口鏡像, MAC洪泛法,ARP欺騙(黑客經(jīng)常會(huì)以此方法進(jìn)行攻擊和竊取數(shù)據(jù))。</p><p>  而作為本次的學(xué)習(xí)研究對(duì)象,選取的是共享以太網(wǎng),也就是說(shuō)本系統(tǒng)在交換以太網(wǎng)中就無(wú)能為力了。</p><p><b> 

79、 3.3 概要設(shè)計(jì)</b></p><p>  3.3.1 概要設(shè)計(jì)目標(biāo)</p><p>  理清程序邏輯,劃分程序模塊,明確模塊之間的調(diào)用關(guān)系,盡量做到高內(nèi)聚低耦合。程序內(nèi)部代碼要有一定的封裝性,也要有一定的可移植性,因?yàn)檫@個(gè)程序的功能也可以成為一個(gè)較大程序的一部分,所以對(duì)移植性和擴(kuò)展要有一定的要求。</p><p>  3.3.2 系統(tǒng)功能模塊劃分&

80、lt;/p><p>  依據(jù)需求分析中的功能需求,系統(tǒng)將要實(shí)現(xiàn)的功能如下,同時(shí)每個(gè)功能包含了一個(gè)或多個(gè)模塊:</p><p>  數(shù)據(jù)捕獲,這個(gè)是本系統(tǒng)的核心,用于捕獲IP數(shù)據(jù)包,由數(shù)據(jù)包捕獲模塊組成。</p><p>  數(shù)據(jù)包分析,截獲到了數(shù)據(jù)包后還不能直接使用,需要按照相關(guān)協(xié)議頭來(lái)完成有效信息提取功能,這個(gè)功能包括數(shù)據(jù)包定義模塊和數(shù)據(jù)包拆包模塊。</p>

81、;<p>  數(shù)據(jù)信息顯示,本程序意在提供給用戶一個(gè)簡(jiǎn)單易用的操作界面,該功能由程序初始化模塊、數(shù)據(jù)顯示模塊和圖形統(tǒng)計(jì)模塊組成。</p><p>  數(shù)據(jù)讀寫(xiě),為方便用戶日后對(duì)數(shù)據(jù)包進(jìn)行進(jìn)一步分析,可將數(shù)據(jù)包保存到日志文件內(nèi),并可以將日志內(nèi)文件重新加入程序分析中,該功能能包含在文件讀寫(xiě)模塊中。</p><p>  線程控制,程序開(kāi)始后,系統(tǒng)將不停的對(duì)數(shù)據(jù)包進(jìn)行捕獲,而程序的控

82、制權(quán)應(yīng)該交由用戶來(lái)控制,因此,為了保護(hù)用戶的控制權(quán),需要除主線程外,另外創(chuàng)建新的線程,新的線程用于數(shù)據(jù)包的捕獲、分析、停止等,而主線程則用于根據(jù)用戶的需要對(duì)新線程進(jìn)行創(chuàng)建和監(jiān)視等任務(wù)。該功能包含線程創(chuàng)建模塊、線程停止模塊。</p><p>  3.3.3 系統(tǒng)模塊描述</p><p><b>  抓包模塊</b></p><p>  根據(jù)Raw

83、 Socket捕包方式,完成數(shù)據(jù)包的捕獲。新線程創(chuàng)建后,需執(zhí)行該模塊,是一個(gè)相對(duì)獨(dú)立的模塊。</p><p> ?。?)數(shù)據(jù)包定義模塊</p><p>  根據(jù)相關(guān)協(xié)議,創(chuàng)建IP,TCP等協(xié)議頭的數(shù)據(jù)結(jié)構(gòu),是數(shù)據(jù)包分析功能的重要一部分。</p><p> ?。?)數(shù)據(jù)包拆包模塊</p><p>  利用截獲的數(shù)據(jù)包,根據(jù)已定義的協(xié)議頭數(shù)據(jù)結(jié)構(gòu)

84、,提取IP地址,通信端口,數(shù)據(jù)包大小等信息。主要是根據(jù)數(shù)據(jù)包捕獲模塊提供的數(shù)據(jù),參照數(shù)據(jù)包定義模塊的數(shù)據(jù)結(jié)構(gòu)來(lái)完成該功能。</p><p><b> ?。?)數(shù)據(jù)顯示模塊</b></p><p>  將分析數(shù)據(jù)包后的信息使用列表的信息顯示出來(lái)。主要是調(diào)用數(shù)據(jù)包分析模塊中得到的有用信息。</p><p><b> ?。?)圖形統(tǒng)計(jì)模塊&

85、lt;/b></p><p>  根據(jù)捕獲到的數(shù)據(jù)包,提供按IP報(bào)頭、協(xié)議類型來(lái)統(tǒng)計(jì)數(shù)據(jù)包的流量信息。圖形統(tǒng)計(jì)模塊也需要數(shù)據(jù)包分析模塊提供信息。</p><p><b>  (6)文件讀寫(xiě)模塊</b></p><p>  將捕獲到的數(shù)據(jù)包,根據(jù)需要保存到文件。并且可以將已保存的數(shù)據(jù)重新顯示到列表框中。</p><p&g

86、t;<b>  線程控制模塊</b></p><p>  該模塊用于創(chuàng)建新線程和停止線程,新線程將調(diào)用數(shù)據(jù)包捕獲模塊捕獲數(shù)據(jù)包。按照用戶需求,當(dāng)用戶需要停止捕獲數(shù)據(jù)包時(shí),需要調(diào)用停止線程,停止數(shù)據(jù)包的捕獲。</p><p>  3.3.4 功能模塊圖</p><p>  根據(jù)系統(tǒng)功能模塊劃分,其圖形描述如圖3.1。</p><

87、;p>  圖3.1 程序功能模塊結(jié)構(gòu)圖</p><p>  第四章 系統(tǒng)詳細(xì)設(shè)計(jì)及實(shí)現(xiàn)</p><p>  4.1 系統(tǒng)設(shè)計(jì)思想</p><p>  本系統(tǒng)將流經(jīng)過(guò)本地網(wǎng)卡的數(shù)據(jù)包截取后,按照已知的數(shù)據(jù)包的格式進(jìn)行拆包分析。系統(tǒng)的用戶操作層處理與后臺(tái)數(shù)據(jù)處理相分離,后臺(tái)數(shù)據(jù)的顯示層分別封裝在兩個(gè)類中,同時(shí)對(duì)數(shù)據(jù)包的截取和分析放在專門(mén)的處理類中,這樣,在程序運(yùn)行

88、的時(shí)候,當(dāng)需要時(shí)就通過(guò)操作層調(diào)用后臺(tái)數(shù)據(jù)處理提供的接口函數(shù)即可。在程序運(yùn)行的時(shí)候,主線程會(huì)調(diào)用類中相應(yīng)的功能,通過(guò)后臺(tái)數(shù)據(jù)處理類的接口,先是初始化,然后抓包,再進(jìn)行分析,再顯示到屏幕上,并完成相關(guān)統(tǒng)計(jì),這些功能的都是在后臺(tái)數(shù)據(jù)處理類中新建的子線程下完成的,這樣做的原因是抓包是用一個(gè)無(wú)限循環(huán)進(jìn)行的,如果不新建線程,一旦開(kāi)始抓包,則程序就會(huì)進(jìn)入“假死”,就不能進(jìn)行其它的任何操作了,比如停止。在每次停止運(yùn)行程序以后,用戶可以選擇保存當(dāng)前數(shù)據(jù),

89、程序就會(huì)自動(dòng)獲取當(dāng)前日期和時(shí)間,將得到的數(shù)據(jù)存入文件中?;蛘?,用戶可以將之前保存的數(shù)據(jù)加載到顯示列表中去。</p><p>  4.2 程序各模塊的詳細(xì)設(shè)計(jì)</p><p>  在概要設(shè)計(jì)時(shí),已經(jīng)對(duì)各模塊功能進(jìn)行了詳細(xì)描述,但還未設(shè)計(jì)到各模塊的具體實(shí)現(xiàn),其具體實(shí)現(xiàn)設(shè)計(jì)如下:</p><p> ?。?)抓包模塊:這個(gè)模塊和數(shù)據(jù)包拆包、線程創(chuàng)建、線程停止模塊聯(lián)系緊密,所

90、以應(yīng)該封裝到一個(gè)類里面。在外部調(diào)用的時(shí)候,只需要把這個(gè)在實(shí)例化一個(gè)對(duì)象,并且外的接口也只需要提供初始化、開(kāi)始捕包、停止捕包接口即可,模塊的具體實(shí)現(xiàn)不需對(duì)外泄露。這個(gè)模塊內(nèi)就是包含WSAStartup()函數(shù),Socket()函數(shù),bind()函數(shù),WSAIoctl()函數(shù),recv()函數(shù)。每個(gè)函數(shù)都有會(huì)有返回值,在這個(gè)模塊里也將判斷是不是每個(gè)函數(shù)都成功的執(zhí)行了,如果任意一個(gè)函數(shù)沒(méi)有成功執(zhí)行,那么整個(gè)程序的功能都無(wú)法實(shí)現(xiàn)。該程序就會(huì)提示

91、出相應(yīng)的出錯(cuò)信息,以便能更快更準(zhǔn)確的找到問(wèn)題的所在。本模塊雖然是程序的核心部分,但是比較簡(jiǎn)單,都是一些Socket提供的一些接口函數(shù),所以在實(shí)現(xiàn)起來(lái)也比較容易。</p><p> ?。?)數(shù)據(jù)包定義模塊:這個(gè)模塊是定義在一個(gè)頭文件里的,因?yàn)樗鋵?shí)是一個(gè)結(jié)構(gòu)體(Struct)。該模塊沒(méi)什么別的特殊意義,IP數(shù)據(jù)報(bào)結(jié)構(gòu)已在2.2.3節(jié)列出,同時(shí)為了能對(duì)端口進(jìn)行分析,有必要對(duì)TCP協(xié)議結(jié)構(gòu),及UDP結(jié)構(gòu)進(jìn)行分析,TCP

92、協(xié)議結(jié)構(gòu)如下:</p><p>  typedef struct _TCPHeader</p><p><b>  {</b></p><p>  WORD SourPort;//源端口</p><p>  WORD DestPort;//目的端口</p><p>  DWORD Seq

93、No;//序列號(hào)</p><p>  DWORD AckNo;//確認(rèn)序列號(hào)</p><p>  BYTE HLen;//頭部長(zhǎng)度</p><p>  BYTE Flag;//保留</p><p>  WORD WndSize;//窗口</p><p>  WORD ChkSum;//校驗(yàn)和

94、</p><p>  WORD UrgPtr;//緊急指針</p><p>  _TCPHeader()</p><p><b>  {</b></p><p>  memset(this, 0, sizeof(_TCPHeader)); //初始化</p><p><b>  }&

95、lt;/b></p><p>  }TCPHeader, *PTCPHeader;</p><p>  UDP協(xié)議結(jié)構(gòu)如下:</p><p>  typedef struct _UDPHeader</p><p><b>  {</b></p><p>  WORD SourPort;/

96、/源端口</p><p>  WORD DestPort;//目的端口</p><p>  WORD Len;//報(bào)文長(zhǎng)度</p><p>  WORD ChkSum;//校驗(yàn)和</p><p>  _UDPHeader()</p><p><b>  {</b></p>

97、<p>  memset(this, 0, sizeof(_UDPHeader)); //初始化</p><p><b>  }</b></p><p>  }UDPHeader, *PUDPHeader;</p><p> ?。?)數(shù)據(jù)包拆包模塊:本模塊也是寫(xiě)在新創(chuàng)建的線程里,這樣做的目的是為了可以更方便的處理數(shù)據(jù)包。因?yàn)楫?dāng)上一

98、個(gè)模塊抓取到數(shù)據(jù)后,就會(huì)直接調(diào)用這個(gè)模塊,這個(gè)模塊接收的數(shù)據(jù)從字符指針類型的數(shù)據(jù)強(qiáng)制轉(zhuǎn)換成我們定義的數(shù)據(jù)包結(jié)構(gòu)類型,通過(guò)指針移動(dòng),及移位運(yùn)算和按位與的方法,從數(shù)據(jù)包中提取出用戶想要的信息。</p><p> ?。?) 程序初始化模塊:本模塊是制作界面的,主要是通過(guò)分割窗口的方法,將主窗口分割成兩個(gè)窗口,一個(gè)主要是用于裝載列表框,表一定會(huì)有表頭,而表頭是固定的,所以會(huì)在初始化里就先將它加在界面上。另一個(gè)是圖形統(tǒng)計(jì)那

99、里,初始化時(shí),可以先將坐標(biāo)和尺度先畫(huà)處理。</p><p> ?。?)數(shù)據(jù)顯示模塊:本模塊是在單獨(dú)創(chuàng)建一個(gè)視圖類的中。在數(shù)據(jù)包拆包模塊執(zhí)行后,就會(huì)得到已經(jīng)分析好的包內(nèi)的所有信息,并通過(guò)SendMessage()函數(shù)向主程序發(fā)送數(shù)據(jù)達(dá)到通知,主程序?qū)⑼ㄟ^(guò)分割窗口時(shí)保存的函數(shù)指針,調(diào)用該模塊類中的函數(shù),這些得到的信息添加到已經(jīng)初始化過(guò)的列表中,就這樣一個(gè)一個(gè)填,就可以把所有數(shù)據(jù)都顯示出來(lái)。</p>&l

100、t;p> ?。?)數(shù)據(jù)流繪圖模塊:得到數(shù)據(jù)包的數(shù)據(jù)后,會(huì)有一段數(shù)據(jù)是表示數(shù)據(jù)包長(zhǎng)度的,通過(guò)這個(gè)就可以計(jì)算出當(dāng)前的流量。每得到一個(gè)數(shù)據(jù)包,主程序都會(huì)通過(guò)SendMessage()函數(shù)將數(shù)據(jù)長(zhǎng)度發(fā)給本模塊,本模塊就會(huì)將數(shù)據(jù)長(zhǎng)度累加起來(lái),然后通過(guò)事先調(diào)用SetTimer()函數(shù)設(shè)置的定時(shí)器,判斷是否需要重畫(huà)窗口,本窗口時(shí)程序初始化時(shí)分割的一個(gè)獨(dú)立的窗口,因此窗口重畫(huà)不會(huì)對(duì)其他窗口產(chǎn)生影響。定時(shí)器會(huì)每秒中啟動(dòng)一次,每次調(diào)用繪圖函數(shù),這樣就

101、可生成流量統(tǒng)計(jì)的折線圖。</p><p> ?。?)文件讀寫(xiě)模塊:在程序停止抓包后,因?yàn)閷?duì)前面的數(shù)據(jù)包的信息并沒(méi)有進(jìn)行記錄,所以不能從內(nèi)存中找到數(shù)據(jù)包信息而進(jìn)行記錄。但是因?yàn)榱斜砝锏男畔⑴c數(shù)據(jù)包是一一對(duì)應(yīng)的,所以就把表內(nèi)的信息按照設(shè)定的格式完完全全的寫(xiě)入文件中即可。這樣就完成了一次數(shù)據(jù)包的信息記錄。當(dāng)然,記錄完數(shù)據(jù)后,也可以通過(guò)ifstream文件流將數(shù)據(jù)重新加入列表框中顯示分析。</p><

102、p> ?。?) 線程控制模塊:這個(gè)模塊是需要抓包模塊調(diào)用。當(dāng)用戶點(diǎn)擊“開(kāi)始捕包”菜單按鈕的時(shí)候,捕包模塊開(kāi)始調(diào)用捕包初始化函數(shù),接著使用CreatThread()函數(shù)創(chuàng)建新的捕包線程。在用戶按下“停止捕包”菜單按鈕時(shí),抓包模塊將調(diào)用該模塊,停止線程,停止數(shù)據(jù)包的捕獲。</p><p><b>  4.3系統(tǒng)類圖</b></p><p>  4.3.1系統(tǒng)類關(guān)系圖

103、</p><p>  4.3.2關(guān)鍵類的說(shuō)明</p><p>  CpackHandle: 本類是本系統(tǒng)的關(guān)鍵類,窗口類對(duì)本類實(shí)例化就可以進(jìn)行初始化套接字、抓取數(shù)據(jù)包、解析數(shù)據(jù)包等一系列操作。詳細(xì)說(shuō)明見(jiàn)表4.1</p><p>  表 4.1 CpackHandle詳細(xì)說(shuō)明表</p><p>  CMainFrame: 主窗口類,所有的界面

104、操作都在這里進(jìn)行,而通過(guò)界面的操作,來(lái)啟動(dòng)一些后臺(tái)操作,如抓包,并將結(jié)果以列表、曲線顯示出來(lái)。</p><p><b>  詳細(xì)說(shuō)明見(jiàn)表4.2</b></p><p>  表 4.2 CMainFrame詳細(xì)說(shuō)明表</p><p>  CIPListView: 列表視圖,將各個(gè)數(shù)據(jù)包在列表框中顯示。</p><p>&

105、lt;b>  詳細(xì)說(shuō)明見(jiàn)表4.3</b></p><p>  表 4.3 CIPListView詳細(xì)說(shuō)明表</p><p>  CFigureView: 列表視圖,將各個(gè)數(shù)據(jù)包在列表框中顯示。</p><p><b>  詳細(xì)說(shuō)明見(jiàn)表4.4</b></p><p>  表 4.3 CFigureVie

106、w詳細(xì)說(shuō)明表</p><p><b>  4.4 系統(tǒng)流程圖</b></p><p>  圖4.1 系統(tǒng)流程圖</p><p><b>  4.5 安全控制</b></p><p>  進(jìn)行系統(tǒng)的安全控制,主要是為了保證軟件的正常運(yùn)行。一般而言,從數(shù)據(jù)環(huán)境和數(shù)據(jù)處理兩方面來(lái)看,影響系統(tǒng)安全的因素主要

107、有環(huán)境性因素和數(shù)據(jù)處理因素。環(huán)境性因素,包括硬件和系統(tǒng)軟件、系統(tǒng)開(kāi)發(fā)等方面。例如,硬件軟件方面,硬件失靈,系統(tǒng)軟件失靈,邏輯線路錯(cuò)誤等;系統(tǒng)開(kāi)發(fā)方面,沒(méi)有按科學(xué)的方法開(kāi)發(fā)系統(tǒng)和設(shè)計(jì)程序、系統(tǒng)未經(jīng)測(cè)試和調(diào)試等。數(shù)據(jù)處理因素,是指數(shù)據(jù)處理行為引起的各種情況。例如,處理環(huán)節(jié)使用了錯(cuò)誤的程序、錯(cuò)誤的數(shù)據(jù)文件,處理不及時(shí),丟失數(shù)據(jù)文件和程序。因此,要進(jìn)行系統(tǒng)的安全控制,應(yīng)針對(duì)影響系統(tǒng)安全的兩方面因素入手,有的放矢,相應(yīng)地進(jìn)行環(huán)境和數(shù)據(jù)處理兩方面的

108、有效控制,以保證系統(tǒng)安全有效地運(yùn)行。本系統(tǒng)中主要使用的安全控制包括:</p><p> ?。?)軟件運(yùn)行系統(tǒng)環(huán)境</p><p>  由于目前Windows7系統(tǒng)與Windows XP系統(tǒng)性的變化,而本程序的運(yùn)行環(huán)境是Windows XP, 并不完全兼容Windows系統(tǒng)的各個(gè)版本,尤其在Window7系統(tǒng)中,如果不以管理員身份運(yùn)用,則無(wú)法正常啟動(dòng)抓包程序,因此,為了避免不必要的錯(cuò)誤,程序

109、中作了系統(tǒng)版本的判別,本程序定義了一個(gè)OSVERSIONINFO結(jié)構(gòu),通過(guò)在啟動(dòng)抓包的時(shí)候,調(diào)用GetVersionEx()函數(shù),將系統(tǒng)版本信息及時(shí)存入OSVERSIONINFO結(jié)構(gòu)中,進(jìn)而比較出當(dāng)前程序運(yùn)行系統(tǒng)是否為Windows XP,如果不是則提示用戶,由用戶來(lái)決定是否繼續(xù)運(yùn)行本軟件。</p><p><b> ?。?)初始化階段</b></p><p>  主

110、要是套接字的初始化階段,包括創(chuàng)建套接字,綁定套接字,設(shè)置套接字等,如果其中一個(gè)環(huán)節(jié)出錯(cuò),為了避免不必要的錯(cuò)誤,程序就不應(yīng)該繼續(xù)進(jìn)行下去,同時(shí)為了軟件的維護(hù),通過(guò)WSAGetLastError()函數(shù)提示使用出現(xiàn)了的問(wèn)題,并馬上返回,結(jié)束程序運(yùn)行。</p><p><b> ?。?)捕包階段</b></p><p>  之前也有提到過(guò),通過(guò)使用多線程來(lái)防止系統(tǒng)崩潰。&l

111、t;/p><p><b>  數(shù)據(jù)的使用與釋放</b></p><p>  數(shù)據(jù)使用前,應(yīng)該養(yǎng)成初始化的好習(xí)慣,如果不進(jìn)行初始化數(shù)據(jù)對(duì)應(yīng)的內(nèi)存值不一定為0或空,可能會(huì)出現(xiàn)亂碼,也有可能是其他程序未釋放的數(shù)據(jù)。本程序中TCP、IP等數(shù)據(jù)結(jié)構(gòu)在使用前都使用了memset()函數(shù)清空內(nèi)存,值得注意的是OSVERSIONINFO結(jié)構(gòu)是必須清空的,否則無(wú)法獲取系統(tǒng)版本信息。另外,在

溫馨提示

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

評(píng)論

0/150

提交評(píng)論