1.CS144 第一单元导论 - Katyusha's blog
mobile wallpaper 1mobile wallpaper 2mobile wallpaper 3mobile wallpaper 4mobile wallpaper 5mobile wallpaper 6mobile wallpaper 7
3058 字
8 分钟
1.CS144 第一单元导论
2026-09-10

CS144 第一单元导论#

第一单元要回答的核心问题其实很朴素:

一台电脑上的应用产生了一串数据,它怎样穿过许多不同的链路和路由器,最后交给另一台电脑上的正确应用?

这一单元出现了 HTTP、TCP、IP、Ethernet、IPv4、ARP 等许多名词,但不必一开始就背协议格式。先抓住一条主线:应用负责表达数据的意义,端系统负责组织通信,中间网络负责把一个个数据包逐跳送向目标。

1. 从一次网页访问开始#

假设浏览器要访问一台 Web 服务器。浏览器先确定服务器的 IP 地址和 TCP 端口,建立 TCP 连接,再发送 HTTP 请求。请求离开电脑前,会被逐层包装成网络能够处理的对象:

HTTP 请求
↓ 传输层加入控制信息
TCP segment
↓ 网络层加入源、目的 IP 等信息
IP datagram
↓ 链路层加入当前一跳的地址信息
Ethernet / Wi-Fi frame

这些不是四份互不相关的数据,而是同一份应用数据被一层层装入新的“外壳”。到达服务器后,各层再按相反顺序拆开,最终把 HTTP 字节交给 Web 服务进程。

从操作系统视角看,应用只是通过 socket 文件描述符读写字节;写入成功通常只表示数据进入了内核缓冲区,并不等于数据已经离开网卡,更不等于服务器已经收到。

2. Internet 四层模型#

Internet 用分层控制复杂度,每一层只承担一类职责:

层主要问题常见协议或技术数据对象
应用层这些字节对应用意味着什么?HTTP、SSH、BitTorrentmessage
传输层怎样把数据交给目标主机上的正确进程?TCP、UDPsegment / datagram
网络层怎样跨越多个网络到达目标主机?IPIP datagram
链路层怎样跨过当前这一跳?Ethernet、Wi-Fiframe

IP 位于不同应用与不同链路之间

IP 位于中间,像一条“细腰”:上面可以运行许多传输协议和应用,下面也可以使用完全不同的链路技术。只要上下双方都能使用 IP,就不需要让每一种应用分别适配每一种网卡和链路。

分层最重要的不是层数,而是稳定的接口:上层使用下层提供的服务,却不依赖下层内部的具体实现。于是 Wi-Fi 可以换成 Ethernet,浏览器的 HTTP 逻辑通常不需要跟着重写。

3. 三个贯穿全课的原则#

3.1 分组交换:把链路按包共享#

Internet 不会为每次通信预先占用一条端到端专线,而是把数据拆成许多可以独立处理的分组。路由器收到一个分组后,只做一个局部动作:

收到分组 → 查看目的 IP → 选择下一跳 → 立即发送或进入队列

这样,一条链路可以交替承载许多应用的流量,空闲用户不会白白占着资源,这称为统计复用。代价是多个分组同时争用链路时需要排队,因此时延会变化;队列满时,分组还可能被丢弃。

3.2 分层:把职责和状态隔开#

路由器不需要理解网页内容,IP 也不需要知道 TCP 如何重传。每层只读取自己负责的首部、维护自己的状态,并向上层提供约定好的服务。这让系统更容易理解、替换和扩展。

分层不是绝对禁止跨层信息,而是要求越层依赖有明确理由。隐藏地依赖另一层的内部细节,往往会让一次局部修改扩散成整个系统的联动修改。

3.3 封装:上层对象成为下层载荷#

应用数据被逐层封装

当前层通常只解释自己的头部,把内部内容整体视为 payload(载荷)。链路层不需要理解 HTTP;路由器转发 IP 数据报时,也不需要理解其中是 TCP、UDP 还是别的协议。

最外层的链路帧只在一跳内有效:数据报进入路由器后,旧帧会被拆开;路由器更新必要的 IP 字段,再为下一条链路装入一个新帧。IP 的最终目的地址通常保持不变,而逐跳使用的链路层地址会不断变化。

VPN 展示了封装还可以递归发生:一个完整的 IP 包也能被当作新的载荷,放进另一条加密隧道中传输。不过,封装本身只表示数据的层次关系,并不自动意味着加密。

4. IP 提供的是“尽力而为”#

IP 的基本对象是 IP 数据报。每个数据报都带着最终目的 IP,因此路由器可以独立转发它,不必先为整次通信建立连接。

IP 的服务模型可以压缩成三点:

  • 无连接:发送前不要求网络中的所有路由器建立一条会话。
  • 逐数据报处理:每个数据报可以被独立转发,连续的包不一定走完全相同的路径。
  • 尽力而为:网络会尝试投递,但不保证一定送达、只到一次或按顺序到达。

这不是缺陷,而是清晰的职责边界。全球所有路由器共同实现一个简单的 IP 底座,可靠性、顺序恢复和应用是否真正成功,则由端系统上的 TCP 或应用协议负责。

客户端和服务器之间的数据报经过多台路由器

图中看起来像一条端到端连接,但每台路由器实际上只知道自己的本地转发表和下一跳,没有一台设备掌握这次网页访问的完整进度。

5. IPv4 地址怎样帮助转发#

IPv4 地址是一个 32 bit 的网络层地址,通常写成 192.168.0.106 这样的点分十进制形式。它标识的是网络层端点,不是某个进程,也不是当前链路上的网卡地址。

CIDR 用“地址/前缀长度”描述一个地址范围,例如:

192.168.0.106/24

/24 表示前 24 bit 是网络前缀,剩余部分用于区分这个子网中的接口。子网掩码 255.255.255.0 是同一前缀的另一种写法。判断两个地址是否属于同一子网,本质上是在掩码后比较它们的网络前缀,而不是机械地比较前三段十进制数字。

主机和路由器都要根据目的 IP 选择下一步。路由表中可能有多条规则同时匹配,此时采用 最长前缀匹配(Longest Prefix Match, LPM):

先找出所有匹配目的 IP 的路由,再选前缀最长、也就是范围最具体的那一条。

路由器依据目的 IP 选择下一条链路

0.0.0.0/0 不比较任何地址位,因此能匹配所有目的地址,常被用作默认路由;只要存在更具体的匹配,它就不会优先。

这里必须区分两个概念:

  • 最终目的 IP 写在数据报中,说明数据最终要到哪台主机;
  • 下一跳 是当前设备根据路由表选出的相邻设备,只说明这一刻先交给谁。

路由器通常不会把最终目的 IP 改成下一跳地址。

6. ARP 补上“最后一小步”#

路由决定了下一跳 IP,但 Ethernet 网卡真正发送帧时,需要的是下一跳网卡的 MAC 地址。ARP(Address Resolution Protocol,地址解析协议)负责完成本地映射:

下一跳 IPv4 地址 → 当前链路上的 MAC 地址

ARP 通过请求和应答建立本地映射

如果映射不在缓存中,主机会在本地网络广播询问“谁拥有这个 IP”;拥有该地址的设备再直接回答自己的 MAC。得到结果后,主机缓存映射并发送此前等待的 IP 数据报。

ARP 只在当前链路内工作。若服务器与本机不在同一子网,本机查询的是默认网关的 MAC,而不是远端服务器的 MAC。数据报每经过一个路由器,下一段链路都会重新选择下一跳并使用新的链路层地址。

7. 网络上传的是字节,不是 C++ 结构体#

协议在线路上规定的是一串确定顺序的字节。多字节整数通常使用大端的网络字节序,而主机内存可能使用小端序,因此程序要在协议边界进行明确转换,例如 htons、htonl、ntohs、ntohl。

不要直接把收到的字节缓冲区强制转换为本机结构体:除了端序,还会遇到对齐、填充、对象生命周期和越界读取等问题。更稳妥的做法是先检查长度,再按协议规定的偏移读取字段并转换字节序。

对于导论,记住一句话就够了:网络协议定义线上表示,编译器和 ABI 决定本机对象表示;二者不能混为一谈。

8. 不同应用为什么使用同一张网络#

第一单元用几个应用展示了相同底座上的不同需求:

应用主要通信模式关键问题
HTTP客户端连接固定服务器请求和响应如何在字节流中表达
BitTorrent多个 peer 互相交换文件片段如何发现拥有所需片段的节点
Skype 一类实时通信寻找并连接某个特定用户NAT 后的设备怎样被通知并建立连接

家庭网络常使用 NAT,让多台设备共享一个公网 IP。外部设备通常不能随意向内网主机发起连接,因此实时通信会借助公网 rendezvous(会合)服务器传递“谁在呼叫谁”的控制消息;若双方无法直连,还可以通过 relay(中继)转发实际数据。

这些应用模式差异很大,却都能建立在同一套分层、IP 数据报和链路传输机制之上。这正是 Internet 架构可扩展性的来源。

9. 把第一单元压缩成一条因果链#

应用产生有意义的数据
↓
传输层把数据交给远端进程
↓
IP 把传输层对象装入自包含的数据报
↓
主机或路由器对目的 IP 做最长前缀匹配,选出下一跳
↓
ARP 把下一跳 IP 解析为本地链路地址
↓
链路层发送一跳帧;下一台路由器重复上述过程
↓
目的主机逐层解封装,把数据交给目标应用

以后遇到任何新协议,可以先问四个问题:

  1. 它位于哪一层,向上提供什么服务?
  2. 它处理的是消息、字节流、数据报还是帧?
  3. 当前设备读取哪个首部,又决定最终目标还是下一跳?
  4. 丢失、重复、乱序或超时发生后,哪一层拥有足够状态来恢复?

第一单元建立的是 Internet 的整体地图。下一单元会进入传输层,讨论当 IP 只能“尽力而为”时,端系统怎样用确认、重传、窗口和状态机提供可靠的 TCP 字节流。

课程材料依据#

  • AIGC R066:1-12 The Internet and IP Recap,用于核对第一单元的整体结构与四条主线。
  • AIGC R048、R049、R051、R052、R055、R064、R065:分别对应四层模型、IP 服务、分组交换、分层、IPv4、最长前缀匹配与 ARP。
  • 官方 R028:核对 IP 数据报、封装、复用与 best-effort 的职责边界。
  • 官方 R006 第 1、3—4 页:核对网络接口、下一跳与 ARP;官方 R007 第 1、3—4 页:核对路由器与最长前缀匹配。

上述 AIGC 讲义与官方材料在本文涉及的核心概念上没有发现冲突。字节序主要来自 AIGC 1-8 byte order,官方 Winter 2024 讲义没有直接展开这一主题。

分享

如果这篇文章对你有帮助,欢迎分享给更多人!

1.CS144 第一单元导论
https://katyusha-blog.com/posts/cs144/notes/chatper-1introduction/
作者
katyusha
发布于
2026-09-10
许可协议
CC BY-NC-SA 4.0

部分信息可能已经过时

目录