计算机网络公选课课程论文.doc_第1页
计算机网络公选课课程论文.doc_第2页
计算机网络公选课课程论文.doc_第3页
计算机网络公选课课程论文.doc_第4页
计算机网络公选课课程论文.doc_第5页
已阅读5页,还剩38页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

计算机网络公选课课程论文摘 要随着信息技术的发展及网络应用的普及和扩大,家庭或小型办公网络处处可见,网络管理、故障排除不再是专家的“专利”,了解网络结构,对网络连接进行检测成为用户的基本需求,然而路由跟踪是网络结构发现,网络故障诊断的重要工具,它越来越受用户的关注。方便、快捷、可视的路由跟踪小软件也应运而生。本文主要介绍了路由跟踪程序的实现原理,从而深入了解icmp协议,icmp报文格式及各字段含义。论文中包括路由跟踪需求分析、总体设计和详细设计的过程,阐述了以java为开发平台、以eclipse为集成开发环境实现网络底层开发的方法。软件系统中实现了traceroute和ping(packet internet grope)程序。关键词路由跟踪; ping; java;jpcap目 录摘 要iabstract错误!未定义书签。目 录ii第1章 绪论11.1 课题背景11.2 开发环境介绍11.2.1 java11.2.2 eclipse开发环境21.2.3 jpcap 简介2第2章 总体设计52.1 需求分析52.2 系统主要功能描述52.3 系统模块图52.3.1 系统模块概述52.3.2 系统模块设计图52.4 本章小结6第3章 详细设计73.1 系统设计73.1.1 ping的实现原理73.1.2 traceroute的实现原理73.1.3 ip报文结构83.1.4 icmp报文结构93.1.5 ethenet报文结构113.2 系统流程图设计123.2.1 ping流程图123.2.2 traceroute流程图133.3 界面设计143.4 本章小结15第4章 系统实现164.1 数据包构造实现164.1.1 ip报文实现164.1.2 icmp报文实现194.1.3 ethenet报文实现214.2 ping的实现234.3 traceroute的实现264.4 界面的实现294.4.1 ping控制面板实现294.4.2 traceroute控制面板实现304.4.3 主界面实现304.5 本章小结30第5章 系统测试315.1 测试环境315.2 测试过程315.2.1 ping测试315.2.2 traceroute测试345.2.3 界面功能测试355.3 测试结果375.4 本章小结37结 论38参考文献39致 谢4040 第1章 绪论1.1 课题背景 路由是把信息从源穿过网络传递到目的地的行为,在传输过程中,遇到一系列的中间节点。这些中间节点构成了路由跟踪的依据。路由的话题早已在计算机界出现,但直到八十年代中期才获得商业成功,这一时间延迟的主要原因是七十年代的网络很简单,后来大型的网络才较为普遍。而路由跟踪是在路由的基础上提出的问题,是利用路由跟踪实用程序于确定 ip 数据报访问目标所采取的路径。当我们不能通过网络访问目的设备时,网络运行者就需要判断是哪里出了问题。问题不仅仅会出现在最终目的设备,也可能出现在转发数据包的中间路由器。解决方法是,了解了ip数据报访问目标所采取的路径,将发现网络布网简单拓扑,确定路由断点即可解决网络故障。操作系统中的tracert或traceroute路由跟踪程序,通过它可以查看到达目标地址所经过的路径。它的作用与ping有类似之处,使用ping可以检查是否连接,如果不通,一般不好准确判断哪一个节点出错,而使用tracert则可以准确判断出错的部分。路由跟踪程序随着网络的发展而发展,现已经较为成熟,不仅在操作系统上有路由跟踪程序,在中间设备也加入路由跟踪程序,如cisco扩展路由跟踪程序,提供详细的参数选择。单、多线程路由跟踪程序都已经面世,实现方式也各不相同,如基于记录路由选项的,基于udp,基于icmp echo request的路由探测。本课题主要对该方向进一步研究,把ping和traceroute同时集成在一个软件系统上,利用基于icmp echo request的路由探测方法,并用多线程编程实现多个目标同时跟踪,使之成为方便、快捷、可视化的网络轻型管理工具。1.2 开发环境介绍1.2.1 javajava是java程序设计语言和java平台的总称。java平台由java虚拟机(java virtual machine)和java 应用编程接口(application programming interface、简称api)构成。java 应用编程接口为java应用提供了一个独立于操作系统的标准接口,可分为基本部分和扩展部分。在硬件或操作系统平台上安装一个java平台之后,java应用程序就可运行。现在java平台已经嵌入了几乎所有的操作系统。这样java程序可以只编译一次,就可以在各种系统中运行。java是一种简单的,面向对象的,分布式的,解释型的,健壮安全的,结构中立的,可移植的,性能优异、多线程的动态语言。java是跨平台语言,一般来说对网络的操作都在ip层以上,也就是只能对tcp/udp进行操作,当然也可以设置部分tcp/udp的option,如果想再往ip层或者数据link层操作就无能为力了,必须依靠jni使用本地os的socket部分接口。很幸运,我在知道有winpcap的同时也知道有人在开发jpcap,此包可以方便的操作网络底层应用协议,以下1.2.3小节将对jpcap api作详细说明。1.2.2 eclipse开发环境eclipse 是一个开放源代码的、基于 java 的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。幸运的是,eclipse 附带了一个标准的插件集,包括 java 开发工具(java development tools,jdt)。 eclipse是著名的跨平台的自由集成开发环境(ide)。eclipse是一个开发源码项目,任何人都可以免费得到,并可以在此基础上开发各自的插件,因此越来越受人们关注。使用者只需下载各种语言的插件即可。eclipse专注于为高度集成的工具开发提供一个全功能的平台。它主要由eclipse项目、eclipse工具项目和eclipse技术项目三个项目组成,具体包括四个部分组成eclipse platform、jdt、cdt和pde.jdt支持java开发、cdt支持c开发、pde用来支持插件开发,eclipse platform则是一个开放的可扩展ide,提供了一个通用的开发平台。它提供建造块和构造并运行集成软件开发工具的基础。eclipse platform允许工具建造者独立开发与他人工具无缝集成的工具从而无须分辨一个工具功能在哪里结束,而另一个工具功能在哪里开始。eclipse sdk(软件开发者包)是eclipse platform、jdt和pde所生产的组合并,它们可以一次下载。这些部分在一起提供了一个具有丰富特性的开发环境,允许开发者有效地建造可以无缝集成到eclipse platform中的工具。eclipse sdk由eclipse项目生产的工具和来自其它开放源代码的第三方软件组合而成。eclipse项目生产的软件以 cpl发布,第三方组件有各自自身的许可协议。eclipse让java开发更快捷更高效,无论对于庞大的开发项目还是微小的程序设计它都成为用户的青睐。1.2.3 jpcap 简介1.jpcap开发环境安装只需要把lib中的dll文件拷贝到jre的bin目录,同时lib中的jar文件拷贝到jre中的lib/ext目录下就安装完整,当然你可以使用exe安装包进行安装,这样会更加的简单。需要注意的是,我们经常使用的windows xp操作系统大部分都是精简版,可能少了wincap工具,所以在程序开发时,同时安装上winpcap。2.jpcap类库的基本结构如图1-1所示:图1-1 jpcap 类库结构3. packet基类及其子类packet这个类是所有被捕获的数据包的基类,可以提供被捕获数据包的长度,被捕获数据包的时间标记等基本信息。arppacket和ippacket是继承packet的子类,它们将被捕获包分成两类。arppacket按照arp数据报的内容,将其各数据段的数据取出。ippacket则被分得更细。这两个类主要与是与数据链路层密切相关的,其与mac地址相关的信息在ethemetpacket类中表示出来。ethemetpacket是从datalinkpacket继承而来的。ippacket下有三个子类,分别是icmppacket、tcppacket、udppacket。这三个类分别表示的是被存储在ip数据报的报文中发送的icmp、tcp、udp报文。在被捕获包的基本信息就可以通过直接转化为字符串(tostring)而得到。如icmppacket在用tostring方法直接转化,得到字符串为:类型 type(type) 执行命令code(code)。4. jpcap的主要功能jpcap提供了十分方便的数据包捕获方法。jpcap使用一个事件模型来处理包。首先,必须创建一个执行接口jpcap.jpcaphandler的类。public class jpcaphandler implements jpcaphandler public void handlepacket(packet packet) system.out.println(packet); 为了捕获包,需要让jpcap知道要用哪个网络设备来监听。api提供了jpcap.jpcap.getdevicelist()方法以满足这一目的。这个方法返回一列字符串,可以按一下方法如下使用它:string devices = jpcap.getdevicelist(); 一旦有了一个设备名称的目录,只要从其中选取一个用来监听:string devicename = devices0; 选择一个设备之后,通过jpcap.opendevice()方法打开它。opendevice()方法需要四个参数:即将打开的设备名,从设备上一次读取的最大字节数,说明是否将设备设为混杂模式的boolean值,和以后调用processpacket()方法要使用到的超时值。jpcapjpcap = jpcap.opendevice(devicename, 1024, false, 10000); opendevice()方法将一个参数返回到用以捕获的jpcap对象。既然有了jpcap实例,你可以调用processpacket() 或looppacket()开始监听了。这两种方式都带有两个参数:捕获的最大包数可以是-1(说明没有限制);执行jpcaphandler的一个类的实例。如果你调用processpacket(),那么jpcap将一直捕获包,直到超过opendevice中规定的时限或达到了规定的最大包数。looppacket()则将一直捕获包,直到达到最大包数,如果没有最大数限制,它将永远运行下去。就像下面这样调用:jpcap.looppacket(-1, new jpcaphandler(); 对于捕获的数据包,可以利用jpcap中的packet及其子类进行分类分析,获得数据包的详细信息。jpcap还有进行数据包过滤的函数setfilter(java.lang.stringcondition, booleanoptimize)。其中condition是过滤条件。在进行数据包捕获前设置过滤条件,可以将不感兴趣的数据包剔除。jpcap.setfilter(host 49,true);因为jpcap对数据包进行了分类,而数据包中的关键字段也有接口调用,所以在设置过滤条件时也可以在利用这些条件进行更细致的分类。jpcap还提供了用来发送数据包的一个类jpcapsender,可以用来发送ippacket及其子类,包括ippacket、icmppacket、tcppacket、udppacket。定义好一个相应的包后,就可以利用sendpacket函数发送数据包。jpcapsender sender=jpcapsender.opendevice(jpcap.getdevicelist()0);sender.sendpacket(p); /send a packet第2章 总体设计2.1 需求分析系统实现路由的跟踪,每经过一个路由,要求得到经过该路由节点的地址,也就是说输入目标信息,可以得到本地主机到目标经过的所有中间节点。这些中间节点用ip地址标识。并要求对跟踪跳数,每一跳等待时间可控。为了让系统更加完善,首先要测试目标的连通性,系统中也要实现目标探测功能,即ping功能。2.2 系统主要功能描述数据包构造:主要实现ip包,icmp包和ethenet包的构造(参考jpcap包构造方法)。获取本地网络信息 :主要实现pc机网络设备(网卡)的打开,获取该网卡的网络信息,如ip,mac地址。ping功能:主要实现测试到达目的网络节点是否畅通,与windows自带ping功能基本相同。traceroute功能:主要实现路由跟踪方法,输入跟踪目标的ip地址或url地址,即可跟踪,亦可进行多目标的同时跟踪。界面模块:主要实现可视化操作界面。2.3 系统模块图2.3.1 系统模块概述按系统实现要求主要分成5大模块:数据包构造模块、获取本地网络信息模块、ping功能模块、traceroute功能模块和界面模块。其中,数据包构造模块包括ip包构造、icmp包构造和ethernet包构造;获取本地网络信息模块包打开网络设备和获取本地信息功能;ping功能模块和traceroute功能模块是发送数据包,监听接收的数据包进行分析处理;界面模块包括ping控制面板,traceroute控制面板和主控制面板。2.3.2 系统模块设计图 系统模块图如图2-1所示。图2-1 系统模块设计图2.4 本章小结本章主要讲述了系统的需求分析、整体模块划分,对系统进行结构总体设计,为进一步做好系统详细设计做好准备。第3章 详细设计3.1 系统设计系统设计中,了解系统中各个模块实现原理是设计的基础,以下分别对系统中主要原理进行详细阐述,为进一步流程设计做准备。3.1.1 ping的实现原理ping (packet internet grope),因特网包探索器,用于测试网络连接量的程序。ping发送一个icmp回声请求消息给目的地并报告是否收到所希望的icmp回声应答。以下面一个网络为例:有a、b、c、d四台机子,一台路由ra,子网掩码均为,默认路由为。在同一网段内,在主机a上运行“ping ”后,都发生了些什么呢? 首先,ping命令会构建一个固定格式的icmp请求数据包,然后由icmp协议将这个数据包连同地址“”一起交给ip层协议(和icmp一样,实际上是一组后台运行的进程),ip层协议将以地址“”作为目的地址,本机ip地址作为源地址,加上一些其他的控制信息,构建一个ip数据包,并想办法得到的mac地址(物理地址,这是数据链路层协议构建数据链路层的传输单元帧所必需的),以便交给数据链路层构建一个数据帧。关键就在这里,ip层协议通过机器b的ip地址和自己的子网掩码,发现它跟自己属同一网络,就直接在本网络内查找这台机器的mac,如果以前两机有过通信,在a机的arp缓存表应该有b机ip与其mac的映射关系,如果没有,就发一个arp请求广播,得到b机的mac,一并交给数据链路层。后者构建一个数据帧,目的地址是ip层传过来的物理地址,源地址则是本机的物理地址,还要附加上一些控制信息,依据以太网的介质访问规则,将它们传送出去。主机b收到这个数据帧后,先检查它的目的地址,并和本机的物理地址对比,如符合,则接收;否则丢弃。接收后检查该数据帧,将ip数据包从帧中提取出来,交给本机的ip层协议。同样,ip层检查后,将有用的信息提取后交给icmp协议,后者处理后,马上构建一个icmp应答包,发送给主机a,其过程和主机a发送icmp请求包到主机b一模一样。不在同一网段内,在主机a上运行“ping ”后,开始跟上面一样,到了怎样得到mac地址时,ip协议通过计算发现d机与自己不在同一网段内,就直接将交由路由处理,也就是将路由的mac取过来,至于怎样得到路由的mac,跟上面一样,先在arp缓存表找,找不到就广播吧。路由得到这个数据帧后,再跟主机d进行联系,如果找不到,就向主机a返回一个超时的信息。3.1.2 traceroute的实现原理traceroute程序的实现主要涉及ip头部生存时间(time to live ,ttl)字段的使用。设置ttl字段的目的是防止数据报由于选路错误或其他软硬件原因从而导致在网络中无休止的流动,它指定了数据报的生存时间。ttl的初始值由源主机设置,当一份数据报经过路由器时,处理该数据报的路由器都需要把ttl值减去数据报在路由器中停留的秒数。但事实上大多数路由器只是简单地将ttl值减1,因此ttl字段最终被实现为一个跳站计数器。当ttl字段的值被减为0时,路由器就不会转发该数据报,而是将其丢弃,并产生一份icmp超时差错报文发往源主机以通知错误的发生。traceroute程序的关键就在于返回的这份icmp超时差错报文的源地址就是途经路由器的ip地址。由此,通过依次递增ttl字段的值,就可以得到一份数据报在其传输路径上所经过的路由信息。traceroute程序在具体实现时,是令其向目的主机发送一个icmp回显请求(echo request)消息,并重复递增ip头部ttl字段的值。刚开始的时候ttl等于1,这样当该数据报抵达途中的第一个路由器时,ttl的值就被减为0,导致发生超时错误,因此该路由器生成一份icmp超时差错报文返回给源主机。随后,主机将数据报的ttl值递增1,以便ip报文能传递到下一个路由器,下一个路由器将会生成icmp超时超时差错报文返回给源主机。不断重复这个过程,直到数据报到达最终的目的主机,此时目的主机将返回icmp回显应答(echo replay)消息。这样,源主机只需对返回的每一份icmp报文进行解析处理,就可以掌握数据报从源主机到达目的主机途中所经过的路由信息。3.1.3 ip报文结构ip数据报的最开始存放着ip的版本(version)。ipv4版本存放为4。接下来ihl是一个字符,即以32位为一个单位,存放着从版本开始到填充结束的报头的长度。最短的情况没有选项,这是ihl的值为5。服务类型字段(type of service)表示ip数据报在传递时发送端要求的品质。第七位是为将来预留的扩展位。数据报长度字段(total length)以8位为一个单位,即字节表示ip数据报的长度。接下来的标识字段(identification),从tcp等上层协议调用时ip数据报的标识号。标志字段(flags)和数据块偏移(fragment offset)用于对数据块偏移的处理。ip数据报要在数据链路层的协议规定下装入帧的报文中传送,由于ip数据报中,报文部分最大就有65535为,数据链路层的帧是不能全部容纳的,所以采用叫做分块的方法。分割的数据称为碎块。ip数据报的标志表示有无碎块,数据块偏移用于保证数据块偏移按照正确的顺序处理。ttl字段是为了防止错误的ip数据报在网络上循环,赋予ip数据报一定的寿命。ip数据报在发送时就在ttl字段中设置其寿命。ttl字段的值在ip数据报每通过一次路由器时,进行一次衰减。当为0时,ip数据报就被删除。通常设为最大值255。协议字段(protocol)中存放着表示tcp等ip的上层协议的值。包括icmp、tcp、egp、igp、udp等。在检查错误的报头校验码(header checksum)的后面是发送端地址和目的地址,他们在ipv4中都为32位。最后存放的是选项和把报头进行32位整数化后余下的位。ip报文结构如图3-1所示:图3-1 ip数据包头的结构3.1.4 icmp报文结构1.icmp报文与ip报文的关系icmp是因特网控制报文协议(internet control message protocol,icmp)的缩写。icmp通常被认为是ip层的一个组成部分(子协议),主要用于在ip主机和路由器之间传递控制消息。但从结构上看它位于ip层的上方,因为icmp报文是封装在ip数据报内作为有效载荷传输的,它与ip报文的关系如图3-2所示。图3-2 ip报文与icmp报文的关系2.icmp报文结构icmp报文的一般格式如图3-3所示,所有icmp报文的前4个字节都是一样的,但是剩余的其他字节则根据不同的类型和代码而有所区别。图3-3 icmp报文的一般格式类型(type)字段可以有15个不同的取值,用来描述特定类型的icmp报文。icmp报文可以划分为查询报文和差错报告报文两类,某些icmp报文进一步使用代码(code)字段来描述同一类型下的不同条件,因此不同类型的icmp报文是由类型字段和代码字段共同决定的。16位校验和字段使用与ip报头的校验和字段机同的网际校验算法,不同的是该校验和覆盖整个icmp报文,即校验内容不仅包括icmp报头,还包括icmp数据部分。部分类型的icmp报文及其说明参照表3-1。表3-1 部分icmp报文参照表类型字段的值消 息意 义0echo reply对回应请求(8)的响应3destination unreachable从路由器返回给发送端:ip数据报到达不了接收端4source quench抑制从发送端传送来的数据5redirect请求变更路径8echo request响应请求11time exceeded for a datagram通知发送端ttl已经为012parameter problem on a datagram通知数据报形式出错13timestamp request要求对方送出时间信息(时间戳)14timestamp reply对要求时间戳的响应3.icmp回显请求与回显应答报文系统中涉及3种类型的icmp报文:icmp回显请求报文、icmp回显应答报文和icmp超时差错报文。其中,icmp回显请求与回显应答报文结构如图3-4所示。图3-4 icmp回显请求与应答报文结构这两种报文通常也称作ping报文,目的是为了测试一台主机到另一台主机是否可达。当一台主机收到icmp回显请求报文后,接收主机应向源主机回送icmp回显应答报文,且该回显报文必须响应源报文中标识符、序列号和选项数据三个字段(即应将这三个字段原封不动地返回)。4.icmp超时差错报文icmp超时报文会在两种情况下产生:一是路由器在转发数据报时ip头部的ttl值减为0,二是当组成一个数据报的所有分片未能在某一限定时间内到达目的主机而导致的超时。两种情况下路由器或目的主机都将丢弃相应分组并向源主机发送超时差错报文,本程序主要是利用第一种情况产生的超时差错报文来收集路由信息。icmp超时差错报文的结构如图3-5所示。图3-5 icmp超时差错报文结构icmp(所有)差错报文的规则是:报文中的数据部分必须包含产生该差错报文的ip数据报头部(包含选项字段),以及(至少包含)跟在该ip头部后面的前8个字节。这样接收icmp的进程就可以根据所包含的差错数据将其与之前的某个特定的报文或进程关联起来。对于使用的回显请求报文,由它产生的icmp超时差错报文的完整格式如图3-6所示。图5-6 icmp超时差错报文的完整格式3.1.5 ethenet报文结构以太网帧的结构是这样。开始的64位是前同步码(preamble)和帧首定界符(start frame delimiter)。前同步码是使发送端和接收端在数据的交接上步调一致的信号。发送端以56位(1010101010)反复发送1和0信号。接收端接收到这种信号后,准备读取发送来的信号。前同步码结束后使表示帧的真正开始的8位(10101011)位列。帧首定界符之后是地址等报头信息。帧首定界符后面是接收端及发送端的mac地址。只有在接收端的mac地址是自己的mac地址的情况下,才能进行帧的接收;mac地址为其他机器的情况下,将不接收改帧。但当接收端地址全部都为1时,在同一以太网内连接的所有设备,都要接收该帧。地址全部为1的mac地址称为广播地址。接收端和发送端的mac地址后面是16位的类型字段(type field)。类型字段中存放的是以太网帧中传送数据的上层协议的种类代码。以太网帧的报文部最大能存放12000位,即1500字节。以太网是物理层及数据链路层的协议。以太网帧所传送的数据是网络层规定的数据包。如果要使用ip网络协议,则ip数据包就将存储在以太网帧的报文处。帧的尾部是检查数据错误的错误校验及修正码。以太网中常使用循环冗余校验(crc: cyclic redundancy check)检查错误。crc中,将表示帧的位列作为多项式。把多项式与准备好的特定多项式相除,得出的结果与数据一同发送。在接收端重新进行一次除法运算,用其结果确认传送来的数据正确与否。ethenet报文格式如图3-7所示。图3-7 ethenet报文格式3.2 系统流程图设计3.2.1 ping流程图根据3.1节对ping原理的分析,ping程序流程图如图3-8所示。图3-8 ping流程图3.2.2 traceroute流程图根据3.1节对traceroute原理的分析,traceroute流程图如图3-9所示。图3-9 traceroute流程图3.3 界面设计界面设计遵循kiss原则就是keep it simple and stupid的缩写,简洁和易于操作。要求在界面中接收输入的参数,如目标信息,最大跳数,等待时间等信息,然后按“确定”按钮即可启动ping或traceroute线程,启动程序后实时在界面上显示执行信息,并要求可以停止当前运行的线程。3.4 本章小结在本章中,详细地阐述设计的原理,并以图文形式表达了本系统逻辑结构设计和各模块的控制流程设计。第4章 系统实现4.1 数据包构造实现本系统中主要用到的网络数据报文包括ip报文、icmp报文和ethernet报文,上一章对报文结构及协议特性作了详细分析,这节将用代码实现这些报文。各报文之间的类关系如图4-1所示。图4-1 报文类之间的关系4.1.1 ip报文实现根据以上ip数据包的结构,程序实现如下。1.数据包的基类,可以提供被捕获数据包的长度,被捕获数据包的时间标记等基本信息public class packet implements serializable public packet() void setpacketvalue(long sec, long usec, int caplen, int len) this.sec = sec; this.usec = usec; this.caplen = caplen; this.len = len; void setdatalinkpacket(datalinkpacket p) datalink = p; void setpacketdata(byte data) this.data = data; void setpacketheader(byte header) this.header = header; public string tostring() return (new stringbuilder(string.valueof(sec).append(:).append(usec).tostring(); public long sec; public long usec; public int caplen; public int len; public datalinkpacket datalink; public byte header; public byte data;2.继承父类packet,实现ippacket类public class ippacket extends packet public ippacket() options = null; public void setipv4parameter(int priority, boolean d_flag, boolean t_flag, boolean r_flag, int rsv_tos, boolean rsv_frag, boolean dont_frag, boolean more_frag, int offset, int ident, int ttl, int protocol, inetaddress src, inetaddress dst) version = 4; this.priority = (byte)priority; this.d_flag = d_flag; this.t_flag = t_flag; this.r_flag = r_flag; this.rsv_tos = (byte)rsv_tos; this.rsv_frag = rsv_frag; this.dont_frag = dont_frag; this.more_frag = more_frag; offset = (short)offset; this.ident = ident; hop_limit = (short)ttl; tocol = (short)protocol; src_ip = src; dst_ip = dst; void setipv4value(byte ver, byte pri, boolean d, boolean t, boolean r, byte rsv_tos, boolean rf, boolean df, boolean mf, short offset, short len, short ident, short ttl, short proto, byte src, byte dst) version = ver; priority = pri; d_flag = d; t_flag = t; r_flag = r; this.rsv_tos = rsv_tos; rsv_frag = rf; dont_frag = df; more_frag = mf; this.offset = offset; length = len; this.ident = ident; hop_limit = ttl; protocol = proto; try src_ip = inetaddress.getbyaddress(src); dst_ip = inetaddress.getbyaddress(dst); catch(unknownhostexception unknownhostexception) void setoption(byte option) this.option = option; byte getsourceaddress() return src_ip.getaddress(); byte getdestinationaddress() return dst_ip.getaddress(); public string tostring() return (new stringbuilder(string.valueof(super.tostring().append( ).append(src_ip).append(-).append(dst_ip).append( protocol().append(protocol).append() priority().append(priority).append() ).append(d_flag ? d : ).append(t_flag ? t : ).append(r_flag ? r : ).append( hop().append(hop_limit).append() ).append(rsv_frag ? rf/ : ).append(dont_frag ? df/ : ).append(more_frag ? mf : ).append( offset().append(offset).append() ident().append(ident).append().tostring(); /(省略)ip包类型定义及icmp包所用数据类型定义,实现代码参见设计代码4.1.2 icmp报文实现根据以上icmp包结构分析,继承ip包结构,实现程序如下。public class icmppacket extends ippacket public icmppacket() void setvalue(byte type, byte code, short checksum, short id, short seq) this.type = type; this.code = code; this.checksum = checksum; this.id = id; this.seq = seq; void setid(short id, short seq) this.id = id; this.seq = seq; void settimestampvalue(int orig, int recv, int trans) orig_timestamp = orig; recv_timestamp = recv; trans_timestamp = trans; void setredirectip(byte ip) try redir_ip = inetaddress.getbyaddress(ip); catch(unknownhostexception unknownhostexception) byte getredirectip() return redir_ip.getaddress(); void setrouteradvalue(byte addr_num, byte entry_size, short alive_time, string addr, int pref) this.addr_num = addr_num; addr_entry_size = entry_size; this.alive_time = alive_time; for(int i = 0; i ).append(getdestinationaddress().append( ().append(frametype).append().tostring(); private char hexupperchar(byte b) b = (byte)(b 4 & 0xf); if(b = 0) return 0; if(b 10) return (char)(48 + b); else return (char)(97 + b) - 10); private char hexlowerchar(byte b) b &= 0xf; if(b = 0) return 0; if(b 10) return (char)(48 + b); else retur

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论