基于 ICMP 的网络连通性探测机制 : ping 与 traceroute 工作流程
注:本文为 “网络连通性检测技术原理” 相关合辑。
图片清晰度受引文原图所限。
略作重排,如有内容异常,请看原文。
网络连通性检测技术原理:从 ping 到 ICMP 协议
1. 回环地址
1.1 IPv4 回环地址
127.0.0.1属于IPv4地址。IPv4地址总长度为 32 位,以 8 位为 1 个字节,共划分为 4 个字节。以127开头的IPv4地址均为回环地址,该类地址属于IPv4协议中的特殊地址,由协议规范直接定义。127.0.0.1是回环地址集中的一个典型地址,其取值在网络协议源码中存在固定定义:
/* Address to loopback in software to local host. */#defineINADDR_LOOPBACK0x7f000001/* 127.0.0.1 */IPv4地址空间为2 32 2^{32}232,约为 40 亿。该地址空间规模无法满足全球网络设备接入需求,因此推出IPv6协议。IPv6地址长度为 128 位,地址空间约为10 38 10^{38}1038,可满足大规模设备的地址分配需求。
IPv4地址采用点分十进制格式,每 8 位为一组,组间以.分隔。IPv6地址以 16 位为一组,组间以:分隔,连续全 0 段可简写为::,且单个IPv6地址中仅允许一次该简写形式。
1.2 IPv6 回环地址
IPv4协议下的回环地址为127.0.0.1,IPv6协议下的回环地址表示为::1。IPv4环境中使用ping 127.0.0.1命令,IPv6环境中对应使用ping6 ::1命令。
1.3 回环地址的协议栈行为
断开物理网络连接后,在终端执行ping 127.0.0.1命令,输出如下:
$ ping 127.0.0.1 PING 127.0.0.1 (127.0.0.1): 56 data bytes 64 bytes from 127.0.0.1: icmp_seq=0 ttl=64 time=0.080 ms 64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.093 ms 64 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.074 ms 64 bytes from 127.0.0.1: icmp_seq=3 ttl=64 time=0.079 ms 64 bytes from 127.0.0.1: icmp_seq=4 ttl=64 time=0.079 ms ^C --- 127.0.0.1 ping statistics --- 5 packets transmitted, 5 packets received, 0.0% packet loss round-trip min/avg/max/stddev = 0.074/0.081/0.093/0.006 ms实验结果表明,物理断网状态下仍可ping通127.0.0.1。
报文从应用层经传输层至网络层的处理流程,与外网ping操作一致。系统在网络层根据目标IP查询路由表,确定出接口网卡。目标IP为外网地址时,报文通过物理网卡发送;目标IP为回环地址时,报文转发至本地回环接口。
本地回环接口为虚拟网络接口,不具备物理网卡的发送队列等硬件结构。报文被推送至input_pkt_queue链表,该链表为系统内共享队列,存储发往本机的网络报文。报文入队后触发软中断,内核线程ksoftirqd响应中断,从链表中取出报文,沿数据链路层、网络层逐层上传至应用程序。
该传输路径全程不经过物理网卡,报文在本机协议栈内完成闭环传输,因此断网状态下仍可ping通127.0.0.1。
2. ICMP 协议
2.1 定义与功能
ICMP(Internet Control Message Protocol,互联网控制报文协议)是IP协议的辅助协议,工作于网络层。网络数据包在传输过程中会出现各类异常,网络节点需通过报文反馈异常信息,以调整传输策略,该过程由ICMP协议承载。
ICMP可实现IP数据包送达状态确认、IP数据包丢弃原因上报、网络配置优化信息传递等功能。IP通信过程中,若IP数据包无法抵达目标地址,具体异常原因由ICMP协议向源节点反馈。
主机 A 向主机 B 发送数据包时,若路由器 2 无法定位主机 B,则路由器 2 向主机 A 发送ICMP目标不可达数据包,反馈传输失败信息。ICMP通知报文依托IP协议传输,路由器 2 返回的ICMP数据包经路由转发至主机 A,主机 A 解析ICMP首部与数据域后获取异常原因。
2.2 ICMP 报文格式
ICMP报文封装于IP数据包内部,工作于网络层,为IP协议提供辅助功能。
ICMP头部的类型字段可分为两类:
- 查询报文类型,用于网络状态诊断
- 差错报文类型,用于传输异常原因通知
2.3 查询报文类型
2.3.1 回送消息(类型 0 与类型 8)
回送消息用于主机或路由器间验证数据包的送达状态,ping命令基于该类消息实现。
通信节点可发送ICMP回送请求报文(ICMP Echo Request Message,类型8),并接收对端返回的ICMP回送应答报文(ICMP Echo Reply Message,类型0)。
该类报文在标准ICMP结构基础上增设两类字段:
- 标识符:用于区分不同应用程序发送的
ICMP数据包,可采用进程PID作为标识 - 序号:初始值为
0,每发送一次新的回送请求则自增1,可用于判断数据包丢失情况
选项数据域中,ping会记录报文发送时间,用于计算数据包往返时间。
2.4 差错报文类型
常用ICMP差错报文类型如下:
- 目标不可达消息,类型为
3 - 源抑制消息,类型为
4 - 重定向消息,类型为
5 - 超时消息,类型为
11
2.4.1 目标不可达消息(类型 3)
IP路由器无法将数据包转发至目标地址时,向源主机返回ICMP目标不可达报文,异常原因记录于ICMP头部的代码字段。
常见目标不可达代码如下:
a. 网络不可达(代码 0)
路由器路由表中无匹配目标IP网络号的条目时,向源主机反馈网络不可达信息。无类别域间路由普及后,该类异常反馈场景减少。
b. 主机不可达(代码 1)
路由表中无目标主机信息,或目标主机未接入网络时,向源主机反馈主机不可达信息。
c. 协议不可达(代码 2)
源主机采用指定协议访问目标主机,目标主机防火墙禁止该协议通信时,向源主机反馈协议不可达信息。
d. 端口不可达(代码 3)
源主机向目标主机指定端口发起通信,目标主机无进程监听该端口时,向源主机反馈端口不可达信息。
e. 需要分片但设置不分片位(代码 4)
源主机发送IP数据报时,将IP首部的分片禁止标志位设为1。传输路径中路由器遇到超出MTU的数据包时不执行分片操作,直接丢弃该数据包,并向源主机反馈对应不可达信息。
2.4.2 源抑制消息(类型 4)
低速广域线路场景下,路由器出现网络拥塞时,可向源主机发送ICMP源抑制消息。源主机接收该消息后,调整IP数据包发送间隔,缓解网络拥塞。该类报文易造成网络通信资源分配不均,实际场景中较少使用。
2.4.3 重定向消息(类型 5)
路由器检测到源主机采用非最优路径传输数据时,向源主机返回ICMP重定向报文,携带最优路由信息。源主机后续通信可依据该信息调整传输路径。
2.4.4 超时消息(类型 11)
IP数据包包含TTL(Time To Live,生存周期)字段,数据包每经过一台路由器,该字段值减1。当字段值降至0时,数据包被路由器丢弃。
路由器丢弃数据包后,向源主机发送ICMP超时消息,通知数据包已被丢弃。TTL机制可避免路由环路导致数据包在网络中无限转发。
3. ping 命令原理
3.1 概述
ping属于应用层工具,与常规应用程序处于同一网络分层。ping的功能为向目标主机发送探测报文,检测目标主机的网络可达性。ping工具的底层依托网络层ICMP协议实现报文传输。
ICMP协议与IP协议同属网络层协议,ICMP报文需封装在IP数据包中完成传输。
ping操作可简化理解为向目标IP地址发送探测报文,报文传输遵循网络协议栈的封装规则。
3.2 ping 与 TCP 数据传输的差异
常规网络数据传输多采用TCP协议,其与ping命令的实现流程存在差异。
ping与常规应用程序均归属于应用层。以基于TCP协议的通信软件为例,数据传输需依托socket实现。TCP场景下socket的创建形式为:
socket(AF_INET,SOCK_STREAM,0);其中AF_INET标识采用IPv4地址与端口组合的寻址方式,SOCK_STREAM标识使用传输层面向字节流的TCP协议。
socket创建完成后,应用程序通过sendto接口写入数据,进程从用户态切换至内核态,调用sock_sendmsg函数。数据依次经过传输层添加TCP头部、网络层添加IP头部、数据链路层添加MAC头部后,进入网卡发送队列,经由物理网卡发送。
ping命令的socket创建形式为:
socket(AF_INET,SOCK_RAW,IPPROTO_ICMP);SOCK_RAW为原始套接字,工作于网络层,适用于ICMP报文的构造与发送。ping报文进入内核态后同样调用sock_sendmsg函数,在网络层添加ICMP头部与IP头部,数据链路层添加MAC头部后发送。二者在内核态的报文处理流程相近。
网络故障排查时优先使用ping命令,原因在于ping可模拟应用程序的数据发送路径,检测网络层的连通状态。
3.3 ping 工作流程
以同一子网内主机 A 执行ping主机 B 为例,流程如下:
3.3.1 数据包构建与发送
源主机构建ICMP回送请求数据包,字段如下:
- 类型字段:回送请求报文赋值为
8 - 序号字段:用于区分连续发送的数据包,每发送一次自增
1
报文数据域记录发送时间,用于计算往返时间RTT。
ICMP数据包与目标地址192.168.1.2提交至IP层。IP层以192.168.1.2为目的地址,本机IP为源地址,协议字段设为1标识ICMP协议,构建IP数据包。
数据链路层依据ARP映射表获取目标MAC地址,添加MAC头部后,按照以太网传输规则发送数据帧。
3.3.2 数据包接收与应答
主机 B 接收数据帧后,校验目的MAC地址,匹配则接收并提取IP数据包,经IP层解析后交付ICMP协议。
主机 B 构建ICMP回送应答数据包,类型字段设为0,序号与接收的请求报文一致,随后将报文发送至主机 A。
源主机在预设时限内未接收ICMP应答报文,判定目标主机不可达;接收应答报文则判定目标主机可达。源主机通过当前时间与报文发送时间的差值,计算数据包传输时延。
跨网段通信场景下,数据包需经网关与路由器转发,路由选择与MAC地址会随传输链路变化,ICMP报文结构不受该过程影响。
ping程序使用ICMP回送请求(类型8)与回送应答(类型0)两类报文。主机 B 操作系统协议栈识别类型为8的ICMP回送请求报文后,自动组装类型为0的ICMP回送应答报文并发送至主机 A,该过程由操作系统网络协议栈实现。
3.4 ping 本机地址与回环地址的差异
在 macOS 系统中执行ifconfig命令,输出如下:
$ ifconfig lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 16384 inet 127.0.0.1 netmask 0xff000000 ... en0: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500 inet 192.168.31.6 netmask 0xffffff00 broadcast 192.168.31.255 ...lo0为本地回环接口,对应地址为127.0.0.1;en0为物理网卡接口,对应地址192.168.31.6为本机局域网地址。
通过抓包分析可知,ping本机IP地址与ping回环地址的报文均通过lo0虚拟接口传输,不进入外部网络。因此两种操作的报文传输路径一致,不存在功能差异。
4. traceroute 原理
traceroute为 UNIX 与 macOS 系统命令,Windows 系统对应命令为tracert,该工具依托ICMP差错报文类型实现功能。
4.1 路径路由追踪
traceroute通过递增TTL数值发送数据包,获取传输路径上的路由器信息。命令格式示例:
traceroute192.168.1.100工作机制为:从TTL = 1开始依次递增发送UDP数据包,接收ICMP超时报文。
TTL设为1时,数据包被第一跳路由器丢弃,返回超时报文TTL设为2时,数据包被第二跳路由器丢弃,返回超时报文- 重复上述过程直至数据包抵达目标主机
部分路由器不反馈ICMP报文,此类场景下无法获取完整路径路由信息。
traceroute发送UDP数据包时,采用大于3000的非常规端口作为目标端口。目标主机接收该UDP数据包后,返回ICMP端口不可达报文,标识数据包已抵达目标主机。
4.2 路径 MTU 确定
traceroute可通过设置不分片标志位,实现路径MTU探测。
以太网链路MTU通常为1500字节,非以太网链路MTU数值存在差异,路径MTU探测可确定适配传输路径的数据包最大长度。
工作机制如下:
- 源主机发送
IP数据报,将IP首部分片禁止标志位设为1 - 传输路径路由器对超出
MTU的数据包执行丢弃操作,返回携带链路MTU信息的ICMP不可达报文 - 源主机依据报文信息逐步减小数据包尺寸,确定适配目标路径的
MTU数值
5. 127.0.0.1、localhost 与 0.0.0.0 的差异
在服务部署场景中,访问127.0.0.1:80、localhost:80、0.0.0.0:80与本机IP地址均可能连通服务,但三者在协议定义上存在区别。
localhost属于域名,而非IP地址,其默认解析结果为127.0.0.1,解析规则可在/etc/hosts文件中修改。默认配置下,localhost与127.0.0.1的访问行为一致。
0.0.0.0为IPv4协议中的无效目标地址,执行ping 0.0.0.0会返回路由不可达错误:
$ ping 0.0.0.0 PING 0.0.0.0 (0.0.0.0): 56 data bytes ping: sendto: No route to host ping: sendto: No route to host0.0.0.0在服务监听场景中存在应用,其宏定义如下:
/* Address to accept any incoming messages. */#defineINADDR_ANY((unsignedlongint)0x00000000)/* 0.0.0.0 */服务监听0.0.0.0时,可接收本机所有IPv4地址的连接请求。客户端发起连接时,不可使用0.0.0.0作为目标地址,需指定具体服务IP。
6. 禁用 ICMP Echo Request 的考量
6.1 禁用动机
6.1.1 降低网络暴露面,抵御自动化扫描
攻击者在实施定向攻击前,先对目标网段进行主机存活扫描。Ping扫描(ICMP Sweep)因实现简单、开销低,是常用的初筛手段。若目标设备丢弃ICMP Echo Request,自动化扫描脚本将误判该IP地址无活跃主机,从而跳过后续端口扫描与漏洞探测。
禁用Ping无法对抗高阶攻击者。具备一定经验的攻击者可采用TCP SYN扫描、ARP探测、协议栈指纹分析等手段绕过该限制。但在实际场景中,禁用Ping可有效过滤大量脚本发起的批量自动化扫描,降低被随机选中的概率。因此,多数企业安全基线规范要求公网暴露设备禁用Ping。
6.1.2 防御 ICMP 洪水攻击
ICMP协议无连接、无状态,无需像TCP那样执行三次握手。攻击者利用该特性,伪造大量源IP地址向目标服务器发送ICMP Echo Request。目标服务器对每个请求均返回ICMP Echo Reply,导致上行带宽与CPU资源被无意义流量耗尽,形成ICMP Flood,属于DDoS攻击的一种常见形态。
虽然现代防火墙、流量清洗设备与云厂商DDoS防护服务已能应对此类攻击,但禁用Ping仍是最直接、零成本的缓解措施——服务器不生成Echo Reply,攻击者即无法通过该协议消耗目标资源。在安全意识较强的场景下,减少对外暴露的协议类型,遵循最小权限原则关闭非必要服务,仍具有现实意义。
6.2 禁用弊端
6.2.1 增加故障排查复杂度
Ping是网络连通性诊断的基础工具。禁用Ping后,运维人员无法通过最快捷的方式确认链路状态,需依次排查物理层、数据链路层、网络层配置,显著延长MTTR(Mean Time To Repair)。
6.2.2 影响监控系统的存活检测
大量监控平台(如 Zabbix、Nagios、Prometheus Blackbox Exporter)默认使用ICMP Ping作为主机存活探测手段。禁用Ping后,若未同步调整探测策略,将导致误告警或真实故障漏报。
6.2.3 与云原生及负载均衡环境冲突
主流云厂商(阿里云、腾讯云、AWS、Azure)的负载均衡健康检查机制部分依赖ICMP。若云服务器禁用Ping,可能导致健康检查失败,触发流量摘除,直接影响业务可用性。容器编排平台(如Kubernetes)的部分CNI插件与健康检查探针也可能受到波及。
6.3 场景化决策建议
禁用Ping并非绝对正确或错误,应结合网络位置、安全需求与运维成本综合判断:
| 场景 | 建议 | 理由 |
|---|---|---|
| 公网暴露设备(边界防火墙外侧、公网服务器) | 禁用 | 缩小攻击暴露面,过滤自动化扫描 |
| 内网基础设施(内网服务器、接入/汇聚/三层交换机) | 不禁用 | 内网环境相对可信,Ping是最高效的排障工具 |
| 云服务器 / 容器实例 | 遵循厂商建议,谨慎禁用 | 云厂商健康检查与监控可能依赖ICMP,需提前评估影响 |
高安全隔离区(DMZ、生产网关键节点) | 禁用并配合替代探测方案 | 安全优先级高于排障便利性,需通过替代手段保障可观测性 |
安全策略不应以牺牲可维护性为代价。若在内网全面禁用Ping,往往导致故障排查效率骤降,最终因业务压力被迫回退。
6.4 不依赖 Ping 的主机存活检测方法
当ICMP被禁用时,可采用以下替代方案确认主机在线状态:
6.4.1 TCP 端口探测
向目标主机的常用服务端口(如 22/SSH、80/HTTP、443/HTTPS、3389/RDP)发送TCP SYN包。若收到SYN-ACK,则表明主机在线且对应服务存活。工具:nc -zv <IP> <Port>、nmap -PS <IP>、telnet <IP> <Port>。
6.4.2 ARP 探测(限于同一二层域)
在局域网内,可通过ARP请求探测目标MAC地址。若收到ARP Reply,则证明该IP对应的主机处于在线状态。工具:arp-scan、nmap -PR <IP>。
6.4.3 HTTP / HTTPS 健康检查
针对提供Web服务的节点,直接发起HTTP GET或HEAD请求,根据状态码(如 200 OK)判断服务可用性。负载均衡器(Nginx、HAProxy、云 CLB)普遍采用此机制。
6.4.4 SSH 协议探测
对 Linux / Unix 服务器,可尝试建立SSH连接。即使不进行身份认证,协议握手阶段的服务端 banner 即可证明主机在线。工具:ssh -v <IP>、nc <IP> 22。
6.4.5 SNMP 轮询
若设备开启SNMP服务,可通过SNMP GET请求读取系统描述(sysDescr)、接口状态(ifOperStatus)等OID,实现带内监控与存活确认。
6.4.6 应用层心跳与探针
在微服务与容器环境中,由应用自身或Sidecar代理(如 Envoy)周期性上报心跳至注册中心(Consul、Etcd、Nacos),或通过Kubernetes Liveness / Readiness Probe进行健康判定,完全不依赖网络层ICMP。
6.4.7 路由追踪与路径分析
使用traceroute(Linux,基于UDP或ICMP)或tracert(Windows,基于ICMP)结合TCP选项(tcptraceroute),可逐跳分析路径连通性,定位故障节点。
7. 结论
127.0.0.1为IPv4回环地址,localhost为默认解析至该地址的域名。ping回环地址与本机地址均通过虚拟回环接口传输报文,不经过物理网卡,断网状态下仍可正常通信。- 服务监听
0.0.0.0可响应本机所有IPv4地址的连接请求。 ping基于ICMP回送请求(类型8)与回送应答(类型0)报文实现网络连通性检测。traceroute依托ICMP差错报文实现路径路由追踪与路径MTU探测。- 禁用
Ping是安全与便利之间的权衡,需结合网络位置、监控依赖与排障成本综合评估。
参考文献
[1] 竹下隆史. 图解 TCP/IP. 人民邮电出版社.
[2] 刘超. 趣谈网络协议. 电子工业出版社.
Reference
断网了,还能ping通 127.0.0.1 吗?小白 yes的练级攻略 2023-12-20 10:50 浙江
https://mp.weixin.qq.com/s/w1jJzU8yx109DMnLdMcpPwping 的原理_ping ip 测试的结果不同的原因-CSDN博客 小林coding 于 2020-03-25 22:43:00 发布
https://blog.csdn.net/qq_34827674/article/details/105106807为什么这么多设备都禁 ping?禁 ping 到底图什么?小黑聊技术 2026年6月11日 12:00 广东
https://mp.weixin.qq.com/s/Uf6C7s1P_w07wg22Um7lTQ
