TCP/IP详解05-网络层:ICMP协议、Ping和Traceroute

TCP/IP详解05-网络层:ICMP协议、Ping和Traceroute

1. ICMP:Internet控制报文协议(Internet Control Message Protocol)

前面讲到了,IP协议并非一个可靠的协议,它不保证数据被送达,那么,天然的,保证数据送达的工做应该由其余的模块来完成。其中一个重要的模块就是ICMP(网络控制报文)协议web

当传送IP数据包发生错误--好比主机不可达,路由不可达等等,ICMP协议将会把错误信息封包,而后传送回给主机。给主机一个处理错误的机会,这也就是为何说创建在IP层以上的协议是可能作到安全的缘由。算法

ICMP 报文是在 IP 数据报内部被传输的。
这里写图片描述安全

这里写图片描述

  • ICMP 数据包由 8bit 的错误类型和 8bit 的代码和 16bit 的校验和组成。而前 16bit就组成了ICMP所要传递的信息。
  • 检验和字段覆盖整个 ICMP 报文。使用的算法与 IP 首部检验和算法相同。ICMP 的检验和是必需的。

1.1 ICMP报文的类型

不一样类型由报文中的类型字段和代码字段来共同决定。图中的最后两列代表 ICMP 报文是一份查询报文仍是一份差错报文bash

当发送一份ICMP差错报文时,报文始终包含 IP 的首部和产生 ICMP 差错报文的 IP 数据报的前 8 个字节。这样,接收 ICMP 差错报文的模块就会把它与某个特定的协议(根据 IP 数据报首部中的协议字段来判断)和用户进程(根据包含在 IP 数据报前 8 个字节中的 TCP 或 UDP 报文首部中的 TCP 或 UDP 端口号来判断)联系起来。服务器

这里写图片描述

下面各类状况都不会致使产生 ICMP差错报文:网络

  • 1) ICMP差错报文(可是,ICMP查询报文可能会产生ICMP差错报文)。
  • 2) 目的地址是广播地址(见图 3-9)或多播地址(D类地址,见图1-5)的IP数据报。
  • 3) 做为链路层广播的数据报。
  • 4) 不是IP分片的第一片(将在11.5节介绍分片)。
  • 5) 源地址不是单个主机的数据报。这就是说,源地址不能为零地址、环回地址、广播地址或多播地址。

这些规则是为了防止过去容许 ICMP差错报文对广播分组响应所带来的广播风暴。tcp

1.2 ICMP 查询报文

1.2.1 ICMP地址掩码请求与应答

ICMP 地址掩码请求用于无盘系统在引导过程当中获取本身的子网掩码。系统广播 它的 ICMP 请求报文(这一过程与无盘系统在引导过程当中用 RARP 获取 IP 地址是相似的)。svg

ICMP 地址掩码请求和应答报文的格式以下图所示。ICMP 报文中的标识符和序列号字段由发送端任意选择设定,这些值在应答中将被返回。这样,发送端就能够把应答与请求进行匹配。
这里写图片描述工具

sun % icmpaddrmask 
    sun received mask= ff000000, from 140.252.13.33
sun % icmpaddrmask 
    localhost received mask= ff000000, from 127.0.0.1

上述两种状况下返回的地址掩码对应的都是环回地址,即 A类地址 127.0.0.1。还有,咱们从图 2-4 能够看到,发送给本机 IP 地址的数据报( 140.252.13.33)其实是送到环回接口。ICMP 地址掩码应答必须是收到请求接口的子网掩码(这是由于多接口主机每一个接口有不一样的子网掩码),所以两种状况下地址掩码请求都来自于环回接口。测试

1.2.2 ICMP时间戳请求与应答

ICMP 时间戳请求容许系统向另外一个系统查询当前的时间。返回的建议值是自午夜开始计算的毫秒数,协调的统一时间( Coordinated Universal Time, UTC)(早期的参考手册认为 UTC 是格林尼治时间)。

ICMP 时间戳请求和应答报文格式如图所示:
这里写图片描述

1.3 ICMP 差错报文

1.3.1 ICMP端口不可达差错

ICMP不可达报文的通常格式如图
这里写图片描述

这里写图片描述
ICMP差错报文包含产生该差错报文的数据报IP首部,并至少包含该IP首部后面的前8个字节.

  • (1)IP首部包含协议字段,使ICMP知道如何解析后面的8个字节.
  • (2)IP首部后面的前8个字节实际为TCP或UDP首部的一部分,包含了源端口和目的端口号.

2. ICMP的应用–Ping程序

ping 程序是对两个 TCP/IP 系统连通性进行测试的基本工具。它只利用 ICMP回显请求和回显应答报文,而不用通过传输层( TCP/UDP)。Ping服务器通常在内核中实现 ICMP的功能。
这里写图片描述
ping 的原理是用类型码为0的ICMP发请求,受到请求的主机则用类型码为8的ICMP回应。ping程序来计算间隔时间,并计算有多少个包被送达。用户就能够判断网络大体的状况。咱们能够看到,ping给出来了传送的时间和TTL的数据。

  • Unix 系统在实现 ping 程序时是把 ICMP 报文中的标识符字段置成发送进程的 ID号。 这样即便在同一台主机上同时运行了多个 ping程序实例, ping程序也能够识别出返回的信息。
  • 序列号从0开始,每发送一次新的回显请求就加 1。ping 程序打印出返回的每一个分组的序列号,容许咱们查看是否有分组丢失、失序或重复

2.1 在 LAN、WAN 以及 SLIP 链路(拨号和线路)上运行 ping 程序的输出结果

参见书本

2.2 ping 的 IP 记录路由选项

ping 程序在发送出去的 IP 数据报中设置 IP RR 选项(该 IP 数据报包含 ICMP 回显请求报文)。这样,每一个处理该数据报的路由器都把它的 IP 地址放入选项字段中。当数据报到达目的端时,IP 地址清单应该复制到 ICMP 回显应答中,这样返回途中所通过的路由器地址也被加入清单中。当 ping 程序收到回显应答时,它就打印出这份IP地址清单。

**缺点:**IP 首部中只有有限的空间来存放 IP 地址。IP首部最大的长度为 60个字节,因为 IP 首部固定长度为 20 字节,RR 选项用去3个字节(code、len、ptr),这样只剩下 37个字节( 60-20-3)来存放 IP 地址清单,也就是说只能存放 9 个 IP 地址。

这里写图片描述

  • code 是一个字节,指明 IP 选项的类型。对于 RR 选项来讲,它的值为 7。
  • len 是 RR 选项总字节长度,在这种状况下为 39。
  • ptr 称做指针字段。它是一个基于 1 的指针,指向存放下一个 IP 地址的位置。它的最小值为 4,指向存放第一个 IP 地址的位置。随着每一个 IP 地址存入清单,ptr 的值分别为 8,12,16,最大到36。当记录下9个IP地址后, ptr的值为40,表示清单已满。

使用tcpdump输出RR选项:待补充

2.3 ping 的 IP 时间戳选项

这里写图片描述

  • 时间戳选项的代码为 0x44
  • len 和 ptr 与记录路由选项相同:选项的总长度(通常为36或40)和指向下一个可用空间的指针( 5,9,13等)。
  • OF 表示溢出字段,FL 表示标志字段。

这里写图片描述

3. ICMP的应用–Traceroute程序

3.1 原理说明

不使用IP 记录路由选项( RR)的缘由:

  • 首先,原先并非全部的路由器都支持记录路由选项。
  • 其次,记录路由通常是单向的选项。
  • 最后一个缘由也是最主要的缘由是,IP 首部中留给选项的空间有限,不能存放当前大多数的路径。

Traceroute 的执行操做:开始时发送一个 TTL 字段为1的 UDP 数据报,而后将 TTL 字段每次加 1,以肯定路径中的每一个路由器。每一个路由器在丢弃 UDP 数据报时都返回一个 ICMP 超时报文 2,而最终目的主机则产生一个 ICMP 端口不可达的报文。

  1. Traceroute 程序使用 ICMP 报文和 IP 首部中的 TTL 字段(生存周期)。
  2. 所通过的每一个路由器都将 TTL 值减 1。当路由器收到一份IP数据报,若是其TTL字段是0或1,则路由器不转发该数据报(接收到这种数据报的目的主机能够将它交给应用程序,这是由于不须要转发该数据报。可是在一般状况下,系统不该该接收 TTL 字段为 0 的数据报)。相反,路由器将该数据报丢弃,并给信源机发一份 ICMP“超时”信息。 Traceroute 程序的关键在于包含这份 ICMP 信息的 IP 报文的信源地址是该路由器的IP地址。
  3. Traceroute程序发送一份 UDP 数据报给目的主机,但它选择一个不可能的值做为 UDP 端口号(大于30000),使目的主机的任何一个应用程序都不可能使用该端口。由于,当该数据报 到达时,将使目的主机的 UDP 模块产生一份“端口不可达”错误的 ICMP 报文。

关于 Traceroute 程序,还有一些必须指出的事项:

  • 首先,并不能保证如今的路由也是未来所要采用的路由,甚至两份连续的 IP 数据报均可能采用不一样的路由。
  • 第二,不能保证 ICMP 报文的路由与 traceroute 程序发送的 UDP 数据报采用同一路由。这代表所打印出来的往返时间可能并不能真正体现数据报发出和返回的时间差(若是 UDP 数据报从信源到路由器的时间是 1 秒,而 ICMP 报文用另外一条路由返回信源用了 3秒时间,则打印出来的往返时间是4秒)。
  • 第三,返回的 ICMP 报文中的信源 IP 地址是 UDP 数据报到达的路由器接口的 IP 地址。这与 IP 记录路由选项不一样,记录的 IP 地址指的是发送接口地址。因为每一个定义的路由器都有2个或更多的接口,所以,从 A主机到B主机上运行 traceroute 程序和从 B 主机到 A 主机上运行 traceroute 程序所获得的结果多是不一样的。

这里写图片描述
有两种不一样的ICMP“超时”报文,它们的 ICMP 报文中 code 字段不一样。Traceroute程序使用的 ICMP 报文是在 TTL 值等于 0 时产生的,其code字段为0。

3.2 局域网输和广域网输出 Traceroute 程序结果

参见书本

3.3 IP源站选路选项

源站选路(source routing)的思想是由发送者指定路由。它能够采用如下两种形式:

  • 严格的源路由选择。发送端指明 IP数据报所必须采用的确切路由。若是一个路由器发现 源路由所指定的下一个路由器不在其直接链接的网络上, 那么它就返回一个“源站路 由失败”的ICMP差错报文。
  • 宽松的源站选路。发送端指明了一个数据报通过的 IP地址清单,可是数据报在清单上指 明的任意两个地址之间能够经过其余路由器。

Snip20180629_21

  • 对于宽松的源站选路来讲,code 字段的值是 0x83;而对于严格的源站选路,其值为 0x89。

3.4 ping 和 traceroute程序比较

比较ping和traceroute程序在处理同一台主机上客户的多个实例的不一样点。

比较ping和traceroute程序在计算往返时间上的不一样点。