一、为什么要分层
网络是人类造过的最复杂的工程系统之一。要管住这种复杂度,只有一个办法:分解。
1.1 航空公司类比(KR 经典)
一次坐飞机的流程:
买票 ————————————→ 退票
行李托运 ————————————→ 行李提取
登机口登机 ————————————→ 登机口离开
跑道起飞 ————————————→ 跑道降落
飞机路线选择 —————→ 飞机路线选择 —————→
每一层只和对端的同一层打交道(买票的人关心票,装行李的人关心行李),并且只依赖下一层提供的服务。
关键在于:**只要接口不变,任何一层的实现都可以被替换。**换一种登机方式,不影响买票系统。
1.2 分层的收益
- 模块化:每层的实现可以独立演进。TCP 从 Reno 换到 CUBIC,不需要改动任何路由器。
- 复用:所有应用共享同一套传输层和网络层。
- 可管理:明确的接口划分让责任边界清楚。
1.3 分层的代价(教材上常被略过)
⚠️ 分层不是免费的:
- 功能重复:差错检测在链路层做(CRC)、传输层又做一次(checksum)
- 信息隐藏损害性能:TCP 看不到底层是无线还是有线,误把无线误码当成拥塞而降速(这是移动网络上的经典问题,第 25 讲会详谈)
- 头部开销:每层加一个头部,40 字节的 TCP/IP 头部对一个 100 字节的载荷是 40% 的浪费
🎯 考试常见简答题:「分层的两个缺点是什么?」——功能冗余与跨层信息不可见。
二、互联网五层模型
从上往下:
| 层 | 名称 | 解决什么问题 | 数据单位 | 代表协议 | 本课讲次 |
|---|---|---|---|---|---|
| 5 | 应用层 | 让应用之间交换报文 | 报文 message | HTTP, DNS, SMTP, DASH | 第 5–9 讲 |
| 4 | 传输层 | 进程到进程的数据传输 | 报文段 segment | TCP, UDP, QUIC | 第 10–16 讲 |
| 3 | 网络层 | 主机到主机,跨网络寻路 | 数据报 datagram | IP, ICMP, OSPF, BGP | 第 17–22 讲 |
| 2 | 链路层 | 相邻节点之间传帧 | 帧 frame | Ethernet, 802.11, PPP | 第 23–24 讲 |
| 1 | 物理层 | 在介质上传比特 | 比特 bit | 电压、光脉冲、无线电 | 第 25 讲部分 |
记住每层的「作用范围」
这比记协议名重要得多:
应用层 ┃ 进程 ←——————————————————————————→ 进程 逻辑通信
传输层 ┃ 进程 ←——————————————————————————→ 进程 端到端
网络层 ┃ 主机 ←—— 逐跳转发 ——————————————→ 主机 跨网络
链路层 ┃ 节点 ←→ 节点 (每一跳都重新做一次)
物理层 ┃ 比特在一段介质上
📌 注意一个重要区别:传输层和应用层只在端系统上实现,路由器不运行 TCP。路由器只处理到第 3 层。交换机只处理到第 2 层。
这就是「智能在边缘」在协议栈上的具体体现。
三、OSI 七层模型
ISO 制定的参考模型,比五层模型多了两层:
| OSI 层 | 五层模型中的位置 | 干什么 |
|---|---|---|
| 7 应用层 | 应用层 | |
| 6 表示层 | ⚠️ 被并入应用层 | 数据格式转换、加密、压缩 |
| 5 会话层 | ⚠️ 被并入应用层 | 会话的建立、同步、恢复 |
| 4 传输层 | 传输层 | |
| 3 网络层 | 网络层 | |
| 2 数据链路层 | 链路层 | |
| 1 物理层 | 物理层 |
互联网的态度是:表示层和会话层的功能如果应用需要,由应用自己实现。这符合端到端原则——不把应用不一定需要的功能强加给所有人。
💡 面试常问:「TLS 属于第几层?」严格说 TLS 不在五层模型的任何一层,它位于应用层与传输层之间;在 OSI 语汇里最接近表示层(第 6 层)。很多人说它是「4.5 层」。第 28 讲会详细讲。
四、封装(Encapsulation)
这是本讲的核心机械过程,Lab 1 抓包时你会一层一层亲眼看到。
4.1 逐层加头部
应用层 [ 应用数据 M ]
↓
传输层 [Ht][ M ] ← 报文段 = TCP头 + M
↓
网络层 [Hn][Ht][ M ] ← 数据报 = IP头 + 报文段
↓
链路层 [Hl][Hn][Ht][ M ][尾部] ← 帧 = 帧头 + 数据报 + CRC
↓
物理层 1010110100110101110001010... ← 比特流
每一层把上一层交下来的东西整个当作「数据」(payload),在前面加上自己的头部。接收方逐层剥掉。
关键洞察:**下层从不解读上层的内容。**IP 层不知道里面装的是 TCP 还是 UDP 的哪个应用——它只看 IP 头部里的协议号字段。这正是分层能工作的原因。
4.2 一份数据在路径上的形态变化
主机A 交换机 路由器 交换机 主机B
[Hl|Hn|Ht|M] → [Hl|Hn|Ht|M] → [Hn|Ht|M] → [Hl'|Hn|Ht|M] → [Hl'|Hn|Ht|M]
剥掉旧帧头
查路由
加上新帧头
⚠️ 考试高频点:
- 链路层头部逐跳更换(每一跳的 MAC 地址都不一样)
- IP 头部端到端基本不变(源/目的 IP 地址不变,但 TTL 每跳减 1,校验和重算)
- 传输层头部端到端完全不变(路由器不碰它)
(NAT 是这条规则的著名例外——它篡改 IP 和端口,第 18 讲会讨论它带来的争议。)
4.3 头部开销的量化
以太网帧头/尾: 14 + 4 = 18 字节
IPv4 头部: 20 字节
TCP 头部: 20 字节
————————
合计 58 字节
对一个 1500 字节的以太网 MTU,载荷最多 1460 字节,开销约 3.9%。但对一个 40 字节载荷的 SSH 击键包,开销超过 59%。
这解释了为什么 VoIP 要用 UDP(省 12 字节)+ 压缩头部,也解释了为什么把小包合并(Nagle 算法,第 14 讲)在某些场景下是必要的。
五、两条设计原则
5.1 端到端原则(End-to-End Principle)
只有在通信端点才能完整、正确地实现的功能,就不应该放在网络内部实现。 ——Saltzer, Reed & Clark, 1984
用它来论证:可靠传输为什么不放在 IP 层?
假设我们让每一跳链路都做可靠传输(发现丢帧就重传)。这样够吗?
不够。因为分组还可能在路由器内部出问题:内存位翻转、软件 bug、缓冲区溢出被丢弃。逐跳可靠无法覆盖这些。
结论是:**端到端的检查无论如何都必须做一次。**既然必须做,网络内部再做一遍就是冗余(对性能不敏感的场景而言)。
⚠️ 但这条原则不是绝对的。在误码率极高的链路上(无线),逐跳重传能显著提高性能——因为让 TCP 用 RTT 级的超时去恢复一个无线误码,代价太大了。802.11 确实做了链路层重传(第 25 讲)。
📌 端到端原则的正确读法是:「端到端的功能必须在端上实现;网络内部只在有明确性能收益时才做部分重复。」
5.2 沙漏模型(The Hourglass / Narrow Waist)
HTTP SMTP DNS RTP QUIC BitTorrent ... ← 应用层:多
╲ ╱
TCP UDP SCTP ← 传输层:少
╲ ╱
┏━━━━━━━┓
┃ IP ┃ ← 网络层:只有一个 ⭐
┗━━━━━━━┛
╱ ╲
Ethernet 802.11 PPP DOCSIS 5G ... ← 链路层:多
╱ ╲
铜缆 光纤 无线电 卫星 ... ← 物理层:多
IP 是整个互联网唯一的收腰。
它带来了互联网最重要的性质:
IP over everything, everything over IP. 任何新的链路技术只要能承载 IP 分组,就自动能跑所有现有应用;任何新应用只要基于 IP,就自动能跑在所有现有链路上。
代价是:**IP 层本身极难改变。**IPv6 从 1998 年标准化到现在,全球部署率仍未过半(第 19 讲会讨论为什么)。收腰的宽度就是互联网创新的自由度,也是它的枷锁。
六、安全威胁概览
安全不是课程最后一章才出现的话题,它贯穿每一层。这里先建立分类,第 27–28 讲展开。
6.1 五类基本威胁
1️⃣ 恶意软件(Malware)
通过网络植入主机的病毒、蠕虫、木马、勒索软件。
- 病毒需要用户动作(点开附件)
- 蠕虫不需要,自我传播(Morris 蠕虫 1988、Slammer 2003)
- 僵尸网络(botnet):被控制的主机群,用于发起后续攻击
2️⃣ 拒绝服务(DoS / DDoS)
让服务对合法用户不可用。三种基本类型:
| 类型 | 手法 | 例子 |
|---|---|---|
| 弱点攻击 | 发精心构造的报文触发崩溃 | 畸形分组导致协议栈崩溃 |
| 带宽洪泛 | 用海量流量淹没接入链路 | DDoS 反射放大(DNS/NTP 放大) |
| 连接洪泛 | 耗尽服务器的连接表 | SYN 洪泛(第 14 讲详讲) |
3️⃣ 分组嗅探(Packet Sniffing)
在共享介质上(WiFi、集线器)把网卡设为混杂模式,读取所有经过的分组。
- 完全被动,无法被检测
- 唯一有效的防御是加密(第 27–28 讲)
- 这是「公共 WiFi 危险」的技术根源
4️⃣ IP 欺骗(IP Spoofing)
伪造 IP 数据报的源地址。
⚠️ 根本原因:IP 协议不对源地址做任何认证。任何人都可以往源地址字段写任何值。
后果:DDoS 反射攻击、盲注入攻击、绕过基于 IP 的访问控制。
缓解手段是 入口过滤(ingress filtering)——ISP 应当丢弃源地址不属于自己客户的分组(BCP 38)。但这需要全球 ISP 协同部署,至今未完全实现。这是互联网的一个结构性缺陷。
5️⃣ 中间人攻击(Man-in-the-Middle)
攻击者插入到通信路径中,可以读取甚至篡改双向流量。手段包括 ARP 欺骗(第 24 讲)、DNS 投毒(第 7 讲)、BGP 劫持(第 21 讲)、恶意 WiFi 热点。
6.2 分层视角下的威胁
| 层 | 典型威胁 | 典型防御 |
|---|---|---|
| 应用层 | 恶意软件、钓鱼、注入 | 输入校验、沙箱、TLS |
| 传输层 | SYN 洪泛、会话劫持 | SYN cookie、TLS、随机序列号 |
| 网络层 | IP 欺骗、BGP 劫持、DDoS | 入口过滤、IPsec、RPKI |
| 链路层 | ARP 欺骗、MAC 泛洪 | 动态 ARP 检测、端口安全 |
| 物理层 | 窃听、干扰 | 物理管控、扩频、加密 |
📌 一个贯穿全课的判断:**互联网最初的设计假设了一个相互信任的环境。**几乎所有的安全问题,都源于这个假设在 1990 年代之后不再成立,而底层协议已经无法轻易更换。
七、例题(Worked Example)
题目:主机 A(192.168.1.10,MAC aa:aa:aa:aa:aa:aa)通过本地路由器 R 向公网上的服务器 B(93.184.216.34)发送一个 HTTP GET 请求。R 的内网侧 MAC 为 rr:rr:rr:rr:rr:rr。
(a) A 发出的以太网帧中,源 MAC 和目的 MAC 分别是什么? (b) 这个帧中的目的 IP 是什么? (c) 路由器 R 在转发时会修改哪些字段? (d) 服务器 B 收到的帧的源 MAC 是 A 的 MAC 吗?
解答:
(a) 源 MAC = aa:aa:aa:aa:aa:aa(A 自己),目的 MAC = rr:rr:rr:rr:rr:rr(路由器)。
⚠️ 这是最经典的考点。目的 IP 在外网,所以链路层要送到默认网关,而不是服务器——A 根本没有办法在链路层直接触达 B。(A 如何知道 R 的 MAC?通过 ARP,第 24 讲。)
(b) 目的 IP = 93.184.216.34,即服务器 B 的真实地址。IP 地址是端到端的,MAC 地址是逐跳的——这句话请记牢。
(c) R 会:
- 丢弃原以太网帧头,构造新的帧头(新的源/目的 MAC)
- TTL 减 1
- 重算 IP 头部校验和(因为 TTL 变了)
- 若配置了 NAT,还会改写源 IP 和源端口(第 18 讲)
- 不修改 TCP 头部和 HTTP 数据
(d) **不是。**B 收到的帧,其源 MAC 是 B 所在局域网上最后一跳路由器的 MAC。MAC 地址在每一跳都被替换,永远不会跨越路由器传播。
八、随堂自测
- 说出五层模型每一层的「作用范围」(谁到谁)。
- 路由器实现到第几层?交换机呢?为什么路由器不需要实现 TCP?
- 用端到端原则论证:为什么文件传输的完整性校验必须由应用自己做,即使 TCP 已经有校验和?
- 沙漏模型的「腰」为什么必须窄?如果我们把 TCP 也放进腰里会怎样?
- 为什么说 IP 欺骗是一个结构性缺陷而不是实现 bug?
- 一个 40 字节的 TCP 载荷,经过 TCP + IPv4 + 以太网封装后,总共在链路上传输多少字节?开销占比多少?
九、本讲要点回顾
- 分层的收益是模块化与可演化,代价是功能冗余与跨层信息不可见。
- 五层模型:应用(进程↔进程报文)、传输(进程↔进程)、网络(主机↔主机)、链路(相邻节点)、物理(比特)。
- 传输层和应用层只存在于端系统;路由器到第 3 层,交换机到第 2 层。
- 封装:每层把上层数据整体当载荷加自己的头部。MAC 逐跳变,IP 端到端不变。
- 端到端原则:端上必须做的检查,网络内部不必重做——除非有明确的性能收益。
- 沙漏模型:IP 是唯一的窄腰,这既是互联网可扩展性的来源,也是它难以演进的原因。
- 五类威胁:恶意软件、DoS、嗅探、IP 欺骗、中间人。它们的共同根源是互联网诞生于一个相互信任的环境。
十、自测答案
1. 应用层:进程↔进程(交换报文);传输层:进程↔进程(端到端可靠/不可靠传输);网络层:主机↔主机(跨越多个网络);链路层:相邻节点↔节点(一跳);物理层:一段物理介质上的比特。
2. 路由器实现第 1–3 层,交换机实现第 1–2 层。路由器不需要 TCP,因为 TCP 提供的是端到端的进程间可靠传输,而路由器不是通信的端点——它只负责把 IP 数据报往正确方向推。(例外:路由器自身作为一台主机运行 BGP、SSH 管理时会用 TCP,但那是它作为端系统的角色,与转发无关。)
3. TCP 校验和只覆盖在网络中传输的那一段,而且它是弱校验(16 位反码和,漏检率不低)。数据在离开 TCP 之后仍可能损坏:磁盘写入错误、内存位翻转、中间件(代理、NAT、CDN)改写、应用层 bug。既然只有应用能验证「最终存下来的文件是否正确」,那么完整性校验(如 SHA-256)就必须由应用做——这正是端到端原则的原始论证形式。
4. 腰窄意味着每一层的实现者只需要适配一个接口:新链路技术只要能承载 IP,新应用只要能用 IP,就自动互通。如果把 TCP 放进腰里,所有链路层设备都要理解 TCP,那么 ① UDP、QUIC 这类应用就无法部署;② 任何 TCP 的改进都要升级全球设备。腰越宽,功能越强,但演化越僵。
5. 因为 IP 协议的设计中就没有源地址认证机制——不是某个实现忘了检查,而是规范本身不要求、也没有提供任何手段去验证。要修复它需要修改全球所有网络的转发行为(BCP 38 入口过滤),而这是一个协同问题:单个 ISP 部署对自己没有直接收益(受益的是别人),因此长期部署不足。这是典型的结构性/激励问题,而非技术难题。
6. 40(载荷)+ 20(TCP)+ 20(IPv4)+ 18(以太网头 14 + FCS 4)= 98 字节。若计入以太网前导码 7 字节、SFD 1 字节和帧间隙 12 字节,实际占用 118 字节。开销占比 = (98−40)/98 ≈ 59.2%(按帧算)。这就是为什么交互式小包流量的实际链路效率极低。