若能将日子从苦洌清茶过成平淡如水,我自守一城三世,眷一人白头。
ICMP (Internet 控制报文协议)
(Internet Control Message Protocol)Internet 控制报文协议,它是 TCP/IP 协议簇的一个子协议,用于在 IP 主机、路由器之间传递控制消息。控制消息是指网络通不通、主机是否可达、路由是否可用等网络本身的消息。
ICMP 和 IP 协议处于同一层,但是 ICMP 协议底层用的是 IP 协议。 一个搭建好的网络,往往需要先进行简单的测试,来验证网络是否通畅。单单使用 IP 协议并不提供可靠性传输。IP 协议如果丢包,并不能通知传输层是否丢包以及丢包原因。
ICMP 功能
- ICMP 协议主要用来检测网络通信故障和实现链路追踪,最典型的应用就是 ping 和 traceroute。
- ping
- 通过发送回送请求报文和回送回答报文来检测源主机到目的主机的链路是否有问题,目的地是否可达,以及通信的延迟情况。
- traceroute
- 通过发送探测报文来获取链路地址信息。第一个探测报文 TTL 为 1,到达第一个路由器时,TTL 减 1 为 0 所以丢掉这个探测包,同时向源主机发回 ICMP 时间超过报文,这时源主机就获得了第一个路由器的 IP 地址;接着源主机发送第二个探测报文,TTL 增 1 为 2,到达第一个路由器 TTL 减 1 为 1 并转发探测包到第二个路由器,这时 TTL 减 1 为 0,丢掉这个探测包并向源主机发回 ICMP 时间超过报文,源主机就获得了第二个路由器的 IP 地址;以此类推,直到探测报文到达 traceroute 的目的地,这时源主机就获得了到目的地的每一跳路由的 IP 地址。
ICMP 报文
- 由于 ICMP 底层用的是 IP 协议,所以 ICMP 报文是 IP 协议的有效载荷。
- ICMP 报文包含在 IP 数据报中,属于 IP 的一个用户,IP 头部就在 ICMP 报文的前面,所以一个 ICMP 报文包括 IP 头部、ICMP 头部和 ICMP 报文,IP 头部的 Protocol 值为 1 就说明这是一个 ICMP 报文,ICMP 头部中的类型(Type)域用于说明 ICMP 报文的作用及格式,此外还有一个代码(Code)域用于详细说明某种 ICMP 报文的类型,所有数据都在 ICMP 头部后面。
ICMP 类型
- 响应和应答
- ping,就是响应请求(Type=8)和应答(Type=0),一台主机向一个节点发送一个 Type=8 的 ICMP 报文,如果途中没有异常(例如被路由器丢弃、目标不回应 ICMP 或传输失败),则目标返回 Type=0 的 ICMP 报文,说明这台主机存在,更详细的 tracert 通过计算 ICMP 报文通过的节点来确定主机与目标之间的网络距离。
- 目标不可到达、源抑制和超时报文
- 这三种报文的格式是一样的,目标不可到达报文(Type=3)在路由器或主机不能传递数据报时使用,例如我们要连接对方一个不存在的系统端口(端口号小于 1024)时,将返回 Type=3、Code=3 的 ICMP 报文,它要告诉我们:“嘿,别连接了,我不在家的!”,常见的不可到达类型还有网络不可到达(Code=0)、主机不可到达(Code=1)、协议不可到达(Code=2)等。源抑制则充当一个控制流量的角色,它通知主机减少数据报流量,由于 ICMP 没有恢复传输的报文,所以只要停止该报文,主机就会逐渐恢复传输速率。最后,无连接方式网络的问题就是数据报会丢失,或者长时间在网络游荡而找不到目标,或者拥塞导致主机在规定时间内无法重组数据报分段,这时就要触发 ICMP 超时报文的产生。超时报文的代码域有两种取值:Code=0 表示传输超时,Code=1 表示重组分段超时。
- 时间戳
- 时间戳请求报文(Type=13)和时间戳应答报文(Type=14)用于测试两台主机之间数据报来回一次的传输时间。传输时,主机填充原始时间戳,接收方收到请求后填充接收时间戳后以 Type=14 的报文格式返回,发送方计算这个时间差。一些系统不响应这种报文