一、为什么要分层

网络是人类造过的最复杂的工程系统之一。要管住这种复杂度,只有一个办法:分解。

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 地址在每一跳都被替换,永远不会跨越路由器传播。


八、随堂自测

  1. 说出五层模型每一层的「作用范围」(谁到谁)。
  2. 路由器实现到第几层?交换机呢?为什么路由器不需要实现 TCP?
  3. 用端到端原则论证:为什么文件传输的完整性校验必须由应用自己做,即使 TCP 已经有校验和?
  4. 沙漏模型的「腰」为什么必须窄?如果我们把 TCP 也放进腰里会怎样?
  5. 为什么说 IP 欺骗是一个结构性缺陷而不是实现 bug?
  6. 一个 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%(按帧算)。这就是为什么交互式小包流量的实际链路效率极低。