计算机网路-ICMP
一、 ICMP 是什么?它的定位是什么?
ICMP 是一种网络层协议,用于在IP主机、路由器之间传递控制消息。
可以把它想象成互联网的 “信令系统” 或 “故障诊断与反馈机制”。
核心定位:IP协议本身是“尽力而为”的、无连接的,它不提供差错报告或控制机制。如果IP数据包在传输过程中失败了(如目标不可达、超时),IP协议自身无法将这一情况通知源发送方。ICMP 就是为了弥补IP协议的这一不足而设计的。
重要关系:ICMP 虽然工作在网络层,但它不是IP的上层协议,也不是IP的下层协议,而是IP协议的辅助协议。ICMP报文是被封装在IP数据包中进行传输的。
二、 ICMP 的主要作用和功能
ICMP 的功能非常明确,主要分为两大类:
1. 差错报告
当IP数据包在传输过程中发生错误时,向数据包的源发送方报告错误类型。这是ICMP最核心的功能。
常见的差错报告类型包括:
目的不可达:当路由器或主机无法将数据包交付到最终目的地时,会向源发送方发送一个“目的不可达”消息。
超时:
TTL超时:IP数据包的生存时间字段减到0时,路由器会丢弃该包并发送一个ICMP超时消息。这主要用于
traceroute
命令。分片重组超时:接收方等待一个数据包的所有分片时,如果在一定时间内没有收齐,会发送超时消息。
参数问题:当IP数据包的头部字段有错误(如校验和错误),导致路由器无法处理时,会发送此消息。
源抑制:一种早期的简单拥塞控制机制。当路由器或目标主机缓冲区满时,会发送源抑制消息,要求发送方降低发送速率。注意:现代网络已很少使用此功能,而是依赖TCP等传输层协议进行拥塞控制。
2. 网络探询与诊断
用于测试网络连通性、查询主机信息等。这是我们日常网络故障排查中最常接触到的功能。
常见的查询报文类型包括:
回送请求与回送应答:这就是我们最熟悉的
ping
命令的基础。一台主机向另一台主机发送“回送请求”,如果目标主机收到,则会回复一个“回送应答”。用于测试两台主机之间的网络是否通畅。时间戳请求与应答:用于同步两台主机的时间或测量网络延迟的变体。
地址掩码请求与应答:当一个主机不知道自己所处的网络的子网掩码时,可以向路由器查询。
三、 ICMP 报文格式
ICMP报文虽然类型很多,但其格式是统一的,非常简单:
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | 类型 Type | 代码 Code | 校验和 Checksum | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | 报文主体 | | (可变长度) | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
类型:1个字节,标识ICMP报文的大类。例如,类型8是回送请求,类型0是回送应答,类型3是目的不可达。
代码:1个字节,在同一个类型下,进一步细分具体的原因。例如,在“目的不可达”(类型3)中,代码0表示网络不可达,代码1表示主机不可达,代码3表示端口不可达。
校验和:2个字节,用于检验ICMP报文在传输过程中是否出错。
报文主体:可变长度,其内容取决于ICMP报文的类型和代码。通常,它会包含引发该ICMP报文的原始IP数据包的头部和前8个字节(这8个字节通常包含了TCP或UDP的端口号信息),以便源主机能够确定是哪个应用程序发出的数据包出了问题。
四、 常见ICMP报文类型实例详解
1. Ping 程序(类型 8 和 类型 0)
过程:
主机A执行
ping 192.168.1.1
。主机A构建一个 类型=8(回送请求) 的ICMP报文。
该ICMP报文被封装在一个IP数据包中,目标地址是
192.168.1.1
。主机B收到后,识别出是回送请求,则构建一个 类型=0(回送应答) 的ICMP报文,发回给主机A。
主机A收到回送应答,计算往返时间,并显示“来自 192.168.1.1 的回复”。
2. Traceroute 程序(利用类型 11:超时)
原理:
traceroute
巧妙地利用了IP头中的 TTL 字段。traceroute
首先向目的地发送一个TTL=1的UDP数据包(或ICMP请求)。第一个路由器收到后,将TTL减1变为0,于是丢弃该包,并向源发送方发送一个 类型=11(超时) 的ICMP报文。源主机由此知道了第一个路由器的地址。
接着,发送TTL=2的数据包,它会到达第二个路由器后超时,第二个路由器发回ICMP超时报文。
重复此过程,直到数据包到达最终目的地。目标主机会回复一个“端口不可达”(类型3,代码3)的ICMP报文(因为traceroute使用了一个不常用的高端口),
traceroute
程序据此知道路径追踪完成。
3. 目的不可达(类型 3)
场景:当你尝试访问一个关闭的Web服务时。
你的电脑向服务器80端口发送一个TCP SYN包。
数据包成功到达服务器,但服务器上没有进程在监听80端口。
服务器的TCP/IP协议栈会回复一个 类型=3(目的不可达),代码=3(端口不可达) 的ICMP报文给你的电脑。
你的操作系统收到后,会告诉你“连接被拒绝”。
五、 ICMP 的网络安全考量
ICMP虽然非常有用,但也可能被恶意利用:
ICMP 侦察:攻击者可以使用
ping
扫描来发现网络中存在的主机。ICMP 重定向攻击:恶意主机可以发送伪造的ICMP重定向消息(类型5),试图改变受害主机的路由表,从而实施中间人攻击。
拒绝服务攻击:如著名的 Smurf 攻击,攻击者伪造源IP地址为受害者,然后向一个网络的广播地址发送大量ICMP请求,该网络的所有主机都会向受害者回复应答,耗尽受害者的资源。
因此,在许多网络的安全策略中,会有选择地过滤某些类型的ICMP报文(如禁止外部网络ping通内部主机),但这需要在安全和可管理性之间做出平衡。
总结
方面 | 详细说明 |
---|---|
定位 | 网络层的辅助协议,IP协议的“错误报告和诊断系统”。 |
封装 | ICMP报文被封装在IP数据包的数据部分进行传输。 |
核心功能 | 差错报告(如目的不可达、超时)和 查询诊断(如ping)。 |
工作方式 | 由网络设备(路由器、主机)在遇到问题时主动触发,向源IP地址发送反馈。 |
重要性 | 是网络连通性测试、路径追踪和故障排除的不可或缺的工具,是互联网稳定运行的基础。 |
简单来说,没有ICMP,互联网就会像一个没有仪表盘和故障灯的汽车——你能开,但出了问题你根本不知道原因在哪里。ping
和 traceroute
这两个最基础的网络工具,正是ICMP协议能力的直接体现。