写在前面
后端开发会遇到一类特别让人头大的问题:
监控曲线一片祥和,应用日志干干净净,APM 里 P99 的小尾巴稳稳贴着 100ms 不动,但客服群里在炸——用户大量反馈接口超时、页面打不开、下单转圈。
你盯着满屏的绿色指标看了半个小时,开始怀疑人生:是不是客服把客户端搞错了?
这种问题我处理过几次,每次的根因都不在应用层,而是在更靠下的网络链路上。本文把排查方法论整理出来,希望帮你在下次"被甩锅"之前多一套自查武器。
一句话先说结论:那些被网络层吞掉的请求,根本不会出现在你的日志里。 只盯着应用监控,你永远查不到这一类问题。
一、为什么"应用监控正常 ≠ 服务健康"
后端工程师习惯的世界是这样的:
Client → Nginx → 网关 → 服务A → 服务B → DB
我们的 APM、Trace、日志、监控全都铺设在这条链路里。但用户视角的真实链路其实是:
用户设备 → Wi-Fi/4G → 本地 ISP → 骨干网 → IDC 入口 → 负载均衡 → Nginx → ...
在 Nginx 之前的那一大段,我们的监控盲区。
如果用户的运营商到你机房出口之间发生了路由抖动、丢包、跨网拥塞,你的服务接口的 access_log 里根本不会有这条请求的痕迹——因为请求压根没到。
这种问题在后端日志里的表现通常是:
- 请求"凭空消失",客户端报超时但服务端无记录
- 偶发性的 connection reset
- 同一接口,A 地用户飞快、B 地用户卡死
- 监控全绿,但客服群在炸
如果你遇到过这种情况,恭喜你,今天这套方法论就是给你准备的。
二、分层诊断思维:把网络问题切成四块
不要一上来就 ping。我见过太多同学拿着 ping 一通乱测,最后越测越乱。
正确的思路是分层逐级排除:
| 层级 | 关注问题 | 典型工具 |
|---|---|---|
| 应用层 | HTTP 状态码、TLS 握手、TTFB | curl -w、浏览器 DevTools |
| 传输层 | TCP 端口、连接建立、握手时延 | TCPing、telnet、nc |
| 网络层 | 路由路径、跳数、跨网延迟 | traceroute、MTR |
| 域名解析 | DNS 解析结果、TTL、污染 | dig、nslookup |
排查时,从最高层开始往下剥,剥到哪层异常就停在哪层深挖。
三、实战五步排障法
第一步:多地 Ping,先确认是不是"普遍问题"
公司内部 ping 你自己的服务,和真实用户 ping 你的服务,是两回事。
公司网络往往走的是优质专线,跟用户家里宽带的链路完全不重合。所以排查的第一步,永远是从多个地理位置、多个运营商发起 ping,看看延迟和丢包的分布。
如果你手头没有多地节点,最简单的办法是用免登录的在线工具,比如 BiuPing 在线 Ping 可以一键从全国不同地区、不同运营商发起测试,几秒钟就能拿到一张分布图。
判断标准:
- 某个区域全部丢包:大概率是该地区到机房出口的链路问题
- 全国普遍丢包:机房出口或者你的服务器本身有问题
- 某运营商专线劣化:跨网穿透问题,需要联系机房做调度
- 延迟全绿但用户还是慢:那就不是 ICMP 层的事,往下排
第二步:TCPing,绕过 ICMP 看真实端口
很多生产服务器是禁 ICMP 的(云厂商默认安全组就经常关掉),ping 不通不代表服务挂了。而且就算 ICMP 通,也不代表你的 TCP 端口能正常握手。
这时候要用 TCPing。它的本质是发起一次 TCP 三次握手然后立刻断开,专门用来测端口可达性和握手时延。
# Linux 下用 nc 模拟
nc -zv your-domain.com 443
# 或者用 tcping 命令行工具
tcping your-domain.com 443
如果想多地点测,可以用 BiuPing TCPing 直接看不同节点对 443/80/3306 等端口的握手延迟,特别适合排查"ping 通但服务不可达"的场景。
我之前遇到过一次诡异问题:用户反馈连不上,运维 ping 完全正常,最后是 TCPing 发现某地用户的 SYN 包根本到不了机房——是中间一台路由设备的 ACL 出了问题。
第三步:路由追踪,找出拥塞的那一跳
确认网络层有问题之后,下一步是定位问题出在哪一跳。
traceroute(Windows 是 tracert)会逐跳打印数据包经过的每一个路由节点。但本地 traceroute 只能看你这台机器的视角,用户的视角你看不到。
这时候多地路由追踪就特别关键。比如用 BiuPing 路由追踪 从北京电信、上海移动、广州联通分别发起 traceroute,你能直观看到:
- 数据包在哪一跳开始延迟飙升
- 是在用户侧 ISP 拥塞,还是在骨干网,还是在你机房入口
- 跨网(电信→联通)的回环点在哪里
一个实战经验:如果连续几跳的延迟都在 2~10ms 之间,但某一跳突然跳到 200ms,那一跳就是拥塞点。如果是在你机房附近的跳,可以联系 IDC;如果在用户 ISP 那边,能做的不多,但至少你可以理直气壮地告诉运营:"不是后端的锅"。
第四步:DNS 检测,排除解析层"幽灵问题"
DNS 是后端工程师最容易忽略的故障点之一。我见过的真实事故里,至少有 30% 跟 DNS 有关:
- 切了新机房,DNS TTL 没生效,部分用户还在打老 IP
- CDN 厂商解析劣化,把用户调度到了远端节点
- 某地 DNS 缓存了已废弃的 IP
- 域名被局部 DNS 污染
排查方法:
# 看 A 记录
dig your-domain.com A +short
# 看不同 DNS 服务器返回什么
dig @8.8.8.8 your-domain.com
dig @114.114.114.114 your-domain.com
# 看 TTL 和权威应答
dig your-domain.com +trace
如果想看全国各地 DNS 的解析结果是否一致,可以用 BiuPing DNS 查询 一次拉出几十个节点的解析记录,能很快发现解析劫持或调度不一致的问题。
第五步:HTTP 测速,把完整链路时间拆开看
如果前四步都没问题,但用户还是觉得慢,那就上 HTTP 全链路测速。
curl 可以拆出每一段耗时:
curl -o /dev/null -s -w "
DNS解析: %{time_namelookup}s
TCP连接: %{time_connect}s
TLS握手: %{time_appconnect}s
首字节(TTFB): %{time_starttransfer}s
总耗时: %{time_total}s
" https://your-domain.com
四个时间段的含义:
- DNS 解析慢:DNS 服务商问题,或者递归过深
- TCP 连接慢:网络层延迟(看 RTT),或者服务器 accept 队列满
- TLS 握手慢:证书链太长、缺 OCSP Stapling、服务端 CPU 抖动
- TTFB 慢:这就是后端的锅了——应用处理慢、DB 慢、缓存穿透等
多地视角的话用 BiuPing 网站测速 直接看瀑布图,每一段时间清清楚楚,比自己写脚本跑各地 VPS 省事得多。
四、三个高频场景的快速定位
场景 A:监控全绿,但客服在炸
特征:服务端 access_log 数量明显下降,但用户大量反馈超时。
判断:请求根本没到你这里。先做多地 Ping + TCPing,重点看南方/北方某个区域是不是普遍劣化。如果是,基本可以确定是网络层而不是应用层。
场景 B:接口偶发性超时,重试就好了
特征:错误率曲线像锯齿一样上下抖动,但平均值不高。
判断:链路抖动或丢包。用持续 ping(不是单次)观察一段时间的丢包率。1% 以内的偶发丢包对 TCP 来说就是几次重传,但对超时阈值卡得紧的接口就是 P99 飙升。
场景 C:换了机房之后,部分用户变慢了
特征:变更窗口后,整体没问题,但客服群里冒出几个特定地区的用户在反馈。
判断:路由质量问题。新机房到某地用户的链路可能不如老机房友好。多地 traceroute 对比新老 IP 的路由路径,找出那个绕远的跳。这种问题通常需要跟 IDC 沟通做 BGP 调度。
五、给后端工程师的几条心法
写到这里,我想把这次复盘的几个心得提炼一下:
- 不要默认问题在你的代码里。当监控正常但用户报错时,先怀疑链路。
- 本地视角不可信。你的开发机、测试机、堡垒机看到的世界跟用户完全不一样。
- 多地多视角是基本配置。哪怕是一个免登录在线工具,也比单点 ping 强 100 倍。
- 排查要分层。从应用层往下剥,剥到哪层异常停在哪层。
- 保留证据,便于甩锅。截图、traceroute 结果、丢包数据,是你跟运维、网络组、IDC 沟通时最有力的弹药。
写在最后
后端工程师面对网络问题时最大的成本,往往不是排查本身,而是"花了 30 分钟反复看应用监控之后才意识到,问题压根不在应用层"。
有了上面这套分层方法论,前 5 分钟就能把"是不是网络问题"判断个八九不离十,剩下的更多是协调资源、跟进闭环的事。
希望这篇手册能帮你在排障的时候少走一些弯路。
如果你有自己常用的网络排障工具或者经验,欢迎在评论区交流。
文中提到的多节点诊断工具我用的是 BiuPing,免登录、覆盖全国节点、IPv4/IPv6 双栈都支持,应急的时候很顺手,推荐给同样需要的朋友。