文章目录
- 一、ICMP 协议
- 1. ICMP 概念
- 2. ICMP 重定向
- 3. ICMP 差错检测
- 4. ICMP 错误报告/差错报文
- 5. ICMP 差错报文的结构
- 6. ICMP 源站抑制差错
- 7. ICMP 数据包格式
- 8. ICMP 消息类型和编码类型
- 9. ICMP 应用-Ping
- 10. ICMP 应用-Tracert
- 11. BSD 对 ICMP 报文的处理
- 12. 总结
- PING 程序
- 1. Ping 简介
- 2. Ping 程序
- 3. IP 记录路由选项
- 4. IP 记录路由选项结构
- 5. IP 时间戳选项
- Traceroute 程序
- 1. Traceroute 介绍
- 2. Traceroute 和 IP 路径记录选项的区别
- 3. Traceroute 原理
- 4. Windows 下的 Tracert 数据包分析
- 5. Traceroute 注意事项
- IP 源站选路选项
- 1. IP 源站选路选项
- 2. IP 源站选路的操作机制
一、ICMP 协议
1. ICMP 概念
Internet 控制消息协议 ICMP(Internet Control Message Protocol)是网络层的一个重要协议。ICMP协议用来在网络设备间传递各种差错和控制信息,并对于收集各种网络信息、诊断和排除各种网络故障等方面起着至关重要的作用。
ICMP通常被IP层或者更高层的协议(TCP/IP)使用。一些ICMP报文把差错报文返回给用户进程。(告诉应用程序网络上存在什么问题)
ICMP用来出传递差错、控制、查询等信息。
2. ICMP 重定向
PC主机端都有网关,例如主机A网关是100,他要发送报文首先向他的网关路由器打招呼,RTB得和他连接得接口IP就是100,所以第一个找他,RTB检查报文信息发现不是找他,而是找他同网段的另一台网关设备,所以RTB会向主机发送redirect(重定向)消息,让他去找200的RTA,RTA则会将报文转发给服务器A。
- 我们假定主机发送一份IP数据报给R1(R1是主机的默认网关)。
- R1收到数据报并且检查它的路由表,发现R2是发送该数据报的下一跳。当它把数据报发送给R2时,R1检测到它正在发送的接口与接收到数据报的接口是相同的。
- R1发送一份ICMP重定向报文给主机,告诉它以后把数据报发送给R2而不是R1。
一旦默认路由发生差错,默认路由器将通知它进行重定向,并允许主机对路由表作相应的改动。
ICMP 重定向报文的格式如下:
ICMP重定向报文的接收者必须查看三个IP地址:
1. 导致重定向的IP地址(即ICMP重定向报文中包含的IP首部中的目的IP地址)。
2. 发送重定向报文的路由器的IP地址(IP数据报首部中的源IP地址)。
3. 应该采用的路由器IP地址(ICMP重定向报文中的4~7字节)。
重定向的条件
在生成ICMP重定向报文之前这些条件需要满足:
- 出接口必须等于入接口。
- 用于向外传送数据包的路由不能被ICMP重定向报文创建或者修改过,而且不能是路由器的默认路由。
- 数据包不能用源站选路来转发。
- 内核必须配置成可以发送重定向报文。
- 在修改路由表之前要作一些检查。这是为了防止路由器或主机的误操作,以及恶意用户的破坏,导致错误地修改系统路由表。
- 新的路由器必须直接与网络相连接。
- 重定向报文必须来自当前到目的地所选择的路由器。
- 重定向报文不能让主机本身作为路由器。
- 被修改的路由必须是一个间接路由。
3. ICMP 差错检测
ICMP Echo Request和ICMP Echo Reply分别用来查询和响应某些信息,进行差错检测。
主机A向服务器A发送报文为请求报文,也就是request 服务器收到要回复,称为reply。
简单来讲,抓包出来的报文,有请求,有回复的就是能够连接的,如果只有请求没有回复就是没链接成功。
4. ICMP 错误报告/差错报文
ICMP定义了各种错误消息,用于诊断网络连接性问题;根据这些错误消息,主机A可以判断出数据传输失败的原因。比如,如果网络中发生了环路,导致报文在网络中循环,且最终TTL超时,这种情况下网络设备会发送TTL超时消息给发送端设备。如果目的地不可达,则中间的网络设备会发送目的不可达消息给发送端设备。目的不可达的情况有多种,如果是网络设备无法找到目的网络,则发送目的网络不可达消息;如果网络设备无法找到目的网络中的目的主机,则发送目的主机不可达消息。
当发送一份ICMP差错报文的时候,报文始终包含IP的首部和产生ICMP差错报文的IP数据包的前8个字节。这样,接收ICMP差错报文的模块就会把它与某个特定的协议(根据IP数据报首部中的协议字段来判断)和用户的进程(根据包含在IP数据报前8个字节中的TCP或者UDP报文首部中的TCP或UDP端口号来判断)联系起来。
ICMP差错报文的数据包如下:
- IP数据包的前8个字节中包含有源端口,目的端口,总长度和校验和。源端口对应的一个应用程序。也就是说这个数据包报错是给某个应用程序看的(上图中很明显是TFTP应用程序出现问题,目的端口是69,而69端口是TFTP应用程序所占用的)。
注意:下面各种情况都不会导致产生ICMP差错报文:
- ICMP差错报文(但是,ICMP查询报文可能会产生ICMP差错报文)
- 目的地址是广播地址或多播地址(D类地址)的IP数据报。
- 作为链路层广播的数据报。
- 不是IP分片的第一片(只有第一片才会产生差错报文)。
- 源地址不是单个主机的数据报。这就是说,源地址不能为零地址、环回地址、广播地址或多播地址。
这些规则是为了防止过去允许ICMP差错报文对广播分组响应所带来的广播风暴。
5. ICMP 差错报文的结构
ICMP的一个规则是,ICMP差错报文必须包含生成该差错报文的数据报IP首部(包含任何选项),还必须至少包含跟在该IP首部后面的前8个字节(在本例中是UDP首部)。
包含在UDP首部中的源端口号和目的端口号非常重要。就是由于目的端口号才导致产生了ICMP端口不可达的差错报文。而接收ICMP的系统可以根据源端口号来把差错报文与某个特定的用户进程相关联。导致差错的数据报中的IP首部要被送回的原因是因为IP首部中包含了协议字段,使得ICMP能够解释后面的8个字节(在本例中是UDP首部)。
6. ICMP 源站抑制差错
ICMP 源站抑制差错报文格式:
当主机发送很多数据报,并且发送速度很快的时候。路由器转发不过来,资源不够了,缓存也缓存不下。就会发送一个ICMP源站抑制差错报文。
但是新的Router Requirements RFC 提出路由器不应该产生源站抑制差错报文。由于源站抑制要消耗网络带宽,且对于拥塞来说是一种无效而不公平的调整,因此现在人们对于源站抑制差错的态度是不支持的。
还需要指出的是,sock程序要么没有接收到源站抑制差错报文,要么接收到却将它们忽略了。结果是如果采用UDP协议,那么BSD实现通常忽略其接收到的源站抑制报文(TCP接受源站抑制差错报文,并将放慢在该连接上的数据传输速度)。其部分原因在于,在接收到源站抑制差错报文时,导致源站抑制的进程可能已经中止了。
7. ICMP 数据包格式
ICMP报文是在IP数据报内部被传输的。
ICMP报文分为两类,分别是查询报文,差错报文。
这里只是说ICMP数据包的格式,Type表示数据包类型,Code表示同一类型中不同的信息,Checksum也就是校验,用于检查消息是否完整,消息中包含32比特的可变参数,Checksum字段一般不使用。
ICMP消息封装在IP报文里,格式取决于Type和Code字段。ICMP报文内容可变,不使用时为0。
-
Type 是消息类型(8位)。类型字段可以有15个不同的值,以描述特定类型的ICMP报文。某些ICMP报文还使用代码字段的值来进一步描述不同的报文内容。
-
Code 是消息的具体参数(8位)。
-
Checksum 字段校验信息是否完整(16位校验和)。检验和字段覆盖整个ICMP报文。ICMP的检验和是必需的。
在ICMP的Redirect(重定向)消息中,这个字段用来指定网关IP地址,主机根据这个地址将报文重定向到网关。
在Echo请求消息中,这个字段包含标识符和序号,源端根据这两个参数将收到的回复消息与本端发送的Echo请求消息进行关联。尤其是当源端向目的端发送了多个Echo请求消息时,需要根据标识符和序号将Echo请求和回复消息进行——对应。
ICMP Echo Request数据包:
ICMP Echo Reply数据包:
8. ICMP 消息类型和编码类型
图中的最后两列表明ICMP报文是一份查询报文还是一份差错报文。对ICMP差错报文有时需要作特殊处理,因此我们需要对它们进行区分。
-
ICMP定义了多种消息类型,并用于不同的场景。
-
有些ICMP消息使用Type字段定义消息大类,用Code字段表示消息的具体类型。比如,类型为3的消息表示目的不可达,不同的Code值表示不可达的原因,包括目的网络不可达(Code=0)、目的主机不可达(Code=1)、协议不可达(Code=2)、目的TCP/UDP端口不可达(Code=3)等。
主机不可达
Echo Request
端口不可达
UDP的端口不可达
需要分片但设置了不分片比特
DF位为1
由于过滤,通讯被强制禁止
9. ICMP 应用-Ping
ICMP的一个典型应用是Ping。Ping是检测网络连通性的常用工具,同时也能够收集其他相关信息。用户可以在Ping命令中指定不同参数,如ICMP报文长度、发送的ICMP报文个数、等待回复响应的超时时间等,设备根据配置的参数来构造并发送ICMP报文,进行Ping测试。
Ping常用的配置参数说明如下:
-
-a:source-ip-address指定发送ICMP ECHO-REQUEST报文的源IP地址。如果不指定源IP地址,将采用出接口的IP地址作为ICMP ECHO-REQUEST报文发送的源地址。
-
-c:count指定发送ICMP ECHO-REQUEST报文次数。缺省情况下发送5个ICMP ECHO-REQUEST报文。
-
-h:ttl-value指定TTL的值。缺省值是255。
-
-t:timeout指定发送完ICMP ECHO-REQUEST后,等待ICMP ECHO-REPLY的超时时间。
-
ping命令输出信息包括目的地址,ICMP报文长度、序号、TTL往返时间。序号包含在可变参数字段中,TTL包含在IP头中。
Ping命令的输出信息中包括目的地址、ICMP报文长度、序号、TTL值以及往返时间。序号是包含在Echo回复消息(Type=0)中的可变参数字段,TTL和往返时间包含在消息的IP头中。
10. ICMP 应用-Tracert
ICMP的另一个典型应用是Tracert(路由追踪)。
Tracert基于报文头中的TTL值来逐跳跟踪报文的转发路径。为了跟踪到达某特定目的地址的路径,源端首先将报文的TTL值设置为1。该报文到达第一个节点后,TTL超时,于是该节点向源端发送TTL超时消息,消息中携带时间戳。然后源端将报文的TTL值设置为2,报文到达第二个节点后超时,该节点同样返回TTL超时消息,以此类推,直到报文到达目的地。这样,源端根据返回的报文中的信息可以跟踪到报文经过的每一个节点,并根据时间戳信息计算往返时间。Tracert是检测网络丢包及时延的有效手段,同时可以帮助管理员发现网络中的路由环路。
Tracert常用的配置参数说明如下:
- -a:source-ip-address指定tracert报文的源地址。
- -f:first-ttl指定初始TTL。缺省值是1。
- -m:max-ttl指定最大TTL。缺省值是30。
- -name:使能显示每一跳的主机名。
- -p:port指定目的主机的UDP端口号。
- RTA向主机B发UDP报文,选择大于30000的端口数。
- 第一跳,判断不是目的IP地址不是本机地址,TTL减一为零,丢弃报文发送ICMP超时报文(且含有该跳IP地址10.0.0.2),这样RTA得到RTB地址。
- 第二跳,三跳类似。
- 直到主机收到UDP报文,目的IP地址是本机地址,但没用应用程序对于UDP端口数,返回源一个ICMP端口不可达。源收到ICMP端口不可达后得知报文已经到目的端,停止Tracert程序,得到经历的路径
tracert www.baidu.com # 路由追踪
11. BSD 对 ICMP 报文的处理
BSD:Unix操作系统
12. 总结
-
Ping使用的是哪两类ICMP消息?
- Ping利用ICMP Echo Request请求消息(Type值为8)来发起检测目的可达性。目的端收到ICMP Echo Request请求消息后,根据IP报文头中的源地址向源端发送ICMP Echo Reply回复消息(Type值为0)。
-
当网络设备收到TTL值为0的IP报文时,会如何操作?
- 如果IP数据包在到达目的地之前TTL值已经降为0,则收到IP数据包的网络设备会丢弃该数据包,并向源端发送ICMP消息通知源端TTL超时。
PING 程序
1. Ping 简介
”ping” 这个名字源于声纳定位操作。其目的是为了测试另台主机是否可达。该程序发送一份ICMP回显请求报文给主机,并等待返回ICMP回显应答。
可以用Ping程序来确定问题出在哪里。Ping程序还能测出到这台主机的住返时间,以表明该主机离我们有 “多远“ 。
一台主机的可达性可能不只取决于IP层是否可达,还取决于使用何种协议以及端口号。Ping程序的运行结果可能显示某台主机不可达,但是可以用Telnet远程登录到该台主机的25号端口。
2. Ping 程序
我们称发送回显请求的Ping程序为客户,而称被Ping的主机为服务器。大多数的TCP/IP实现都在内核中直接支持Ping服务器,这种服务器不是一个用户进程。
Unix系统在实现ping程序时是把ICMP报文中的标识符字段置成发送进程的ID号。这样即使在同一台主机上同时运行了多个ping程序实例, ping程序也可以识别出返回的信息。
序列号从0开始,每发送一次新的回显请求就加1。ping程序打印出返回的每个分组的序列号,允许我们查看是否有分组丢失、失序或重复。IP是一种最好的数据报传递服务,因此这三个条件都有可能发生。
ICMP回显请求和回显应答报文如图所示:
- 标识符 Identifier:16位字段,通常由发送方设置,用于唯一标识发送的ping消息。这样即使在同一台主机上同时运行了多个ping程序实例, ping程序也可以识别出返回的信息。
- 序列号 Sequence Number:16位字段,表示ping消息的序列号,通常由发送方设置,用于标识不同的ping消息。每发送一次新的回显请求就加1。ping程序打印出返回的每个分组的序号。
- 选项参数:
- **数据 Data **包含数据字段,可以用来携带任意数据,通常用来填充数据以达到指定的数据包大小。
序列号位是每发送一次新的Request请求就加1。
Linux中的ping结果
-
当返回ICMP回显应答的时候,要打印出序列号和TTL值,并计算往返的时间。
-
回显应答是以发送的次序返回的(0,1,2等)
-
ping程序通过在ICMP报文数据中存放发送请求的时间值来计算往返时间。当应答返回的时候,用当前时间减去存放在ICMP报文中的时间值,即是往返时间。
-
Windows的数据部分没有意义。
广域网输出(不常见)
- 重复的分组:可能看到两个icmp_seq 值一样的信息。
- 失序的分组:可能看到icmp_seq值9在8的前面。
- 表示IP协议是不可靠的协议,可以重复,丢失,失序…
3. IP 记录路由选项
IP记录路由选项是IPv4协议中的一种选项,用于在IP数据报文头部中记录数据包在传输过程中经过的路由节点。当一个数据包通过互联网传输时,它可能会经过多个路由器和网络节点,IP记录路由选项可以用来记录这些经过的节点信息。
-
ping程序为我们提供了查看IP记录路由(RR)选项的机会。大多数不同版本的ping程序都提供 -R 选项,以提供记录路由的功能。它使得ping程序在发送出去的IP数据报中设置IP的RR选项(该IP数据报包含ICMP回显请求报文)。这样,每个处理该数据报的路由器都把它的IP地址放入选项字段中。当数据报到达目的端时, IP地址清单应该复制到ICMP回显应答中,这样返回途中所经过的路由器地址也被加入清单中。当ping程序收到回显应答时,它就打印出这份IP地址清单。
- 在IP数据报中,“RR"通常指的是"Record Route”(记录路由)选项。记录路由选项允许数据包在传输过程中记录经过的路由器的IP地址,以便后续分析和跟踪数据包的路径。
-
最大的问题是IP首部中只有有限的空间来存放IP地址(IP首部一共站60个字节)。IP首部中的首部长度字段只有4bit,因此整个IP首部最长只能包括15(4bit全为1,8+4+2+1=15)个32bit长的字(即60个字节)。由于IP首部固定长度为20字节, RR选项用去3个字节,这样只剩下37个字节(60-20-3)来存放IP地址清单,也就是说只能存放9(4×9)个IP地址。
4. IP 记录路由选项结构
-
code:是一个字节,指明IP选项的类型。对于RR选项来说,它的值为7。
-
长度(Length):占据1个字节,表示RR选项的总长度,包括类型和长度字段自身,以及后续的地址字段。通常情况下,长度为3至39,具体取决于记录的路由节点数量。(尽管可以为RR选项设置比最大长度小的长度,但是ping程序总是提供39字节的选项字段,最多可以记录9个IP地址。由于IP首部中留给选项的空间有限,它一般情况都设置成最大长度)。
-
ptr称作指针字段。它是一个基于1的指针,指向存放下一个IP地址的位置。它的最小值为4,指向存放第一个IP地址的位置。随着每个IP地址存入清单, ptr的值分别为8,12,16,最大到36。当记录下9个IP地址后,ptr的值为40,表示清单已满。
-
地址(Address):每个地址占据4个字节,记录经过的路由器的IP地址。选项字段中可以包含多个地址,根据长度字段确定数量。
当路由器(根据定义应该是多穴的)在清单中记录IP地址时,它应该记录哪个地址呢?是入口地址还是出口地址?为此,RFC 791 [Postel 1981a] 指定路由器记录出口IP地址。当原始主机(运行pins程序的主机)收到带有RR选项的ICMP回显应答时它也要把它的入口IP地址放入清单中。
路径记录是记录的出接口。
5. IP 时间戳选项
时间戳功能没什么用处。
IP时间戳选项与记录路由选项类似。
-
时间戳选项的代码为0x44。其他两个字段len和ptr与记录路由选项相同:选项的总长度(一般为36或40)和指向下一个可用空间的指针( 5,9,13等)。接下来的两个字段是4 bit的值:
-
OF 表示溢出字段。
-
FL 表示标志字段。
-
-
时间戳的取值一般为自UTC午夜开始计的毫秒数,与ICMP时间戳请求和应答类似。如果路由器不使用这种格式,它就可以插入任何它使用的时间表示格式,但是必须打开时间戳中的高位以表明为非标准值。
-
与我们遇到的记录路由选项所受到的限制相比,时间戳选项遇到情况要更坏一些。如果我们要同时记录IP地址和时间戳(标志位为1),那么就可以同时存入其中的四对值。只记录时间留戳是没有用处的,因为我们没有标明时间戳与路由器之间的对应关系(除非有一个永远不变的拓扑结构)。
Traceroute 程序
Windows下是Tracert
Linux下是Traceroute
1. Traceroute 介绍
Traceroute是用来侦测主机到目的主机之间所经路由情况的重要工具,也是最便利的工具。Traceroute可以看到 IP 数据从一台主机传到另一台主机所经过的路由。尽管ping工具也可以进行侦测,但是因为ip头的限制,ping不能完全的记录下所经过的路由器。所以Traceroute正好就填补了这个缺憾。
Traceroute程序还可以让我们使用IP源路由选项。
Traceroute程序发送的是UDP的数据包,而且目的端口是一个高端口。
2. Traceroute 和 IP 路径记录选项的区别
描述了IP记录路由选项(RR)。为什么不使用这个选项而另外开发一个新的应用程序?有三个方面的原因。
- 首先,原先并不是所有的路由器都支持记录路由选项,因此选项在
- 某些路径上不能使用(Traceroute 程序不需要中间路由器具备任何特殊的或可选的功能)。
- 其次,记录路由一般是单向的选项。发送端设置了该选项,那么接收端不得不从收到的IP首部中提取出所有的信息,然后全部返回给发送端。大多数ping服务器的实现(内核中的ICMP回显应答功能)把接收到的RR清单返回,但是这样使得记录下来的IP地址翻了一番(一来一回)。这样做会受到一些限制(Traceroute程序只需要目的端运行一个UDP模块一其他不需要任何特殊的服务器应用程序)。
- 最后一个原因也是最主要的原因是,IP首部中留给选项的空间有限,不能存放当前大多数的路径。
3. Traceroute 原理
Traceroute的原理是,它收到目的主机的 IP 后,首先给目的主机发送一个TTL=1的UDP数据包,而经过的第一个路由器收到这个数据包以后,就自动把TTL减1,而TTL变为0以后,路由器就把这个包给抛弃了,并同时产生了一个主机不可达的ICMP数据报给主机。
主机收到数据报以后再发一个TTL=2的UDP数据报给目的主机,然后刺激第二个路由器给主机发ICMP数据报。如此往复直到到达目的主机。这样Traceroute就拿到了所有的路由器IP。从而避开了IP头只能记录有限路由IP的问题。
那么是怎么知道UDP到没到达目的主机呢?这就涉及一个技巧的问题,TCP和UDP协议有一个端口号定义,而普通的网络程序只监控少数的几个号码较小的端口,比如说80,比如说23,等等。而Traceroute发送的是端口号>30000的UDP数据报,所以到达目的主机的时候,目的主机只能发送一个端口不可达的ICMP数据报给主机。主机接到这个报告以后就知道,目的主机到了。
- 通过使用高端口号,Traceroute可以确保其发送的ICMP数据包不会与正在运行的服务之间发生冲突,从而更准确地显示跟踪数据包在网络中的路径和延迟情况。
Traceroute程序里面提供了一些很有用的选项,甚至包含了IP选路的选项。
Cisco的Traceroute工作原理:
在cisco中,发送去往目的地UDP:33434(端口号)(cisco默认),TTL值为1的报文,到达第一个路由器时,路由器发现TTL值为1,路由器就会给源发送一个ICMP差错信息TTL不可达。当源收到ICMP时,读取ICMP中的源地址打印出来,然后继续发送去往目的地UDP:33435,TTL值为2的报文,到达第二个路由器时,路由器发现TTL值为1,路由器又会给源发送一个ICMP差错信息TTL不可达。当源收到ICMP时,读取ICMP中的源地址打印出来,如此重复,获取经过的所有路由,当抵达目的时,目的地路由器发现是找自己的,不会看TTL值是否为1,继续查看4层信息,发现端口自己没有开启,会给源发送一个ICMP差错信息端口不可达信息。当源读取这个端口不可达信息,就知道到达目的地了,继续打印出来。
微软的Tracert的工作原理:
发送去往目的地的ICMP请求报文TTL值为1的报文,到达第一个路由器时,路由器发现TTL值为1,路由器就会给源发送一个ICMP差错信息TTL不可达。当源收到ICMP时,读取ICMP中的源地址打印出来,然后继续发送去往目的地的ICMP请求报文TTL值为2的报文,到达第二个路由器时,路由器发现TTL值为1,路由器又会给源发送一个ICMP差错信息TTL不可达。当源收到ICMP时,读取ICMP中的源地址打印出来,若此重复,获取经过的所有路由,当抵达目的时,目的地路由器发现是找自己的,不会看TTL值是否为1,直接回应一个ICMP应答报文,当源读取这个ICMP应答报文时,就知道到达目的地了,继续打印出来。
4. Windows 下的 Tracert 数据包分析
追踪数据包从本机到Kali虚拟机的路径。
tracert 192.168.199.249
发送Echo Request,第一跳的TTL值为1。
如果返回Echo Reply数据包,就证明抵达目的地。
尝试追踪数据包从本机到www.baidu.com
的路径。
tracert www.baidu.com
发现后面的数据包中的TTL值是逐渐增加的。
TCMP差错报文。
最后抵达目的地是Echo reply数据包。
5. Traceroute 注意事项
-
源端口号(42804)看起来有些大。traceroute程序将其发送的UDP数据报的源端口号设置为Unix进程号与32768之间的逻辑或值。对于在同一台主机上多次运行traceroute程序的情况,每个进程都查看ICMP返回的UDP首部的源端口号并且只处理那些对自己发送应答的报文。
-
第一:并不能保证现在的路由也是将来所要采用的路由,甚至两份连续的IP数据报都可能采用不同的路由。
-
第二:不能保证ICMP报文的路由与traceroute程序发送的UDP数据报采用同一路由。这表明所打印出来的往返时间可能并不能真正体现数据报发出和返回的时间差(如果UDP数据报从信源到路由器的时间是1秒,而ICMP报文用另一条路由返回信源用了3秒时间,则打印出来的往返时间是4秒)。
-
第三:返回的ICMP报文中的信源IP地址是UDP数据报到达的路由器接口的IP地址。这与IP记录路由选项不同,记录的IP地址指的是发送接口地址。由于每个定义的路由器都有2个或更多的接口,因此,从A主机到B主机上运行 traceroute 程序和从B主机到A主机上运行traceroute程序所得到的结果可能是不同的。
-
Traceroute是入接口,而IP路径记录是出接口。
-
Traceroute需要发送三个数据包到目标主机,这样三个数据包的平均值才是有效的,有助于提高Traceroute结果的准确性和可信度。
IP 源站选路选项
IP源站选路选项是IPv4协议中的一种选项,用于指示数据包在传输过程中经过指定的路由节点。当一个数据包携带了源站选路选项时,它将会按照选项中指定的路由路径进行传输,而不再依赖于网络中的动态路由选择。
1. IP 源站选路选项
源站选路的思想是由发送者指定路由。可以采用以下两种形式。
严格源站路由选择:发送端指明IP数据报所必须采用的确切路由,,那么它就会返回一个 “源站路由失败” 的 ICMP 差错报文。(里面的IP地址必须的直连路由)
宽松的源站路由选择:发送端指明了一个数据报经过的IP地址清单,但是数据报在清单上指明的任意两个地址之间可以通过其他路由器。
- 这个格式与记录路由选项格式基本一致。不同之处是,对于源站选路必须在发送IP数据报前填充IP地址清单;而对于记录路由选项,我们需要为IP地址清单分配并清空一些空间,并让路由器填充该清单中的各项。
- 对于源站选路,只要为所需要的IP地址数分配空间并进行初始化,通常其数量小于9。而对于记录路由选项来说,必须尽可能地分配空间,以达到9个地址。
- 对于宽松的源站选路来说,code字段的值是0x83;而对于严格的源站选路,其值为0x89。len和ptr字段与记录路由选项格式中所描述的一样。
源站路由报错数据包:
2. IP 源站选路的操作机制
图中的#
号表示下一跳的地址。
当一个源站路由发出时,指针会指向选项位的第一个IP地址,相当于告诉客户端第一条去哪,然后R1收到的会是指针指向下一跳的IP地址,在R1发送出去的时候,会将自己出接口的IP地址填写到选项位的第一个IP地址(回去的时候才知道反向的源站路由),如此重复。