互联网控制报文协议 (ICMP) 简明指南:基础小白必读
什么是ICMP?
互联网控制报文协议(Internet Control Message Protocol, ICMP)是一种用于在网络设备之间传递控制信息和错误报告的协议。它帮助主机和路由器报告错误情况和提供异常情况的报告。ICMP是互联网的标准协议(RFC792),并作为IP数据报的一部分发送。
ICMP报文作为IP数据报的数据部分,加上数据报的首部,组成IP数据报发送出去。但通常我们把ICMP作为IP层的协议,而不是高层协议,因为它配合IP一起完成网络层功能。ICMP报文的格式如图所示:
ICMP的基本结构
ICMP报文是IP数据报的组成部分主要有两种主要类型:差错报告报文和询问报文。
常见的ICMP报文类型
根据不同的类型,ICMP报文可分为以下几类:
ICMP报文 | 类型值 | 报文类型 |
---|---|---|
差错报告报文 | 3 | 终点不可达 |
11 | 超时(TTL超时或分片重装超时) | |
12 | 参数问题 | |
5 | 路由重定向 | |
询问报文 | 8或0 | 回送请求或应答 |
13或14 | 时间戳请求或应答 |
ICMP差错报告报文
1. 终点不可达:当路由器或主机无法交付数据报时,发送此报文。具体可再根据ICMP的代码字段细分为目的网络不可达、目的主机不可达、目的协议不可达、目的端口不可达、目的网络未知、目的主机未知以及需要分片但DF置位等。
2. 超时:当TTL值减为零或分片重装超时时发送。路由器收到一个IP数据报时,若目的地址不是自己,会将其TTL值减1再转发出去,但当TTL值减为零时(收到TTL值为1的IP数据报),除丢弃该数据报外,还要向源点发送超时报文。此外,终点若在预先规定的时间内不能收到一个数据报的全部数据报片,就会把已收到的数据报片都丢弃,并向源点发送超时报文。
3. 参数问题:当路由器或目的主机收到的数据报的首部中有的字段的值不正确时,路由器或目的主机就丢弃该数据报,并向源点发送参数问题报文。
4. 路由重定向:路由器把路由重定向报文发送给主机,让主机知道下次应将数据报发送给另外的路由器(提供一条更好的路由)。
所有的ICMP差错报告报文中的数据字段都有统一的格式:
提取收到的IP数据报的数据部分的前8个字节是为了得到运输层的端口号(对于TCP和UDP),以及运输层报文的发送序号(对于TCP)。这些信息对源点通知高层协议是有用的。整个ICMP报文作为IP数据报的数据部分发送给源点。
注意:以下几种情况不应发送ICMP差错报告报文:
- 对ICMP差错报告报文不再发送ICMP差错报告报文。
- 对第一个分片的数据报片的所有后续数据报片不发送ICMP差错报告报文。
- 对具有多播地址的数据报不发送ICMP差错报告报文。
- 对具有特殊地址的数据报(如127.0.0.0或0.0.0.0)不发送ICMP差错报告报文。
ICMP询问报文
常用的ICMP询问报文有两类。
1. 回送请求和应答:ICMP回送请求报文是由主机或路由器向一个特定的目的主机发出的询问,收到此报文的主机必须给源主机或路由器发送ICMP回送应答报文,将ICMP回送请求报文携带的数据原封不动送回去。这种报文用来测试目的站是否可达及了解其有关状态。
2. 时间戳请求和应答:ICMP时间戳请求报文用于请某个主机或路由器应答当前的日期和时间。ICMP时间戳应答报文中有一个32位的字段,其中写入的整数代表从1900年1月1日起到当前时刻一共有多少秒。这种报文可用来进行时钟同步和测量时间。
ICMP的实际应用
ICMP的一个重要应用就是分组网间探测(Packet Internet Groper, PING),用来测试两个主机之间的连通性。PING使用了ICMP回送请求和回送应答报文。PING是应用层直接使用网络层ICMP的一个例子。它没有通过运输层的TCP或UDP。
1. PING:测试两个主机之间的连通性。使用ICMP回送请求和回送应答报文,检测网络连接的状态和响应时间。
例子:在Windows中使用ping
命令:
C: \Documents and Settings XXR>ping mail.sina.con.cn
Pinging mail.sina.con.cn [282.108.43.238] with 32 bytes of data:
Reply from 202.108.43.230: bytes-32 time-368ms TTL-242
Reply from 202.108.43.230: bytes-32 time-374ms TTL-242
Request timed out.
Reply from 202.108.43.230: bytes=32 time=374ms TTL=242
Ping statistics for 202.188.43.230:
Packets: Sent =4, Received =3, Lost =1 (25% loss)
Approximate round trip times in milliseconds:
Minimum=368ms, Maximum=374ms, Average=372ms
输出结果显示发送和接收的报文数、丢失的分组数,以及往返时间。
图4—29给出了从南京的一台PC到新浪网的邮件服务器的连通性的测试结果。PC一连发出四个ICMP回送请求报文。如果邮件服务器正常工作而且响应这个ICMP回送请求报文(有的主机为了防止恶意攻击通过设置防火墙拒绝接收或响应这种报文),那么它就发回ICMP回送应答报文。通过记录发送报文和接收报文的时间,很容易得出往返时间。最后显示出的是统计结果:发送到哪个机器(IP地址),发送的、收到的和丢失的分组数(但不给出分组丢失的原因),往返时间的最小值、最大值和平均值。从得到的结果可以看出,第三个测试分组丢失了。
2. Traceroute:跟踪数据报从源点到终点的路径。Windows中使用tracert
命令,通过发送一连串TTL值递增的数据报,获取每个路由器的IP地址和往返时间。
例子:在Windows中使用tracert
命令:
C: \Documents and Settings XXR>tracert mail.sina.com.cn
Tracing route to mail.sina.com.cn [202.188.43.230]
over a maximum of 30 hops:
1 23 ms 23 ms 23 ms 192.168.1.1
2 24 ms 24 ms 24 ms 221.231.204.1
3 25 ms 25 ms 25 ms 221.231.206.1
4 26 ms 26 ms 26 ms 202.97.27.1
5 27 ms 27 ms 27 ms 202.97.41.2
6 28 ms 28 ms 28 ms 202.97.35.2
7 29 ms 29 ms 29 ms 202.97.36.2
8 30 ms 30 ms 30 ms 219.158.32.2
9 31 ms 31 ms 31 ms 219.158.13.2
10 32 ms 32 ms 32 ms 202.96.12.2
11 33 ms 33 ms 33 ms 61.135.148.2
12 34 ms 34 ms 34 ms mail.sina.com.cn [202.108.43.2]
Trace complete.
输出结果显示路径上的每个路由器和到达每个路由器的时间。
Traceroute工作原理:
traceroute从源主机向目的主机发送一连串IP数据报,数据报中封装的是无法交付的UDP用户数据报。第一个数据报的TTL值设置为1。当数据报到达路径上的第一个路由器时,路由器会将TTL值减1。当TTL值等于零时,路由器丢弃数据报并向源主机发送ICMP超时差错报告报文。源主机接着发送第二个数据报,并将TTL值设置为2。这一过程持续进行,直到数据报到达目的主机,目的主机返回ICMP终点不可达报文,源主机停止发送数据报。这些ICMP报文提供了路由信息,包括到达目的主机所经过的路由器的IP地址和到达每个路由器的往返时间。
图4—30是从南京的一台PC向新浪网的邮件服务器发出tracert命令后所获得的结果。图中每一行有三个时间,是因为对应于每一个TTL值,源主机要发送三次同样的IP数据报。需要注意的是,IP数据报经过的路由器越多,所花费的时间也会越多,但从图中可看出,有时正好相反,这是因为互联网的拥塞程度变化无常。
总结
ICMP是网络通信中不可或缺的一部分,帮助检测和报告网络问题。通过了解ICMP的结构和常见类型,可以更好地掌握网络诊断工具如PING和Traceroute的使用。
ICMP的一个重要应用就是分组网间探测(Packet Internet Groper, PING),用来测试两个主机之间的连通性。PING使用了ICMP回送请求和回送应答报文。PING是应用层直接使用网络层ICMP的一个例子。它没有通过运输层的TCP或UDP。
希望通过这篇文章,您能对ICMP有一个基础的了解,并能有效使用网络诊断工具进行问题排查。如果有任何疑问或建议,欢迎在评论区交流!
图文来源:《计算机网络教程》第六版微课版