1.ICMP协议概述
1.1 什么是ICMP?
ICMP(Internet Control Message Protocol的缩写),中文就是:网际报文控制协议。
该协议是网络协议族的核心协议之一。通过一张图来看下该协议所处位置:
(图片来自 百度安全验证):
可以看到,ICMP协议与IP协议同属网络层。
虽然两者同属网络层,没有上下级关系,但是ICMP协议最终还是要依靠IP协议将报文发送出去。
1.2 ICMP协议作用
IP协议我们知道是发送数据包的重要协议,实现了数据包的分片发送。那么ICMP协议呢?
ICMP主要是用于ip主机、路由器直接传递控制消息。
控制消息:网络是否通、主机是否可达、路由是否可用等网络本身的消息。
所以ICMP消息不同于正常的网络通讯包,它主要是传递网络本身问题的消息。
通过ICMP协议发送消息,我们可以确认IP包是否成功达到目标IP;如果数据包在发送过程中被丢弃,ICMP会响应具体的原因;
1.3 基于ICMP协议的命令
1)ping
该命令我们都比较熟悉了,通常会用来检测目标ip是否存活、发送包传递时间等
2)traceroute
该命令能够打印出当前主机发送数据包到目标ip主机中经历了多少路由器
2.ICMP协议报文格式
先来简单看下ICMP的报文格式
(1)类型:一个8位类型字段,表示ICMP数据包类型。
(2)代码:一个8位代码域,表示指定类型中的一个功能。如果一个类型中只有一种功能,代码域置为0。
(3)检验和:数据包中ICMP部分上的一个16位检验和。
ICMP协议的类型目前已经定义了十多种,具体如下(来自百度百科):
TYPE |
CODE |
Description |
Query |
Error |
---|---|---|---|---|
0 |
0 |
Echo Reply——回显应答(Ping应答) |
x |
|
3 |
0 |
Network Unreachable——网络不可达 |
x |
|
3 |
1 |
Host Unreachable——主机不可达 |
x |
|
3 |
2 |
Protocol Unreachable——协议不可达 |
x |
|
3 |
3 |
Port Unreachable——端口不可达 |
x |
|
3 |
4 |
Fragmentation needed but no frag. bit set——需要进行分片但设置不分片比特 |
x |
|
3 |
5 |
Source routing failed——源站选路失败 |
x |
|
3 |
6 |
Destination network unknown——目的网络未知 |
x |
|
3 |
7 |
Destination host unknown——目的主机未知 |
x |
|
3 |
8 |
Source host isolated (obsolete)——源主机被隔离(作废不用) |
x |
|
3 |
9 |
Destination network administratively prohibited——目的网络被强制禁止 |
x |
|
3 |
10 |
Destination host administratively prohibited——目的主机被强制禁止 |
x |
|
3 |
11 |
Network unreachable for TOS——由于服务类型TOS,网络不可达 |
x |
|
3 |
12 |
Host unreachable for TOS——由于服务类型TOS,主机不可达 |
x |
|
3 |
13 |
Communication administratively prohibited by filtering——由于过滤,通信被强制禁止 |
x |
|
3 |
14 |
Host precedence violation——主机越权 |
x |
|
3 |
15 |
Precedence cutoff in effect——优先中止生效 |
x |
|
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请求) |
x |
|
9 |
0 |
Router advertisement——路由器通告 |
||
10 |
0 |
Route solicitation——路由器请求 |
||
11 |
0 |
TTL equals 0 during transit——传输期间生存时间为0 |
x |
|
11 |
1 |
TTL equals 0 during reassembly——在数据报组装期间生存时间为0 |
x |
|
12 |
0 |
IP header bad (catchall error)——坏的IP首部(包括各种差错) |
x |
|
12 |
1 |
Required options missing——缺少必需的选项 |
x |
|
13 |
0 |
Timestamp request (obsolete)——时间戳请求(作废不用) |
x |
|
14 |
Timestamp reply (obsolete)——时间戳应答(作废不用) |
x |
||
15 |
0 |
Information request (obsolete)——信息请求(作废不用) |
x |
|
16 |
0 |
Information reply (obsolete)——信息应答(作废不用) |
x |
|
17 |
0 |
Address mask request——地址掩码请求 |
x |
|
18 |
0 |
Address mask reply——地址掩码应答 |
还是先实战一下,方便我们对其有个更具象的认知。
3.ICMP协议实战
3.1 ping命令实战(正常主机)
笔者准备两台机器,采用ping的方式来进行通讯,ping之前启动好wireshark来进行相应ip抓包
3.1.1 抓包实战
客户端直接启动cmd命令行,发送ping命令如下:
C:\Users\lucky>ping 192.168.3.18
正在 Ping 192.168.3.18 具有 32 字节的数据:
来自 192.168.3.18 的回复: 字节=32 时间=114ms TTL=64
来自 192.168.3.18 的回复: 字节=32 时间=65ms TTL=64
来自 192.168.3.18 的回复: 字节=32 时间=45ms TTL=64
来自 192.168.3.18 的回复: 字节=32 时间=3ms TTL=64
192.168.3.18 的 Ping 统计信息:
数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失),
往返行程的估计时间(以毫秒为单位):
最短 = 3ms,最长 = 114ms,平均 = 56ms
发送了4次请求,也收到4次回复。
3.1.2 wireshark抓包分析
在进行3.1.1动作之前,先启动wireshark,准备好抓取相应包信息,抓取信息如下:
这里是4次ping请求和响应的总输出。
我们分析下其中一次即可,No.333和No.336
No.333 ping请求体分析
No. Time Source Destination Protocol Length Info
333 11.697911 192.168.3.8 192.168.3.18 ICMP 74 Echo (ping) request id=0x0001, seq=11611/23341, ttl=64 (reply in 336)
Frame 333: 74 bytes on wire (592 bits), 74 bytes captured (592 bits) on interface 0
Ethernet II, Src: IntelCor_40:2c:f7 (10:f0:05:40:2c:f7), Dst: bc:d0:74:13:40:02 (bc:d0:74:13:40:02)
Internet Protocol Version 4, Src: 192.168.3.8, Dst: 192.168.3.18
Internet Control Message Protocol
Type: 8 (Echo (ping) request) # ping请求
Code: 0 # ping请求
Checksum: 0x2000 [correct] # 校验和
[Checksum Status: Good]
Identifier (BE): 1 (0x0001) # 标识符
Identifier (LE): 256 (0x0100) # 标识符
Sequence number (BE): 11611 (0x2d5b) # 序列号
Sequence number (LE): 23341 (0x5b2d) # 序列号
[Response frame: 336]
Data (32 bytes)
注意:
Sequence number(BE)和Sequence number(LE)的值也是相同的,BE和LE是什么区别,他们在内容上只是顺序的不同,而对应的hex值是相同的。
通过资料的查找,可以这样理解:
wireshark考虑到window系统与Linux系统发出的ping报文(主要指ping应用字段而非包含IP头的ping包)的字节顺序不一样(windows为LE:little-endian byte order,Linux为BE:big-endian),别分告诉信息,其本质内容是没有不变的,只是表达形式不同。
No.336 ping响应体分析
No. Time Source Destination Protocol Length Info
336 11.812172 192.168.3.18 192.168.3.8 ICMP 74 Echo (ping) reply id=0x0001, seq=11611/23341, ttl=64 (request in 333)
Frame 336: 74 bytes on wire (592 bits), 74 bytes captured (592 bits) on interface 0
Ethernet II, Src: bc:d0:74:13:40:02 (bc:d0:74:13:40:02), Dst: IntelCor_40:2c:f7 (10:f0:05:40:2c:f7)
Internet Protocol Version 4, Src: 192.168.3.18, Dst: 192.168.3.8
Internet Control Message Protocol
Type: 0 (Echo (ping) reply) # ping响应
Code: 0 # ping响应
Checksum: 0x2800 [correct] # 校验和
[Checksum Status: Good]
Identifier (BE): 1 (0x0001) # 标识符(这里与ping请求体中的Identifier是相同的)
Identifier (LE): 256 (0x0100) # 标识符(这里与ping请求体中的Identifier是相同的)
Sequence number (BE): 11611 (0x2d5b) # 序列号(这里与ping请求体中的Sequence number是相同的)
Sequence number (LE): 23341 (0x5b2d) # 序列号(这里与ping请求体中的Sequence number是相同的)
[Request frame: 333] # 响应帧
[Response time: 114.261 ms] # 响应耗时
Data (32 bytes)
以上就是一个正常的ping命令实战过程。
下面我们来看一个不太正常的,了解下ICMP协议是如何响应控制消息的。
3.2 ping命令实战(非正常主机)
我们来简单测试一种,目标主机不可达的情况。
我们来对一个不存在的主机(ip:192.168.3.18)来发送ping命令,测试下响应结果
3.2.1 抓包实战
客户端直接启动cmd命令行,发送ping命令如下:
C:\Users\lucky>ping 192.168.3.199
正在 Ping 192.168.3.199 具有 32 字节的数据:
来自 192.168.3.8 的回复: 无法访问目标主机。
来自 192.168.3.8 的回复: 无法访问目标主机。
来自 192.168.3.8 的回复: 无法访问目标主机。
来自 192.168.3.8 的回复: 无法访问目标主机。
192.168.3.199 的 Ping 统计信息:
数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失),
ping请求直接返回了目标主机无法访问
3.2.2 wireshark抓包分析
在进行3.2.1动作之前,先启动wireshark,准备好抓取相应包信息,抓取信息如下:
这里协议Info内容也是Destination unreachable
来看下具体信息
No. Time Source Destination Protocol Length Info
4 9.008265 192.168.3.8 192.168.3.8 ICMP 92 Destination unreachable (Host unreachable)
Frame 4: 92 bytes on wire (736 bits), 92 bytes captured (736 bits) on interface 0
Null/Loopback
Internet Protocol Version 4, Src: 192.168.3.8, Dst: 192.168.3.8
Internet Control Message Protocol # ICMP响应
Type: 3 (Destination unreachable) # 主机不可达
Code: 1 (Host unreachable) # 主机不可达
Checksum: 0xe37f [correct]
[Checksum Status: Good]
Unused: 00000000
Internet Protocol Version 4, Src: 192.168.3.8, Dst: 192.168.3.199
Internet Control Message Protocol # ICMP请求体
Type: 8 (Echo (ping) request) # ping请求
Code: 0 # ping请求
Checksum: 0x1f9f [unverified] [in ICMP error packet]
[Checksum Status: Unverified]
Identifier (BE): 1 (0x0001)
Identifier (LE): 256 (0x0100)
Sequence number (BE): 11708 (0x2dbc)
Sequence number (LE): 48173 (0xbc2d)
Data (32 bytes)
总结:根据ICMP响应的Type和Code,对照表内容之后,可以知道目标主机不可达
总结:
ICMP协议与IP协议一样,都是位于网络层的协议。文章来源:https://www.toymoban.com/news/detail-439531.html
但是ICMP协议主要是用来传递控制消息,根据不同的Type和Code来展示目标主机的基本情况(是否可达、路由是否可用等信息)。
本质上,ICMP协议需要借助IP协议将网络包发送出去。文章来源地址https://www.toymoban.com/news/detail-439531.html
到了这里,关于ICMP协议解析与实战的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!