計(jì)算機(jī)網(wǎng)絡(luò)公選課課程論文_第1頁
已閱讀1頁,還剩42頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、<p><b>  摘 要</b></p><p>  隨著信息技術(shù)的發(fā)展及網(wǎng)絡(luò)應(yīng)用的普及和擴(kuò)大,家庭或小型辦公網(wǎng)絡(luò)處處可見,網(wǎng)絡(luò)管理、故障排除不再是專家的“專利”,了解網(wǎng)絡(luò)結(jié)構(gòu),對(duì)網(wǎng)絡(luò)連接進(jìn)行檢測(cè)成為用戶的基本需求,然而路由跟蹤是網(wǎng)絡(luò)結(jié)構(gòu)發(fā)現(xiàn),網(wǎng)絡(luò)故障診斷的重要工具,它越來越受用戶的關(guān)注。方便、快捷、可視的路由跟蹤小軟件也應(yīng)運(yùn)而生。</p><p>  

2、本文主要介紹了路由跟蹤程序的實(shí)現(xiàn)原理,從而深入了解ICMP協(xié)議,ICMP報(bào)文格式及各字段含義。論文中包括路由跟蹤需求分析、總體設(shè)計(jì)和詳細(xì)設(shè)計(jì)的過程,闡述了以JAVA為開發(fā)平臺(tái)、以Eclipse為集成開發(fā)環(huán)境實(shí)現(xiàn)網(wǎng)絡(luò)底層開發(fā)的方法。軟件系統(tǒng)中實(shí)現(xiàn)了Traceroute和Ping(Packet Internet Grope)程序。</p><p>  關(guān)鍵詞 路由跟蹤; PING; JAVA;JPCAP</p&

3、gt;<p><b>  目 錄</b></p><p><b>  摘 要I</b></p><p>  Abstract錯(cuò)誤!未定義書簽。</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、設(shè)計(jì)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)模塊設(shè)計(jì)圖5</p><p>  2.4 本章小結(jié)6<

6、/p><p>  第3章 詳細(xì)設(shè)計(jì)7</p><p>  3.1 系統(tǒng)設(shè)計(jì)7</p><p>  3.1.1 Ping的實(shí)現(xiàn)原理7</p><p>  3.1.2 Traceroute的實(shí)現(xiàn)原理7</p><p>  3.1.3 IP報(bào)文結(jié)構(gòu)8</p><p>  3.1.4 ICMP報(bào)文

7、結(jié)構(gòu)9</p><p>  3.1.5 Ethenet報(bào)文結(jié)構(gòu)11</p><p>  3.2 系統(tǒng)流程圖設(shè)計(jì)12</p><p>  3.2.1 Ping流程圖12</p><p>  3.2.2 Traceroute流程圖13</p><p>  3.3 界面設(shè)計(jì)14</p><p&

8、gt;  3.4 本章小結(jié)15</p><p>  第4章 系統(tǒng)實(shí)現(xiàn)16</p><p>  4.1 數(shù)據(jù)包構(gòu)造實(shí)現(xiàn)16</p><p>  4.1.1 IP報(bào)文實(shí)現(xiàn)16</p><p>  4.1.2 ICMP報(bào)文實(shí)現(xiàn)19</p><p>  4.1.3 Ethenet報(bào)文實(shí)現(xiàn)21</p>

9、<p>  4.2 Ping的實(shí)現(xiàn)23</p><p>  4.3 Traceroute的實(shí)現(xiàn)26</p><p>  4.4 界面的實(shí)現(xiàn)29</p><p>  4.4.1 Ping控制面板實(shí)現(xiàn)29</p><p>  4.4.2 Traceroute控制面板實(shí)現(xiàn)30</p><p>  4.4.

10、3 主界面實(shí)現(xiàn)30</p><p>  4.5 本章小結(jié)30</p><p>  第5章 系統(tǒng)測(cè)試31</p><p>  5.1 測(cè)試環(huán)境31</p><p>  5.2 測(cè)試過程31</p><p>  5.2.1 Ping測(cè)試31</p><p>  5.2.2 Tracero

11、ute測(cè)試34</p><p>  5.2.3 界面功能測(cè)試35</p><p>  5.3 測(cè)試結(jié)果37</p><p>  5.4 本章小結(jié)37</p><p><b>  結(jié) 論38</b></p><p><b>  參考文獻(xiàn)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)絡(luò)傳遞到目的地的行為,在傳輸過程中,遇到一系列的中間節(jié)點(diǎn)。這些中間節(jié)點(diǎn)構(gòu)成了路由跟蹤的依據(jù)。路

13、由的話題早已在計(jì)算機(jī)界出現(xiàn),但直到八十年代中期才獲得商業(yè)成功,這一時(shí)間延遲的主要原因是七十年代的網(wǎng)絡(luò)很簡單,后來大型的網(wǎng)絡(luò)才較為普遍。而路由跟蹤是在路由的基礎(chǔ)上提出的問題,是利用路由跟蹤實(shí)用程序于確定 IP 數(shù)據(jù)報(bào)訪問目標(biāo)所采取的路徑。</p><p>  當(dāng)我們不能通過網(wǎng)絡(luò)訪問目的設(shè)備時(shí),網(wǎng)絡(luò)運(yùn)行者就需要判斷是哪里出了問題。問題不僅僅會(huì)出現(xiàn)在最終目的設(shè)備,也可能出現(xiàn)在轉(zhuǎn)發(fā)數(shù)據(jù)包的中間路由器。解決方法是,了解了I

14、P數(shù)據(jù)報(bào)訪問目標(biāo)所采取的路徑,將發(fā)現(xiàn)網(wǎng)絡(luò)布網(wǎng)簡單拓?fù)?,確定路由斷點(diǎn)即可解決網(wǎng)絡(luò)故障。</p><p>  操作系統(tǒng)中的tracert或traceroute路由跟蹤程序,通過它可以查看到達(dá)目標(biāo)地址所經(jīng)過的路徑。它的作用與ping有類似之處,使用ping可以檢查是否連接,如果不通,一般不好準(zhǔn)確判斷哪一個(gè)節(jié)點(diǎn)出錯(cuò),而使用tracert則可以準(zhǔn)確判斷出錯(cuò)的部分。路由跟蹤程序隨著網(wǎng)絡(luò)的發(fā)展而發(fā)展,現(xiàn)已經(jīng)較為成熟,不僅在操作

15、系統(tǒng)上有路由跟蹤程序,在中間設(shè)備也加入路由跟蹤程序,如cisco擴(kuò)展路由跟蹤程序,提供詳細(xì)的參數(shù)選擇。</p><p>  單、多線程路由跟蹤程序都已經(jīng)面世,實(shí)現(xiàn)方式也各不相同,如基于記錄路由選項(xiàng)的,基于UDP,基于ICMP Echo Request的路由探測(cè)。本課題主要對(duì)該方向進(jìn)一步研究,把Ping和Traceroute同時(shí)集成在一個(gè)軟件系統(tǒng)上,利用基于ICMP Echo Request的路由探測(cè)方法,并用多線

16、程編程實(shí)現(xiàn)多個(gè)目標(biāo)同時(shí)跟蹤,使之成為方便、快捷、可視化的網(wǎng)絡(luò)輕型管理工具。</p><p>  1.2 開發(fā)環(huán)境介紹</p><p>  1.2.1 JAVA</p><p>  Java是Java程序設(shè)計(jì)語言和Java平臺(tái)的總稱。Java平臺(tái)由Java虛擬機(jī)(Java Virtual Machine)和Java 應(yīng)用編程接口(Application Program

17、ming Interface、簡稱API)構(gòu)成。Java 應(yīng)用編程接口為Java應(yīng)用提供了一個(gè)獨(dú)立于操作系統(tǒng)的標(biāo)準(zhǔn)接口,可分為基本部分和擴(kuò)展部分。在硬件或操作系統(tǒng)平臺(tái)上安裝一個(gè)Java平臺(tái)之后,Java應(yīng)用程序就可運(yùn)行?,F(xiàn)在Java平臺(tái)已經(jīng)嵌入了幾乎所有的操作系統(tǒng)。這樣Java程序可以只編譯一次,就可以在各種系統(tǒng)中運(yùn)行。</p><p>  Java是一種簡單的,面向?qū)ο蟮模植际降?,解釋型的,健壯安全的,結(jié)構(gòu)中

18、立的,可移植的,性能優(yōu)異、多線程的動(dòng)態(tài)語言。</p><p>  Java是跨平臺(tái)語言,一般來說對(duì)網(wǎng)絡(luò)的操作都在IP層以上,也就是只能對(duì)tcp/udp進(jìn)行操作,當(dāng)然也可以設(shè)置部分tcp/udp的option,如果想再往IP層或者數(shù)據(jù)link層操作就無能為力了,必須依靠JNI使用本地OS的socket部分接口。很幸運(yùn),我在知道有WinPcap的同時(shí)也知道有人在開發(fā)Jpcap,此包可以方便的操作網(wǎng)絡(luò)底層應(yīng)用協(xié)議,以下

19、1.2.3小節(jié)將對(duì)Jpcap API作詳細(xì)說明。</p><p>  1.2.2 Eclipse開發(fā)環(huán)境</p><p>  Eclipse 是一個(gè)開放源代碼的、基于 Java 的可擴(kuò)展開發(fā)平臺(tái)。就其本身而言,它只是一個(gè)框架和一組服務(wù),用于通過插件組件構(gòu)建開發(fā)環(huán)境。幸運(yùn)的是,Eclipse 附帶了一個(gè)標(biāo)準(zhǔn)的插件集,包括 Java 開發(fā)工具(Java Development Tools,JD

20、T)。 </p><p>  Eclipse是著名的跨平臺(tái)的自由集成開發(fā)環(huán)境(IDE)。Eclipse是一個(gè)開發(fā)源碼項(xiàng)目,任何人都可以免費(fèi)得到,并可以在此基礎(chǔ)上開發(fā)各自的插件,因此越來越受人們關(guān)注。使用者只需下載各種語言的插件即可。</p><p>  Eclipse專注于為高度集成的工具開發(fā)提供一個(gè)全功能的平臺(tái)。它主要由Eclipse項(xiàng)目、Eclipse工具項(xiàng)目和Eclipse技術(shù)項(xiàng)目三

21、個(gè)項(xiàng)目組成,具體包括四個(gè)部分組成——Eclipse Platform、JDT、CDT和PDE.JDT支持Java開發(fā)、CDT支持C開發(fā)、PDE用來支持插件開發(fā),Eclipse Platform則是一個(gè)開放的可擴(kuò)展IDE,提供了一個(gè)通用的開發(fā)平臺(tái)。它提供建造塊和構(gòu)造并運(yùn)行集成軟件開發(fā)工具的基礎(chǔ)。Eclipse Platform允許工具建造者獨(dú)立開發(fā)與他人工具無縫集成的工具從而無須分辨一個(gè)工具功能在哪里結(jié)束,而另一個(gè)工具功能在哪里開始。&l

22、t;/p><p>  Eclipse SDK(軟件開發(fā)者包)是Eclipse Platform、JDT和PDE所生產(chǎn)的組合并,它們可以一次下載。這些部分在一起提供了一個(gè)具有豐富特性的開發(fā)環(huán)境,允許開發(fā)者有效地建造可以無縫集成到Eclipse Platform中的工具。Eclipse SDK由Eclipse項(xiàng)目生產(chǎn)的工具和來自其它開放源代碼的第三方軟件組合而成。Eclipse項(xiàng)目生產(chǎn)的軟件以 CPL發(fā)布,第三方組件有各

23、自自身的許可協(xié)議。</p><p>  Eclipse讓JAVA開發(fā)更快捷更高效,無論對(duì)于龐大的開發(fā)項(xiàng)目還是微小的程序設(shè)計(jì)它都成為用戶的青睞。</p><p>  1.2.3 Jpcap 簡介</p><p>  1.JPCAP開發(fā)環(huán)境安裝</p><p>  只需要把lib中的dll文件拷貝到j(luò)re的bin目錄,同時(shí)lib中的jar文件拷貝

24、到j(luò)re中的lib/ext目錄下就安裝完整,當(dāng)然你可以使用exe安裝包進(jìn)行安裝,這樣會(huì)更加的簡單。</p><p>  需要注意的是,我們經(jīng)常使用的Windows XP操作系統(tǒng)大部分都是精簡版,可能少了WinCap工具,所以在程序開發(fā)時(shí),同時(shí)安裝上WinPcap。</p><p>  2.Jpcap類庫的基本結(jié)構(gòu)如圖1-1所示:</p><p>  圖1-1 Jpc

25、ap 類庫結(jié)構(gòu)</p><p>  3. Packet基類及其子類</p><p>  Packet這個(gè)類是所有被捕獲的數(shù)據(jù)包的基類,可以提供被捕獲數(shù)據(jù)包的長度,被捕獲數(shù)據(jù)包的時(shí)間標(biāo)記等基本信息。</p><p>  ARPPacket和IPPacket是繼承Packet的子類,它們將被捕獲包分成兩類。ARPPacket按照ARP數(shù)據(jù)報(bào)的內(nèi)容,將其各數(shù)據(jù)段的數(shù)據(jù)取出

26、。IPPacket則被分得更細(xì)。這兩個(gè)類主要與是與數(shù)據(jù)鏈路層密切相關(guān)的,其與MAC地址相關(guān)的信息在EthemetPacket類中表示出來。EthemetPacket是從DatalinkPacket繼承而來的。</p><p>  IPPacket下有三個(gè)子類,分別是ICMPPacket、TCPPacket、UDPPacket。這三個(gè)類分別表示的是被存儲(chǔ)在IP數(shù)據(jù)報(bào)的報(bào)文中發(fā)送的ICMP、TCP、UDP報(bào)文。<

27、;/p><p>  在被捕獲包的基本信息就可以通過直接轉(zhuǎn)化為字符串(toString)而得到。</p><p>  如ICMPPacket在用toString方法直接轉(zhuǎn)化,得到字符串為:類型 type(type) 執(zhí)行命令code(code)。</p><p>  4. Jpcap的主要功能</p><p>  Jpcap提供了十分方便的數(shù)據(jù)包捕

28、獲方法。Jpcap使用一個(gè)事件模型來處理包。首先,必須創(chuàng)建一個(gè)執(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知道要用哪個(gè)網(wǎng)絡(luò)設(shè)備來監(jiān)聽。API提供了jpcap.Jpcap.getDeviceList()方法以滿足這一目的。這個(gè)方法返回一列字符串,可以按一

30、下方法如下使用它:</p><p>  String[] devices = Jpcap.getDeviceList(); </p><p>  一旦有了一個(gè)設(shè)備名稱的目錄,只要從其中選取一個(gè)用來監(jiān)聽:</p><p>  String deviceName = devices[0]; </p><p>  選擇一個(gè)設(shè)備之后,通過Jpcap.

31、openDevice()方法打開它。openDevice()方法需要四個(gè)參數(shù):即將打開的設(shè)備名,從設(shè)備上一次讀取的最大字節(jié)數(shù),說明是否將設(shè)備設(shè)為混雜模式的Boolean值,和以后調(diào)用processPacket()方法要使用到的超時(shí)值。</p><p>  Jpcapjpcap = Jpcap.openDevice(deviceName, 1024, false, 10000); </p><p

32、>  openDevice()方法將一個(gè)參數(shù)返回到用以捕獲的Jpcap對(duì)象。既然有了Jpcap實(shí)例,你可以調(diào)用processPacket() 或loopPacket()開始監(jiān)聽了。這兩種方式都帶有兩個(gè)參數(shù):捕獲的最大包數(shù)可以是-1(說明沒有限制);執(zhí)行JpcapHandler的一個(gè)類的實(shí)例。</p><p>  如果你調(diào)用processPacket(),那么Jpcap將一直捕獲包,直到超過openDevic

33、e中規(guī)定的時(shí)限或達(dá)到了規(guī)定的最大包數(shù)。loopPacket()則將一直捕獲包,直到達(dá)到最大包數(shù),如果沒有最大數(shù)限制,它將永遠(yuǎn)運(yùn)行下去。就像下面這樣調(diào)用:</p><p>  jpcap.loopPacket(-1, new Jpcaphandler()); </p><p>  對(duì)于捕獲的數(shù)據(jù)包,可以利用Jpcap中的Packet及其子類進(jìn)行分類分析,獲得數(shù)據(jù)包的詳細(xì)信息。</p&g

34、t;<p>  Jpcap還有進(jìn)行數(shù)據(jù)包過濾的函數(shù)setFilter(java.lang.String condition, boolean optimize)。其中condition是過濾條件。在進(jìn)行數(shù)據(jù)包捕獲前設(shè)置過濾條件,可以將不感興趣的數(shù)據(jù)包剔除。</p><p>  jpcap.setFilter("host 210.212.147.149",tru

35、e);</p><p>  因?yàn)镴pcap對(duì)數(shù)據(jù)包進(jìn)行了分類,而數(shù)據(jù)包中的關(guān)鍵字段也有接口調(diào)用,所以在設(shè)置過濾條件時(shí)也可以在利用這些條件進(jìn)行更細(xì)致的分類。</p><p>  Jpcap還提供了用來發(fā)送數(shù)據(jù)包的一個(gè)類JpcapSender,可以用來發(fā)送IPPacket及其子類,包括IPPacket、ICMPPacket、TCPPacket、UDPPacket。定義好一個(gè)相應(yīng)的包后,就可以利

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章 總體設(shè)計(jì)</b>

37、</p><p><b>  2.1 需求分析</b></p><p>  系統(tǒng)實(shí)現(xiàn)路由的跟蹤,每經(jīng)過一個(gè)路由,要求得到經(jīng)過該路由節(jié)點(diǎn)的地址,也就是說輸入目標(biāo)信息,可以得到本地主機(jī)到目標(biāo)經(jīng)過的所有中間節(jié)點(diǎn)。這些中間節(jié)點(diǎn)用IP地址標(biāo)識(shí)。并要求對(duì)跟蹤跳數(shù),每一跳等待時(shí)間可控。</p><p>  為了讓系統(tǒng)更加完善,首先要測(cè)試目標(biāo)的連通性,系統(tǒng)中也

38、要實(shí)現(xiàn)目標(biāo)探測(cè)功能,即Ping功能。</p><p>  2.2 系統(tǒng)主要功能描述</p><p>  數(shù)據(jù)包構(gòu)造:主要實(shí)現(xiàn)IP包,ICMP包和Ethenet包的構(gòu)造(參考Jpcap包構(gòu)造方法)。</p><p>  獲取本地網(wǎng)絡(luò)信息 :主要實(shí)現(xiàn)PC機(jī)網(wǎng)絡(luò)設(shè)備(網(wǎng)卡)的打開,獲取該網(wǎng)卡的網(wǎng)絡(luò)信息,如IP,MAC地址。</p><p>  Pi

39、ng功能:主要實(shí)現(xiàn)測(cè)試到達(dá)目的網(wǎng)絡(luò)節(jié)點(diǎn)是否暢通,與windows自帶Ping功能基本相同。</p><p>  Traceroute功能:主要實(shí)現(xiàn)路由跟蹤方法,輸入跟蹤目標(biāo)的IP地址或URL地址,即可跟蹤,亦可進(jìn)行多目標(biāo)的同時(shí)跟蹤。</p><p>  界面模塊:主要實(shí)現(xiàn)可視化操作界面。</p><p><b>  2.3 系統(tǒng)模塊圖</b>&

40、lt;/p><p>  2.3.1 系統(tǒng)模塊概述</p><p>  按系統(tǒng)實(shí)現(xiàn)要求主要分成5大模塊:數(shù)據(jù)包構(gòu)造模塊、獲取本地網(wǎng)絡(luò)信息模塊、Ping功能模塊、Traceroute功能模塊和界面模塊。其中,數(shù)據(jù)包構(gòu)造模塊包括IP包構(gòu)造、ICMP包構(gòu)造和Ethernet包構(gòu)造;獲取本地網(wǎng)絡(luò)信息模塊包打開網(wǎng)絡(luò)設(shè)備和獲取本地信息功能;Ping功能模塊和Traceroute功能模塊是發(fā)送數(shù)據(jù)包,監(jiān)聽接收

41、的數(shù)據(jù)包進(jìn)行分析處理;界面模塊包括Ping控制面板,Traceroute控制面板和主控制面板。</p><p>  2.3.2 系統(tǒng)模塊設(shè)計(jì)圖</p><p>  系統(tǒng)模塊圖如圖2-1所示。</p><p>  圖2-1 系統(tǒng)模塊設(shè)計(jì)圖</p><p><b>  2.4 本章小結(jié)</b></p><

42、p>  本章主要講述了系統(tǒng)的需求分析、整體模塊劃分,對(duì)系統(tǒng)進(jìn)行結(jié)構(gòu)總體設(shè)計(jì),為進(jìn)一步做好系統(tǒng)詳細(xì)設(shè)計(jì)做好準(zhǔn)備。</p><p><b>  第3章 詳細(xì)設(shè)計(jì)</b></p><p><b>  3.1 系統(tǒng)設(shè)計(jì)</b></p><p>  系統(tǒng)設(shè)計(jì)中,了解系統(tǒng)中各個(gè)模塊實(shí)現(xiàn)原理是設(shè)計(jì)的基礎(chǔ),以下分別對(duì)系統(tǒng)中主要原理進(jìn)

43、行詳細(xì)闡述,為進(jìn)一步流程設(shè)計(jì)做準(zhǔn)備。</p><p>  3.1.1 Ping的實(shí)現(xiàn)原理</p><p>  Ping (Packet Internet Grope),因特網(wǎng)包探索器,用于測(cè)試網(wǎng)絡(luò)連接量的程序。Ping發(fā)送一個(gè)ICMP回聲請(qǐng)求消息給目的地并報(bào)告是否收到所希望的ICMP回聲應(yīng)答。</p><p>  以下面一個(gè)網(wǎng)絡(luò)為例:有A、B、C、D四臺(tái)機(jī)子,一臺(tái)路

44、由RA,子網(wǎng)掩碼均為255.255.255.0,默認(rèn)路由為192.168.0.1。</p><p>  在同一網(wǎng)段內(nèi),在主機(jī)A上運(yùn)行“Ping 192.168.0.5”后,都發(fā)生了些什么呢? 首先,Ping命令會(huì)構(gòu)建一個(gè)固定格式的ICMP請(qǐng)求數(shù)據(jù)包,然后由ICMP協(xié)議將這個(gè)數(shù)據(jù)包連同地址“192.168.0.5”一起交給IP層協(xié)議(和ICMP一樣,實(shí)際上是一組后臺(tái)運(yùn)行的進(jìn)程),IP層協(xié)議將以地址“192.168.

45、0.5”作為目的地址,本機(jī)IP地址作為源地址,加上一些其他的控制信息,構(gòu)建一個(gè)IP數(shù)據(jù)包,并想辦法得到192.168.0.5的MAC地址(物理地址,這是數(shù)據(jù)鏈路層協(xié)議構(gòu)建數(shù)據(jù)鏈路層的傳輸單元——幀所必需的),以便交給數(shù)據(jù)鏈路層構(gòu)建一個(gè)數(shù)據(jù)幀。關(guān)鍵就在這里,IP層協(xié)議通過機(jī)器B的IP地址和自己的子網(wǎng)掩碼,發(fā)現(xiàn)它跟自己屬同一網(wǎng)絡(luò),就直接在本網(wǎng)絡(luò)內(nèi)查找這臺(tái)機(jī)器的MAC,如果以前兩機(jī)有過通信,在A機(jī)的ARP緩存表應(yīng)該有B機(jī)IP與其MAC的映射關(guān)

46、系,如果沒有,就發(fā)一個(gè)ARP請(qǐng)求廣播,得到B機(jī)的MAC,一并交給數(shù)據(jù)鏈路層。后者構(gòu)建一個(gè)數(shù)據(jù)幀,目的地址是IP層傳過來的物理地址,源地址則是本機(jī)的物理地址,還要附加上一些控制信息,依據(jù)以太網(wǎng)的介質(zhì)訪問規(guī)則,將它們傳送出去。</p><p>  主機(jī)B收到這個(gè)數(shù)據(jù)幀后,先檢查它的目的地址,并和本機(jī)的物理地址對(duì)比,如符合,則接收;否則丟棄。接收后檢查該數(shù)據(jù)幀,將IP數(shù)據(jù)包從幀中提取出來,交給本機(jī)的IP層協(xié)議。同樣,I

47、P層檢查后,將有用的信息提取后交給ICMP協(xié)議,后者處理后,馬上構(gòu)建一個(gè)ICMP應(yīng)答包,發(fā)送給主機(jī)A,其過程和主機(jī)A發(fā)送ICMP請(qǐng)求包到主機(jī)B一模一樣。</p><p>  不在同一網(wǎng)段內(nèi),在主機(jī)A上運(yùn)行“Ping 192.168.1.4”后,開始跟上面一樣,到了怎樣得到MAC地址時(shí),IP協(xié)議通過計(jì)算發(fā)現(xiàn)D機(jī)與自己不在同一網(wǎng)段內(nèi),就直接將交由路由處理,也就是將路由的MAC取過來,至于怎樣得到路由的MAC,跟上面一

48、樣,先在ARP緩存表找,找不到就廣播吧。路由得到這個(gè)數(shù)據(jù)幀后,再跟主機(jī)D進(jìn)行聯(lián)系,如果找不到,就向主機(jī)A返回一個(gè)超時(shí)的信息。</p><p>  3.1.2 Traceroute的實(shí)現(xiàn)原理</p><p>  Traceroute程序的實(shí)現(xiàn)主要涉及IP頭部生存時(shí)間(time to live ,TTL)字段的使用。</p><p>  設(shè)置TTL字段的目的是防止數(shù)據(jù)報(bào)

49、由于選路錯(cuò)誤或其他軟硬件原因從而導(dǎo)致在網(wǎng)絡(luò)中無休止的流動(dòng),它指定了數(shù)據(jù)報(bào)的生存時(shí)間。TTL的初始值由源主機(jī)設(shè)置,當(dāng)一份數(shù)據(jù)報(bào)經(jīng)過路由器時(shí),處理該數(shù)據(jù)報(bào)的路由器都需要把TTL值減去數(shù)據(jù)報(bào)在路由器中停留的秒數(shù)。但事實(shí)上大多數(shù)路由器只是簡單地將TTL值減1,因此TTL字段最終被實(shí)現(xiàn)為一個(gè)跳站計(jì)數(shù)器。當(dāng)TTL字段的值被減為0時(shí),路由器就不會(huì)轉(zhuǎn)發(fā)該數(shù)據(jù)報(bào),而是將其丟棄,并產(chǎn)生一份ICMP超時(shí)差錯(cuò)報(bào)文發(fā)往源主機(jī)以通知錯(cuò)誤的發(fā)生。Traceroute

50、程序的關(guān)鍵就在于返回的這份ICMP超時(shí)差錯(cuò)報(bào)文的源地址就是途經(jīng)路由器的IP地址。由此,通過依次遞增TTL字段的值,就可以得到一份數(shù)據(jù)報(bào)在其傳輸路徑上所經(jīng)過的路由信息。</p><p>  Traceroute程序在具體實(shí)現(xiàn)時(shí),是令其向目的主機(jī)發(fā)送一個(gè)ICMP回顯請(qǐng)求(Echo request)消息,并重復(fù)遞增IP頭部TTL字段的值。剛開始的時(shí)候TTL等于1,這樣當(dāng)該數(shù)據(jù)報(bào)抵達(dá)途中的第一個(gè)路由器時(shí),TTL的值就被減

51、為0,導(dǎo)致發(fā)生超時(shí)錯(cuò)誤,因此該路由器生成一份ICMP超時(shí)差錯(cuò)報(bào)文返回給源主機(jī)。隨后,主機(jī)將數(shù)據(jù)報(bào)的TTL值遞增1,以便IP報(bào)文能傳遞到下一個(gè)路由器,下一個(gè)路由器將會(huì)生成ICMP超時(shí)超時(shí)差錯(cuò)報(bào)文返回給源主機(jī)。不斷重復(fù)這個(gè)過程,直到數(shù)據(jù)報(bào)到達(dá)最終的目的主機(jī),此時(shí)目的主機(jī)將返回ICMP回顯應(yīng)答(Echo replay)消息。這樣,源主機(jī)只需對(duì)返回的每一份ICMP報(bào)文進(jìn)行解析處理,就可以掌握數(shù)據(jù)報(bào)從源主機(jī)到達(dá)目的主機(jī)途中所經(jīng)過的路由信息。<

52、;/p><p>  3.1.3 IP報(bào)文結(jié)構(gòu)</p><p>  IP數(shù)據(jù)報(bào)的最開始存放著IP的版本(version)。Ipv4版本存放為4。接下來IHL是一個(gè)字符,即以32位為一個(gè)單位,存放著從版本開始到填充結(jié)束的報(bào)頭的長度。最短的情況沒有選項(xiàng),這是IHL的值為5。</p><p>  服務(wù)類型字段(type of service)表示IP數(shù)據(jù)報(bào)在傳遞時(shí)發(fā)送端要求的品

53、質(zhì)。第七位是為將來預(yù)留的擴(kuò)展位。</p><p>  數(shù)據(jù)報(bào)長度字段(total length)以8位為一個(gè)單位,即字節(jié)表示IP數(shù)據(jù)報(bào)的長度。接下來的標(biāo)識(shí)字段(identification),從TCP等上層協(xié)議調(diào)用時(shí)IP數(shù)據(jù)報(bào)的標(biāo)識(shí)號(hào)。</p><p>  標(biāo)志字段(flags)和數(shù)據(jù)塊偏移(fragment offset)用于對(duì)數(shù)據(jù)塊偏移的處理。IP數(shù)據(jù)報(bào)要在數(shù)據(jù)鏈路層的協(xié)議規(guī)定下裝入幀

54、的報(bào)文中傳送,由于IP數(shù)據(jù)報(bào)中,報(bào)文部分最大就有65535為,數(shù)據(jù)鏈路層的幀是不能全部容納的,所以采用叫做分塊的方法。分割的數(shù)據(jù)稱為碎塊。IP數(shù)據(jù)報(bào)的標(biāo)志表示有無碎塊,數(shù)據(jù)塊偏移用于保證數(shù)據(jù)塊偏移按照正確的順序處理。</p><p>  TTL字段是為了防止錯(cuò)誤的IP數(shù)據(jù)報(bào)在網(wǎng)絡(luò)上循環(huán),賦予IP數(shù)據(jù)報(bào)一定的壽命。IP數(shù)據(jù)報(bào)在發(fā)送時(shí)就在TTL字段中設(shè)置其壽命。TTL字段的值在IP數(shù)據(jù)報(bào)每通過一次路由器時(shí),進(jìn)行一次衰

55、減。當(dāng)為0時(shí),IP數(shù)據(jù)報(bào)就被刪除。通常設(shè)為最大值255。</p><p>  協(xié)議字段(protocol)中存放著表示TCP等IP的上層協(xié)議的值。包括ICMP、TCP、EGP、IGP、UDP等。</p><p>  在檢查錯(cuò)誤的報(bào)頭校驗(yàn)碼(header checksum)的后面是發(fā)送端地址和目的地址,他們?cè)贗pv4中都為32位。最后存放的是選項(xiàng)和把報(bào)頭進(jìn)行32位整數(shù)化后余下的位。</

56、p><p>  IP報(bào)文結(jié)構(gòu)如圖3-1所示:</p><p>  圖3-1 IP數(shù)據(jù)包頭的結(jié)構(gòu)</p><p>  3.1.4 ICMP報(bào)文結(jié)構(gòu)</p><p>  1.ICMP報(bào)文與IP報(bào)文的關(guān)系</p><p>  ICMP是因特網(wǎng)控制報(bào)文協(xié)議(Internet Control Message Protocol,ICM

57、P)的縮寫。ICMP通常被認(rèn)為是IP層的一個(gè)組成部分(子協(xié)議),主要用于在IP主機(jī)和路由器之間傳遞控制消息。但從結(jié)構(gòu)上看它位于IP層的上方,因?yàn)镮CMP報(bào)文是封裝在IP數(shù)據(jù)報(bào)內(nèi)作為有效載荷傳輸?shù)?,它與IP報(bào)文的關(guān)系如圖3-2所示。</p><p>  圖3-2 IP報(bào)文與ICMP報(bào)文的關(guān)系</p><p>  2.ICMP報(bào)文結(jié)構(gòu)</p><p>  ICMP報(bào)文的

58、一般格式如圖3-3所示,所有ICMP報(bào)文的前4個(gè)字節(jié)都是一樣的,但是剩余的其他字節(jié)則根據(jù)不同的類型和代碼而有所區(qū)別。</p><p>  圖3-3 ICMP報(bào)文的一般格式</p><p>  類型(type)字段可以有15個(gè)不同的取值,用來描述特定類型的ICMP報(bào)文。ICMP報(bào)文可以劃分為查詢報(bào)文和差錯(cuò)報(bào)告報(bào)文兩類,某些ICMP報(bào)文進(jìn)一步使用代碼(code)字段來描述同一類型下的不同條件,

59、因此不同類型的ICMP報(bào)文是由類型字段和代碼字段共同決定的。16位校驗(yàn)和字段使用與IP報(bào)頭的校驗(yàn)和字段機(jī)同的網(wǎng)際校驗(yàn)算法,不同的是該校驗(yàn)和覆蓋整個(gè)ICMP報(bào)文,即校驗(yàn)內(nèi)容不僅包括ICMP報(bào)頭,還包括ICMP數(shù)據(jù)部分。</p><p>  部分類型的ICMP報(bào)文及其說明參照表3-1。</p><p>  表3-1 部分ICMP報(bào)文參照表</p><p>  3.ICM

60、P回顯請(qǐng)求與回顯應(yīng)答報(bào)文</p><p>  系統(tǒng)中涉及3種類型的ICMP報(bào)文:ICMP回顯請(qǐng)求報(bào)文、ICMP回顯應(yīng)答報(bào)文和ICMP超時(shí)差錯(cuò)報(bào)文。其中,ICMP回顯請(qǐng)求與回顯應(yīng)答報(bào)文結(jié)構(gòu)如圖3-4所示。</p><p>  圖3-4 ICMP回顯請(qǐng)求與應(yīng)答報(bào)文結(jié)構(gòu)</p><p>  這兩種報(bào)文通常也稱作Ping報(bào)文,目的是為了測(cè)試一臺(tái)主機(jī)到另一臺(tái)主機(jī)是否可達(dá)。當(dāng)一

61、臺(tái)主機(jī)收到ICMP回顯請(qǐng)求報(bào)文后,接收主機(jī)應(yīng)向源主機(jī)回送ICMP回顯應(yīng)答報(bào)文,且該回顯報(bào)文必須響應(yīng)源報(bào)文中標(biāo)識(shí)符、序列號(hào)和選項(xiàng)數(shù)據(jù)三個(gè)字段(即應(yīng)將這三個(gè)字段原封不動(dòng)地返回)。</p><p>  4.ICMP超時(shí)差錯(cuò)報(bào)文</p><p>  ICMP超時(shí)報(bào)文會(huì)在兩種情況下產(chǎn)生:一是路由器在轉(zhuǎn)發(fā)數(shù)據(jù)報(bào)時(shí)IP頭部的TTL值減為0,二是當(dāng)組成一個(gè)數(shù)據(jù)報(bào)的所有分片未能在某一限定時(shí)間內(nèi)到達(dá)目的主機(jī)而

62、導(dǎo)致的超時(shí)。兩種情況下路由器或目的主機(jī)都將丟棄相應(yīng)分組并向源主機(jī)發(fā)送超時(shí)差錯(cuò)報(bào)文,本程序主要是利用第一種情況產(chǎn)生的超時(shí)差錯(cuò)報(bào)文來收集路由信息。</p><p>  ICMP超時(shí)差錯(cuò)報(bào)文的結(jié)構(gòu)如圖3-5所示。</p><p>  圖3-5 ICMP超時(shí)差錯(cuò)報(bào)文結(jié)構(gòu)</p><p>  ICMP(所有)差錯(cuò)報(bào)文的規(guī)則是:報(bào)文中的數(shù)據(jù)部分必須包含產(chǎn)生該差錯(cuò)報(bào)文的IP數(shù)據(jù)報(bào)

63、頭部(包含選項(xiàng)字段),以及(至少包含)跟在該IP頭部后面的前8個(gè)字節(jié)。這樣接收ICMP的進(jìn)程就可以根據(jù)所包含的差錯(cuò)數(shù)據(jù)將其與之前的某個(gè)特定的報(bào)文或進(jìn)程關(guān)聯(lián)起來。</p><p>  對(duì)于使用的回顯請(qǐng)求報(bào)文,由它產(chǎn)生的ICMP超時(shí)差錯(cuò)報(bào)文的完整格式如圖3-6所示。</p><p>  圖5-6 ICMP超時(shí)差錯(cuò)報(bào)文的完整格式</p><p>  3.1.5 Ethen

64、et報(bào)文結(jié)構(gòu)</p><p>  以太網(wǎng)幀的結(jié)構(gòu)是這樣。開始的64位是前同步碼(preamble)和幀首定界符(start frame delimiter)。前同步碼是使發(fā)送端和接收端在數(shù)據(jù)的交接上步調(diào)一致的信號(hào)。發(fā)送端以56位(10101010…10)反復(fù)發(fā)送1和0信號(hào)。接收端接收到這種信號(hào)后,準(zhǔn)備讀取發(fā)送來的信號(hào)。</p><p>  前同步碼結(jié)束后使表示幀的真正開始的8位(10101

65、011)位列。幀首定界符之后是地址等報(bào)頭信息。幀首定界符后面是接收端及發(fā)送端的MAC地址。只有在接收端的MAC地址是自己的MAC地址的情況下,才能進(jìn)行幀的接收;MAC地址為其他機(jī)器的情況下,將不接收改幀。但當(dāng)接收端地址全部都為1時(shí),在同一以太網(wǎng)內(nèi)連接的所有設(shè)備,都要接收該幀。地址全部為1的MAC地址稱為廣播地址。</p><p>  接收端和發(fā)送端的MAC地址后面是16位的類型字段(type field)。類型字

66、段中存放的是以太網(wǎng)幀中傳送數(shù)據(jù)的上層協(xié)議的種類代碼。以太網(wǎng)幀的報(bào)文部最大能存放12000位,即1500字節(jié)。以太網(wǎng)是物理層及數(shù)據(jù)鏈路層的協(xié)議。以太網(wǎng)幀所傳送的數(shù)據(jù)是網(wǎng)絡(luò)層規(guī)定的數(shù)據(jù)包。如果要使用IP網(wǎng)絡(luò)協(xié)議,則IP數(shù)據(jù)包就將存儲(chǔ)在以太網(wǎng)幀的報(bào)文處。幀的尾部是檢查數(shù)據(jù)錯(cuò)誤的錯(cuò)誤校驗(yàn)及修正碼。以太網(wǎng)中常使用循環(huán)冗余校驗(yàn)(CRC: Cyclic Redundancy Check)檢查錯(cuò)誤。CRC中,將表示幀的位列作為多項(xiàng)式。把多項(xiàng)式與準(zhǔn)備好的

67、特定多項(xiàng)式相除,得出的結(jié)果與數(shù)據(jù)一同發(fā)送。在接收端重新進(jìn)行一次除法運(yùn)算,用其結(jié)果確認(rèn)傳送來的數(shù)據(jù)正確與否。Ethenet報(bào)文格式如圖3-7所示。</p><p>  圖3-7 Ethenet報(bào)文格式</p><p>  3.2 系統(tǒng)流程圖設(shè)計(jì)</p><p>  3.2.1 Ping流程圖</p><p>  根據(jù)3.1節(jié)對(duì)Ping原理的分析

68、,Ping程序流程圖如圖3-8所示。</p><p>  圖3-8 Ping流程圖</p><p>  3.2.2 Traceroute流程圖</p><p>  根據(jù)3.1節(jié)對(duì)Traceroute原理的分析,Traceroute流程圖如圖3-9所示。</p><p>  圖3-9 Traceroute流程圖</p><p

69、><b>  3.3 界面設(shè)計(jì)</b></p><p>  界面設(shè)計(jì)遵循KISS原則就是"Keep It Simple And Stupid"的縮寫,簡潔和易于操作。要求在界面中接收輸入的參數(shù),如目標(biāo)信息,最大跳數(shù),等待時(shí)間等信息,然后按“確定”按鈕即可啟動(dòng)Ping或Traceroute線程,啟動(dòng)程序后實(shí)時(shí)在界面上顯示執(zhí)行信息,并要求可以停止當(dāng)前運(yùn)行的線程。<

70、/p><p><b>  3.4 本章小結(jié)</b></p><p>  在本章中,詳細(xì)地闡述設(shè)計(jì)的原理,并以圖文形式表達(dá)了本系統(tǒng)邏輯結(jié)構(gòu)設(shè)計(jì)和各模塊的控制流程設(shè)計(jì)。</p><p><b>  第4章 系統(tǒng)實(shí)現(xiàn)</b></p><p>  4.1 數(shù)據(jù)包構(gòu)造實(shí)現(xiàn)</p><p>

71、  本系統(tǒng)中主要用到的網(wǎng)絡(luò)數(shù)據(jù)報(bào)文包括IP報(bào)文、ICMP報(bào)文和Ethernet報(bào)文,上一章對(duì)報(bào)文結(jié)構(gòu)及協(xié)議特性作了詳細(xì)分析,這節(jié)將用代碼實(shí)現(xiàn)這些報(bào)文。各報(bào)文之間的類關(guān)系如圖4-1所示。</p><p>  圖4-1 報(bào)文類之間的關(guān)系</p><p>  4.1.1 IP報(bào)文實(shí)現(xiàn)</p><p>  根據(jù)以上IP數(shù)據(jù)包的結(jié)構(gòu),程序?qū)崿F(xiàn)如下。</p>&l

72、t;p>  1.數(shù)據(jù)包的基類,可以提供被捕獲數(shù)據(jù)包的長度,被捕獲數(shù)據(jù)包的時(shí)間標(biāo)記等基本信息</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,實(shí)現(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ù)類型定義,實(shí)現(xiàn)代碼參見設(shè)計(jì)代碼</p><p><b>  }</b></p><p>  4.1.2 ICMP報(bào)文實(shí)現(xiàn)</p><

99、;p>  根據(jù)以上ICMP包結(jié)構(gòu)分析,繼承IP包結(jié)構(gòu),實(shí)現(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包類型定義,實(shí)現(xiàn)代碼參見設(shè)計(jì)代碼</p><p>  //(省略)ICMP包所用數(shù)據(jù)類型定義</p><p><b>  }</b></p><p>  4.1.3 Ethe

113、net報(bào)文實(shí)現(xiàn)</p><p>  根據(jù)Ethenet包的結(jié)構(gòu),構(gòu)造Ethenet包程序代碼如下。并通過實(shí)現(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等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫僅提供信息存儲(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)論