• ICMP协议介绍
一、定义
- 网际控制报文协议ICMP(Internet Control Message Protocol),是一种面向无连接协议,用于传输出错报告控制信息;
- 在TCP/IP协议簇中是一个重要子协议,通常被IP层或者更高层协议(TCP/UDP)使用,属于网络层协议;
- 主要用于IP主机和路由器之间传递控制消息,包括网络通不通,主机是否可达,路由是否可用等网络状态。
举例:ping 和 tracert是两个常用网络管理命令,ping 用来测试网络可达性,tracert 用来显示到达目的主机的路径。ping和 tracert 都利用 ICMP 协议来实现网络功能,它们是把网络协议应用到日常网络管理的典型实例。
二、原因
- 由于IP协议数据传输天然存在不可靠、无连接等特点,为了解决数据传输出现的问题,引入了ICMP协议;
- 这些控制消息并不传输用户数据,但是对于收集各种网络信息、诊断和排除各种网络故障以及用户数据的传递具有直观重要的作用;
- 在数据传输的过程中,IP提供尽力而为的服务,为了把数据包发送到目的地址尽最大努力,它并不对目的主机是否收到数据包进行验证,无法进行流量控制和差错控制。因此在数据包传输过程中,产生各种错误在所难免,为了更有效的转发IP数据包,提供数据包交付成功寄回,ICMP应运而生。
思考1:ICMP协议介于传输层和网络层之间,通常被IP层或者更高层协议(TCP/UDP)使用,那为啥属于网络层而不是传输层?
- ICMP 报文被封装在IP数据报中,作为IP数据报的数据部分,通过互联网传递
- 传输层协议关注从端到端发送数据并确保可靠性,而ICMP目的是确保将数据路由到正确的位置,实际上并不路由数据
三、ICMP数据帧
- Type (类型):标识ICMP报文的类型;占用1字节
- Code(代码):标识对应ICMP报文的代码,它与类型字段一起共同标识了ICMP报文的详细类型;占用1字节
- Checksum(校验和):对包括ICMP报文数据部分在内的整个ICMP数据报的校验和,以检验报文在传输过程中是否出现了差错,其计算方法和IP报头中的校验和计算方法一致;占用2字节
- Header Other(首部其他部分):根据不同的报文类型而有不同的格式,有的是全0,有的则有其他的特殊格式。占用4字节,ICMP始终有8个字节的头部长度
- Packet Content(数据部分):不同类型和子类型有不同的内容,占用4字节
目前定义类型详见下表,从类型值来看ICMP报文可以分为两大类:第一类是差错报文,第二类是查询报文
Type | Code | 描述 | 报文类型 |
---|---|---|---|
0-Echo响应 | 0 | Echo响应报文 | 查询 |
3-目的不可达 | 0 | 目标网络不可达报文 | 差错 |
1 | 目标主机不可达报文 | 差错 | |
2 | 目标协议不可达报文 | 差错 | |
3 | 目标端口不可达报文 | 差错 | |
4 | 要求分段并设置DF flag标志报文 | 差错 | |
5 | 源路由失败报文 | 差错 | |
6 | 未知的目标网络报文 | 差错 | |
7 | 未知的目标主机报文 | 差错 | |
8 | 源主机隔离报文 | 差错 | |
9 | 禁止访问的网络报文 | 差错 | |
10 | 禁止访问的主机报文 | 差错 | |
11 | 对特定的TOS网络不可达报文 | 差错 | |
12 | 对特定的TOS主机不可达报文 | 差错 | |
13 | 由于过滤 网络流量被禁止报文 | 差错 | |
14 | 主机越权报文 | 差错 | |
15 | 优先权终止生效报文 | 差错 | |
5-重定向 | 0 | 重定向网络报文 | 差错 |
1 | 重定向主机报文 | 差错 | |
2 | 基于TOS的网络重定向报文 | 差错 | |
3 | 基于TOS的主机重定向报文 | 差错 | |
8-Echo请求 | 0 | Echo请求报文 | 查询 |
9-路由器通告 | 0 | 路由通告报文 | 查询 |
10-路由器请求 | 0 | 路由器的发现/选择/请求报文 | 查询 |
11-ICMP超时 | 0 | TTL超时报文 | 差错 |
1 | 分片重组超时报文 | 差错 | |
12-参数问题 | 0 | IP报首部参数错误报文 | 差错 |
1 | 丢失必要选项报文 | 差错 | |
2 | 不支持的长度报文 | 差错 | |
13-时间戳请求 | 0 | 时间戳请求报文 | 查询 |
14-时间戳应答 | 0 | 时间戳应答报文 | 查询 |
15-信息请求 | 0 | 信息请求报文 | 查询 |
16-信息应答 | 0 | 信息应答报文 | 查询 |
四、ICMP请求/应答帧格式
Type(类型):表示ICMP报文类型,8表示Echo(ping)request
0表示Echo(ping)reply
Code(代码):标识对应ICMP报文的代码,它与类型字段一起共同标识了ICMP报文的详细类型
Checksum(校验和):对ICMP报文数据部分在内的整个ICMP数据报的校验和
Identifier(标识符):用于表示ICMP进程,占用2字节(单进程内请求与应答报文Identifier字段保持一致
Sequence Number(序列号):用于关联请求报文和应答报文(对应请求和应答报文的序列号相同),占用2字节
思考2:Identifier和Sequence number为何有BE、LE之分?
wireshark考虑到window系统与Linux系统发出的ping报文(主要指ping应用字段而非包含IP头的ping包)的字节顺序不一样(windows为LE:little-endian byte order,Linux为BE:big-endian),为了体现wireshark的易用性,开发者将其分别显示出来。
Packet Content(数据部分):标识ICMP的相关数据部分