「作者主页」:士别三日wyx
「作者简介」:CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者
「推荐专栏」:对网络安全感兴趣的小伙伴可以关注专栏《网络安全入门到精通》
ICMP协议
ICMP(Internet Control Message Protocol)是「控制报文协议」,是IP协议的一个组成部分,负责在主机和路由器之间「传递控制信息」(不传递用户数据),比如网络通不通,主机是否可达等。
1、ICMP协议工作原理
ICMP的功能是「检错」而不是纠错。
它将出错的报文返回给发送方的设备,发送方根据ICMP报文确定「错误类型」,从而更好的重发错误的数据包。
ping
和 tracert
命令就是利用ICMP协议来实现的
ping 127.0.0.1
:检查网络连通性,ping的过程就是ICMP协议的工作过程。如果对方禁用了ICMP协议,就会Ping不通,但这并不代表网络不通。tracert 127.0.0.1
:路由跟踪,显示数据包到达目标主机经过的设备和消耗时间。
2、ICMP协议报文格式
ICMP是IP协议的一部分,因此,ICMP协议的报文包含在IP数据报的数据部分:
我们结合数据包解释一下每个字段的作用
Type
:类型【4位】,标明ICMP报文的作用及格式。Code
:代码【4位】,标明报文的类型。Checksum
:校验和【8位】,检验报文是否有误。Identifier
:标识符【取决于类型】,确定是否是同一次请求响应。Sequence number
:序列号【取决于类型】,表示数据包在传输过程中的顺序。
3、ICMP协议报文类型
ICMP协议主要通过 Type 和 Code 的组合,来表示报文的「类型」。
比如正常的请求响应:发送方 Type=8
的报文,途中没有异常,接收方就返回 Type=0
的报文
如果端口不可达,接收方就返回 Type=3
,Code=3
。
常见的ICMP响应类型:
- 网络连通:
Type=0
,Code=0
- 网络不可达:
Type=3
,Code=0
- 主机不可达:
Type=3
,Code=1
- 协议不可达:
Type=3
,Code=2
- 端口不可达:
Type=3
,Code=3
完整的ICMP类型:
TYPE | CODE | Description |
---|---|---|
0 | 0 | Echo Reply------回显应答(Ping应答) |
3 | 0 | Network Unreachable------网络不可达 |
3 | 1 | Host Unreachable------主机不可达 |
3 | 2 | Protocol Unreachable------协议不可达 |
3 | 3 | Port Unreachable------端口不可达 |
3 | 4 | Fragmentation needed but no frag. bit set------需要进行分片但设置不分片比特 |
3 | 5 | Source routing failed------源站选路失败 |
3 | 6 | Destination network unknown------目的网络未知 |
3 | 7 | Destination host unknown------目的主机未知 |
3 | 8 | Source host isolated (obsolete)------源主机被隔离(作废不用) |
3 | 9 | Destination network administratively prohibited------目的网络被强制禁止 |
3 | 10 | Destination host administratively prohibited------目的主机被强制禁止 |
3 | 11 | Network unreachable for TOS------由于服务类型TOS,网络不可达 |
3 | 12 | Host unreachable for TOS------由于服务类型TOS,主机不可达 |
3 | 13 | Communication administratively prohibited by filtering------由于过滤,通信被强制禁止 |
3 | 14 | Host precedence violation------主机越权 |
3 | 15 | Precedence cutoff in effect------优先中止生效 |
4 | 0 | Source quench------源端被关闭(基本流控制) |
5 | 0 | Redirect for network------对网络重定向 |
5 | 1 | Redirect for host------对主机重定向 |
5 | 2 | Redirect for TOS and network------对服务类型和网络重定向 |
5 | 3 | Redirect for TOS and host------对服务类型和主机重定向 |
8 | 0 | Echo request------回显请求(Ping请求) |
9 | 0 | Router advertisement------路由器通告 |
10 | 0 | Route solicitation------路由器请求 |
11 | 0 | TTL equals 0 during transit------传输期间生存时间为0 |
11 | 1 | TTL equals 0 during reassembly------在数据报组装期间生存时间为0 |
12 | 0 | IP header bad (catchall error)------坏的IP首部(包括各种差错) |
12 | 1 | Required options missing------缺少必需的选项 |
13 | 0 | Timestamp request (obsolete)------时间戳请求(作废不用) |
14 | Timestamp reply (obsolete)------时间戳应答(作废不用) | |
15 | 0 | Information request (obsolete)------信息请求(作废不用) |
16 | 0 | Information reply (obsolete)------信息应答(作废不用) |
17 | 0 | Address mask request------地址掩码请求 |
18 | 0 | Address mask reply------地址掩码应答 |
4、ICMP协议抓包分析
Wireshark开启抓包,cmd 执行 ping 192.168.2.1 -n 1
,ping一次我的网关。
Wireshark 过滤 icmp
,第一个是ICMP请求包,第二个是ICMP响应包。
1)先看第一个包,重点看我圈中的字段:
Type=8
,Code=0
,表示这是一个回显请求Echo (ping) request
Checksum Status = Good
,表示校验状态是良好的,报文无误
2)再看第二个包,重点看我圈中的字段
Type=0
,Code=0
,表示这是一个回显应答Echo (ping) Reply
Response time
只出现ICMP响应包,Ping命令返回的响应时间,就是从这里获取的
Data
表示数据包的大小,Ping命令返回的字节,就是从这里获取的
3)Identifier
和 Sequence number
这四个字段用来对应请求和响应的关系。
- 请求和响应中,这四个字段都是一样的,用来标识这次请求。比如我给你发个1,你给我回个1,我就知道我们俩是同一个请求;如果你给我回个2,我就知道我们不是同一个请求,你是回给别人的,你不是会给我的。
日常使用,主要看Type
和 Code
这两个字段,知道ICMP的报文类型即可。