CalcGuide · 技术博客主页 / 一页纸学习计划
🟠

网络排查与可观测性:从 ping 到 eBPF

分类:计算机基础 · 路径:docs/topics/network-troubleshooting/README.md

#troubleshooting#observability#ebpf#mtr#ping

用 ping/mtr/ss/netstat/traceroute/eBPF 逐级定位网络问题,能写 bpftrace 脚本

父主题

计算机网络:从物理层到 HTTP/3 的全栈协议与排查

子主题(0)

网络排查与可观测性:从 ping 到 eBPF

0. 元信息

1. 学习路线

分层排查方法论
  → ping / mtr / traceroute:连通性与路径
  → dig / nslookup / getent:DNS 解析
  → ss / netstat / lsof / ip:本地 socket 与路由表
  → curl / httpie / openssl s_client:应用层握手
  → tcpdump / Wireshark:包证据
  → conntrack / iptables / nft:NAT 与防火墙
  → perf / bpftrace / BCC:内核与可观测性
  → 综合案例:从告警到根因

每一步先想清楚“在哪一层、问什么、用哪个工具”。工具要随手能写命令,不靠搜。

2. 阶段周数分配

阶段3 周方案4 周方案备注
1. 排查方法论0.5 周0.5 周OSI/TCP-IP 分层、现象→假设→验证
2. 连通性工具0.5 周0.75 周ping、mtr、traceroute、tcpping
3. DNS 与路由0.5 周0.75 周dig、getent、ip route、ip rule
4. 本地 socket0.5 周0.5 周ss、lsof、/proc/net/tcp
5. 应用层0.25 周0.25 周curl、openssl s_client、HTTP/2
6. 抓包取证0.25 周0.25 周tcpdump 配合 §9 中的 display filter
7. 防火墙与 NAT0.25 周0.5 周iptables、nft、conntrack
8. 内核可观测性0.25 周0.5 周bpftrace、perf、/proc
9. 综合案例0.25 周0.25 周故障复盘报告

3. 九阶段表

阶段核心知识实践产出可观察学会标准
1. 排查方法论OSI/TCP-IP 分层、现象→假设→验证、证据链一份排障 checklist能给出“DNS 还是 TCP 还是应用”的初判
2. 连通性ICMP、RTT、TTL、丢包、mtr 报告解读5 份 mtr 报告能区分丢包来自本机、运营商、目标
3. DNS 与路由递归/迭代解析、/etc/resolv.conf、nsswitch、路由表与策略路由DNS 解析链路图能解释 DNS 慢和解析失败的区别
4. 本地 socketTCP 状态机、监听队列、/proc/net/tcpss -tin10 条 ss 命令能用 ss 看 RTT、重传、cwnd
5. 应用层HTTP 状态码、TLS 握手、ALPN、HTTP/2 帧一次 curl -v 完整输出能从握手判断 TLS 版本和证书链
6. 抓包取证tcpdump BPF、tshark 字段、pcap 保存pcap + tshark 报告能配合 §packet-analysis 给出包证据
7. 防火墙与 NATiptables/nft 链、conntrack、-j MASQUERADE一份 nftables 规则能定位被 REJECT/DROP 的包在哪条链
8. 内核可观测性kprobe、tracepoint、bpftrace 单行脚本、BCC 工具集一个能跑的 bpftrace 脚本能写出 tcp_connect 追踪脚本
9. 综合案例故障复盘:RCA 模板、timeline、改进项一份 5 页故障复盘报告能在 15 分钟内讲清“现象→根因→修复→预防”

4. 第一周任务

任务当天交付
Day 1装 mtr、traceroute、dnsutils、bpftrace;记录内核版本与发行版工具版本与采集约定
Day 2ping -cping6 -c、mtr 报告生成;解读 RTT/丢包/SRV三份 mtr 报告
Day 3dig +tracedig @8.8.8.8getent hosts;理解递归与迭代DNS 解析命令清单
Day 4ss -tnapss -tin '( sport = :443 )'lsof -i10 条 ss 练习输出
Day 5curl -vopenssl s_client -connect、HTTP/2 优先级一次完整握手日志
Day 6tcpdump -i any -nn -w /tmp/c.pcaptshark -r一个短 pcap + 关键字段
Day 7项目:复现并定位一次“访问某网站慢”排障报告 + 命令清单 + 证据

Day 7 拆解

步骤 A —— 最小可用(60 分钟)

  1. 选一个目标(如 https://example.com);
  2. time curl -o /dev/null -s -w '%{time_namelookup} %{time_connect} %{time_appconnect} %{time_starttransfer} %{time_total}\n' https://example.com 拿到分段时间;
  3. dig +short example.com 拿 DNS 结果,用 ping -c 5 测 RTT;
  4. mtr -r -c 30 example.com 出报告;
  5. ss -tin '( dport = :443 )' 看完毕连接 RTT、重传、cwnd;
  6. 把命令和输出贴到一个 markdown 报告里。

步骤 B —— 补齐四类边界(45 分钟)

5. 阶段通用验收

  1. 不看笔记写出 15 条常用排查命令;
  2. 能从 mtr 报告区分“本机丢包 vs 运营商丢包 vs 目标丢包”;
  3. 能用 ss -tin 看到 RTT、重传、cwnd、拥塞状态;
  4. 能写一个 bpftrace 单行脚本追踪 tcp_connecttcp_sendmsgnetif_receive_skb
  5. 至少复现 3 类故障(DNS 慢、连接超时、TLS 握手失败)并给出证据;
  6. 知道 conntrack 表满、nf_conntrack 限制、offload 对观测的影响;
  7. 能把命令贴进笔记,第二天还能复现。

6. 最终验收

7. 综合项目

首选:一次线上“服务偶发 504”复盘。用本地 docker 起一个 HTTP 服务,模拟至少三种故障(DNS 慢解析、TCP 队列满、TLS 握手慢),逐个定位并给出证据。

备选:Kubernetes Pod 间偶发连接超时 / 公网 API 抖动复盘 / 视频流卡顿端到端分析。

项目必做要求:

  1. 场景说明:拓扑、IP、节点、抓包点、时间同步;
  2. 现象:用户报告、监控曲线、错误日志;
  3. 分段耗时:DNS / TCP / TLS / 首字节 / 总耗时;
  4. 命令清单:每一步用到的 mtr / dig / ss / tcpdump / bpftrace 命令;
  5. 证据文件:pcap、bpftrace 输出、ss 截图;
  6. 根因分析:哪一层、为什么、怎么验证;
  7. 修复与预防:短期 workaround、长期方案、可观测性补强;
  8. 复盘报告:用 5 段法(现象→定位→根因→修复→预防)输出 markdown。

本主题贡献

本主题沉淀分层下钻排障:从 ping/mtr → dig/getent → ss/curl → tcpdump → bpftrace 逐级穿透,每一步都能从「现象→假设→验证」走完整 RCA,所有命令贴进 README 第二天还能复现。

职责(3 项)

  1. mtr -r -c 30 + ping -c 区分丢包来自本机、运营商、目标,能解释为什么某跳高 Loss 不可信(后续跳 Loss 才算真实丢包)、为什么 ICMP 在运营商侧可能被限速;
  2. ss -tnap / ss -tin 看本地 socket 状态(LISTEN/ESTABLISHED/TIME_WAIT/SYN_RECV)、cwnd/rwnd/rtt/retrans、/proc/net/tcp 验证,能定位 TCP 半开连接与 SYN 队列溢出;
  3. 写 bpftrace 单行脚本追踪 tcp_connect / tcp_sendmsg / tcp_retransmit_skb / netif_receive_skb,能在内核侧观测 conntrack 表满、qdisc 丢包、NIC offload 影响。

交付物(4 项)

  1. 5 段法(现象→定位→根因→修复→预防)故障复盘报告(线上 504 / 服务慢 / 公网 API 抖动任一真实复现);
  2. 至少 20 条 ss / mtr / curl / dig / openssl s_client 命令清单(带 BPF filter:ss -tin '( sport = :443 )');
  3. 一个能跑的 bpftrace 脚本(bpftrace -e 'kprobe:tcp_connect { printf("pid=%d comm=%s\n", pid, comm); }')+ BCC 工具集(tcpconnect、tcpretrans)输出;
  4. conntrack 监控(conntrack -L | wc -lnf_conntrack_max)与 NAT MASQUERADE 链规则定位报告。

指标(3 项)

  1. MTTR ≤ 30 分钟(从用户报告到定位根因);
  2. 排障定位 hop 数 ≤ 5(mtr 跳点 + ss 状态 + tcpdump 包证据联合判定);
  3. bpftrace 事件吞吐量 ≥ 1k events/s 不丢(高并发场景验证 -d debug 输出)。

8. 推荐开源资料

角色资料链接用法
方法论SRE Workbook 第 6 章https://sre.google/workbook/incident-response/排障方法论与 RCA 模板
方法论Brendan Gregg — Thinking Methodically about Performancehttps://www.brendangregg.com/methodology.html自下而上排查思路
连通性mtr 主页https://www.bitwizard.nl/mtr/mtr 报告字段说明
mtr 手册mtr(8)https://github.com/traviscross/mtr报告模式与参数
DNS 工具dig(1)https://manpages.ubuntu.com/manpages/jammy/man1/dig.1.html+trace / +short 实战
ss / netstatss(8)https://www.man7.org/linux/man-pages/man8/ss.8.htmlsocket 状态、内核信息
抓包tcpdump manualhttps://www.tcpdump.org/manpages/tcpdump.1.html配合 §packet-analysis
内核观测bpftrace 手册https://github.com/bpftrace/bpftrace单行脚本与参考指南
内核观测BCC 工具集https://github.com/iovisor/bcctcpconnect、tcpretrans 等成品工具
内核观测Brendan Gregg — Linux Performancehttp://www.brendangregg.com/linuxperf.html内核侧排查图谱
综合Cloudflare 博客(Outage 系列)https://blog.cloudflare.com/tag/post-mortem/大厂故障复盘范例

mtr、traceroute、bpftrace 均为开源工具,LICENSE 多为 GPL/BSD,引用前先看仓库 LICENSE。

9. 学习资料汇聚(v0.3 自包含)

本节由本计划生成。工具行为以官方手册、内核文档和实际样本为准。

9.1 背景与动机

网络问题常出现在三层:用户态(应用、DNS)、内核态(socket、conntrack、qdisc)、链路上(运营商、对端)。日志只看到一端的状态;mtr 看路径,ss 看本地 socket,tcpdump 看线上包,bpftrace 看内核事件。这四件事串起来才能完整还原链路。

Mike Muuss 写 ping 是 1983 年,Bug 报告里说“想测路径上的 RTT”。Van Jacobson 在 80 年代末写了 traceroute,原理是操纵 TTL 引发 ICMP Time Exceeded。Matt Kimball 1997 年写了基于 ICMP+UDP 的 mtr(Matt’s Traceroute),沿用至今。bpftrace 是 2017 年前后 Alastair Robertson、Brendan Gregg 等人在 BCC 之上做的高层前端,把 kprobe/tracepoint 包成 awk 风格。Linux 内核的 BPF 子系统从 2014 年起快速演进,是当代可观测性的基础设施。

排查网络问题需要逐层假设、逐层验证。工具会撒谎(mtu/ttl/conntrack/时钟),证据链必须能复现。

9.2 概念地图

flowchart LR
  App[应用层 HTTP/gRPC/DB] --> Socket[用户态 socket]
  Socket --> Conntrack[conntrack 表]
  Conntrack --> TC[TC qdisc]
  TC --> NIC[NIC driver]
  NIC --> Wire[物理链路]
  Wire --> Net[运营商 / 交换机]
  Net --> Peer[对端 socket]
  Peer --> PeerApp[对端应用]
  Ping[ping/mtr] --> ICMP[ICMP 探测]
  ICMP --> Net
  SS[ss/netstat] --> Socket
  Dig[dig/getent] --> DNS[DNS 解析链路]
  DNS --> Resolver[本地 resolver]
  Tcpdump[tcpdump] --> Wire
  Bpf[bpftrace/perf] --> Kernel[内核 kprobe/tracepoint]
  Kernel --> Socket
  Kernel --> Conntrack
  Kernel --> NIC

ICMP 探测看“链路通不通”,DNS 工具看“名字解不解”,ss 看“本地状态对不对”,tcpdump 看“线上包是什么样”,bpftrace 看“内核做了什么决定”。

9.3 基础知识讲解

经典论文 / RFC

资料角色评分链接
RFC 792 — Internet Control Message ProtocolICMP 起源4https://datatracker.ietf.org/doc/html/rfc792
RFC 4443 — ICMPv6IPv6 控制消息4https://datatracker.ietf.org/doc/html/rfc4443
Van Jacobson — traceroute(USENIX 1989 论文)traceroute 原理4https://www.merit.edu/wp-content/uploads/2019/01/traceroute.pdf
RFC 9293 — Transmission Control ProtocolTCP 现行规范5https://datatracker.ietf.org/doc/html/rfc9293
RFC 1034 / 1035 — DNSDNS 协议5https://datatracker.ietf.org/doc/html/rfc1034
BPF Performance Tools(Brendan Gregg)内核可观测性方法论5https://www.brendangregg.com/ebpf.html
The Linux BPF runtime(kernel docs)BPF 子系统权威说明4https://docs.kernel.org/bpf/

经典书籍

资料角色评分链接
《TCP/IP Illustrated, Volume 1》W. Richard StevensTCP/IP 字段与行为5https://www.informit.com/store/tcp-ip-illustrated-volume-1-the-protocols-9780321336316
《Linux Performance》Brendan Gregg内核与系统级排查图谱5http://www.brendangregg.com/linuxperf.html
《Systems Performance》Brendan Gregg系统级方法论5https://www.brendangregg.com/books.html
《Network Warrior》Gary A. Donahue实战派网络排障4https://www.oreilly.com/library/view/network-warrior-2nd/9781449307971/
《The Site Reliability Workbook》Google故障响应流程4https://sre.google/workbook/

优秀博客

资料角色评分链接
Brendan Gregg — Linux Performance内核侧排查地图5http://www.brendangregg.com/linuxperf.html
Brendan Gregg — bpftrace one-linersbpftrace 单行脚本示例5https://www.brendangregg.com/books.html
Cloudflare 博客 — The story of one latency spike真实故障复盘4https://blog.cloudflare.com/the-story-of-one-latency-spike/
Cloudflare 博客 — BPF, eBPF, XDP and BpfilterBPF 家族关系4https://blog.cloudflare.com/bpf-the-forgotten-bytecode/
Julia Evans — networking zines / bpftrace直观图解4https://wizardzines.com/
Red Hat — TCP troubleshooting内核 TCP 调优与排障4https://access.redhat.com/articles
Tailscale — Troubleshooting TLSTLS 侧排障实战4https://tailscale.com/kb/1301/tls-debugging

核心人物

人物贡献关键出处
Mike Muussping 作者1983 年 BRL Report
Van Jacobsontraceroute、TCP 拥塞控制USENIX 1989
Matt Kimballmtr 原型1997 年发布
Alexey Kuznetsoviproute2 / ss 前身作者Linux 网络栈
Willem de Bruijnpacketdrill 与内核网络测试Linux 网络测试
Brendan Greggbpftrace、BCC 与性能方法论Brendan Gregg 个人站
Alastair Robertsonbpftrace 主要维护者bpftrace GitHub
David S. MillerLinux 网络子系统维护者(多年)LKML

开发方法

方法适用关键点
自下而上分层任何网络问题L1 物理 → L2 链路 → L3 IP → L4 TCP → L7 应用,每层先过一遍
现象→假设→验证排障对话与复盘先列 3 个最可能根因,再用最小命令验证
证据链多人协作复盘命令、输出、时间戳、可复现步骤都要落库
时间线驱动延迟/抖动把所有事件按时间排齐,看相对间隔
双端抓包怀疑中间丢包同时抓本端和对端,对比序列号
一行命令优先快速验证能用 ss -tin 解决的就不上 tcpdump
命令化复现交接与回归命令贴进 README,第二天还能跑

9.4 经典问题与经典案例

#问题为什么重要最简答案
1ping 通但 curl 不通常见:MTU、TCP 防火墙、应用端口ss -tnapiptables -L -nv
2mtr 看到一半丢包运营商或中间节点限速 ICMP看最后几跳,参考目标机的 RTT
3DNS 解析慢resolver 配置、TCP DNS、DoHdig +trace 看是本地 resolver 还是上游慢
4TCP TIME_WAIT 多短连接风暴ss -s 看统计,必要时调 net.ipv4.tcp_tw_reuse
5SYN_RECV 队列堆积accept 队列满、syncookiesss -tan state syn-recvtcp_max_syn_backlog
6TLS 握手慢RTT 大、证书链长、OCSPopenssl s_client -connect -tlsextdebug 拆解
7conntrack 表满NAT/防火墙场景conntrack -L | wc -lnf_conntrack_max
8网卡 offload 让 RTT 看着小TCP timestamp 关闭、LSOethtool -k <iface> 检查
9HTTP/2 stream 复用延迟服务端 push、优先级curl --http2 -v 看 stream id
10偶发 RST中间设备健康检查、保活过短看 RST 来自哪一端,看 keepalive
11内核丢包统计应用没收到包但接口有统计ip -s link/proc/net/softnet_stat
12QUIC / HTTP/3 排障UDP 路径上的中间设备看是否被运营商 QoS/reset

9.5 学习难点

概念难点

难点为什么会卡突破路径
TTL 与 RTT 概念混淆都是“看上去”的数字TTL 是 hop 计数;RTT 是往返时间
ping 通 ≠ 服务可用ICMP 被特殊对待拆出 TCP/HTTP 再看
NAT 与 conntrack 关系看不到 conntrack 就会怪应用在 NAT 网关上 conntrack -E 看流
TCP 状态机记不住状态多画一张图,记住 LISTEN/ESTABLISHED/TIME_WAIT 三个就够 80%

思维难点

难点为什么会卡突破路径
不知道从哪一层开始信息不足先用 mtr + dig + curl 分段计时,定位大致层
工具输出有迷惑性ICMP 被降速、TCP timestamp 关闭看多个指标交叉验证
偶发问题难复现缺乏触发条件拉长时间窗口、看指标分布而非单点
复盘写成流水账没结构用 5 段法:现象→定位→根因→修复→预防

工程难点

难点为什么会卡突破路径
内核事件难观测没有传统日志bpftrace 单行脚本,从 BCC 工具集借力
多网卡多命名空间包路径不一致先画拓扑再抓包
容器内抓包网络命名空间nsenter -n 或主机侧抓 cni 网桥
高并发数据噪包多到存不下BPF capture filter + 轮转 + capinfos 校验
bpftrace 报错难懂内核版本/编译选项差异升级内核或用 BCC 替代品

9.6 技术标准与接口

9.6.1 Entity

名称版本 / 现状发布组织状态许可证 / 可访问性
ping (iputils)iputils 持续维护iputils 团队活跃BSD
mtr0.95+mtr 项目活跃GPL-2.0
traceroute持续维护inetutils / modern traceroute活跃多为 GPL/BSD
dig / BIND 工具BIND 9.xISC活跃MPL-2.0
ss (iproute2)持续维护iproute2 项目活跃GPL-2.0
curl8.xcurl 项目活跃MIT
openssl3.xOpenSSL 项目活跃Apache-2.0
tcpdump4.xtcpdump group活跃BSD-3
BPF (kernel)Linux 4.x+ 持续演进Linux 内核活跃GPL-2.0
bpftrace0.16+bpftrace 项目活跃Apache-2.0
BCC0.25+iovisor活跃Apache-2.0

9.6.2 Scope

9.6.3 Structure

真实命令样例:

# mtr 报告 30 次
mtr -r -c 30 8.8.8.8

# ss 看本机到 :443 的连接 RTT / 重传 / cwnd
ss -tin '( sport = :443 )'

# DNS 解析链路
dig +trace example.com

# 应用层分段时间
curl -o /dev/null -s -w 'dns=%{time_namelookup} tcp=%{time_connect} tls=%{time_appconnect} ttfb=%{time_starttransfer} total=%{time_total}\n' https://example.com

# 抓包
tcpdump -i any -nn -s 0 -w /tmp/c.pcap tcp port 443

# bpftrace 追踪 TCP 连接发起
sudo bpftrace -e 'kprobe:tcp_connect { printf("pid=%d comm=%s dest=%s\n", pid, comm, arg2); }'

9.6.4 Ecosystem

9.6.5 Depth Tiers

层级名称必须看到什么
L0知道存在知道 ping/mtr/ss/curl/tcpdump/bpftrace 各管一段
L1看得懂示例能读 mtr 报告的 Loss%/Avg、ss 的状态列、curl 的分段时间
L2能正确调用能用 ss/tcpdump/curl/dig 定位常见问题(DNS 慢、TCP 队列满、TLS 失败)
L3能解释与排错能结合 conntrack、offload、MTU、内核参数解释异常现象
L4能设计与扩展能写 bpftrace/BCC 工具、配置全链路观测、做复杂复盘

本计划要求达到:L3。做 SRE/网络平台/性能工程师时进入 L4。

9.6.6 Source

10. 常见误区

11. 所有知识点分类(统一规则)

  1. 编程语言
  2. 数据结构与算法
  3. 计算机基础:ICMP、TCP/IP、DNS、conntrack、路由、内核网络栈
  4. 工程技术:ping/mtr/ss/curl/tcpdump/bpftrace、故障复盘流程
  5. Web 与后端:HTTP/TLS 握手、TLS 排障
  6. 前端与客户端
  7. 数据与人工智能
  8. 项目与职业能力:RCA、复盘、协作交接、可观测性
  9. 安全与可靠性:防火墙、conntrack、offload、内核可观测性

本计划归属:计算机基础 主 + 工程技术 辅。


直接依赖(4)

查看知识图谱