traceroute小结 come from CSDN author:houdong

traceroute程序可以使我们看到IP数据报从一台主机传到另一台主机的所经过的路由,并且可以使用IP源站路由选项。

traceroute取代IP RR的原因

1 不是所有的路由器都支持IP RR选项,而traceroute程序不需要中间路由器具备任何特殊的或可选的功能。

2 记录路由一般是单向选项。发送端设置该选项,接收端不得不从收到的IP首部中提取出所有的信息,然后全部返回给发送端。这样使记录下来的IP地址多了一倍(一来一回)。

traceroute程序只需要目的端运行一个UDP模块,其他不需要任何特殊的服务器应用程序。

3 IP首部中留给RR选项的空间有限,不够存放当前大多数的路径。

traceroute原理

traceroute通过ICMP“超时”和“端口不可达”两种消息记录所经过路径的路由。

使用“超时”消息记录经过的路由:

traceroute程序发送的数据报首部TTL字段由发送端设置成一个8bit字段。每个处理数据报的路由器都需要把TTL的值减1或减去数据报在路由器中停留的秒数。由于大多数的路由器转发数据报的时延都小于1秒,因此TTL最终成为一个跳数计数器,每经过一台路由器就将其值减1。

当路由器收到一份IP数据报,如果其TTL字段是0或1,则路由器不转发该数据报。通常情况下,系统不会接收TTL值为0的数据报。

1 接收到这种数据报的主机是目的主机,直接将其交给应用程序。

2 接收主机不是目的主机,直接将其丢弃,并给发送端发一份ICMP超时消息。

traceroute程序记录所经过路由的关键在于包含这份ICMP信息的IP报文的信源地址是该路由器的入站接口IP地址。

使用“端口不可达”消息判断是否到达目的主机:

traceroute程序发送一份UDP数据报给目的主机。但它选择一个不可能的值作为UDP端口号(大于30000),目的主机的任何一个应用程序都不可能使用该端口。因此,当该数据报到达时,将使目的主机的UDP模块产生一份“端口不可达”错误的ICMP报文。traceroute程序要做的就是区分接收到的ICMP错误报文是“超时”还是“端口不可达”来判断什么时间结束。

traceroute示例

 

R1#traceroute 10.0.0.2

Type escape sequence to abort.

Tracing the route to 10.0.0.2

1 172.16.0.2 28 msec 24 msec 144 msec

2 192.168.1.2 144 msec 288 msec 160 msec

3 10.0.0.2 240 msec * 288 msec

1 R1发送一份TTL字段为1的IP数据报给目的主机R4。处理这份数据报的第一个路由器R2将TTL值减1,然后丢弃该数据报,并发回一份超时ICMP报文。这样发送端就得到了该路径中的第一个路由器R2的地址172.16.0.2(入站接口地址),并把R2标记为该路径的第一跳。

2 R1发送一份TTL字段为2的IP数据报给目的主机R4,经过R2时将TTL字段减1后转发至R3。R3接收到IP数据报将TTL字段减1后丢弃,并发回一份超时ICMP报文。这样就得到了该路径中的第二台路由器R3的地址192.168.1.2,并把R3标记为该路径的第二跳。

3 继续这个过程,R1发送一份TTL字段为3的IP数据报给目的主机R4,当到达R4后,该IP数据报使R4模块产生一份ICMP“端口不可达”错误报文并发送给源。traceroute过程此时结束。

svr4 % traceroute slip

traceroute to slip (140.252.13.65),30 hops max,40byte packets

1 bsdi(140.252.13.35)20ms 10ms 10ms

2 slip(140.252.13.65)120ms 120ms 120ms

// 主机名,IP地址,3份数据报的往返时间

输出的第1个无标号行给出了目的主机名和其IP地址,指出TTL最大值是30。40字节的数据报包含20字节IP首部,8字节的UDP首部和12字节的用户数据(序列号,TTL副本,发送数据报的时间)输出的后面两行以TTL开始,接下来是主机或路由器名及其IP地址。对于每个TTL值,发送3份数据报。每接收到一份ICMP报文,就计算并打印出往返时间。如果在5秒内仍未收到3份数据报的任意一份响应,则打印一个*号,并发送下一份数据报。

目的主机的端口号最初设置为33435,每发送一个数据报加1。可以通过命令行选项来改变开始的端口号。

当路由器将TTL值减到0时将发回“传送超时”的ICMP报文。即使这份被丢弃的IP报文发送往目的地,路由器也会发回ICMP报文。

ICMP超时报文格式

有两种不同的ICMP超时报文,它们的ICMP报文中的code字段不同。ICMP差错报文的格式如下:

我们所讨论的ICMP报文是在TTL值为0时产生的,其代码字段为0。

主机在组装分片时可能发生超时。这时它将发送一份“组装报文超时”的ICMP报文。这种差错报文将code字段置1。

traceroute注意事项

对于在同一台主机上多次运行traceroute程序的情况,每个进程都查看ICMP返回的UDP首部的源端口号,并且只处理那些对自己发送应答的报文。

1 不能保证现在的路由也是将来要采用的路由。甚至两份连续的IP数据报都可能采用不同的路由。

2 不能保证ICMP报文的路由与traceroute程序发送的UDP数据报采用同一路由。这表明所打印出来的往返时间可能并不能真正体现数据报发出和返回的时间差。(如果UDP数据报从信源到路由器的时间是1秒,而ICMP报文用另一条路由返回信源用了3秒时间,则打印出来的往返时间是4秒。

3 返回的ICMP报文中的信源IP地址是UDP数据报到达的路由器接口的IP地址。这与IP RR选项不同,记录的IP地址指的是入站接口地址。由于每个定义的路由器都有多个接口,因此从A到B和从B到A运行traceroute程序所得到的结果可能是不同的。

IP源站选路选项

通常IP路由是动态的,即每个路由器都要判断数据报下面该转发到哪个路由器。应用程序对此不进行控制,而且通常也并不关心路由。

源站选路的思想是由发送者指定路由。它可以采用以下两种方式:

1 严格的源路由选择(LSRR)

发送端指明IP数据报所必须采用的确切路由。如果一个路由器发现源路由所指定的下一个路由器不在其直接连接的网络上,那么它就返回一个“源站选路失败”的ICMP报文。

2 宽松的源站选路(SSRR)

发送端指明了一个数据报经过的IP地址清单,但是数据报在清单上指明的任意两个地址之间可以通过其他路由器。

源站路由选项格式:

此格式与IP RR选项格式基本一致。不同之处是,对于源站选路,我们必须在发送IP数据报前填充IP地址清单。而对于记录路由选项,需要为IP地址清单分配并清空一些空间,并让路由器填充该清单中的各项。

宽松的源站选路的code字段的值是0x83;严格的源站选路的值是0x89。

扩展traceroute选项

R1#traceroute

Protocol [ip]:

//指定协议类型

Target IP address:

//与指定协议相关的目标地址

Source address:

//指定源地址

Numeric display [n]:

//数字显示

Timeout in seconds [3]:

//设置超时时间。默认为3秒

Probe count [3]:

//发送UDP包的数量。默认为3个

Minimum Time to Live [1]:

//设定最小TTL值。默认为1

Maximum Time to Live [30]:

//设定最大TTL值。默认为30

Port Number [33434]:

//UDP报文使用的目的端口号。默认为33434

Loose, Strict, Record, Timestamp, Verbose[none]:

//option功能。可以指定任意组合。

时间: 2024-08-01 11:53:33

traceroute小结 come from CSDN author:houdong的相关文章

js初学练手:Csdn Ads Cleaner

这里啦:https://greasyfork.org/zh-CN/scripts/376621-csdn-ads-cleaner 隔壁csdn的广告太猖獗啦!写个js管管它 需配合TemperMonkey使用,点击左上角的按钮就可以清除广告. V1.0代码: // ==UserScript== // @name Csdn Ads Cleaner // @namespace http://tampermonkey.net/ // @version 1.0 // @description Clear

Android插件化(三)加载插件apk中的Resource资源

Android加载插件apk中的Resource资源 简介 如何加载未安装apk中的资源文件呢?我们从android.content.res.AssetManager.java的源码中发现,它有一个私有方法addAssetPath,只需要将apk的路径作为参数传入,我们就可以获得对应的AssetsManager对象,然后我们就可以使用AssetsManager对象,创建一个Resources对象,然后就可以从Resource对象中访问apk中的资源了.总结如下: 1.新建一个AssetManag

Java面试11|Maven与Git

git的命令一定要掌握,如果学习可以参考:廖雪峰的官方网站 git学习:http://learngitbranching.js.org/?demo 1.Maven 生命周期及Maven多项目聚合与继承 Maven的生命周期分如下的9个阶段. (1)clean 清理自动生成的文件,也就是target目录 (2)Validate 验证Maven描述文件是否有效 (3)Compile 编译java代码 (4)Test 运行测试代码 (5)Package 项目打成war包 (6)Verify 验证构件包

Oracle cursor_sharing 参数 详解

一. 官网的说明 http://download.oracle.com/docs/cd/E11882_01/server.112/e17110/initparams042.htm#REFRN10025 1.1 CURSOR_SHARING Property Description Parameter type String Syntax CURSOR_SHARING = { SIMILAR | EXACT | FORCE } Default value EXACT Modifiable ALTE

Java如何判断线程池所有任务是否执行完毕

package csdn;    import java.util.concurrent.ExecutorService;  import java.util.concurrent.Executors;    /**  * @author nineday  */  public class Test {        public static void main(String args[]) throws InterruptedException {          ExecutorServ

Oracle 判断 并 手动收集 统计信息 脚本

CREATE OR REPLACE PROCEDURE SchameB.PRC_GATHER_STATS AUTHID CURRENT_USER IS BEGIN SYS.DBMS_STATS.GATHER_TABLE_STATS('SchName', 'TableName', CASCADE => TRUE); END; / select owner,table_name,last_analyzed,num_rows from dba_tables where owner='SYSTEM' a

Oracle Analyze 命令 详解

官网的链接如下: http://docs.oracle.com/cd/E11882_01/server.112/e26088/statements_4005.htm#SQLRF01105 使用DBMS_STATS 收集统计信息参考: Oracle Statistic 统计信息 小结 http://blog.csdn.net/tianlesoftware/article/details/4668723 Oracle 判断 并 手动收集 统计信息 脚本 http://blog.csdn.net/ti

NIO的使用 ShortBuffer

java.nio.ByteBuffer用法小结 http://blog.csdn.net/zhoujiaxq/article/details/22822289 在NIO中,数据的读写操作始终是与缓冲区相关联的.读取时信道(SocketChannel)将数据读入缓冲区,写入时首先要将发送的数据按顺序填入缓 冲区.缓冲区是定长的,基本上它只是一个列表,它的所有元素都是基本数据类型.ByteBuffer是最常用的缓冲区,它提供了读写其他数据类型的方法, 且信道的读写方法只接收ByteBuffer.因此

推荐系统资料汇总

大数据/数据挖掘/推荐系统/机器学习相关资源Share my personal resources 视频大数据视频以及讲义http://pan.baidu.com/share/link?shareid=3860301827&uk=3978262348浙大数据挖掘系列http://v.youku.com/v_show/id_XNTgzNDYzMjg=.html?f=2740765用Python做科学计算http://www.tudou.com/listplay/fLDkg5e1pYM.htmlR语