什么是icmp协议

ICMP是(Internet Control Message Protocol)Internet控制报文协议。它是TCP/IP协议族的一个子协议,用于在IP主机、路由器之间传递控制消息。控制消息是指网络通不通、主机是否可达、路由是否可用等网络本身的消息。这些控制消息虽然并不传输用户数据,但是对于用户数据的传递起着重要的作用。

定义

ICMP协议是一种面向无连接的协议,用于传输出错报告控制信息。它是一个非常重要的协议,它对于网络安全具有极其重要的意义。

它是TCP/IP协议族的一个子协议,属于网络层协议,主要用于在主机与路由器之间传递控制信息,包括报告错误、交换受限控制和状态信息等。当遇到IP数据无法访问目标、IP路由器无法按当前的传输速率转发数据包等情况时,会自动发送ICMP消息。ICMP报文在IP帧结构的首部协议类型字段(Protocol 8bit)的值=1.

如下图所示,ICMP包有一个8字节长的包头,其中前4个字节是固定的格式,包含8位类型字段,8位代码字段和16位的校验和;后4个字节根据ICMP包的类型而取不同的值。

Understanding Ping Command and ICMP with Examples
What is ICMP type?
Understanding ICMP Packets with Examples

ICMP提供一致易懂的出错报告信息。发送的出错报文返回到发送原数据的设备,因为只有发送设备才是出错报文的逻辑接受者。发送设备随后可根据ICMP报文确定发生错误的类型,并确定如何才能更好地重发失败的数据包。但是ICMP唯一的功能是报告问题而不是纠正错误,纠正错误的任务由发送方完成。

我们在网络中经常会使用到ICMP协议,比如我们经常使用的用于检查网络通不通的Ping命令(Linux和Windows中均有),这个“Ping”的过程实际上就是ICMP协议工作的过程。还有其他的网络命令如跟踪路由的Tracert命令也是基于ICMP协议的。

13fb8ad9562cfcfaa95f15a5fa34bd4d.png

ICMP协议到底属于哪一层

icmp协议是IP层的附属协议,是介于IP层和TCP层之间的协议,一般认为属于IP层协议。IP协议用它来与其他主机或路由器交换错误报文和其他的一些网络情况。在ICMP包重携带了控制信息和故障恢复信息。主要用于路由器主机向其他路由器或者主机发送出错报文的控制信息​。

ICMP的功能特点

e33e4657fe4bd28f3aa407685d5be9a4.png

ICMP本身是网络层的一个协议;

ICMP差错报告采用路由器-源主机的模式,路由器在发现数据报传输出现错误时只向源主机报告差错原因;

ICMP并不能保证所有的IP数据报都能够传输到目的主机;

ICMP不能纠正差错,它只是报告差错。差错处理需要由高层协议去完成。

它是TCP/IP协议族的一个子协议,用于在IP主机、路由器之间传递控制消息。控制消息是指网络通不 通、主机是否可达、路由是否可用等网络本身的消息。这些控制消息虽然并不传输用户数据,但是对于用户数据的传递起着重要的作用。 ICMP的作用与特点 ICMP的特点: ICMP本身是网络层的一个协议; ICMP差错报告采用路由器-源主机的模式,路由器在发现数据报传输出现错误时只向源主机报告差错原因; ICMP并不能保证所有的IP数据报都能够传输到目的主机; ICMP不能纠正差错,它只是报告差错。差错处理需要由高层协议去完成。 ICMP报文类型 ICMP差错控制 ICMP差错报告报文: 目的站不可达: 源站抑制 超时 参数问题 改变路由 目的站不可到达 网络不可到达(net unreachable) 主机不可到达(host unreachable) 协议不可到达(protocol unreachable) 端口不可到达(port unreachable) 源路由选择不能完成(source route failed) 目的网络不可知(unknown destination network) 目的主机不可知(unknown destination host)

Exploring ICMP Protocol with Examples
Exploring ICMP with Examples

ping命令是什么协议?

维基百科介绍:

ping是一种电脑网络工具,用来测试数据包能否通过IP协议到达特定主机。ping的运作原理是向目标主机传出一个ICMP echo@要求数据包,并等待接收echo回应数据包。程序会按时间和成功响应的次数估算丢失数据包率(丢包率)和数据包往返时间(网络时延,Round-trip delay time)。

可以知道,ping基于ICMP协议。

ICMP属于哪一层?

查阅书籍《TCP/IP协议族》,第9章“网络控制报文协议(ICMP)”,我们可以看到下面这一段话:

IP协议还缺少主机和管理查询所需要的机制。主机有时候需要判断某个路由器或者是对方主机是否活跃。有时网络管理员也需要来自其他主机或路由器的信息。
网络控制报文协议(ICMP)是设计来弥补上述两个遗憾的,它是IP协议的伴侣。图9.1给出了ICMP协议在网络层中的位置,以及它与IP及其他协议之间的关系。

查看《TCP/IP协议详解卷1》,第6章“ICMP:Internet控制报文协议”:

ICMP经常被认为是IP层的一个组成部分。它传递差错报文以及其他需要注意的信息。
ICMP报文通常被IP层或更高层协议(TCP或UDP)使用。

由此可见,ICMP位于网络层,与IP属于同一层。

进一步验证
我们进一步查看权威的资料,找到RFC 792文档:

The Internet Protocol (IP) [1] is used for host-to-host datagram
service in a system of interconnected networks called the
Catenet [2]. The network connecting devices are called Gateways.
These gateways communicate between themselves for control purposes
via a Gateway to Gateway Protocol (GGP) [3,4]. Occasionally a
gateway or destination host will communicate with a source host, for
example, to report an error in datagram processing. For such
purposes this protocol, the Internet Control Message Protocol (ICMP),
is used. **ICMP, uses the basic support of IP as if it were a higher
level protocol, however, ICMP is actually an integral part of IP, and
must be implemented by every IP module**.

大意就是:

ICMP协议是用于host到host之间的数据报服务,目的host与源host进行通信时,ICMP会用到,比如通过处理数据报报告一个错误。
ICMP基于IP,以至于它看起来像一个上层协议,但是实际上是IP的一部分,而且必须在每个IP模块中实现。

至于ICMP的详细作用以及帧结构定义,这里不再赘述,读者自行了解。

Exploring ICMP Port Number with Example

ICMP差错报文

报告IP数据报在传输中的差错是ICMP报文最基本的功能,ICMP差错报文有如下特点:

ICMP差错报文都是由路由器发送到源主机的,因为IP数据报中含有源主机的IP地址,报告给源主机是最可行的方案,另外,发出IP数据报的源主机最需要知道数据是否到达目标主机。
ICMP差错报文只提供IP数据报在传输过程中的差错报告,并不规定对各类差错应采取什么样的处理措施。具体对差错的处理,由收到ICMP差错报文的源主机将相应的差错与应用程序联系起来才能进行相应的差错处理。
ICMP差错报文不享受任何优先权,也没有特别的可靠性保证措施,与普通的IP数据报一样进行传输,传输过程中可能被丢失、损坏,甚至被抛弃。
ICMP差错报文是伴随着抛弃出错的IP数据报而产生的。
当路由器发送一份参数错误等的ICMP差错报文时,ICMP报文数据区始终包含产生ICMP差错报文的IP数据报的头部和其数据区的前8个字节(64位)。
在有些情况下,为了防止在网络中产生大量的ICMP差错报文(广播风暴),影响网络的正常工作,即使发生差错,也不会产生ICMP差错报文,这些情况包括:
●ICMP报文发生差错。这是为了避免差错报文无休止产生而规定的(但ICMP查询报文可能会产生ICMP差错报文)。
●目的地址是广播地址或多播地址(D类地址)的IP数据报。
●作为链路层广播的数据报。
●不是IP分片的第一片。
●源地址不是单个主机的数据报。这就是说,源地址不能为零地址、回送地址、广播地址或多播地址。

Capture ICMP Packets With Tcpdump
Filtering ICMP ICMPv6 Packets with Tcpdump


David Cao
14 声望1 粉丝