CS 168 · LECTURE 03 · 2026-09-03 · 互联网地基

从应用向下看:分层、封装与首部

把 HTTP 消息一路封装成 TCP segment、IP datagram 与 Ethernet frame,再在每一跳拆换链路首部。

版本快照:Fall 2026 官方课表与在线教材,核对日期 2026-09-02;官网仍标注 under construction,日期与政策可能变化。

  1. 互联网地基
  2. 路由
  3. 传输
  4. 应用与端到端
  5. 数据中心
  6. 群体通信
  7. 无线与移动

本章核心问题

为什么路由器可以转发 HTTPS 流量,却通常不知道用户请求的是哪个页面?

1 · 封装不是“不断复制”

发送端应用产生消息,TCP 加入端口、序号和标志,IP 加入源/目的地址与 TTL,链路层再加入本跳可达所需的地址和校验。接收端按相反顺序解复用。每层的 payload 正是上一层完整的协议数据单元。

封装让路由器只需解析到 IP 层便能工作;它不必理解 TCP 重传、DNS 名称或 HTTP 内容。这种信息隐藏既降低演化成本,也限定了网络中间设备能做的优化。

2 · 哪些字段逐跳变化

IP 源/目的地址通常端到端不变,但 TTL 每过一台路由器减一,IPv4 首部校验和随之更新。Ethernet 源/目的 MAC 只服务当前链路,到下一条链路必须换成新的两端地址。TCP 序号与端口由端点解释,普通路由器无需修改。

NAT、隧道与代理是重要例外:它们会修改或额外包裹跨层字段。看到抓包差异时,先问路径中是否有显式中间盒,而不是立刻认为协议定义失效。

3 · 复用与解复用

同一块网卡承载多种链路层 payload,EtherType 指出上层是 IPv4、IPv6 等;IP Protocol 字段指出 TCP、UDP 或 ICMP;TCP/UDP 端口再把数据交给应用 socket。这是一串逐层 key lookup。

“端口”也有两个不同语境:路由器的物理/逻辑接口决定从哪条链路发送;传输层端口是 16 位标识,帮助主机把 segment 交给进程。项目 2 的 simulator port 与 TCP port 不能混用。

4 · 首部开销与 MTU

每层首部消耗字节,链路还有最大传输单元(MTU)。若上层交付对象过大,就必须由某层分段或分片。现代 TCP 通常按 MSS 控制 segment payload,尽量避免 IP 分片。

调试时要用首部中的长度字段推进 offset,不能假设 IPv4 永远 20 B:IHL 指出实际首部长度,IP options 会改变后续 ICMP/UDP 首部的位置,这正是 Traceroute 1B 的典型边界。

交互推演:逐层追踪应用消息如何被封装成可在链路上传送的帧。

封装是包含关系与跨层状态变化,逐步展示比静态术语表更容易建立包的心智模型。

逐层追踪应用消息如何被封装成可在链路上传送的帧。的静态步骤概览

纠错:最容易带走的错误模型

闭卷推演

为 UDP Traceroute 的出站 probe 和返回 ICMP Time Exceeded 各画一棵封装树,指出返回包中为什么还嵌有原始 IP 首部与至少 8 B payload。

检查:IP 包从主机 A 经路由器到主机 B,哪项通常会在路由器处改变?

开始前:先固定四类名字

假设浏览器 10.1.2.7/02:aa:aa:aa:aa:07 访问服务器 203.0.113.9:443,第一跳网关接口是 10.1.2.1/02:bb:bb:bb:bb:01。先问自己:IP 地址标识端到端主机接口,MAC 地址只负责当前链路,端口把字节交给端点进程,TTL 限制数据报还能经过多少个路由器。

检查:路由器 R 转发普通 HTTPS 数据报时,必须知道哪个信息?

Worked Packet Journey:一个请求跨过路由器

下面不是协议名清单,而是同一批应用字节在设备、首部与表之间的完整旅程。为突出不变量,暂不引入 NAT 或代理。

步骤对象 / 事件添加或移除地址与状态谁理解它
0 · BrowserGET / 字节生成 HTTP message目标由 URL 解析成 203.0.113.9:443应用
1 · TCPmessage → segment加 TCP 头src port 51514,dst port 443;序号纳入发送状态两端 TCP
2 · IPsegment → datagram加 IP 头src IP 10.1.2.7,dst IP 203.0.113.9,TTL 64主机与路由器
3 · Host linkdatagram → frame加第一跳 Ethernet 头src MAC 02:aa…07,dst MAC 02:bb…01本链路网卡 / 交换机
4 · Router inputframe arrives验帧并移除链路头路由器看到 IP dst;TCP/HTTP 仍是 payload路由器输入端口
5 · Router forwardIP datagramTTL 64→63;更新 IPv4 header checksumsrc/dst IP 和 TCP ports 不变;查 FIB 选出口路由器 IP 层
6 · Router outputdatagram → new frame加下一跳链路头MAC 换成 R 出口与下一跳;IP 仍为两端地址路由器输出端口
7 · Destinationframe → datagram → segment → message逐层移除头Protocol→TCP,dst port 443→server socket服务器协议栈

跨越全程的不变量:在没有 NAT/隧道/代理时,目的 IP、TCP 端口和应用字节保持端到端语义;逐跳变量是链路地址,TTL 每跳递减。

检查:第 5 步之后,哪个组合正确?

检查:目的主机用什么顺序把数据交给 HTTPS socket?

Counterfactual:如果 MAC 地址端到端不换?

远端服务器的 MAC 在本地链路上没有意义,交换机也不会跨互联网学习它。主机会把帧交给默认网关;路由器必须为下一链路重新封装。若错误地保留原目的 MAC,下一链路无法把帧交给正确 next hop,即使 IP 路由完全正确也会停住。

反过来,如果路由器把 IP 目的地址改成 next hop,下一台路由器会误以为数据报已经抵达该接口,端到端目的地被破坏。这说明 link address 与 network address 不是重复字段,而是解决不同范围的问题。

误解拆解:packet 的字节全程不变

为什么诱人
“同一个请求”听起来像同一个不可变对象,抓包工具也常把每层统称为 packet。
具体反例
路由器必须把 TTL 64 改成 63,并把面向第一跳网关的 Ethernet 头换成下一链路头;否则环路不会终止或帧无法跨链路。
正确模型
跟踪嵌套对象:应用字节被端到端传输/网络语义包裹,而每一跳创建新的 link-layer envelope。

Packet Trace 深度检查

不看上表,填写路由器转发后的 src MAC / dst MAC / src IP / dst IP / TTL / src port / dst port。再指出 NAT 出现时哪一项会成为例外。

检查:若路径形成转发环,哪个字段保证单个 IP 数据报最终停止?

检查:抓到两个帧,IP 五元组相同但 MAC 两端不同,最合理的解释是什么?

Explain It Yourself

  1. 用“容器里的容器”之外的语言解释封装为何允许路由器不理解 HTTP。
  2. 闭卷画出 Browser → TCP → IP → Ethernet → Router → new Ethernet → Destination,并在每条边写出哪一个 header 改变。
自检标准

答案必须同时说清设备、地址作用域、解复用键和 TTL;只背“二层换、三层不换”还不足以解释原因。

从机制到 Project 1

解析 IHL
保护“内层 ICMP/UDP offset 由实际 IP header length 决定”的不变量,不能硬编码 20 B。
匹配 ICMP 引用
返回错误包含原 IP 头与至少 8 B payload,Traceroute 才能把它关联到具体 probe。
历史边界
你当年没有做 Project 1;这里是独立教学 trace,不伪装成 Fall 2026 官方答案。

一手资料

正文是 CourseStack 的中文解释与重新绘制的教学例子;官方页面负责课程原始定义,历史仓库只提供你的实现证据。