CalcGuide · 技术博客主页 / 一页纸学习计划
🔥极高

TCP/IP 协议栈:从 IP 到 ICMP

分类:计算机基础 · 路径:docs/topics/tcp-ip-stack/README.md

#tcp-ip#ip#ipv4#ipv6#icmp#routing

理解 IPv4/IPv6 报文、子网划分、路由、NAT、ICMP,能用 traceroute/mtr 排查

父主题

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

子主题(0)

TCP/IP 协议栈:从 IP 到 ICMP

0. 元信息

1. 学习路线

二层交付边界
  → IPv4 报文头与编址
  → CIDR 与子网计算
  → 路由表与最长前缀匹配
  → MTU、分片、PMTUD
  → ICMP 类型与代码
  → NAT 与 conntrack
  → IPv6 报文、地址、邻居发现
  → Linux 抓包与综合排障

每一步都要在两台机器上抓一次包。坑在「只看 RFC 不抓包」——字段太多,背不下来;看到真实字节流才算入门。

2. 阶段周数分配

阶段3 周方案4 周方案备注
1. IPv4 报文0.5 周0.75 周字段逐位对照 tcpdump -vv -X
2. CIDR 与编址0.5 周0.75 周20 道手算 + 5 道 ipcalc 验证
3. 路由与转发0.5 周0.75 周用 network namespace 做三跳实验
4. MTU 与 ICMP0.5 周0.5 周抓 Echo、TTL Exceeded、Fragmentation Needed
5. NAT0.5 周0.5 周抓转换前后的五元组
6. IPv60.5 周0.75 周地址、扩展头、NDP、PMTUD
7. 综合排障0.5 周0.5 周traceroute + mtr + tcpdump 联用

3. 九阶段表

阶段核心知识实践产出可观察学会标准
1. 分层边界Internet 层职责、hop-by-hop vs end-to-end、封装关系一张主机→路由器→主机的字段变化图能解释为什么 IP 不保证可靠和顺序
2. IPv4 报文Version、IHL、DSCP/ECN、Total Length、ID、Flags、Fragment Offset、TTL、Protocol、Header Checksum、源/目的 IP一份带字段标注的 tcpdump -vv -X 输出能从十六进制定位 TTL、Protocol 和地址
3. CIDR前缀长度、子网掩码、网络号、广播地址、可用主机范围、路由聚合20 道子网计算(含 /20/27/302 分钟内口算任意 /N 边界
4. 路由直连、静态、默认路由、metric、ECMP、最长前缀匹配三 namespace + 两 veth 拓扑实验能预测一个目的 IP 走哪条路由
5. MTU链路 MTU、IP 分片、DF 位、PMTUD、IPv6 不分片不同负载长度的 ping -s/-M do 实验能区分「链路丢包」与「MTU black hole」
6. ICMPEcho、Destination Unreachable、Time Exceeded、Redirect、Fragmentation Needed、Parameter ProblemICMP 类型/代码对照表能从 type/code 判断失败环节
7. NATSNAT、DNAT、PAT、conntrack、Hairpin NAT、ALG抓包对比转换前后五元组能解释 NAT 为什么破坏端到端可达性
8. IPv6地址表示、前缀、Link-Local、SLAAC、NDP、PMTUD、扩展头IPv6 双栈主机实验能用 ip -6 neighping6 完成发现
9. 综合排障traceroute、mtr、tcpdump、ss、ip route get一份「跨网段服务不通」定位报告30 分钟内定位未知网络问题

阶段 9 真实场景:服务跨 VPC 调用慢,要能从 mtr 跳点变化判断是「丢在运营商」还是「目标主机丢包」。

4. 第一周任务

任务当天交付
Day 1ip -d link 看本机接口;ip addr 记录 IP/前缀;ping 127.0.0.1ping <本机 IP> 区分环回与本机一份接口清单 + ping 输出
Day 2tcpdump -ni any -e -vv -X icmp 抓一次 ping;把 20 字节 payload 改成 200 字节再看报头一份带字段标注的 hexdump
Day 3手算 4 道子网(/24 /27 /30 /20),再用 ipcalcpython netaddr 验证4 道手算 + 验证截图
Day 4ip route 看本机路由表;ip route get 8.8.8.8 看实际命中;加一条 ip route add 实验路由表 + 命中记录
Day 5ping -M do -s 1472 <target> 测 MTU;故意挑过大值看 ICMP Fragmentation Needed一份 MTU 测试记录
Day 6traceroute 到外网,看 TTL=1 起点;改 -I / -T / -U 对比不同探测方式traceroute 输出 + 协议对比
Day 7项目:抓一次完整对话:本机 ping 公网 IP,截取 echo request / echo reply / 中间 hop 的 ICMP Time Exceeded 各一份抓包 pcap + 标注

Day 7 拆解

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

  1. tcpdump -ni any -w /tmp/icmp.pcap icmp 抓 30 秒;
  2. ping -c 3 1.1.1.1
  3. tcpdump -r /tmp/icmp.pcap -vv 列出请求和应答;
  4. 把 echo request 的 IP 头字段逐一对照 RFC 791 §3.1 标注。

步骤 B —— 补齐边界(30 分钟)

进阶:稳定通过后,再叠加 BPF 过滤 tcpdump 'icmp[icmptype] == 11',验证只看 Time Exceeded。

5. 阶段通用验收

  1. 不看 RFC 也能画出 IPv4 头 20 字节的字段分布;
  2. 用自己的话解释「为什么需要分片」「为什么 IPv6 不分片」;
  3. 画一张图:主机 A → 路由器 R1 → R2 → 主机 B 上每跳 IP 头变化(TTL、checksum、地址);
  4. 测试异常:TTL=0、DF 置位 + 大包、不可达目的地址、错误 checksum;
  5. 准备 3 组自定义数据并贴实际输出(不同 TTL、不同 MTU、不同路由);
  6. 记录每次抓包的 BPF 过滤器和命令;
  7. 能修改 BPF 抓到想要的报文,而不是只能照抄。

6. 最终验收

7. 综合项目

首选:跨网段服务延迟定位(必做:在两台 Linux 上用 network namespace 模拟 3 跳网络,故意在某跳注入丢包或延迟,用 mtr + tcpdump 定位)。

备选

综合项目必做要求:

  1. 场景描述:网络拓扑、预期行为、实际行为;
  2. 工具选择理由:为什么用 mtr 而不是 ping?为什么用 tcpdump 而不是 wireshark 命令行版本?
  3. 核心分析:每一跳的现象、判断依据、根因定位;
  4. 复现脚本:可重复运行的 ip netns add / tc qdisc add / iptables 命令;
  5. 边界测试:换协议(UDP/TCP)、换方向、换 MTU 都验证过;
  6. 运行说明:环境依赖(iproute2iptablestraceroutemtrtcpdump)、复现步骤;
  7. README:项目介绍、目录结构、复盘;
  8. 复盘记录:用时、难点、收获、下一步。

复盘项目交付物统一存到 notes/

本主题贡献

本主题沉淀 IPv4/IPv6 报文、CIDR 子网、ICMP 错误传递、MTU/PMTUD 与 NAT/conntrack 五条主线能力,所有结论都要能在两台 Linux 上用 tcpdump -vv -X 重现。

职责(3 项)

  1. 解析 IPv4 头 14 个字段、IPv6 头固定 40 字节与扩展头链,能从 hex 标注 TTL、Protocol、Header Checksum、Hop Limit、Next Header;
  2. 在两 namespace + 两 veth 拓扑上用 tc qdisc add dev lo root netem loss 30% 注入丢包与延迟,用 mtr -r -c 30 + tcpdump 区分丢在运营商还是目标主机,能解释 PMTUD 与 DF 位的关系;
  3. 配 SNAT/DNAT/Hairpin NAT、抓五元组变化、读 conntrack -L,能解释 NAT 为什么破坏端到端可达性,以及为什么 ICMP Fragmentation Needed 被防火墙误杀会引发 MTU 黑洞。

交付物(4 项)

  1. 一份带字段标注的 IPv4 报文 hexdump(tcpdump -ni any -vv -X icmp),含 TTL、Protocol、Header Checksum 逐字节对照;
  2. 20 道 CIDR 手算(覆盖 /20 /27 /30),用 ipcalc / python netaddr 校验并保留截图;
  3. 跨网段延迟升高场景的 mtr 报告 + tcpdump -w /tmp/p.pcap 证据,能定位丢包 hop 与 ICMP Time Exceeded 出现位置;
  4. IPv4/IPv6 双栈对比实验记录(ip -6 neighping6 fe80::1%eth0),含 NAT 转换前后五元组变化对照表。

指标(3 项)

  1. 跨网段问题定位 hop 数 ≤ 5(用 mtr Last/Avg/StDev 与抓包共同判定);
  2. PMTUD 失败场景下 TCP fallback 到 clamp_mss 的恢复时间 < 30 秒;
  3. NAT 转换记录与 conntrack 表一致性检查通过率 100%(五元组 + 超时匹配)。

8. 推荐开源资料(按角色分工)

角色资料链接用法
RFC 原文RFC 791(IPv4)https://www.rfc-editor.org/rfc/rfc791字段定义原文
RFC 原文RFC 8200(IPv6)https://www.rfc-editor.org/rfc/rfc8200报文与扩展头
RFC 原文RFC 792(ICMPv4)https://www.rfc-editor.org/rfc/rfc792ICMP 类型与代码
RFC 原文RFC 4443(ICMPv6)https://www.rfc-editor.org/rfc/rfc4443ICMPv6 必读
RFC 原文RFC 4632(CIDR)https://www.rfc-editor.org/rfc/rfc4632CIDR 与聚合
工具手册iproute2 文档https://wiki.linuxfoundation.org/networking/iproute2ip / tc / ss 用法
工具手册mtr 主页https://www.bitwizard.nl/mtr/mtr 参数与输出
工具手册tcpdump 手册页https://www.tcpdump.org/manpages/tcpdump.1.htmlBPF 与输出格式
中文讲解阿里云「网络层」文档https://help.aliyun.com/document_detail/25378.htmlVPC / 路由表入门
实验环境vagrant + virtualbox 拓扑https://www.vagrantup.com/多 VM 复现网络
抓包练习Wireshark 官方样例 pcaphttps://wiki.wireshark.org/SampleCapturesICMP / TCP / ARP 真实报文

许可证提示:Wireshark 样例 pcap 是公开教学资源;iproute2 是 GPL-2.0。复制或参考命令前先确认许可证。

源码阅读时机:iproute2 源码放到「阶段 4(路由)」之后再读;RFC 原文从 Day 1 就开始对照,但不要试图一次通读所有 RFC——按当前阶段挑相关章节。

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

本节内容基于公开 RFC、Linux 手册与个人整理,标注「由本计划生成」处为计划自写。本节是子主题自包含的最后一节,不再依赖 notes/ 子目录。

9.1 背景与动机

9.2 概念地图

flowchart LR
  App[应用层] --> Socket
  Socket --> TCP[TCP/UDP]
  TCP --> IP[IPv4/IPv6 报文]
  IP --> ICMP[ICMP 控制]
  IP --> Frag[分片/重组]
  IP --> Route{路由查询}
  Route -->|出接口| L2[链路层]
  L2 -->|出网卡| Wire[物理层]
  Wire --> Next[下一跳]
  Next --> L2
  IP --> NAT[NAT 转换]
  IP --> PMTUD[PMTUD]
  PMTUD --> ICMP
  ICMP --> Traceroute[traceroute/mtr]
  IP --> Addr[编址/CIDR]
  IP --> Fwd[转发/最长前缀]

关系说明:

9.3 基础知识讲解

经典论文 / 经典书籍 / 优秀博客 / 核心人物 / 开发方法 五大类,每类 ≥3 条。

经典论文 / RFC(必读)

资料角色评分链接
RFC 791 — Internet ProtocolIPv4 协议原文5https://www.rfc-editor.org/rfc/rfc791
RFC 8200 — Internet Protocol, Version 6IPv6 协议原文5https://www.rfc-editor.org/rfc/rfc8200
RFC 792 — Internet Control Message ProtocolICMPv4 类型/代码5https://www.rfc-editor.org/rfc/rfc792
RFC 4443 — ICMPv6ICMPv6 类型/代码5https://www.rfc-editor.org/rfc/rfc4443
RFC 4632 — Classless Inter-Domain Routing (CIDR)CIDR 与聚合4https://www.rfc-editor.org/rfc/rfc4632
RFC 1191 — Path MTU DiscoveryPMTUD 设计4https://www.rfc-editor.org/rfc/rfc1191

经典书籍(系统化)

资料角色评分链接
《TCP/IP 详解 卷 1:协议》(Richard Stevens)协议层最经典5https://www.amazon.com/TCP-Illustrated-Volume-Protocols/dp/0321336313
《计算机网络:自顶向下方法》(Kurose & Ross)教学级系统讲解4https://gaia.cs.umass.edu/kurose_ross/
《Linux 高性能服务器编程》(游双)Linux 网络栈工程4https://book.douban.com/subject/24722642/
《UNIX 网络编程 卷 1》(Stevens)Socket 与协议实现5https://www.unixnetworkprogramming.com/
《Computer Networking: A Top-Down Approach》(同上 Kurose 第 8 版)配套 PPT/视频4https://gaia.cs.umass.edu/kurose_ross/

优秀博客(按问题查)

资料角色评分链接
Cloudflare Learning Center概念图解 + 实例4https://www.cloudflare.com/learning/network-layer/what-is-the-network-layer/
Julia Evans「Networking!」(zines)抓包与命令可视化5https://jvns.ca/networking-zine.pdf
APNIC Blog运营商视角 + 排障4https://blog.apnic.net/
Marek Majkowski(Cloudflare)TCP/IP 深入系列4https://blog.cloudflare.com/tag/tcp/
joyeu1234(CSDN「TCP/IP 协议栈」)中文步骤化讲解3https://blog.csdn.net/joyeu1234/article/category/1924409
阿里云 VPC 文档国内云网络实践4https://web.archive.org/web/2024*/joyeu1234

核心人物(知道谁定的规范)

人物贡献关键出处
Jon PostelRFC 编辑、Internet 协议体系奠基人RFC 791/792/793 系列
Vint CerfTCP/IP 共同设计者与 Bob Kahn 合著 1974 论文
Bob KahnTCP/IP 共同设计者与 Vint Cerf 合著 1974 论文
Steve DeeringIPv6 首席设计师RFC 2460/4291
Christian HuitemaIPv6 部署与 NAT 穿越《IPv6: The New Internet Protocol》
Radia PerlmanSpanning Tree、路由协议《Interconnections: Bridges, Routers, Switches》
W. Richard Stevens《TCP/IP 详解》《UNIX 网络编程》工程师人手一本

开发方法(动手习惯)

方法适用关键点
抓包驱动学习任何协议学习看到真实字节流比看图快 10 倍
双向对比(请求/应答)排障把 request 与 reply 放一起对照字段变化
字段级标注抓包复盘tcpdump -vv -X 输出逐字段标注
最小复现排障缩到两台机器一个包,再扩到原场景
BPF 过滤抓包写不准过滤器等于没抓;先 tcpdump -dd 验证表达式
ip route get 验证路由写完路由先用 get 验证再发包

缺失部分:tcpdump-dd 输出语法、BPF 字面量在不同 libpcap 版本的差异。本计划不重写工具手册;查 man pcap-filter 即可。

9.4 经典问题与经典案例

#问题为什么会重要最简答案
1TTL 超时包去哪了路由环路诊断每跳减 1,到 0 路由器回 ICMP Time Exceeded 给源
2MTU 黑洞大包静默丢路径某跳 MTU 较小,DF=1 时丢包且不发 ICMP
3分片重组失败安全与性能双重问题任一片丢失全包作废;现代网络建议 PMTUD
4IP 头校验和不覆盖数据排障时常被误用IPv4 头校验和只覆盖头;UDP 校验和可选,TCP 必选
5NAT 回流失败内网服务从公网无法访问需要 hairpin NAT 或拆分内外网 DNS
6ICMP 被防火墙误杀ping 通但 TCP 不通防火墙禁 ICMP 会让 PMTUD 失效
7IPv6 Link-Local 不可路由fe80::/10 只能在二层段内ping6 fe80::1%eth0 指定 zone
8IP 欺骗安全审计基础入口路由器做 uRPF / BCP38 过滤
9路由黑洞路由指向不存在的下一跳ip route get 验证后再配置
10ECMP 不均衡同目的多路径负载不均多数实现按五元组 hash,会出现长连接独占

9.5 学习难点

概念难点

难点为什么会卡突破路径
IPv4 头字段20 字节 14 个字段,记不住抓一个包对照 RFC 791 标一遍;用 Anki 卡片
CIDR 与子网边界前缀长度转十进制掩码不熟每天 5 道手算 + ipcalc 验证
最长前缀匹配路由表多条匹配不知道选谁写出每条前缀的二进制前缀,找最长公共前缀
ICMP 类型与代码40+ 类型记不住抓包时打印 icmptypeicmpcode 字段名对照
IPv6 地址表示缩写规则不熟写一个 Python 展开/压缩函数来回切换

思维难点

难点为什么会卡突破路径
hop-by-hop vs end-to-end分不清哪层改什么画一张每跳字段变化表,标出 TTL、checksum、地址
无连接 vs 不可靠误以为 IP 也有重传写一段文字:IP 收到包只管「转交下一跳」
NAT 与端到端以为 NAT 透明抓包看五元组变化;写 conntrack 表对照
PMTUD 失败模式防火墙拦 ICMP 导致 MTU 卡 576改用 clamp_mss 的 TCP 兜底方案

工程难点

难点为什么会卡突破路径
tcpdump BPF 写错过滤器返回零结果tcpdump -d 编译查看;先抓全量再过滤
多接口选择-i any 混杂时序改用具体接口 -i eth0
路由实验污染主机表ip route add 后忘记删ip netns add 在命名空间内做实验
mtr 输出解读不知道哪些跳算「丢包」看 Last/Avg/StDev 三列,结合 30 秒以上采样
IPv6 链路本地地址不知道 %eth0 含义把它理解成「作用域 ID」,跨链路要带

9.6 技术标准与接口

9.6.1 Entity

名称版本发布组织状态许可证 / 可访问性
IPv4 (RFC 791)1981IETF / IESG现行标准免费公开
IPv6 (RFC 8200)2017IETF / IESG现行标准免费公开
ICMPv4 (RFC 792)1981IETF / IESG现行标准免费公开
ICMPv6 (RFC 4443)2006IETF / IESG现行标准免费公开
CIDR (RFC 4632)2006IETF / IESG现行标准免费公开
iproute2持续更新Linux 社区事实标准GPL-2.0
Linux kernel net stack持续更新Linux Foundation事实标准GPL-2.0

9.6.2 Scope

不适用:实时多媒体(用 UDP/RTP)、可靠字节流(用 TCP)、应用语义(用 HTTP/gRPC)。与传输层关系:IP 提供「从源主机到目的主机」能力,TCP/UDP 在此之上提供「端到端进程间」能力。

9.6.3 Structure

IPv4 头(20 字节,必会字段):

偏移字段长度说明
0Version + IHL1 字节Version=4;IHL=5(无选项)
1DSCP + ECN1 字节QoS 与显式拥塞通知
2-3Total Length2 字节含头,单位字节
4-5Identification2 字节分片重组用
6-7Flags + Fragment Offset2 字节DF / MF 位
8TTL1 字节每跳减 1
9Protocol1 字节1=ICMP, 6=TCP, 17=UDP
10-11Header Checksum2 字节只覆盖头
12-15Source IP4 字节
16-19Destination IP4 字节

IPv6 头(40 字节固定,扩展头链式):

偏移字段长度
0-3Version + Traffic Class + Flow Label4 字节
4-5Payload Length2 字节
6Next Header1 字节
7Hop Limit1 字节
8-23Source Address16 字节
24-39Destination Address16 字节

ICMPv4 常见类型:

Type名称用途
0 / 8Echo Reply / Requestping
3Destination Unreachablecode 0=net, 1=host, 3=port, 4=need frag
5Redirect路由优化(已基本弃用)
11Time ExceededTTL=0(traceroute 关键)
12Parameter Problem头字段错误

9.6.4 Ecosystem

9.6.5 Depth Tiers

层级名称必须看到什么
L0知道存在知道 IP/ICMP/CIDR 是网络层;知道 IPv4 / IPv6 两个版本
L1看得懂示例看到 ping / traceroute 输出能猜出哪个字段
L2能正确调用能写 ip route / ip addr / tcpdump 完成日常操作
L3能解释与排错能解释 MTU 黑洞、TTL 超时、NAT 回流失败的根因
L4能设计与扩展能设计 PMTUD 失败的兜底方案、写 conntrack 规则

本计划目标:阶段 9 综合排障时达到 L3

9.6.6 Source

10. 常见误区

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

按本仓库统一分类规则(与父主题一致):

  1. 编程语言
  2. 数据结构与算法
  3. 计算机基础:网络协议、操作系统、组成原理
  4. 工程技术
  5. Web 与后端
  6. 前端与客户端
  7. 数据与人工智能
  8. 项目与职业能力

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


直接依赖(1)

查看知识图谱 · 热度 🔥极高