当你面对一个打不开的网站

当我们听到别人说"网站打不开了",或者自己写的接口突然超时。

这时候你不会想翻《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(目标端口) 问题可能在哪一层
全不通 超时 卡在某跳 超时 网络层(路由或防火墙)
能通 超时 最终到达 超时 传输层(端口被拦截或服务未启)
能通 超时 最终到达 拒绝 应用层(服务进程没监听该端口)
延迟高 延迟大 某跳后飙升 延迟大 网络拥塞或跨国链路问题
丢包严重 丢包高 某跳大量 * 丢包 线路质量差或路由器过载
正常 正常 正常 正常(或非预期返回) 问题在更上层(代码、数据库等)

六、结尾

  1. Ping 问死活 —— 但对方可能装死(禁 ping)

  2. Traceroute 问路径 —— 星星不一定代表断了

  3. Telnet 问端口 —— 服务开没开,一敲便知

用 Ping 快速过滤,用 Traceroute 定位断点,用 Telnet 确认服务。

下次网站打不开,可以试着从这3个角度试着检查看看。


本文命令示例在 Linux(Ubuntu 22.04)和 macOS Ventura 环境下验证通过。Windows 用户请将 traceroute -I 换成 tracerttelnet 需手动添加功能(控制面板 → 启用或关闭 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

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐