ICMP 的用途
主机和路由器可以使用 ICMP 协议报告差错情况和提供有关异常情况的报告。
如下图所示,ICMP 报文是作为数据部分装在 IP 数据报中的,但它并不是高层协议(虽然看起来像是),而是 IP 层协议。
ICMP 报文种类
ICMP 报文的种类有两种:ICMP 差错报告报文和ICMP 询问报文。
如下表给出了几种常用的 ICMP 报文类型
ICMP 差错报告报文
常见的差错报告报文如下:
1)终点不可达
当路由器或主机不能交付数据报时,就向源点发送终点不可达报文。
2)时间超过
- 当路由器收到生存时间为零的数据报时,除丢弃该数据报外,还要向源点发送时间超过报文。
- 当终点在预先规定的时间内不能收到一个数据报的全部数据片时,就把已收到的数据报片都丢弃,并向源点发送时间超过报文。
3)参数问题
当路由器或目的主机收到数据报的首部中有字段的值不正确时,就丢弃该数据报,并向源点发送参数问题报文。
4)改变路由(重定向)
路由器把改变路由报文发送给主机,让主机知道下次应将数据报发送给另外的路由器(可通过更好的路由)。
👾 差错报告报文的格式
所有的 ICMP 差错报告报文中的数据字段都具有同样的格式,如下图所示。
主机或路由器会把需要进行差错报告的 IP 数据报的首部和数据字段的前 8 个字节(包含运输层端口号和发送序列号)提取出来,作为 ICMP 报文的数据字段。
ICMP 询问报文
常用的 ICMP 询问报文有两种:
1)回送请求和回答
ICMP 回送请求报文是由主机或路由器向一个特定的目的主机发出询问。收到此报文的主机必须给源主机或路由器发送 ICMP 回送回答报文。这种询问报文用来测试目的站是否可达以及了解有关状态。
2)时间戳请求和回答
ICMP 时间戳请求报文是请求某台主机或路由器回答当前的日期和时间,可用于时钟同步和时间测量。
ICMP 应用举例
ping
ping
一般用来测试两台主机之间的连通性。ping
使用了 ICMP 回送请求和回答报文。
traceroute
traceroute
用来跟踪一个分组从源点到终点的路径。
源主机向目的主机发送一连串的 IP 数据报,数据报中封装的是无法交付的 UDP 用户数据报。
第一个数据报 P1 的生存时间 TTL 设置为 1,所以 P1 到达第一个路由 R1 的时候,TTL 就变成了 1,R1 就会把报文丢掉,然后向源主机发送一个 ICMP 时间超过差错报告报文。
第二个数据包 P2 的生存时间 TTL 设置为 2,…
这样一直下去,直到最后一个数据报能刚好到达目的主机。但是数据报中的封装的仍然是无法交付的 UDP 用户数据报,所以目的主机会向源主机发送 ICMP 终点不可达差错报告报文。
这样源主机就达到了自己的目的,由路由器和目的主机发来的这些 ICMP 报文包含了源主机想知道的路由信息
- 到达目的主机所经过的路由器的 IP 地址
- 到达其中每一个路由器的往返时间。
参考文献
[1] 谢希仁. 计算机网络 [M]. 7 ed. 北京: 电子工业出版 社, 2017.