一、为什么要分层

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

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%(按帧算)。这就是为什么交互式小包流量的实际链路效率极低。