ICMP(Internet Control Message Protocol)协议是一个网络层协议。 一个新搭建好的网络,往往需要先进行一个简单的测试,来验证网络是否畅通;但是IP协议并不提供可靠传输。如果丢包了,IP协议并不能通知传输层是否丢包以及丢包的原因。因此我们需要ICMP协议来完成这样的功能。
一、 功能
ICMP协议的功能主要有:
- 确认IP包是否成功到达目标地址
- 通知在发送过程中IP包被丢弃的原因
我们需要注意:ICMP是基于IP协议工作的,但是它并不是传输层的功能,因此仍然把它归结为网络层协议。
二、报文格式
ICMP报文包含在IP数据报中,IP报头在ICMP报文的最前面。一个ICMP报文包括IP报头(至少20字节)、ICMP报头(至少八字节)和ICMP报文(属于ICMP报文的数据部分)。当IP报头中的协议字段值为1时,就说明这是一个ICMP报文。
ICMP报头如下图所示:
- 类型:占1字节,标识ICMP报文的类型,从类型值来看ICMP报文可以分为两大类。第一类是取值为1~127的差错报文,第2类是取值128以上的信息报文
- 代码:占1字节,标识对应ICMP报文的代码。它与类型字段一起共同标识了ICMP报文的详细类型
- 校验和:占2字节,这是对包括ICMP报文数据部分在内的整个ICMP数据报的校验和,以检验报文在传输过程中是否出现了差错
- 内容:占8字节。
三、常见的差错报文
常见的ICMP报文可以分为两大类,即差错报文和查询报文。
1.差错报文
常见的ICMP差错报文有以下几种:目的站不可达、数据报超时等。
目的站不可达
目的地不可达由主机或其入站网关生成,以通知客户端由于某种原因目的地不可达。出现此消息的原因可能包括: 与主机的物理连接不存在(距离无限);指定的协议或端口未激活;数据必须分段,但“不分段”标志已打开。不可到达的 TCP 端口特别以TCP RST响应,而不是像预期的那样以目标不可到达类型 3 进行响应。对于IP 多播传输,永远不会报告目标不可达。
类型字段(位 0–7)必须设置为 3
代码字段(位 8-15)用于指定错误类型,可以是以下任何一种:
代码 | 描述 |
---|---|
0 | 网络不可达错误。 |
1 | 主机无法访问错误。 |
2 | 协议不可达错误(不支持指定的传输协议)。 |
3 | 端口不可达错误(指定协议无法通知主机传入消息)。 |
4 | 数据报太大。数据包分段是必需的,但“不分段”(DF) 标志已打开。 |
5 | 源路由失败错误。 |
6 | 目标网络未知错误。 |
7 | 目标主机未知错误。 |
8 | 源主机隔离错误。 |
9 | 目标网络在管理上被禁止 |
10 | 目标主机被管理禁止。 |
11 | 对于服务类型,网络无法访问。 |
12 | 对于服务类型无法访问主机。 |
13 | 通信被管理禁止(管理过滤阻止数据包转发)。 |
14 | 主机优先级冲突(表示主机或网络和端口的组合不允许请求的优先级)。 |
15 | 优先级截止有效(数据报的优先级低于网络管理员设置的级别)。 |
下一跳 MTU字段(位 48-63)包含发生代码 4 错误时下一跳网络的 MTU。[15]
包含IP 标头和附加数据以允许客户端将回复与导致目标无法到达回复的请求进行匹配。
数据报超时
超时由网关生成,以通知由于生存时间字段达到零而丢弃的数据报的源。如果主机未能在其时限内 重组分段数据报,则也可能会发送超时消息。
Traceroute实用程序使用超时消息来识别两个主机之间路径上的网关。
类型必须设置为 11
代码指定超时消息的原因,包括以下内容:
代码 | 描述 |
---|---|
0 | 运输过程中超过了生存时间。 |
1 | 超过片段重组时间。 |
源主机使用IP 标头和原始有效负载的前 64 位将超时消息与丢弃的数据报进行匹配。对于UDP和TCP等更高级别的协议,64 位有效负载将包括丢弃数据包的源端口和目标端口。
2.查询报文
常见的ICMP查询报文有以下几种:回送请求或回答、时间戳请求或回答、路由器询问和通告、信息请求或回答、地址掩码请求或回答。
其中用得较多的是回送请求或回答、时间戳请求或回答,其他的三种查询报文目前几乎很少被用到,以前它们主要在主机启动时使用,通过使用这三种查询报文,主机能确定自身在网络环境中IP地址、地址掩码、路由器状况等信息,现在,DHCP协议已经能够完全实现这些功能。此外,在互联网中的两台主机能够使用时间戳请求或回答报文来确定数据报在彼此之间往返所需要的时间。
时间戳
时间戳用于时间同步。原始时间戳设置为发送者最后一次接触数据包的时间(自午夜以来以毫秒为单位)。不使用接收和发送时间戳。
类型必须设置为 13
代码必须设置为0
客户端可以使用标识符和序列号来将时间戳回复与时间戳请求进行匹配。
原始时间戳是自世界时间(UT)午夜以来的毫秒数。如果 UT 参考不可用,则可以设置最高有效位来指示非标准时间值。
时间戳回复
时间戳回复回复时间戳消息。它由时间戳发送方发送的原始时间戳以及指示何时接收时间戳的接收时间戳和指示何时发送时间戳回复的传输时间戳组成。
类型必须设置为 14
代码必须设置为0
客户端可以使用标识符和序列号来将回复与引起回复的请求进行匹配。
原始时间戳是发送者在发送消息之前最后接触消息的时间。
接收时间戳是回显器在接收时第一次接触它的时间。
传输时间戳是回显器在发送消息时最后一次接触消息的时间。
所有时间戳均以自世界标准时间午夜以来的毫秒为单位。如果时间不可用(以毫秒为单位)或无法提供相对于午夜 UT 的时间,则可以将任何时间插入到时间戳中,前提是时间戳的高位也设置为指示此非标准值。
使用时间戳和时间戳回复消息来同步互联网节点的时钟已经很大程度上被基于UDP的网络时间协议和精确时间协议所取代。
四、应用
-
错误报告:
- 目的地不可达:当路由器或网关无法将IP数据包转发到目的地时,会向发送方返回一个“目的地不可达”消息。
- 时间超出:如果数据包在网络中的存活时间(TTL, Time to Live)耗尽,未到达目的地,会发送时间超出消息告知发送者。
- 参数问题:如果IP数据包的头部有错误,将发送参数问题消息给发送方。
- 改变路由(重定向):路由器发出重定向消息以告诉发送主机有一个更好的路由可供选择。
-
网络诊断工具:
- 回声请求/应答(Echo Request/Reply):这是
ping
命令背后的机制。发送方发送一个回声请求消息,接收方以回声应答消息响应。这通常用于测试网络连接的连通性和延迟。 - 时间戳请求/应答:用于请求/响应发送者和接收者之间的时间戳信息,可用于计算往返时间并同步时钟。
- 回声请求/应答(Echo Request/Reply):这是
-
网络设备和服务的可达性测试:
- 使用ICMP回声请求和应答,可以测试网络上特定设备是否可达,并获取有关网络延迟的信息。
-
网络拥塞控制:
- 路由器通过ICMP“来源抑制”(Source Quench)消息向发送方报告网络拥塞情况,建议发送方减少发送速率。注:来源抑制消息在较新的网络实践中不常使用,因为其功能通常由更复杂的拥塞控制机制取代,如TCP的拥塞控制算法。
-
路径MTU发现:
- ICMP通过不允许分片的“片过大”(Fragmentation Needed and DF Set)消息,被用来执行路径MTU发现过程。这个过程的目的是确定到目的地路径上任何一点的最大传输单元(MTU)的大小。
提问:为什么ping的地址不是完整的URL?
ping
是在网络层工作的,并且直接与目标主机的IP地址交互,而不处理传输层或应用层的协议,如TCP/UDP或HTTPS。当您在浏览器中输入
https://
作为网页的一部分时,这个前缀指定了您希望使用HTTP协议的安全变体(HTTPS)。HTTP和HTTPS是应用层协议,它们使用TCP协议(位于传输层)在客户端和服务器之间传输数据。HTTPS特别使用加密和TLS/SSL证书来保护传输数据的安全。因此,“
https://
”前缀对于ping
命令来说没有意义,因为ping
不涉及这些高层的网络协议。当您想用ping
测试服务器的可达性时,您应该直接使用服务器的IP地址或域名,而不是完整的URL。