网络问题排查三板斧:Ping、Traceroute、Telnet 到底怎么看结果?
当我们听到别人说"网站打不开了",或者自己写的接口突然超时。这时候你不会想翻《TCP/IP 详解》——你只想快速知道:问题出在哪一层?是我的代码、服务器,还是网络本身?Ping、Traceroute、Telnet 就是解决这个问题最经典的"三板斧"。
当你面对一个打不开的网站
当我们听到别人说"网站打不开了",或者自己写的接口突然超时。
这时候你不会想翻《TCP/IP 详解》——你只想快速知道:问题出在哪一层?是我的代码、服务器,还是网络本身?
Ping、Traceroute、Telnet 就是解决这个问题最经典的"三板斧"。它们各自回答一个问题:
| 工具 | 它在问 |
|---|---|
| Ping | 对方活着吗?路通不通? |
| Traceroute | 如果通了,走的是哪条路?哪里堵了? |
| Telnet | 对方这个端口开放了吗?服务在监听吗? |
本文参考平时的实际操作,试着记录下来。
一、Ping:网络世界的第一声问候
1.1 它在做什么
Ping 发送一个 ICMP Echo Request(互联网控制报文协议的请求包),对方如果活着且网络通,就回复 ICMP Echo Reply。
它帮你回答:
-
目标机器是否在线
-
网络延迟大概多少(往返时间 RTT)
-
丢包率高不高
1.2 正常输出长什么样
bash
ping baidu.com
text
PING baidu.com (39.156.66.18): 56 data bytes 64 bytes from 39.156.66.18: icmp_seq=0 ttl=51 time=8.3 ms 64 bytes from 39.156.66.18: icmp_seq=1 ttl=51 time=7.9 ms 64 bytes from 39.156.66.18: icmp_seq=2 ttl=51 time=8.1 ms 64 bytes from 39.156.66.18: icmp_seq=3 ttl=51 time=8.0 ms --- baidu.com ping statistics --- 4 packets transmitted, 4 packets received, 0.0% packet loss round-trip min/avg/max/stddev = 7.9/8.07/8.3/0.14 ms
1.3 关键输出含义
| 字段 | 含义 | 什么时候要注意 |
|---|---|---|
icmp_seq |
第几个包 | 如果中间跳号(比如 0,1,3),说明有丢包 |
ttl |
Time To Live,生存时间 | 每经过一个路由器减 1,初始值减去 TTL ≈ 经过的路由器数量 |
time |
往返延迟 | 内网 <1ms,同城 <20ms,跨国 >150ms 算偏高 |
packet loss |
丢包率 | 大于 5% 就会明显感觉卡顿 |
1.4 TTL 的隐藏信息
TTL 初始值由操作系统决定:
-
Linux / Unix:64 或 255
-
Windows:128
-
某些网络设备:255
判断方法:找一个你确信离得近的 IP,看返回的 TTL,反推初始值。
例子:ttl=51,如果初始是 64,说明经过了 64-51=13 跳路由器。
注意:TTL 是每跳减 1,不是按距离或时间。
1.5 四种异常输出及含义
| 输出 | 含义 | 下一步 |
|---|---|---|
Request timeout |
没有收到回复 | 目标可能关机、防火墙禁 ping、或路由不通 |
Destination Host Unreachable |
本地路由器就知道到不了 | 检查网关、网线、目标 IP 是否正确 |
TTL expired in transit |
超过了最大跳数(默认 30 或 64) | 路由可能成环,或目标太远增加 -t 参数 |
unknown host |
域名解析失败 | 检查 DNS 配置:nslookup 或 dig |
1.6 Ping 测不准的情况
Ping 通 ≠ 网站能访问
因为:
-
服务器可能禁了 ICMP(ping 不通,但 HTTP 正常)
-
防火墙可能允许 ICMP 但拦截 80/443 端口
-
CDN 对 ping 的响应策略不同
黄金法则:Ping 通不一定服务正常,Ping 不通也不一定服务挂了。
二、Traceroute:画出网络的地铁路线图
2.1 它在做什么
Traceroute 利用 TTL 机制,故意发送 TTL=1、2、3... 的包,让沿途的路由器依次返回"超时"消息,从而暴露自己的 IP。
它帮你回答:
-
数据包经过哪些路由器(跳点)
-
每一跳的延迟
-
问题发生在哪一段(比如第三跳之后全是
*)
2.2 命令区别(重要)
| 系统 | 命令 | 默认协议 |
|---|---|---|
| Linux / macOS | traceroute |
UDP |
| Windows | tracert |
ICMP |
推荐在 Linux 上用 traceroute -I 强制使用 ICMP,结果更接近 ping 的行为。
2.3 正常输出解读
bash
traceroute -I baidu.com
text
1 192.168.1.1 (192.168.1.1) 1.2 ms 1.1 ms 1.3 ms 2 10.0.0.1 (10.0.0.1) 3.5 ms 3.6 ms 3.4 ms 3 172.16.1.1 (172.16.1.1) 5.2 ms 5.3 ms 5.1 ms 4 202.96.128.1 (202.96.128.1) 8.1 ms 8.2 ms 8.4 ms 5 39.156.66.18 (39.156.66.18) 8.5 ms 8.3 ms 8.4 ms
每一列含义:
-
第 1 列:跳数
-
第 2 列:该跳路由器的 IP 或域名
-
后面 3 列:该跳返回的 3 次探测延迟(单位 ms)
2.4 异常输出解读
情况一:中途出现 * * *
text
4 172.16.1.1 8.1 ms 8.2 ms 8.4 ms 5 * * * 6 39.156.66.18 25.1 ms 25.3 ms 25.0 ms
含义:第 5 跳的路由器没有返回超时消息(常见原因:该节点禁用了 ICMP/UDP 响应)。
判断:如果后续还能通,这个 * 不一定是问题。很多骨干路由器故意不响应。
情况二:连续多跳 * 且最后不通
text
4 172.16.1.1 8.1 ms 8.2 ms 8.4 ms 5 * * * 6 * * * 7 * * *
含义:从第 4 跳之后断了。
可能原因:
-
上游路由器挂了
-
防火墙拦截
-
路由不通
情况三:延迟在某跳突然飙升
text
3 172.16.1.1 5.2 ms 5.1 ms 5.3 ms 4 202.96.128.1 150 ms 152 ms 148 ms 5 39.156.66.18 151 ms 150 ms 153 ms
含义:第 4 跳之后延迟从 5ms 涨到 150ms。
可能原因:
-
跨运营商(电信到联通)
-
跨国(经过海底光缆)
-
该节点拥塞或做了限速
注意:延迟可能是在回程路径上产生的,traceroute 只能看到去程。
2.5 实战案例:看一段 traceroute 输出
text
1 192.168.1.1 0.5 ms 2 10.0.0.1 2.1 ms 3 * * * 4 * * * 5 8.8.8.8 30.2 ms
读到什么?
-
前两跳正常(你家的路由器和运营商接入点)
-
第 3、4 跳不响应(很可能是运营商的骨干节点禁 ping)
-
第 5 跳到达了 Google DNS
-
结论:网络没问题,只是中间节点不响应而已
三、Telnet:敲门看端口有没有人
3.1 它在做什么
Telnet 尝试与目标的指定端口建立 TCP 连接。如果连接成功,说明该端口上有一个程序在监听;如果失败或超时,说明端口不可达或被拦截。
它帮你回答:
-
这个服务的端口开没开
-
防火墙有没有拦截
-
服务进程有没有启动
3.2 基本用法
bash
telnet <目标IP或域名> <端口号>
3.3 输出解读
成功连接(端口开放)
bash
telnet example.com 80
text
Trying 93.184.216.34... Connected to example.com. Escape character is '^]'.
含义:
-
TCP 三次握手成功
-
端口上有程序在监听
-
你可以手动发送 HTTP 请求(比如输入
GET / HTTP/1.1然后按两下回车)
连接被拒绝(端口未开放)
bash
telnet localhost 9999
text
Trying 127.0.0.1... telnet: connect to address 127.0.0.1: Connection refused telnet: Unable to connect to remote host
含义:
-
目标 IP 可达
-
但该端口没有程序监听
-
或者监听在别的 IP 上(只监听了
0.0.0.0但你还是连不通,需排查)
连接超时
bash
telnet 192.168.1.100 22
text
Trying 192.168.1.100... telnet: connect to address 192.168.1.100: Operation timed out
含义:
-
包发出去了,但一直没有收到 SYN-ACK
-
可能原因:
-
防火墙丢弃了包
-
目标 IP 不存在或关机
-
路由不通
-
这和 Connection refused 的关键区别:
-
refused→ 对方收到了,但明确拒绝(端口没开) -
timeout→ 对方根本没回应(防火墙或网络问题)
3.4 Telnet 的进阶用法:手动测试 HTTP
bash
telnet example.com 80
连接成功后输入:
http
GET / HTTP/1.1 Host: example.com
(注意:Host 后面那行结束后要按两次回车)
你会看到服务器返回的 HTTP 响应头和 HTML 内容。
3.5 现代替代工具
很多系统不再默认安装 Telnet 客户端(因为 Telnet 协议本身不安全)。推荐使用:
| 工具 | 命令示例 | 优势 |
|---|---|---|
nc (netcat) |
nc -zv example.com 443 |
更轻量,可脚本化 |
nmap |
nmap -p 80,443 example.com |
批量扫描,检测服务版本 |
curl |
curl -v telnet://example.com:80 |
你已经有 curl 了 |
macOS / Linux 上用 nc 代替 telnet:
bash
# 测试端口是否开放(-z 只测试不发送数据,-v 显示详情) nc -zv example.com 443 # 手动发送 HTTP 请求 nc example.com 80 GET / HTTP/1.1 Host: example.com
四、三板斧组合使用:一个真实排查案例
场景:用户反馈 https://api.example.com 打不开
第一步:Ping
bash
ping api.example.com
text
PING api.example.com (203.0.113.10): 56 data bytes Request timeout for icmp_seq 0 Request timeout for icmp_seq 1
初步判断:ping 不通。但可能是服务器禁 ping,不一定是问题。
第二步:Traceroute
bash
traceroute -I api.example.com
text
1 192.168.1.1 1.2 ms 2 10.0.0.1 3.4 ms 3 172.16.1.1 5.1 ms 4 202.96.128.1 8.2 ms 5 * * * 6 * * * 7 203.0.113.10 150.1 ms
发现:中间有 * 但最终到达了目标 IP(203.0.113.10)。说明路由是通的,只是中间节点不响应 ICMP。
第三步:Telnet
bash
telnet api.example.com 443
text
Trying 203.0.113.10... telnet: connect to address 203.0.113.10: Operation timed out
结论:
-
路由是通的(traceroute 到了最后)
-
IP 是活的(ping 不通只是因为禁 ping)
-
但 443 端口连不上(超时,不是拒绝)
最终判断:
-
服务器防火墙没有开放 443 端口
-
或者 HTTPS 服务没有启动
-
或者云服务商的安全组规则拦截了
下一步:登录服务器检查 Nginx 或防火墙规则,或检查云控制台的安全组。
五、快速决策表:根据输出判断问题所在
| 现象 | Ping | Traceroute | Telnet(目标端口) | 问题可能在哪一层 |
|---|---|---|---|---|
| 全不通 | 超时 | 卡在某跳 | 超时 | 网络层(路由或防火墙) |
| 能通 | 超时 | 最终到达 | 超时 | 传输层(端口被拦截或服务未启) |
| 能通 | 超时 | 最终到达 | 拒绝 | 应用层(服务进程没监听该端口) |
| 延迟高 | 延迟大 | 某跳后飙升 | 延迟大 | 网络拥塞或跨国链路问题 |
| 丢包严重 | 丢包高 | 某跳大量 * |
丢包 | 线路质量差或路由器过载 |
| 正常 | 正常 | 正常 | 正常(或非预期返回) | 问题在更上层(代码、数据库等) |
六、结尾
-
Ping 问死活 —— 但对方可能装死(禁 ping)
-
Traceroute 问路径 —— 星星不一定代表断了
-
Telnet 问端口 —— 服务开没开,一敲便知
用 Ping 快速过滤,用 Traceroute 定位断点,用 Telnet 确认服务。
下次网站打不开,可以试着从这3个角度试着检查看看。
本文命令示例在 Linux(Ubuntu 22.04)和 macOS Ventura 环境下验证通过。Windows 用户请将 traceroute -I 换成 tracert,telnet 需手动添加功能(控制面板 → 启用或关闭 Windows 功能)。
分享给各位:快速命令速查表
| 需求 | Linux / macOS | Windows |
|---|---|---|
| 测试连通性 | ping -c 4 target |
ping -n 4 target |
| 查看路由路径 | traceroute -I target |
tracert target |
| 测试端口 | telnet target port 或 nc -zv target port |
telnet target port |
| 测试 HTTPS 端口 | openssl s_client -connect target:443 |
(需安装 WSL 或工具) |
| 查看 DNS 解析 | dig target 或 nslookup target |
nslookup target |
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐
所有评论(0)