目录

  • ICMP 协议
  • 因特网控制报文协议
  • ICMP 报文格式
  • ICMP 报文类型
  • Ping 程序
  • Ping 程序简介
  • 实验步骤
  • 问题解答
  • Traceroute 命令
  • Traceroute 简介
  • 实验步骤
  • 问题解答
  • 参考资料

ICMP 协议

因特网控制报文协议

ICMP,即因特网控制报文协议,在主机和路由器之间起到沟通网络层信息的作用。最典型的用途就是差错报告,它允许主机或路由器报告查错情况和提交有关异常情况的报告。例如网络通不通、主机是否可达、路由是否可用等网络本身的消息,这些控制消息虽对于数据的传递起着重要的作用。ICMP 报文作为 IP 有效载荷承载的,因此虽然 ICMP 被认为是 IP 的一部分,但在体系结构上 ICMP 位于 IP 之上。当主机接收到指明上层协议为 ICMP 的 IP 数据报时,该数据报分解的内容应当交给 ICMP。

icmp是什么协议 java icmp协议由什么协议承载_数据

ICMP 报文格式

ICMP 报文包括 IP 头部、ICMP 头部和 ICMP 报文 3 个部分,ICMP 报文是作为 IP 有效载荷承载的。

icmp是什么协议 java icmp协议由什么协议承载_IP_02

字段

说明

Type

ICMP 的类型,标识生成的错误报文;

Code

进一步划分 ICMP 的类型,该字段用来查找产生错误的原因;

Checksum

校验码,字段包含有从 ICMP 报头和数据部分计算得来的,用于检查错误的数据;

ID

ID 值,在 Echo Reply 类型的消息中要返回这个字段;

Sequence

这个字段包含一个序号,在 Echo Reply 类型的消息中要返回这个字段。

ICMP 报文类型

ICMP 有 2 类报文,第一类是差错报告报文,分别是以下 5 种:

差错报告报文

说明

目的不可达

路由器或主机不能交付数据报

超时或超期

路由器收到生存时间为 0 的数据报

参数有问题

路由器或主机收到数据报中,首部有字段的值不正确

重定向

改变主机下一次发生数据报所选的路由

源抑制

发送给源主机,令其降低发送数据的速率(现在不用了)

第二类是网络探询报文,有以下 2 组:

网络探询报文

说明

回声请求与应答

主机或路由器向特定主机发送询问

时间戳请求与应答

请求某台主机或路由器应答当前日期和时间

除此之外还有 3 个不再使用的报文,分别是:信息请求与应答、子网掩码请求与应答、路由器询问和通报。常用报文类型如下:

icmp是什么协议 java icmp协议由什么协议承载_字段_03


我们留意 3 个报文。首先是回显应答 (Echo Reply) 报文,我们知道 Ping 程序是会发送一个回显请求(类型 8 编码 0)报文给目的主机,目的主机收到之后就发送回显应答(类型 0 编码 0)报文进行回显。一般来说,第一个回显请求之前要先发送一个 ARP 请求并接收应答,会消耗一定的时间。

接着是TTL 报文(类型 11 编码 0),这个是在 Traceroute 程序中,路由器检查到 Traceroute 发出的 IP 数据报中 TTL 正好过期,因此路由器就需要丢包并且发送该警告报文返回源主机。源主机就可以得到路由器的 IP 地址,以此达到路由追踪的目的。

还有一个是源抑制报文,这个报文是为了执行拥塞控制,令拥塞的路由器可以通过发送该报文令主机发送速率降低,不过 TCP 在运输层有自己的拥塞控制手法,因此源抑制报文在实践中很少使用。

Ping 程序

Ping 程序简介

Ping 程序允许我们验证某主机是否存在,通过将数据包发送到目标 IP 地址, 如果目标主机在线则目标主机中的 Ping 程序将会发送响应数据包进行响应,这两个 Ping 数据包都是 ICMP 数据包。

例如 Ping 一下集美大学官网:

icmp是什么协议 java icmp协议由什么协议承载_icmp是什么协议 java_04

实验步骤

  1. 打开 windows 的命令提示符。

icmp是什么协议 java icmp协议由什么协议承载_icmp是什么协议 java_05


2. 启动 Wireshark 数据包嗅探器,并开始 Wireshark 数据包捕获。

icmp是什么协议 java icmp协议由什么协议承载_数据_06


3. Ping 程序在 c:\windows\system32 目录中,输入“ping –n 10 hostname” 或 “c:\windows\system32\ping –n 10 hostname”,其中 hostname 最好是另一个大陆的主机名,参数 -n 10 代表发送 10 个 Ping 消息,然后执行命令。

icmp是什么协议 java icmp协议由什么协议承载_IP_07


那就选择麻省理工学院官网 “www.mit.edu”来测试。

icmp是什么协议 java icmp协议由什么协议承载_icmp是什么协议 java_08


我主机上的 ping 程序发送了10 个查询包并收到了 9 个响应,有 1 个包丢失,对于每个响应,源计算往返时间(RTT),数据包平均为 200 毫秒。

4. Ping 程序终止时,停止在 Wireshark 中捕获数据包。

icmp是什么协议 java icmp协议由什么协议承载_icmp是什么协议 java_09


数据包列表显示 19 个数据包,说明源发送的 10 个 Ping 查询和源接收的 9 个 Ping 响应。数据包内容区域可以查看此数据包的信息,该数据包中的 IP 数据报的协议号ICMP 的协议号 01,这表示 IP 数据报的有效载荷是 ICMP 数据包。

icmp是什么协议 java icmp协议由什么协议承载_icmp是什么协议 java_10


查看该 ICMP 包的详情信息,数据包包含校验和,标识符和序列号,该 ICMP 数据包是类型 8 和代码 0,也就是“回应请求”数据包。

icmp是什么协议 java icmp协议由什么协议承载_数据_11

问题解答

  1. 源主机的 IP 地址是多少?目标主机的 IP 地址是多少?

icmp是什么协议 java icmp协议由什么协议承载_IP_12


源主机:192.168.67.249

目标主机:104.86.239.32

2. 为什么 ICMP 数据包没有源端口号和目的端口号?

因为 ICMP 报文作为 IP 有效载荷承载的,不需要像 TCP 或 UDP 那样需要端口号。
3. 查看任意的请求 ICMP 数据包,ICMP 类型和代码是什么?该 ICMP 数据包还有哪些其他字段?校验和,序列号和标识符字段有多少字节?

icmp是什么协议 java icmp协议由什么协议承载_数据_13


类型 8 和代码 0,也就是回应请求报文,还有校验和,序列号和标识符字段,都是 2 字节。

4. 查看任意的响应 ICMP 数据包,ICMP 类型和代码是什么?该 ICMP 数据包还有哪些其他字段?校验和,序列号和标识符字段有多少字节?

icmp是什么协议 java icmp协议由什么协议承载_数据_14


类型 0 编码 0 是回显应答报文,还有校验和,序列号和标识符字段,都是 4 字节。

Traceroute 命令

Traceroute 简介

Traceroute 程序可用于确定数据包从源到目的地的路径,原理是发送 TTL 增加的数据包,当 TTL = 1 的包达到路由器,该路由器会将该包丢弃,并且发送 ICMP 错误给请求的机器。

traceroute 通过首先发送一个或多个带有生存时间 (TTL) 字段设置为 1 的数据报;然后发送一个或多个带有 TTL 字段设置为 2 的数据报到同一个目的地;然后发送一个或多个带有 TTL 字段设置为 3 的数据报到同一个目的地,以此类推,直到目的地真正收到此数据报为止。路由器必须将每个接收到的数据报中的 TTL 减 1,如果 TTL 达到 0,路由器会向来源主机发送 ICMP 消息。由于这种行为,TTL 为 1 的数据报将导致距发送方一次跳跃的路由器,将 ICMP TTL 超出的消息发送回发送方主机;以TTL 为 2 发送的数据报将导致距离为两次跳跃的路由器,将 ICMP 消息发送回发送方主机等等。以这种方式,执行 traceroute 的主机可以通过查看包含ICMP TTL 超出消息的数据报中的来源 IP 地址来获知其自身与目的地之间的路由器的身份。

icmp是什么协议 java icmp协议由什么协议承载_字段_15

实验步骤

  1. 打开 windows 的命令提示符。

icmp是什么协议 java icmp协议由什么协议承载_icmp是什么协议 java_05


2. 启动 Wireshark 数据包嗅探器,并开始 Wireshark 数据包捕获。

icmp是什么协议 java icmp协议由什么协议承载_数据_06


3. tracert 程序在 c:\windows\system32 目录中,在命令提示符中输入“tracert hostname” 或 “c:\windows\system32\ tracert hostname”。其中 hostname 是另一个大陆的主机名,访问法国 INRIA(计算机科学研究所)“www.inria.fr”。需要等上一段时间。

icmp是什么协议 java icmp协议由什么协议承载_IP_18

  1. tracert 程序终止时,停止在 Wireshark 中捕获数据包。

icmp是什么协议 java icmp协议由什么协议承载_icmp是什么协议 java_19


对于每个 TTL 值,源程序发送三个探测包。 Traceroute 显示每个探测包的 RTT,以及返回 ICMP TTL 超出消息的路由器的 IP 地址和名称。

icmp是什么协议 java icmp协议由什么协议承载_数据_20

问题解答

  1. 您的主机的 IP 地址是多少?目标目标主机的 IP 地址是多少?

icmp是什么协议 java icmp协议由什么协议承载_字段_21

源主机:192.168.67.249
目标主机:128.93.162.63
6. 如果 ICMP 发送了 UDP 数据包(如在 Unix / Linux 中),那么探测数据包的 IP 协议号仍然是 01 吗? 如果没有,它会是什么?

待解答。
7. 检查屏幕截图中的 ICMP 响应数据包。这与本实验的前半部分中的 ICMP ping 查询数据包不同吗?如果不同,请解释为什么?

icmp是什么协议 java icmp协议由什么协议承载_icmp是什么协议 java_22


不同,这里的 ICMP 报文时 **TTL 报文(类型 11 编码 0),这个是在 Traceroute 程序中,路由器检查到 Traceroute 发出的 IP 数据报中 TTL 正好过期,因此路由器就需要丢包并且发送该警告报文返回源主机。这个与 Ping 程序中所要达成的目的不同,Ping 程序是为了请求响应。

8. 检查屏幕截图中的 ICMP 错误数据包。它具有比 ICMP 响应数据包更多的字段。这个数据包含哪些内容?

icmp是什么协议 java icmp协议由什么协议承载_字段_23


比响应数据包多了 ICMP 请求数据包的内容。

9. 检查源主机收到的最后三个 ICMP 数据包。这些数据包与 ICMP 错误数据包有何不同?他们为什么不同?

icmp是什么协议 java icmp协议由什么协议承载_数据_24


这个是目的主机返回的回显应答报文,因为 tracert 程序的原理是发送 TTL 增加的数据包,当 TTL = 1 的包达到路由器,该路由器会将该包丢弃,并且发送 ICMP 错误给请求的机器。而最后一组 3 个数据报时可以到达目的主机的,这时由于是被目的主机接收,目的主机不会丢包,而是确确实实收到的这个探测的数据报并进行了响应。

10. 在 tracert 跟踪测量中,是否有一个连接的延迟比其他连接长得多?是否有连接的延迟明显长于其他连接?根据路由器名称,您能猜出这个连接末端的两个路由器的位置吗?在第 8 个节点和第 9 个节点之间时延突增,之后的节点时延都达到了 250+ ms。之后的路由器名都是英文名,且目的地是法国,那应该是连接到了亚洲转欧洲的分界路由器了。

icmp是什么协议 java icmp协议由什么协议承载_icmp是什么协议 java_25


用 Best trace 做一次路由追踪,看来确实在这两个节点出现了从上海伦敦的大跳跃!

icmp是什么协议 java icmp协议由什么协议承载_字段_26

参考资料

《计算机网络 自顶向下方法》 [美] James F.Kurose,Keith W.Ross 著,陈鸣 译,机械工业出版社
ICMP互联网控制消息协议