监控协议之ICMP - Ping 与 TraceRoute
-
稍微对网络有些了解的人都应该知道并用过ping这个命令(很多人应该还了解或使用过traceroute或tracert),用来探测目标主机或设备是否可达或对网络状态做一些基本检查。在基础设施监控中,我们同样需要这种简单但重要的功能,为了让大家更好的了解如何实现设备或主机可达性的监控,本文将为大家介绍ping和traceroute工作的原理和机制,以及它们背后所依赖的一个标准网络协议:ICMP(Internet Control Message Protocol,即互联网控制消息协议)。
ICMP协议介绍
ICMP,即互联网控制消息协议,是最早的网络基本协议之一。它最早的版本是1981年4月发表的RFC 777,并经过几次修改后与当年9月份被IETF在RFC 792中发布。ICMP在所有的网络设备中都被要求实现,从而成为一种帮助人们发现并诊断网络问题的标准手段和工具。最早的ICMP仅在IPv4中实现,随着IPv6的发布,ICMP 经过调整一同成为IPv6的基础协议之一(即ICMPv6)。我们下文讨论中将基于最常见的IPv4进行讨论,方便介绍ICMP协议(ICMPv6工作方式基本类似)。
ICMP是一种直接工作在IP协议之上的协议(逻辑上它比我们常说的UDP或TCP协议更为底层),在协议上它被定义为一种特殊的IP包格式。中所周知,在IP协议中,一个数据包可以简单的分解为包头(Header)和数据(Payload)两部分。IP协议中,最基本包头占用了20字节,在这个基础之上可以对IP头部进行扩展(最大的IP包头可达60字节。下图可以看到IPv4的头部结构
在IP包头的基础上,ICMP 附加了8字节的ICMP头部,这个头部的前4字节中包括了ICMP所需要的三个重要的信息
- 类型(Type):ICMP 消息或回复的类型
- 编码(Code):对应消息类型下的子编码
- 校验码(Checksum):对应整个ICMP消息头和数据的校验码
在这个头部之后的后4个字节则是根据Type和Code的需要而填充响应的信息。完整的ICMP数据包,其大致结构如下:
ICMP的消息按其目的可分为
- ICMP 请求(Request):用户或源主机想目的主机发送的消息,期待目的主机根据包头的类型和编码做相应的回应
- ICMP 应答(Reply):目的主机(或中间的网络处理设备)在接受到源主机的请求后发回的相应包。响应包可能包含源主机期待的结果,也可能是表示一个错误。
ICMP 请求与响应一般是通过一问一答的方式进行交互,如下所示
ICMP 如何工作的?
从上面的协议介绍可见,ICMP是采用一问一答的方式工作的(即通过ICMP 请求和ICMP 应答进行交互)。在实际的网络中,源主机发起ICMP 请求,而ICMP的应答根据实际情况可能由目标主机产生,也可能由网络中的网络设备产生。之所以ICMP 响应可能由中间的网络设备产生是因为
- 网络的结构是复杂,一个数据包可能无法被正确路由到目标设备上。
- 每个IP包在网络上的存留时间有限的的。在上述IP 头中可以看到一个TTL字段,这个字段全称为Time To Live,即一个数据包能在网络中最多经过多少网络节点的限制(或者说它的生命周期)。每经过一个中间网络设备TTL的值就会被减一,如果在到达一个中间网络设备时TTL减一后为0,该设备不会将数据包传递到下一个节点,而是直接在当前节点丢弃并根据情况产生一个ICMP 响应告知数据包发送者。
下面我们看看我们常用的ping和traceroute是怎么工作的,从而可以清楚的了解ICMP 的工作方式和机制
Ping的工作方式
ping命令是我们最常用的命令之一,它是怎么工作的呢?我们先看一个具体的例子。在命令行中,敲入ping <目标地址>并回车,就可以看到如下输出:
从上面的例子可见,ping可以告诉我们大概如下信息
-
对方是否可达,及上面结果中是否收到有效的reply
-
网络到达对方并返回的时间(RTT:Round Trip Time)大致所需的时间,及上面看到的平均时间(3ms)
-
网络到达对方大概所需要经过的网络设备数。上述TTL是我们收到的reply数据包的TTL,根据被ping的目标主机我们可以大致算出中间经过的网络设备数。根据响应包的发送者类型,我们可以用初始TTL减去这个值则得到中间经过的网络设备数。初始值一般情况下如下
- 路由器:初始值为255
- Windows:初始值为128
- Linux或*nix:初始值一般为64
上面列子中,我们ping的是自己的内网桥接主机,中间没有经过其它节点,因此TTL是64(我们的桥接主机是一个linux 机器)
ping命令的工作方式极为简单,发起ping命令的机器直接组装好一个或多个ICMP 请求包,然后依次发送往目标主机并等到ICMP 响应(要么成功,如上所示),要么失败,并在所有响应包接收完成(或超时)后将信息进行汇总,然后显示上述信息即可。
唯一需要解释的是ping是如何计算RTT的呢?这是ping在发送ICMP请求时,利用了ICMP 包头剩余的4字节和ICMP包的数据,它在发送时将当前时间戳记录在这些位置,在对方收到请求时会按协议要求原封不动的把这些数据在ICMP 请求中返回,这样ping就能根据接受的时间减去从ICMP 响应包中读出的发送时间计算出RTT了。
TraceRoute的工作方式
Trace Route的工作方式会比ping 复杂一些。Trace Route是帮助我们获得网络中从一个节点到另一个节点的详细路由信息的工具,帮助我们更好的理解数据在网络中流动的路线和定位、解决一些网络问题。为了方便描述,我们将假设有如下一个网络结构:
在如上网络结构中,两个主机通过中间的网络设备链接起来,从而可以相互进行通讯。Trace Route在工作时,会依次构建初始TTL为1到N(最大255)的ICMP 请求,并根据请求返回结果决定最终路由的状态。
第一步 确定路由经过的第一个节点
在这一步中,第一个网络设备将TTL减一后发现TTL 为0,它会直接发送ICMP 响应包告诉源地址TTL超时,从而让traceroute可以获取第一个路由器的相关信息。
第二步 确定路由经过的第二个节点
在这一步中,第二个网络设备将TTL减一后发现TTL 为0,它会直接发送ICMP 响应包告诉源地址TTL超时,从而让traceroute可以获取第二个路由器的相关信息。
第三步 一次类推,确定路由经过的第三个节点
在这一步中,和前面一样,经过的第三个网络设备将TTL减一后发现TTL 为0,它会直接发送ICMP 响应包告诉源地址TTL超时,从而让traceroute可以获取第三个路由器的相关信息。最后一步 到达目标主机
此时第三个网络设备将ICMP 请求正确路由到目标主机,目标主机回复ICMP 响应,traceroute 发现来自目标主机的ICMP 响应后停止进一步试探,最终完成整个命令。
我们如何用ICMP 做监控
在择维士数象云提供的完全监控中,择维士内置支持了ICMP 协议,从而能完成和ping与traceroute一样的功能,但不同于一般的ping和traceroute,择维士数象云可以
- 通过对协议的直接操控,实现快速多目标地址的ping,其网络探测和扫描效率可以达到使用普通ping的数百倍甚至上千倍
- 数象云中在做类似traceroute功能时可有做更多分析处理(比如效区分中间网络设备的地址类型等),从而能帮助客户发现网络问题发生位置(比如内网或外部网络)等等
- 数象云可以在ICMP的基础上附加更多的更高层协议监控,帮助客户完成从可达性、可用性、可靠性的全面监测。