ICMP 协议
什么是 ICMP 协议?
因特网控制报文协议 ICMP(Internet Control Message Protocol)是一个差错报告机制,是 TCP/IP 协议簇中的一个重要子协议,通常被 IP 层或更高层协议(TCP 或 UDP)使用,属于网络层协议,主要用于在 IP 主机和路由器之间传递控制消息,用于报告主机是否可达、路由是否可用等,比如常用的 Ping 工具就是基于 ICMP 协议。这些控制消息虽然并不传输用户数据,但是对于收集各种网络信息、诊断和排除各种网络故障以及用户数据的传递具有至关重要的作用。
ICMP 头部
- ICMP 头部包含如下五个字段:
type ICMP struct {
Type uint8
Code uint8
Checksum uint16
Identifier uint16
SequenceNumber uint16
}
其中:
Type 字段表示 ICMP 消息的类型;
Code 字段表示 ICMP 消息类型细分的子类型;
Checksum 字段表示 ICMP 报文的校验和,Checksum 是一种防止数据包在传输过程中被篡改的算法。
Identifier(标识符) 字段用于区分不同的 ICMP 进程。
SequenceNumber(序列号) 用于判断 ICMP 报文是否发生乱序或丢包。这个值会随着发送 ICMP 报文的数量而增加,接收方在收到 ICMP 报文后,会将相同的序列号发送给请求方。
不同的 Type 和 Code 值表示不同的 ICMP 报文类型,对应了数据包处理过程中可能出现的不同错误情况,不同类型的 ICMP 报文又分为差错报文和查询报文两种,下表解释了所有的 ICMP 报文类型: