版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、<p><b> 摘 要</b></p><p> 隨著信息技術的發(fā)展及網(wǎng)絡應用的普及和擴大,家庭或小型辦公網(wǎng)絡處處可見,網(wǎng)絡管理、故障排除不再是專家的“專利”,了解網(wǎng)絡結構,對網(wǎng)絡連接進行檢測成為用戶的基本需求,然而路由跟蹤是網(wǎng)絡結構發(fā)現(xiàn),網(wǎng)絡故障診斷的重要工具,它越來越受用戶的關注。方便、快捷、可視的路由跟蹤小軟件也應運而生。</p><p>
2、本文主要介紹了路由跟蹤程序的實現(xiàn)原理,從而深入了解ICMP協(xié)議,ICMP報文格式及各字段含義。論文中包括路由跟蹤需求分析、總體設計和詳細設計的過程,闡述了以JAVA為開發(fā)平臺、以Eclipse為集成開發(fā)環(huán)境實現(xiàn)網(wǎng)絡底層開發(fā)的方法。軟件系統(tǒng)中實現(xiàn)了Traceroute和Ping(Packet Internet Grope)程序。</p><p> 關鍵詞 路由跟蹤; PING; JAVA;JPCAP</p&
3、gt;<p><b> 目 錄</b></p><p><b> 摘 要I</b></p><p> Abstract錯誤!未定義書簽。</p><p><b> 目 錄II</b></p><p><b> 第1章 緒論1<
4、;/b></p><p> 1.1 課題背景1</p><p> 1.2 開發(fā)環(huán)境介紹1</p><p> 1.2.1 JAVA1</p><p> 1.2.2 Eclipse開發(fā)環(huán)境2</p><p> 1.2.3 Jpcap 簡介2</p><p> 第2章 總體
5、設計5</p><p> 2.1 需求分析5</p><p> 2.2 系統(tǒng)主要功能描述5</p><p> 2.3 系統(tǒng)模塊圖5</p><p> 2.3.1 系統(tǒng)模塊概述5</p><p> 2.3.2 系統(tǒng)模塊設計圖5</p><p> 2.4 本章小結6<
6、/p><p> 第3章 詳細設計7</p><p> 3.1 系統(tǒng)設計7</p><p> 3.1.1 Ping的實現(xiàn)原理7</p><p> 3.1.2 Traceroute的實現(xiàn)原理7</p><p> 3.1.3 IP報文結構8</p><p> 3.1.4 ICMP報文
7、結構9</p><p> 3.1.5 Ethenet報文結構11</p><p> 3.2 系統(tǒng)流程圖設計12</p><p> 3.2.1 Ping流程圖12</p><p> 3.2.2 Traceroute流程圖13</p><p> 3.3 界面設計14</p><p&
8、gt; 3.4 本章小結15</p><p> 第4章 系統(tǒng)實現(xiàn)16</p><p> 4.1 數(shù)據(jù)包構造實現(xiàn)16</p><p> 4.1.1 IP報文實現(xiàn)16</p><p> 4.1.2 ICMP報文實現(xiàn)19</p><p> 4.1.3 Ethenet報文實現(xiàn)21</p>
9、<p> 4.2 Ping的實現(xiàn)23</p><p> 4.3 Traceroute的實現(xiàn)26</p><p> 4.4 界面的實現(xiàn)29</p><p> 4.4.1 Ping控制面板實現(xiàn)29</p><p> 4.4.2 Traceroute控制面板實現(xiàn)30</p><p> 4.4.
10、3 主界面實現(xiàn)30</p><p> 4.5 本章小結30</p><p> 第5章 系統(tǒng)測試31</p><p> 5.1 測試環(huán)境31</p><p> 5.2 測試過程31</p><p> 5.2.1 Ping測試31</p><p> 5.2.2 Tracero
11、ute測試34</p><p> 5.2.3 界面功能測試35</p><p> 5.3 測試結果37</p><p> 5.4 本章小結37</p><p><b> 結 論38</b></p><p><b> 參考文獻39</b></p&g
12、t;<p><b> 致 謝40</b></p><p><b> 第1章 緒論</b></p><p><b> 1.1 課題背景</b></p><p> 路由是把信息從源穿過網(wǎng)絡傳遞到目的地的行為,在傳輸過程中,遇到一系列的中間節(jié)點。這些中間節(jié)點構成了路由跟蹤的依據(jù)。路
13、由的話題早已在計算機界出現(xiàn),但直到八十年代中期才獲得商業(yè)成功,這一時間延遲的主要原因是七十年代的網(wǎng)絡很簡單,后來大型的網(wǎng)絡才較為普遍。而路由跟蹤是在路由的基礎上提出的問題,是利用路由跟蹤實用程序于確定 IP 數(shù)據(jù)報訪問目標所采取的路徑。</p><p> 當我們不能通過網(wǎng)絡訪問目的設備時,網(wǎng)絡運行者就需要判斷是哪里出了問題。問題不僅僅會出現(xiàn)在最終目的設備,也可能出現(xiàn)在轉發(fā)數(shù)據(jù)包的中間路由器。解決方法是,了解了I
14、P數(shù)據(jù)報訪問目標所采取的路徑,將發(fā)現(xiàn)網(wǎng)絡布網(wǎng)簡單拓撲,確定路由斷點即可解決網(wǎng)絡故障。</p><p> 操作系統(tǒng)中的tracert或traceroute路由跟蹤程序,通過它可以查看到達目標地址所經過的路徑。它的作用與ping有類似之處,使用ping可以檢查是否連接,如果不通,一般不好準確判斷哪一個節(jié)點出錯,而使用tracert則可以準確判斷出錯的部分。路由跟蹤程序隨著網(wǎng)絡的發(fā)展而發(fā)展,現(xiàn)已經較為成熟,不僅在操作
15、系統(tǒng)上有路由跟蹤程序,在中間設備也加入路由跟蹤程序,如cisco擴展路由跟蹤程序,提供詳細的參數(shù)選擇。</p><p> 單、多線程路由跟蹤程序都已經面世,實現(xiàn)方式也各不相同,如基于記錄路由選項的,基于UDP,基于ICMP Echo Request的路由探測。本課題主要對該方向進一步研究,把Ping和Traceroute同時集成在一個軟件系統(tǒng)上,利用基于ICMP Echo Request的路由探測方法,并用多線
16、程編程實現(xiàn)多個目標同時跟蹤,使之成為方便、快捷、可視化的網(wǎng)絡輕型管理工具。</p><p> 1.2 開發(fā)環(huán)境介紹</p><p> 1.2.1 JAVA</p><p> Java是Java程序設計語言和Java平臺的總稱。Java平臺由Java虛擬機(Java Virtual Machine)和Java 應用編程接口(Application Program
17、ming Interface、簡稱API)構成。Java 應用編程接口為Java應用提供了一個獨立于操作系統(tǒng)的標準接口,可分為基本部分和擴展部分。在硬件或操作系統(tǒng)平臺上安裝一個Java平臺之后,Java應用程序就可運行?,F(xiàn)在Java平臺已經嵌入了幾乎所有的操作系統(tǒng)。這樣Java程序可以只編譯一次,就可以在各種系統(tǒng)中運行。</p><p> Java是一種簡單的,面向對象的,分布式的,解釋型的,健壯安全的,結構中
18、立的,可移植的,性能優(yōu)異、多線程的動態(tài)語言。</p><p> Java是跨平臺語言,一般來說對網(wǎng)絡的操作都在IP層以上,也就是只能對tcp/udp進行操作,當然也可以設置部分tcp/udp的option,如果想再往IP層或者數(shù)據(jù)link層操作就無能為力了,必須依靠JNI使用本地OS的socket部分接口。很幸運,我在知道有WinPcap的同時也知道有人在開發(fā)Jpcap,此包可以方便的操作網(wǎng)絡底層應用協(xié)議,以下
19、1.2.3小節(jié)將對Jpcap API作詳細說明。</p><p> 1.2.2 Eclipse開發(fā)環(huán)境</p><p> Eclipse 是一個開放源代碼的、基于 Java 的可擴展開發(fā)平臺。就其本身而言,它只是一個框架和一組服務,用于通過插件組件構建開發(fā)環(huán)境。幸運的是,Eclipse 附帶了一個標準的插件集,包括 Java 開發(fā)工具(Java Development Tools,JD
20、T)。 </p><p> Eclipse是著名的跨平臺的自由集成開發(fā)環(huán)境(IDE)。Eclipse是一個開發(fā)源碼項目,任何人都可以免費得到,并可以在此基礎上開發(fā)各自的插件,因此越來越受人們關注。使用者只需下載各種語言的插件即可。</p><p> Eclipse專注于為高度集成的工具開發(fā)提供一個全功能的平臺。它主要由Eclipse項目、Eclipse工具項目和Eclipse技術項目三
21、個項目組成,具體包括四個部分組成——Eclipse Platform、JDT、CDT和PDE.JDT支持Java開發(fā)、CDT支持C開發(fā)、PDE用來支持插件開發(fā),Eclipse Platform則是一個開放的可擴展IDE,提供了一個通用的開發(fā)平臺。它提供建造塊和構造并運行集成軟件開發(fā)工具的基礎。Eclipse Platform允許工具建造者獨立開發(fā)與他人工具無縫集成的工具從而無須分辨一個工具功能在哪里結束,而另一個工具功能在哪里開始。&l
22、t;/p><p> Eclipse SDK(軟件開發(fā)者包)是Eclipse Platform、JDT和PDE所生產的組合并,它們可以一次下載。這些部分在一起提供了一個具有豐富特性的開發(fā)環(huán)境,允許開發(fā)者有效地建造可以無縫集成到Eclipse Platform中的工具。Eclipse SDK由Eclipse項目生產的工具和來自其它開放源代碼的第三方軟件組合而成。Eclipse項目生產的軟件以 CPL發(fā)布,第三方組件有各
23、自自身的許可協(xié)議。</p><p> Eclipse讓JAVA開發(fā)更快捷更高效,無論對于龐大的開發(fā)項目還是微小的程序設計它都成為用戶的青睞。</p><p> 1.2.3 Jpcap 簡介</p><p> 1.JPCAP開發(fā)環(huán)境安裝</p><p> 只需要把lib中的dll文件拷貝到jre的bin目錄,同時lib中的jar文件拷貝
24、到jre中的lib/ext目錄下就安裝完整,當然你可以使用exe安裝包進行安裝,這樣會更加的簡單。</p><p> 需要注意的是,我們經常使用的Windows XP操作系統(tǒng)大部分都是精簡版,可能少了WinCap工具,所以在程序開發(fā)時,同時安裝上WinPcap。</p><p> 2.Jpcap類庫的基本結構如圖1-1所示:</p><p> 圖1-1 Jpc
25、ap 類庫結構</p><p> 3. Packet基類及其子類</p><p> Packet這個類是所有被捕獲的數(shù)據(jù)包的基類,可以提供被捕獲數(shù)據(jù)包的長度,被捕獲數(shù)據(jù)包的時間標記等基本信息。</p><p> ARPPacket和IPPacket是繼承Packet的子類,它們將被捕獲包分成兩類。ARPPacket按照ARP數(shù)據(jù)報的內容,將其各數(shù)據(jù)段的數(shù)據(jù)取出
26、。IPPacket則被分得更細。這兩個類主要與是與數(shù)據(jù)鏈路層密切相關的,其與MAC地址相關的信息在EthemetPacket類中表示出來。EthemetPacket是從DatalinkPacket繼承而來的。</p><p> IPPacket下有三個子類,分別是ICMPPacket、TCPPacket、UDPPacket。這三個類分別表示的是被存儲在IP數(shù)據(jù)報的報文中發(fā)送的ICMP、TCP、UDP報文。<
27、;/p><p> 在被捕獲包的基本信息就可以通過直接轉化為字符串(toString)而得到。</p><p> 如ICMPPacket在用toString方法直接轉化,得到字符串為:類型 type(type) 執(zhí)行命令code(code)。</p><p> 4. Jpcap的主要功能</p><p> Jpcap提供了十分方便的數(shù)據(jù)包捕
28、獲方法。Jpcap使用一個事件模型來處理包。首先,必須創(chuàng)建一個執(zhí)行接口jpcap.JpcapHandler的類。</p><p> public class Jpcaphandler implements JpcapHandler {</p><p> public void handlePacket(Packet packet){</p><p> Syst
29、em.out.println(packet);</p><p><b> }</b></p><p><b> } </b></p><p> 為了捕獲包,需要讓Jpcap知道要用哪個網(wǎng)絡設備來監(jiān)聽。API提供了jpcap.Jpcap.getDeviceList()方法以滿足這一目的。這個方法返回一列字符串,可以按一
30、下方法如下使用它:</p><p> String[] devices = Jpcap.getDeviceList(); </p><p> 一旦有了一個設備名稱的目錄,只要從其中選取一個用來監(jiān)聽:</p><p> String deviceName = devices[0]; </p><p> 選擇一個設備之后,通過Jpcap.
31、openDevice()方法打開它。openDevice()方法需要四個參數(shù):即將打開的設備名,從設備上一次讀取的最大字節(jié)數(shù),說明是否將設備設為混雜模式的Boolean值,和以后調用processPacket()方法要使用到的超時值。</p><p> Jpcapjpcap = Jpcap.openDevice(deviceName, 1024, false, 10000); </p><p
32、> openDevice()方法將一個參數(shù)返回到用以捕獲的Jpcap對象。既然有了Jpcap實例,你可以調用processPacket() 或loopPacket()開始監(jiān)聽了。這兩種方式都帶有兩個參數(shù):捕獲的最大包數(shù)可以是-1(說明沒有限制);執(zhí)行JpcapHandler的一個類的實例。</p><p> 如果你調用processPacket(),那么Jpcap將一直捕獲包,直到超過openDevic
33、e中規(guī)定的時限或達到了規(guī)定的最大包數(shù)。loopPacket()則將一直捕獲包,直到達到最大包數(shù),如果沒有最大數(shù)限制,它將永遠運行下去。就像下面這樣調用:</p><p> jpcap.loopPacket(-1, new Jpcaphandler()); </p><p> 對于捕獲的數(shù)據(jù)包,可以利用Jpcap中的Packet及其子類進行分類分析,獲得數(shù)據(jù)包的詳細信息。</p&g
34、t;<p> Jpcap還有進行數(shù)據(jù)包過濾的函數(shù)setFilter(java.lang.String condition, boolean optimize)。其中condition是過濾條件。在進行數(shù)據(jù)包捕獲前設置過濾條件,可以將不感興趣的數(shù)據(jù)包剔除。</p><p> jpcap.setFilter("host 210.212.147.149",tru
35、e);</p><p> 因為Jpcap對數(shù)據(jù)包進行了分類,而數(shù)據(jù)包中的關鍵字段也有接口調用,所以在設置過濾條件時也可以在利用這些條件進行更細致的分類。</p><p> Jpcap還提供了用來發(fā)送數(shù)據(jù)包的一個類JpcapSender,可以用來發(fā)送IPPacket及其子類,包括IPPacket、ICMPPacket、TCPPacket、UDPPacket。定義好一個相應的包后,就可以利
36、用sendPacket函數(shù)發(fā)送數(shù)據(jù)包。</p><p> JpcapSender sender=JpcapSender.openDevice(Jpcap.getDeviceList()[0]);</p><p> sender.sendPacket(p); //send a packet</p><p><b> 第2章 總體設計</b>
37、</p><p><b> 2.1 需求分析</b></p><p> 系統(tǒng)實現(xiàn)路由的跟蹤,每經過一個路由,要求得到經過該路由節(jié)點的地址,也就是說輸入目標信息,可以得到本地主機到目標經過的所有中間節(jié)點。這些中間節(jié)點用IP地址標識。并要求對跟蹤跳數(shù),每一跳等待時間可控。</p><p> 為了讓系統(tǒng)更加完善,首先要測試目標的連通性,系統(tǒng)中也
38、要實現(xiàn)目標探測功能,即Ping功能。</p><p> 2.2 系統(tǒng)主要功能描述</p><p> 數(shù)據(jù)包構造:主要實現(xiàn)IP包,ICMP包和Ethenet包的構造(參考Jpcap包構造方法)。</p><p> 獲取本地網(wǎng)絡信息 :主要實現(xiàn)PC機網(wǎng)絡設備(網(wǎng)卡)的打開,獲取該網(wǎng)卡的網(wǎng)絡信息,如IP,MAC地址。</p><p> Pi
39、ng功能:主要實現(xiàn)測試到達目的網(wǎng)絡節(jié)點是否暢通,與windows自帶Ping功能基本相同。</p><p> Traceroute功能:主要實現(xiàn)路由跟蹤方法,輸入跟蹤目標的IP地址或URL地址,即可跟蹤,亦可進行多目標的同時跟蹤。</p><p> 界面模塊:主要實現(xiàn)可視化操作界面。</p><p><b> 2.3 系統(tǒng)模塊圖</b>&
40、lt;/p><p> 2.3.1 系統(tǒng)模塊概述</p><p> 按系統(tǒng)實現(xiàn)要求主要分成5大模塊:數(shù)據(jù)包構造模塊、獲取本地網(wǎng)絡信息模塊、Ping功能模塊、Traceroute功能模塊和界面模塊。其中,數(shù)據(jù)包構造模塊包括IP包構造、ICMP包構造和Ethernet包構造;獲取本地網(wǎng)絡信息模塊包打開網(wǎng)絡設備和獲取本地信息功能;Ping功能模塊和Traceroute功能模塊是發(fā)送數(shù)據(jù)包,監(jiān)聽接收
41、的數(shù)據(jù)包進行分析處理;界面模塊包括Ping控制面板,Traceroute控制面板和主控制面板。</p><p> 2.3.2 系統(tǒng)模塊設計圖</p><p> 系統(tǒng)模塊圖如圖2-1所示。</p><p> 圖2-1 系統(tǒng)模塊設計圖</p><p><b> 2.4 本章小結</b></p><
42、p> 本章主要講述了系統(tǒng)的需求分析、整體模塊劃分,對系統(tǒng)進行結構總體設計,為進一步做好系統(tǒng)詳細設計做好準備。</p><p><b> 第3章 詳細設計</b></p><p><b> 3.1 系統(tǒng)設計</b></p><p> 系統(tǒng)設計中,了解系統(tǒng)中各個模塊實現(xiàn)原理是設計的基礎,以下分別對系統(tǒng)中主要原理進
43、行詳細闡述,為進一步流程設計做準備。</p><p> 3.1.1 Ping的實現(xiàn)原理</p><p> Ping (Packet Internet Grope),因特網(wǎng)包探索器,用于測試網(wǎng)絡連接量的程序。Ping發(fā)送一個ICMP回聲請求消息給目的地并報告是否收到所希望的ICMP回聲應答。</p><p> 以下面一個網(wǎng)絡為例:有A、B、C、D四臺機子,一臺路
44、由RA,子網(wǎng)掩碼均為255.255.255.0,默認路由為192.168.0.1。</p><p> 在同一網(wǎng)段內,在主機A上運行“Ping 192.168.0.5”后,都發(fā)生了些什么呢? 首先,Ping命令會構建一個固定格式的ICMP請求數(shù)據(jù)包,然后由ICMP協(xié)議將這個數(shù)據(jù)包連同地址“192.168.0.5”一起交給IP層協(xié)議(和ICMP一樣,實際上是一組后臺運行的進程),IP層協(xié)議將以地址“192.168.
45、0.5”作為目的地址,本機IP地址作為源地址,加上一些其他的控制信息,構建一個IP數(shù)據(jù)包,并想辦法得到192.168.0.5的MAC地址(物理地址,這是數(shù)據(jù)鏈路層協(xié)議構建數(shù)據(jù)鏈路層的傳輸單元——幀所必需的),以便交給數(shù)據(jù)鏈路層構建一個數(shù)據(jù)幀。關鍵就在這里,IP層協(xié)議通過機器B的IP地址和自己的子網(wǎng)掩碼,發(fā)現(xiàn)它跟自己屬同一網(wǎng)絡,就直接在本網(wǎng)絡內查找這臺機器的MAC,如果以前兩機有過通信,在A機的ARP緩存表應該有B機IP與其MAC的映射關
46、系,如果沒有,就發(fā)一個ARP請求廣播,得到B機的MAC,一并交給數(shù)據(jù)鏈路層。后者構建一個數(shù)據(jù)幀,目的地址是IP層傳過來的物理地址,源地址則是本機的物理地址,還要附加上一些控制信息,依據(jù)以太網(wǎng)的介質訪問規(guī)則,將它們傳送出去。</p><p> 主機B收到這個數(shù)據(jù)幀后,先檢查它的目的地址,并和本機的物理地址對比,如符合,則接收;否則丟棄。接收后檢查該數(shù)據(jù)幀,將IP數(shù)據(jù)包從幀中提取出來,交給本機的IP層協(xié)議。同樣,I
47、P層檢查后,將有用的信息提取后交給ICMP協(xié)議,后者處理后,馬上構建一個ICMP應答包,發(fā)送給主機A,其過程和主機A發(fā)送ICMP請求包到主機B一模一樣。</p><p> 不在同一網(wǎng)段內,在主機A上運行“Ping 192.168.1.4”后,開始跟上面一樣,到了怎樣得到MAC地址時,IP協(xié)議通過計算發(fā)現(xiàn)D機與自己不在同一網(wǎng)段內,就直接將交由路由處理,也就是將路由的MAC取過來,至于怎樣得到路由的MAC,跟上面一
48、樣,先在ARP緩存表找,找不到就廣播吧。路由得到這個數(shù)據(jù)幀后,再跟主機D進行聯(lián)系,如果找不到,就向主機A返回一個超時的信息。</p><p> 3.1.2 Traceroute的實現(xiàn)原理</p><p> Traceroute程序的實現(xiàn)主要涉及IP頭部生存時間(time to live ,TTL)字段的使用。</p><p> 設置TTL字段的目的是防止數(shù)據(jù)報
49、由于選路錯誤或其他軟硬件原因從而導致在網(wǎng)絡中無休止的流動,它指定了數(shù)據(jù)報的生存時間。TTL的初始值由源主機設置,當一份數(shù)據(jù)報經過路由器時,處理該數(shù)據(jù)報的路由器都需要把TTL值減去數(shù)據(jù)報在路由器中停留的秒數(shù)。但事實上大多數(shù)路由器只是簡單地將TTL值減1,因此TTL字段最終被實現(xiàn)為一個跳站計數(shù)器。當TTL字段的值被減為0時,路由器就不會轉發(fā)該數(shù)據(jù)報,而是將其丟棄,并產生一份ICMP超時差錯報文發(fā)往源主機以通知錯誤的發(fā)生。Traceroute
50、程序的關鍵就在于返回的這份ICMP超時差錯報文的源地址就是途經路由器的IP地址。由此,通過依次遞增TTL字段的值,就可以得到一份數(shù)據(jù)報在其傳輸路徑上所經過的路由信息。</p><p> Traceroute程序在具體實現(xiàn)時,是令其向目的主機發(fā)送一個ICMP回顯請求(Echo request)消息,并重復遞增IP頭部TTL字段的值。剛開始的時候TTL等于1,這樣當該數(shù)據(jù)報抵達途中的第一個路由器時,TTL的值就被減
51、為0,導致發(fā)生超時錯誤,因此該路由器生成一份ICMP超時差錯報文返回給源主機。隨后,主機將數(shù)據(jù)報的TTL值遞增1,以便IP報文能傳遞到下一個路由器,下一個路由器將會生成ICMP超時超時差錯報文返回給源主機。不斷重復這個過程,直到數(shù)據(jù)報到達最終的目的主機,此時目的主機將返回ICMP回顯應答(Echo replay)消息。這樣,源主機只需對返回的每一份ICMP報文進行解析處理,就可以掌握數(shù)據(jù)報從源主機到達目的主機途中所經過的路由信息。<
52、;/p><p> 3.1.3 IP報文結構</p><p> IP數(shù)據(jù)報的最開始存放著IP的版本(version)。Ipv4版本存放為4。接下來IHL是一個字符,即以32位為一個單位,存放著從版本開始到填充結束的報頭的長度。最短的情況沒有選項,這是IHL的值為5。</p><p> 服務類型字段(type of service)表示IP數(shù)據(jù)報在傳遞時發(fā)送端要求的品
53、質。第七位是為將來預留的擴展位。</p><p> 數(shù)據(jù)報長度字段(total length)以8位為一個單位,即字節(jié)表示IP數(shù)據(jù)報的長度。接下來的標識字段(identification),從TCP等上層協(xié)議調用時IP數(shù)據(jù)報的標識號。</p><p> 標志字段(flags)和數(shù)據(jù)塊偏移(fragment offset)用于對數(shù)據(jù)塊偏移的處理。IP數(shù)據(jù)報要在數(shù)據(jù)鏈路層的協(xié)議規(guī)定下裝入幀
54、的報文中傳送,由于IP數(shù)據(jù)報中,報文部分最大就有65535為,數(shù)據(jù)鏈路層的幀是不能全部容納的,所以采用叫做分塊的方法。分割的數(shù)據(jù)稱為碎塊。IP數(shù)據(jù)報的標志表示有無碎塊,數(shù)據(jù)塊偏移用于保證數(shù)據(jù)塊偏移按照正確的順序處理。</p><p> TTL字段是為了防止錯誤的IP數(shù)據(jù)報在網(wǎng)絡上循環(huán),賦予IP數(shù)據(jù)報一定的壽命。IP數(shù)據(jù)報在發(fā)送時就在TTL字段中設置其壽命。TTL字段的值在IP數(shù)據(jù)報每通過一次路由器時,進行一次衰
55、減。當為0時,IP數(shù)據(jù)報就被刪除。通常設為最大值255。</p><p> 協(xié)議字段(protocol)中存放著表示TCP等IP的上層協(xié)議的值。包括ICMP、TCP、EGP、IGP、UDP等。</p><p> 在檢查錯誤的報頭校驗碼(header checksum)的后面是發(fā)送端地址和目的地址,他們在Ipv4中都為32位。最后存放的是選項和把報頭進行32位整數(shù)化后余下的位。</
56、p><p> IP報文結構如圖3-1所示:</p><p> 圖3-1 IP數(shù)據(jù)包頭的結構</p><p> 3.1.4 ICMP報文結構</p><p> 1.ICMP報文與IP報文的關系</p><p> ICMP是因特網(wǎng)控制報文協(xié)議(Internet Control Message Protocol,ICM
57、P)的縮寫。ICMP通常被認為是IP層的一個組成部分(子協(xié)議),主要用于在IP主機和路由器之間傳遞控制消息。但從結構上看它位于IP層的上方,因為ICMP報文是封裝在IP數(shù)據(jù)報內作為有效載荷傳輸?shù)模cIP報文的關系如圖3-2所示。</p><p> 圖3-2 IP報文與ICMP報文的關系</p><p> 2.ICMP報文結構</p><p> ICMP報文的
58、一般格式如圖3-3所示,所有ICMP報文的前4個字節(jié)都是一樣的,但是剩余的其他字節(jié)則根據(jù)不同的類型和代碼而有所區(qū)別。</p><p> 圖3-3 ICMP報文的一般格式</p><p> 類型(type)字段可以有15個不同的取值,用來描述特定類型的ICMP報文。ICMP報文可以劃分為查詢報文和差錯報告報文兩類,某些ICMP報文進一步使用代碼(code)字段來描述同一類型下的不同條件,
59、因此不同類型的ICMP報文是由類型字段和代碼字段共同決定的。16位校驗和字段使用與IP報頭的校驗和字段機同的網(wǎng)際校驗算法,不同的是該校驗和覆蓋整個ICMP報文,即校驗內容不僅包括ICMP報頭,還包括ICMP數(shù)據(jù)部分。</p><p> 部分類型的ICMP報文及其說明參照表3-1。</p><p> 表3-1 部分ICMP報文參照表</p><p> 3.ICM
60、P回顯請求與回顯應答報文</p><p> 系統(tǒng)中涉及3種類型的ICMP報文:ICMP回顯請求報文、ICMP回顯應答報文和ICMP超時差錯報文。其中,ICMP回顯請求與回顯應答報文結構如圖3-4所示。</p><p> 圖3-4 ICMP回顯請求與應答報文結構</p><p> 這兩種報文通常也稱作Ping報文,目的是為了測試一臺主機到另一臺主機是否可達。當一
61、臺主機收到ICMP回顯請求報文后,接收主機應向源主機回送ICMP回顯應答報文,且該回顯報文必須響應源報文中標識符、序列號和選項數(shù)據(jù)三個字段(即應將這三個字段原封不動地返回)。</p><p> 4.ICMP超時差錯報文</p><p> ICMP超時報文會在兩種情況下產生:一是路由器在轉發(fā)數(shù)據(jù)報時IP頭部的TTL值減為0,二是當組成一個數(shù)據(jù)報的所有分片未能在某一限定時間內到達目的主機而
62、導致的超時。兩種情況下路由器或目的主機都將丟棄相應分組并向源主機發(fā)送超時差錯報文,本程序主要是利用第一種情況產生的超時差錯報文來收集路由信息。</p><p> ICMP超時差錯報文的結構如圖3-5所示。</p><p> 圖3-5 ICMP超時差錯報文結構</p><p> ICMP(所有)差錯報文的規(guī)則是:報文中的數(shù)據(jù)部分必須包含產生該差錯報文的IP數(shù)據(jù)報
63、頭部(包含選項字段),以及(至少包含)跟在該IP頭部后面的前8個字節(jié)。這樣接收ICMP的進程就可以根據(jù)所包含的差錯數(shù)據(jù)將其與之前的某個特定的報文或進程關聯(lián)起來。</p><p> 對于使用的回顯請求報文,由它產生的ICMP超時差錯報文的完整格式如圖3-6所示。</p><p> 圖5-6 ICMP超時差錯報文的完整格式</p><p> 3.1.5 Ethen
64、et報文結構</p><p> 以太網(wǎng)幀的結構是這樣。開始的64位是前同步碼(preamble)和幀首定界符(start frame delimiter)。前同步碼是使發(fā)送端和接收端在數(shù)據(jù)的交接上步調一致的信號。發(fā)送端以56位(10101010…10)反復發(fā)送1和0信號。接收端接收到這種信號后,準備讀取發(fā)送來的信號。</p><p> 前同步碼結束后使表示幀的真正開始的8位(10101
65、011)位列。幀首定界符之后是地址等報頭信息。幀首定界符后面是接收端及發(fā)送端的MAC地址。只有在接收端的MAC地址是自己的MAC地址的情況下,才能進行幀的接收;MAC地址為其他機器的情況下,將不接收改幀。但當接收端地址全部都為1時,在同一以太網(wǎng)內連接的所有設備,都要接收該幀。地址全部為1的MAC地址稱為廣播地址。</p><p> 接收端和發(fā)送端的MAC地址后面是16位的類型字段(type field)。類型字
66、段中存放的是以太網(wǎng)幀中傳送數(shù)據(jù)的上層協(xié)議的種類代碼。以太網(wǎng)幀的報文部最大能存放12000位,即1500字節(jié)。以太網(wǎng)是物理層及數(shù)據(jù)鏈路層的協(xié)議。以太網(wǎng)幀所傳送的數(shù)據(jù)是網(wǎng)絡層規(guī)定的數(shù)據(jù)包。如果要使用IP網(wǎng)絡協(xié)議,則IP數(shù)據(jù)包就將存儲在以太網(wǎng)幀的報文處。幀的尾部是檢查數(shù)據(jù)錯誤的錯誤校驗及修正碼。以太網(wǎng)中常使用循環(huán)冗余校驗(CRC: Cyclic Redundancy Check)檢查錯誤。CRC中,將表示幀的位列作為多項式。把多項式與準備好的
67、特定多項式相除,得出的結果與數(shù)據(jù)一同發(fā)送。在接收端重新進行一次除法運算,用其結果確認傳送來的數(shù)據(jù)正確與否。Ethenet報文格式如圖3-7所示。</p><p> 圖3-7 Ethenet報文格式</p><p> 3.2 系統(tǒng)流程圖設計</p><p> 3.2.1 Ping流程圖</p><p> 根據(jù)3.1節(jié)對Ping原理的分析
68、,Ping程序流程圖如圖3-8所示。</p><p> 圖3-8 Ping流程圖</p><p> 3.2.2 Traceroute流程圖</p><p> 根據(jù)3.1節(jié)對Traceroute原理的分析,Traceroute流程圖如圖3-9所示。</p><p> 圖3-9 Traceroute流程圖</p><p
69、><b> 3.3 界面設計</b></p><p> 界面設計遵循KISS原則就是"Keep It Simple And Stupid"的縮寫,簡潔和易于操作。要求在界面中接收輸入的參數(shù),如目標信息,最大跳數(shù),等待時間等信息,然后按“確定”按鈕即可啟動Ping或Traceroute線程,啟動程序后實時在界面上顯示執(zhí)行信息,并要求可以停止當前運行的線程。<
70、/p><p><b> 3.4 本章小結</b></p><p> 在本章中,詳細地闡述設計的原理,并以圖文形式表達了本系統(tǒng)邏輯結構設計和各模塊的控制流程設計。</p><p><b> 第4章 系統(tǒng)實現(xiàn)</b></p><p> 4.1 數(shù)據(jù)包構造實現(xiàn)</p><p>
71、 本系統(tǒng)中主要用到的網(wǎng)絡數(shù)據(jù)報文包括IP報文、ICMP報文和Ethernet報文,上一章對報文結構及協(xié)議特性作了詳細分析,這節(jié)將用代碼實現(xiàn)這些報文。各報文之間的類關系如圖4-1所示。</p><p> 圖4-1 報文類之間的關系</p><p> 4.1.1 IP報文實現(xiàn)</p><p> 根據(jù)以上IP數(shù)據(jù)包的結構,程序實現(xiàn)如下。</p>&l
72、t;p> 1.數(shù)據(jù)包的基類,可以提供被捕獲數(shù)據(jù)包的長度,被捕獲數(shù)據(jù)包的時間標記等基本信息</p><p> public class Packet implements Serializable</p><p><b> {</b></p><p> public Packet()</p><p><
73、;b> {</b></p><p><b> }</b></p><p> void setPacketValue(long sec, long usec, int caplen, int len)</p><p><b> {</b></p><p> this.sec
74、 = sec;</p><p> this.usec = usec;</p><p> this.caplen = caplen;</p><p> this.len = len;</p><p><b> }</b></p><p> void setDatalinkPacket(Da
75、talinkPacket p)</p><p><b> {</b></p><p> datalink = p;</p><p><b> }</b></p><p> void setPacketData(byte data[])</p><p><b>
76、; {</b></p><p> this.data = data;</p><p><b> }</b></p><p> void setPacketHeader(byte header[])</p><p><b> {</b></p><p>
77、 this.header = header;</p><p><b> }</b></p><p> public String toString()</p><p><b> {</b></p><p> return (new StringBuilder(String.valueOf(s
78、ec))).append(":").append(usec).toString();</p><p><b> }</b></p><p> public long sec;</p><p> public long usec;</p><p> public int caplen;</
79、p><p> public int len;</p><p> public DatalinkPacket datalink;</p><p> public byte header[];</p><p> public byte data[];</p><p><b> }</b><
80、/p><p> 2.繼承父類Packet,實現(xiàn)IPPacket類</p><p> public class IPPacket extends Packet</p><p><b> {</b></p><p> public IPPacket()</p><p><b> {&l
81、t;/b></p><p> options = null;</p><p><b> }</b></p><p> public void setIPv4Parameter(int priority, boolean d_flag, boolean t_flag, boolean r_flag, int rsv_tos, bool
82、ean rsv_frag, boolean dont_frag, </p><p> boolean more_frag, int offset, int ident, int ttl, int protocol, InetAddress src, InetAddress dst)</p><p><b> {</b></p><p>
83、version = 4;</p><p> this.priority = (byte)priority;</p><p> this.d_flag = d_flag;</p><p> this.t_flag = t_flag;</p><p> this.r_flag = r_flag;</p><p>
84、 this.rsv_tos = (byte)rsv_tos;</p><p> this.rsv_frag = rsv_frag;</p><p> this.dont_frag = dont_frag;</p><p> this.more_frag = more_frag;</p><p> offset = (short)off
85、set;</p><p> this.ident = ident;</p><p> hop_limit = (short)ttl;</p><p> this.protocol = (short)protocol;</p><p> src_ip = src;</p><p> dst_ip = dst;&
86、lt;/p><p><b> }</b></p><p> void setIPv4Value(byte ver, byte pri, boolean d, boolean t, boolean r, byte rsv_tos, boolean rf, </p><p> boolean df, boolean mf, short offse
87、t, short len, short ident, short ttl, short proto, </p><p> byte src[], byte dst[])</p><p><b> {</b></p><p> version = ver;</p><p> priority = pri;</
88、p><p> d_flag = d;</p><p> t_flag = t;</p><p> r_flag = r;</p><p> this.rsv_tos = rsv_tos;</p><p> rsv_frag = rf;</p><p> dont_frag = df;&l
89、t;/p><p> more_frag = mf;</p><p> this.offset = offset;</p><p> length = len;</p><p> this.ident = ident;</p><p> hop_limit = ttl;</p><p>
90、protocol = proto;</p><p><b> try</b></p><p><b> {</b></p><p> src_ip = InetAddress.getByAddress(src);</p><p> dst_ip = InetAddress.getByAddr
91、ess(dst);</p><p><b> }</b></p><p> catch(UnknownHostException unknownhostexception) { }</p><p><b> }</b></p><p> void setOption(byte option[
92、])</p><p><b> {</b></p><p> this.option = option;</p><p><b> }</b></p><p> byte[] getSourceAddress()</p><p><b> {</b&
93、gt;</p><p> return src_ip.getAddress();</p><p><b> }</b></p><p> byte[] getDestinationAddress()</p><p><b> {</b></p><p> retur
94、n dst_ip.getAddress();</p><p><b> }</b></p><p> public String toString()</p><p><b> {</b></p><p> Return (new StringBuilder(String.valueOf(s
95、uper.toString()))).append(" ").append(src_ip).append("->").append(dst_ip).append(" protocol(").append(protocol).append(") priority(").append(priority).append(") ").app
96、end(d_flag ? "D" : "").append(t_flag ? "T" : "").append(r_flag ? "R" : "").append(" hop(").append(hop_limit).append(") ").append(rsv_frag ?
97、"RF/" : "").append(dont_frag ? "DF/" : "").append(more_frag ? "MF" : "").append(" offset(").append(offset).append(") ident(").append(ident).
98、append(")")</p><p><b> }</b></p><p> //(省略)IP包類型定義及ICMP包所用數(shù)據(jù)類型定義,實現(xiàn)代碼參見設計代碼</p><p><b> }</b></p><p> 4.1.2 ICMP報文實現(xiàn)</p><
99、;p> 根據(jù)以上ICMP包結構分析,繼承IP包結構,實現(xiàn)程序如下。</p><p> public class ICMPPacket extends IPPacket</p><p><b> {</b></p><p> public ICMPPacket()</p><p><b> {&l
100、t;/b></p><p><b> }</b></p><p> void setValue(byte type, byte code, short checksum, short id, short seq)</p><p><b> {</b></p><p> this.typ
101、e = type;</p><p> this.code = code;</p><p> this.checksum = checksum;</p><p> this.id = id;</p><p> this.seq = seq;</p><p><b> }</b></p
102、><p> void setID(short id, short seq)</p><p><b> {</b></p><p> this.id = id;</p><p> this.seq = seq;</p><p><b> }</b></p>
103、<p> void setTimestampValue(int orig, int recv, int trans)</p><p><b> {</b></p><p> orig_timestamp = orig;</p><p> recv_timestamp = recv;</p><p>
104、trans_timestamp = trans;</p><p><b> }</b></p><p> void setRedirectIP(byte ip[])</p><p><b> {</b></p><p><b> try</b></p>&
105、lt;p><b> {</b></p><p> redir_ip = InetAddress.getByAddress(ip);</p><p><b> }</b></p><p> catch(UnknownHostException unknownhostexception) { }</p>
106、;<p><b> }</b></p><p> byte[] getRedirectIP()</p><p><b> {</b></p><p> return redir_ip.getAddress();</p><p><b> }</b><
107、;/p><p> void setRouterAdValue(byte addr_num, byte entry_size, short alive_time, String addr[], int pref[])</p><p><b> {</b></p><p> this.addr_num = addr_num;</p>
108、<p> addr_entry_size = entry_size;</p><p> this.alive_time = alive_time;</p><p> for(int i = 0; i < addr_num; i++)</p><p><b> {</b></p><p><
109、b> try</b></p><p><b> {</b></p><p> router_ip[i] = InetAddress.getByName(addr[i]);</p><p><b> }</b></p><p> catch(UnknownHostExcep
110、tion unknownhostexception) { }</p><p> preference[i] = pref[i];</p><p><b> }</b></p><p><b> }</b></p><p> public String toString()</p>
111、<p><b> {</b></p><p> return (new StringBuilder(String.valueOf(super.toString()))).append("type(").append(type).append(") code(").append(code).append(")").t
112、oString();</p><p><b> }</b></p><p> //(省略)ICMP包類型定義,實現(xiàn)代碼參見設計代碼</p><p> //(省略)ICMP包所用數(shù)據(jù)類型定義</p><p><b> }</b></p><p> 4.1.3 Ethe
113、net報文實現(xiàn)</p><p> 根據(jù)Ethenet包的結構,構造Ethenet包程序代碼如下。并通過實現(xiàn) java.io.Serializable 接口以啟用其序列化功能。</p><p> public abstract class DatalinkPacket implements Serializable</p><p><b> {<
114、/b></p><p> public DatalinkPacket()</p><p><b> { }</b></p><p><b> }</b></p><p> public class EthernetPacket extends DatalinkPacket</p&
115、gt;<p><b> {</b></p><p> public EthernetPacket()</p><p><b> {</b></p><p><b> }</b></p><p> void setValue(byte dst[], byt
116、e src[], short frame)</p><p><b> {</b></p><p> dst_mac = dst;</p><p> src_mac = src;</p><p> frametype = frame;</p><p><b> }</b&g
117、t;</p><p> public String getSourceAddress()</p><p><b> {//獲取源地址</b></p><p><b> }</b></p><p> public String getDestinationAddress()</p>
118、<p><b> {//獲取目的地址</b></p><p><b> }</b></p><p> public String toString()</p><p><b> {</b></p><p> return (new StringBuild
119、er(String.valueOf(super.toString()))).append(" ").append(getSourceAddress()).append("->").append(getDestinationAddress()).append(" (").append(frametype).append(")").toString();&
120、lt;/p><p><b> }</b></p><p> private char hexUpperChar(byte b)</p><p><b> {</b></p><p> b = (byte)(b >> 4 & 0xf);</p><p>
121、 if(b == 0)</p><p> return '0';</p><p> if(b < 10)</p><p> return (char)(48 + b);</p><p><b> else</b></p><p> return (char)((9
122、7 + b) - 10);</p><p><b> }</b></p><p> private char hexLowerChar(byte b)</p><p><b> {</b></p><p><b> b &= 0xf;</b></p>
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 計算機網(wǎng)絡課程
- 計算機網(wǎng)絡論文
- 計算機網(wǎng)絡習題+計算機網(wǎng)絡習題
- eklhbm有關計算機網(wǎng)絡畢業(yè)的論文計算機網(wǎng)絡畢業(yè)論文淺析計算機網(wǎng)絡安全
- 計算機網(wǎng)絡畢業(yè)論文--- 計算機網(wǎng)絡管理軟件
- 計算機網(wǎng)絡
- 計算機網(wǎng)絡課程設計
- 高校計算機網(wǎng)絡課程建設
- 計算機網(wǎng)絡課程設計
- 計算機網(wǎng)絡課程設計
- 計算機網(wǎng)絡課程設計
- 計算機網(wǎng)絡課程設計
- 計算機網(wǎng)絡課程考試復習
- 《計算機網(wǎng)絡課程設計》
- 計算機網(wǎng)絡課程設計
- 計算機網(wǎng)絡課程改革計劃
- 計算機網(wǎng)絡課程設計
- 計算機網(wǎng)絡的發(fā)展史論文—論計算機網(wǎng)絡的發(fā)展
- 計算機網(wǎng)絡安全畢業(yè)論文---淺談計算機網(wǎng)絡安全
- 計算機網(wǎng)絡畢業(yè)論文---淺談計算機網(wǎng)絡安全及建設
評論
0/150
提交評論