Traceroute程序可以让我们看到IP数据报从一台主机传到另一台主机所经过的路由,Traceroute程序还可以让我们使用IP源路由选项。
Traceroute程序的运行过程如下:首先需要创建两个套接字,一个是UDP套接字,用来发送探测报文;一个是原始套接字,用来接收返回的ICMP错误信息。程序一开始向目的地发送一个TTL为1的UDP数据报,隔3秒再发送同样TTL值的数据报,共发送3 个,发送时间间隔通过安装SIGALARM保量来控制。这个数据报导致第一跳路由器返回一个ICMP"time exceeded in transmit
(传输中超时)"错误。然后它发送TTL值为2 的数据报,这样就得到了第二个路由器的地址,继续这个过程,直到发送报文到达了目标主机,由于该报文在目标主机中没有对应的进程处理它(端口值不存在,客户端发送时需要将目标端口指定为不存在的值),目标主机返回ICMP"port unreachable
(端口不可达)"错误,程序结束。
图2-1是Traceroute程序的示例输出,图2-2是用tcpdump监控该程序所得到的输出:
图2-1
30 hops表明最大TTL值是30,40bytes表明探测UDP数据报大小是40B,其中包括20B的IP首部,8B的UDP首部及12B的用户数据,用户数据又包含序列号(初值一般为0,每发一个数据报加一),TTL值及发送数据报时间。图2-1画红框的部分表示三个探测数据报的RTT时间。发送UDP数据报时记录下发送时间tSend,虽然这个时间值随着UDP数据报的发送被发送了出去,但是返回的ICMP报文并不会包含这个值(返回的ICMP报文后面会详述),因此在接收到该报文对应的ICMP差错报文时,该值必须缓存,接收到对应的ICMP报文后,计算接收时间tRecv,于是RTT = tRecv - tSend。
关于traceroute程序还需要说明两点,第一:TTL值由IP_TTL套接字选项设定;第二:UDP数据报的源端口设为进程ID与32768的逻辑或,并需调用bind在UDP套接字上捆绑该端口,该端口的值会随着ICMP差错报文返回,这样当一个主机运行多个traceroute实例时,可以区分返回的
ICMP差错报文属于哪一个发送进程。
图2-2
仔细观察图2-2可以看到UDP数据报的目标端口号每发送一个数据报就加1,但源端口号始终不变。
再仔细看一下ICMP差错报文,图2-3是ICMP差错报文的格式:
图2-3
ICMP超时错误:类型-11 代码-0
ICMP端口不可达错误:类型-3 代码-3
ICMP源站选路失败:类型-3 代码-5
完整的ICMP差错报文的格式如图2-4所示:
图2-4
这里“产生ICMP错误的IPv4数据报”就是指发送的UDP检测数据报。
至此traceroute的路径发现功能就介绍完成了,下面看一下它的IP源站选路(source routing)功能,它的基本思想就是由发送者指定路由。先看一下IP首部源站路由选项的通用格式:
图2-5
各字段的含义与ping程序的记录路由并无区别,对于宽松的源站选路,code字段值为0x83,严格的源站选路,code字段值为0x89,同样这部分内容需放置IP首部的IP选项字段中,与ping程序不同的是,IP地址清单必须是在发送数据报时由发送程序填充,数据报文在网络传送过程中,每个路由器把这份IP地址清单取出与自己IP进行对比,看数据包是否可以经由自己通过;而ping程序在发送数据包之前要将相应IP地址清单字段清空,ptr指针指向4(第一个IP处),由经过的每个路由器填写其IP值。
IP源站路由可以有宽松与严格两种方式,宽松的源站选路(LSRR)是指,发送端指明了一个数据报经过的IP地址清单,但是数据报在清单上指明的任意两个地址之间可以通过其他路由器,命令格式为traceroute -g 中间路由器 目标地址;注意:最多只能指定8个中间路由器,因为IP报文一共只有9个地址的空间,还有一个地址要存放目标地址。宽松的源站路由没有什么可说的,其程序输出与不带-g的traceroute程序也无很大的区别。下面重点要介绍的是严格的源站选路(SSRR)。
严格的源站选路是指发送端指明IP数据报所必须采取的确切路由。如果一个路由器发现源路由指定的下一个路由器不在其直接相连的网络上,那么就返回一个“source route failed(源站路由失败)”ICMP差错报文,其报文格式与前面两个相同,类型字段为3,代码字段为5。
还是通过一个例子来说明,图2-6为一个严格源站路由的输出(-G选项表明严格源站路由):
图2-6
这里gateway与gabby之间并无通路,于是当TTL为3时将返回ICMP“源站路由失败”差错报文,这里的关键是TTL字段为3 的输出行,第一和第三个RTT值后面的!S表明traceroute程序接收到ICMP“源站路由失败”差错报文,第二个RTT位置的星号表明未收到这次探查的应答信号,再看一下对应的tcpdump程序输出(图2-7),可以更加深入地了解这一过程:
图2-7
再借助这个例子,说明一下源站路由选项过程中,IP地址清单的更新过程(图2-8):
图2-8
这里D - westgate R1 - netb R2 - gateway R3 - gabby, “#” 号代表指针ptr, ptr所指向的值就是下站路由的值。
参考资料:
《TCP/IP详解卷1:协议》第8章
《UNIX网络编程卷1》第28章
阅读(1608) | 评论(0) | 转发(0) |