Xx 师范学院计算机与信息技术学院计算机网络原理 课程设计报告书课题名称 基于traceroute 实现目标路径的跟踪姓 名学 号院、系 计算机与信息技术专 业 计算机科学与技术指导教师2012年 12 月 27 日※※※※※※※※※ ※※ ※※ ※※ ※ ※※※※※※ 2010级学生计算机网络原理课程设计目录一、设计目的 (1)二、设计要求 (1)三、设计的理论基础、原理 (1)四、设计关键相关技术、算法及设计实现过程 (5)五、设计总结 (11)六、参考文献 (12)一、设计目的1.熟悉原始套接字编程。
2.了解网络的结构。
3.了解网络传输底层协议。
4.熟悉掌握 ICMP协议的工作原理和路由跟踪原理。
5.掌握vc6.0下程序调试、运行的基本方法。
6.通过实验熟悉协议的应用。
二、设计要求1、通过实验,可以使程序记录并显示了数据报从源端机器传送到目标机器的过程中所经过的路由器的IP地址,并且记录了数据报到达每个路由器所需要的时间。
认真观察到达每个路由器的时间有什么区别,从而熟练掌握tracert 的工作原理和ICMP报文协议。
2、当我们不能通过网络访问目的设备时,网络管理员就需要判断是哪里出了问题。
问题不仅仅会出现在最终目的设备,也可能出现在转发数据包的中间路由器。
三、设计理论基础、原理1、Dos命令Traceroute跟踪路由详解-d防止traceroute 试图将中间路由器的IP 地址解析为它们的名称。
这样可加速显示traceroute 的结果。
-h MaximumHops指定搜索目标(目的)的路径中存在的跃点的最大数。
默认值为30 个跃点。
-j HostList指定回显请求消息将IP 报头中的松散源路由选项与HostList 中指定的中间目标集一起使用。
使用松散源路由时,连续的中间目标可以由一个或多个路由器分隔开。
HostList 中的地址或名称的最大数量为9。
HostList 是一系列由空格分隔的IP 地址(用带点的十进制符号表示)。
仅当跟踪IPv4 地址时才使用该参数。
-w Timeout指定等待“ICMP 已超时”或“回显答复”消息(对应于要接收的给定“回现请求”消息)的时间(以毫秒为单位)。
如果超时时间内未收到消息,则显示一个星号(*)。
默认的超时时间为4000(4 秒)。
-R指定IPv6 路由扩展标头应用来将“回显请求”消息发送到本地主机,使用目标作为中间目标并测试反向路由。
-S指定在“回显请求”消息中使用的源地址。
仅当跟踪IPv6 地址时才使用该参数。
-4指定Traceroute.exe 只能将IPv4 用于本跟踪。
-6指定Traceroute.exe 只能将IPv6 用于本跟踪。
TargetName指定目标,可以是IP 地址或主机名。
-?在命令提示符下显示帮助。
2、Traceroute工作原理(1)Ttaceroute从源主机向目的主机发送一连串的IP数据报,数据报中封装的是无法交付的UDP用户数据报,第一个数据报p1的生存时间TTL设置为1。
当P1到达路径上的第一个路由器R1时,路由器R1先收下它,接着TTL的值减一。
由于TTL等于0了。
R1就把P1丢弃了,并向源主机发送一个ICMP时间超过差错报告报文。
(2)源主机接着发送第二个数据报P2,并把TTL设置为2。
P2先到达路由器R1,R1收下后把TTL减1再转发给路由器R2。
R2收到P2时TTL为1,但减1后TTL变为零了。
R2就丢弃P2,并向源主机发送一个ICMP时间超过差错报告报文。
这样一直继续下去。
但最后一个数据包刚刚到达目的主机时,数据报TTL是1.主机不转发数据报,也不把TTL值减1.但因IP数据报中封装的是无法交付的运输层的UDP用户数据报,因此目的主机要向源主机发送ICMP终点不可达差错报告报文。
(3)这样,源主机到达了自己的目的,因为这些路由器和最后目的主机发来的ICMP报文正好给出了源主机想知道的路由信息—达到目的主机所经过的路由器的IP地址,以及到达其中的每一个路由器的往返时间。
3、ICMP协议简介所有的互联网服务都使用一个底层无连接的分组交付系统,其中,一种称为IP路由器或者IP网关的计算机提供了物理网络之间的所有互连,它用来选择用于发送分组的路径。
当一台路由器收到一个分组后,分析分组中的源地址和目标地址,借助路由器内部的路由表,选择一条最合适的路径,将该分组交付给路径中的下一台主机或者路由器。
那么,当我们从一台主机发送数据报到另外一台主机时,有时为了了解网络结构或者分析故障,需要了解数据报所经过的网络路径,这时采用的办法就是路由跟踪,这样的过程也被称作TraceRoute。
为了让互联网中的路由器报告错误或者提供有关意外情况的信息,设计人员在TCP/IP中加入了一种具有特殊用途的报文机制,这种报文机制称为网际控制报文协议ICMP(Internet Control Message Protocol)。
在正常的IP数据报传输中,当路由器发现某个数据报有错误或者无法转发时,会向发出该IP数据报的原始站点发送ICMP报文,描述IP数据报中所存在的错误。
需要注意的是,ICMP 报文和其他协议报文(如UDP报文、TCP报文)一样,也是封装在IP数据报中的。
4、ICMP原理ICMP(Internet Control Message Protocal)是为了让互联网中的路由器报告错误或提供有关意外情况的信息而设计的一个特殊报文机制。
它是IP协议的附属协议,是封装在IP数据报内部传送的,如图1所示:ICMP的报文格式如图2所示:尽管每个ICMP报文都有自己的格式,但它们开始的三个字段都是一样的:一个8位的报文类型(type)用来标识报文,一个8位的代码(code)用来提供有关类型的进一步信息,一个16位的校验和(checksum)。
(ICMP采用和IP相同的校验和算法,但ICMP校验和只覆盖ICMP报文。
4、在创建套接字的时候可以使用函数:socket(int af, int type, int pr otocol)。
其中type为SOCK_STREAM或SOCK_DAGRAM; protocol一般取0,表示默认TCP/IP协议。
Winsock2中除了现有的地址簇,套接字类型和协议标识外,还添加了一些地址簇,套接字类型和协议标识。
可以通过创建原始套接字来访问控制底层传输协议,比如ICMP协议,IGMP 协议。
在本实验中,将使用ICMP协议来模拟tracert程序,也就是跟踪数据报在网络中传输时所经过的路由器。
5、以下列举几种常见的ICMP报文格式,也是TraceRoute中会遇到到的几种格式(1)回送请求和应答报文格式通常用这种报文格式来判断对方主机是否可达。
主机或者路由器向指定的目的站发送ICMP回送请求报文,任何收到此报文的计算机形成一个回送应答报文,将其返回给最初的发送者。
ping命令其实就是发送这种回送请求报文,然后等待接收回送应答报文。
当类型值为8时,表示回送请求报文,当类型值为0时,表示回送应答报文。
在发送端,一般约定通过标识符来标识该报文属于哪个进程(一般以进程ID作为标识符),通过序号来标识该报文属于该进程发送的第几个报文。
(2)目的站不可达报文格式当路由器无法转发或者直接交付IP数据报时,就会产生上述格式的目的站不可达报文。
根据其中代码值可以分为13种情况,需要特别提及的是当代码为3时,表示的含义为“端口不可达”,但事实上此时数据报已经到达目标主机,只是目标端口未响应,所以目标主机产生“端口不可达”的报文,仅仅从命名上容易产生误解,一定要注意。
当给目标主机的一个无法响应的端口发送UDP报文时,目标主机就会产生这种报文,其中代码值为3。
(3)数据报超时报文格式当路由器的选路表出现差错时,可能会形成一个选路循环,为了避免进入该循环的数据报在循环中无休止的传输下去,每个数据报都包含了一个寿命计时器,也就是IP数据报中的TTL字段。
只要路由器处理了某个数据报,就会将其中的TTL值减1,并且在该值减到0时丢弃该数据报,同时产生这样一个数据报超时报文,其中类型值为11,代码值为0。
下面举一个例子来描述TraceRoute的实现原理。
假设从源主机向目标主机发送一个IP数据报,当该数据报到达目标主机时,一共经过10个路由器转发,显然源主机发出的IP数据报中的TTL值应该是大于10的,否则该数据报会在途中超时,无法到达目标主机。
如果源主机向目标主机发送一个TTL值为n(1≤n≤10)的IP数据报,那么该数据报是无法到达目标主机的,会在途中第n个路由器超时,该路由器会向源主机发送一个ICMP超时报文,源主机则可以根据该超时报文获取途中第n个路由器的IP地址。
如果源主机向目标主机发送一个TTL值为m(m≥11)的IP数据报,那么该数据报可以到达目标主机。
如果在该IP数据报中封装不同类型的协议报文,目标主机则会做出不同的反应:a、如果该IP数据报内封装的是ICMP回送请求报文,目标主机就会向源主机发送一个ICMP回送应答报文。
b、如果该IP数据报内封装的是UDP报文,在这种报文中会指定目标端口,如果此时目标主机上的目标端口并没有与某个UDP套接字绑定,那么目标主机就会向源主机发送一个ICMP端口不可达报文,但是,如果此时目标主机上的目标端口已经和某个UDP套接字绑定,那么该UDP报文会被发给相关套接字,系统将不会产生ICMP端口不可达报文,因此在采用这种协议时,必须注意目标端口的选择。
c、如果该IP数据报内封装的是TCP报文,该报文也要指定目标端口,并将其中SYN标志置1,作为第一次握手。
如果此时目标主机上的目标端口正处在监听状态,那么目标主机会向源主机回应一个TCP报文,其中SYN和ACK标志位置1,确认号为上一次握手的序列号加1,但是如果此时目标主机上的目标端口不处在监听状态,那么目标主机也会向源主机回应一个TCP报文,不过将其中RST和ACK标志位置1,表示复位,不过确认号为上一次握手的序列号加上收到的字节数再加上1,这里收到的字节数指的是TCP报文中的数据部分字节数,为了验证这一点,程序中为第一次握手的TCP报文加上了10个字节的数据部分。
那么,为了获取源主机到目标主机沿途所经过的路由器地址,源主机只需依次发送TTL值为1、TTL值为2、TTL值为3……的IP数据报,接收沿途路由器返回的ICMP超时报文,从中提取路由器地址,直到最后收到目标主机的回应为止。
另外,当路由器无法将数据报交付给目标主机时,可能是因为选路失败或者网络故障,路由器会产生ICMP目的站不可达报文发送给源主机。
此时TraceRoute过程也应该终止。
6、利用原始socket实现及其要点为了能够方便的构造上文提到的各种报文,可以采用原始socket,自行填充IP数据报和内部封装的报文的所有字段。