COMP5416 Week 03 应用层讲课总结
COMP5416 Week 03 讲课总结:Network Applications
课程:COMP5416/COMP4416 — Advanced Network Technologies,Semester 2 2026 讲师:Professor Vincent Gramoli 讲义:
W3-Applications.pdf(67 页) 教材:Kurose & Ross, Computer Networking: A Top-Down Approach, 9th ed. —— 第 2 章,2.1 / 2.2 / 2.3 节⚠️ Midterm quiz 在 Week 6,占 20%,20 道选择题。 ✅ 老师已说明:期中不考 Week 6 的内容,范围就是 Week 1–5。
本讲是考纲里概念密度最高的一周 —— 协议对比、端口号、状态性这类 MCQ 送分题全在这里。
第一部分:应用层与应用架构
一、为什么只需要写端系统的程序
写运行在(不同)端系统上、通过网络通信的程序。 不需要为网络核心设备写软件 —— 网络核心设备不运行用户应用。
这带来的好处:应用可以快速开发和推广(rapid app development, propagation)。
为什么这一点重要:这是互联网设计哲学的直接体现 —— 把智能放在边缘(end systems),把网络核心保持简单。 想推一个新应用,只要在两台主机上装软件即可,不需要说服全世界的路由器厂商升级设备。
讲义列举的网络应用:电子邮件、Web、即时消息、远程登录、P2P 文件共享、多人网游、流媒体视频(YouTube、Hulu、Netflix)、VoIP(Skype)、实时视频会议、社交网络、搜索。
二、两种应用架构
| Client-Server | P2P | |
|---|---|---|
| 服务器 | always-on 主机,永久 IP 地址,用数据中心扩展 | 没有 always-on 服务器 |
| 端系统关系 | 客户之间不直接通信 | 任意端系统直接通信,对等方互相请求并提供服务 |
| 连接性 | 客户可能间歇连接,可能是动态 IP | 对等方间歇连接且会换 IP |
| 扩展性 | 靠加服务器 | 自扩展(self-scalability) |
| 管理 | 相对简单 | 复杂 |
self-scalability 的含义(P2P 的标志性考点)
讲义原话:「新对等方带来新的服务能力,同时也带来新的服务需求。」
换句话说:新用户既是负担也是资源 —— 这是 C/S 架构完全没有的性质。 C/S 里每来一个用户,服务器负担就多一分;P2P 里每来一个用户,系统总上传能力也涨一分。
量化版本见 Week 04 的文件分发公式 —— P2P 的分母
随 N 增长,正是自扩展的数学表达。
第二部分:进程通信与寻址
三、进程与套接字
| 概念 | 定义 |
|---|---|
| 进程 | 主机上运行的程序 |
| 同一主机内的通信 | 操作系统定义的进程间通信(IPC) |
| 不同主机间的通信 | 交换消息 |
| 角色 | 定义 |
|---|---|
| 客户进程 | 发起通信的进程 |
| 服务器进程 | 等待被联系的进程 |
讲义的旁注很重要:P2P 架构的应用里,同时存在客户进程和服务器进程。
也就是说:「客户/服务器」描述的是「进程角色」,不是「系统架构」。 一个 BitTorrent 节点在下载时是客户进程,在上传时是服务器进程 —— 同一台机器同时扮演两种角色。
四、套接字(Socket)
套接字类比一扇门:
- 发送进程把消息推出门外
- 发送进程依赖门外的传输基础设施把消息送到接收进程的套接字
发送进程 接收进程 |
这个比喻的精髓在「依赖」二字:发送方把消息推出门就管不着了, 后面能不能送到、按什么顺序送到,取决于门外那套基础设施是 TCP 还是 UDP。
五、进程寻址(高频 MCQ)
Q:主机的 IP 地址是否足以标识进程? A:不能 —— 同一主机上可能运行很多进程。
标识符 = IP 地址 + 端口号。
端口号汇总
| 服务 | 端口 | 讲义是否点名 |
|---|---|---|
| HTTP | 80 | ✓ |
| SMTP(邮件服务器) | 25 | ✓ |
| FTP 控制 | 21 | ✓ |
| FTP 数据 | 20 | ✓ |
| DNS | 53 | Week 4 |
| POP3 | 110 | 补充 |
| IMAP | 143 | 补充 |
讲义给的完整例子:给 gaia.cs.umass.edu
的 Web 服务器发 HTTP 消息,需要 IP 地址
128.119.245.12 + 端口号 80。
💡 主机 IP 是 32 位(IPv6 是 128 位)。
六、应用层协议定义了什么
| 要素 | 内容 |
|---|---|
| 消息类型 | 如请求、响应 |
| 消息语法 | 有哪些字段、字段如何分隔 |
| 消息语义 | 字段中信息的含义 |
| 规则 | 进程何时、如何发送与响应消息 |
| 类型 | 特点 | 例子 |
|---|---|---|
| 开放协议 | 在 RFC 中定义,允许互操作性 | HTTP、SMTP |
| 专有协议 | 不公开 | Skype |
「开放 vs 专有」的实际意义:HTTP 是 RFC 定义的,所以任何人写的浏览器都能访问任何人写的服务器。 Skype 早期是专有协议,只能用官方客户端 —— 这就是互操作性的价值。
第三部分:传输服务需求与 TCP/UDP
七、应用需要什么样的传输服务(四个维度)
| 维度 | 说明 |
|---|---|
| 数据完整性 | 有些应用(文件传输、Web 事务)要求 100% 可靠;有些(音频)可容忍丢失 |
| 时延(timing) | 网络电话、交互游戏要求低时延才「有效」 |
| 吞吐量 | 多媒体需要最低吞吐量;「弹性应用(elastic apps)」有多少用多少 |
| 安全 | 加密、数据完整性 |
八、常见应用的需求对照表(MCQ 常考)
| 应用 | 数据丢失 | 吞吐量 | 时间敏感 |
|---|---|---|---|
| 文件传输 | 不能丢 | 弹性 | 否 |
| 电子邮件 | 不能丢 | 弹性 | 否 |
| Web 文档 | 不能丢 | 弹性 | 否 |
| 实时音视频 | 可容忍丢失 | 音频 5 kbps–1
Mbps 视频 10 kbps–5 Mbps |
是,100 毫秒级 |
| 存储音视频 | 可容忍丢失 | 同上 | 是,几秒级 |
| 交互游戏 | 可容忍丢失 | 几 kbps 起 | 是,100 毫秒级 |
| 文本消息 | 不能丢 | 弹性 | 是也不是 |
两组最容易被考的对比:
- 实时音视频(100 毫秒级)vs 存储音视频(几秒级) —— 存储视频可以缓冲,所以对时延宽容得多。
- 交互游戏的吞吐量要求很低(几 kbps)但时延要求极严(100 毫秒) —— 说明「吞吐量」和「时延」是两个独立的维度,不能混为一谈。
九、TCP vs UDP(必背)
| 服务 | TCP | UDP |
|---|---|---|
| 可靠传输 | ✅ | ❌ |
| 流量控制 | ✅ 发送方不会淹没接收方 | ❌ |
| 拥塞控制 | ✅ 网络过载时抑制发送方 | ❌ |
| 面向连接 | ✅ 需要建立 | ❌ 无需连接建立 |
| 时延保证 | ❌ | ❌ |
| 最低吞吐量保证 | ❌ | ❌ |
| 安全 | ❌ | ❌ |
两个都不提供的三样东西:时延、最低吞吐量、安全。 这是 MCQ 的经典陷阱选项。
讲义在 UDP 那一栏后面直接抛了个问题: 「既然 UDP 什么都不保证,为什么还要有它(Why bother? Why is there a UDP)?」 答案要到 Week 05 才完整给出: 无连接建立时延、无连接状态、首部只有 8 字节、无拥塞控制(想多快发多快)。
十、常见应用用什么协议(高频 MCQ)
| 应用 | 应用层协议 | 传输层协议 |
|---|---|---|
| 电子邮件 | SMTP [RFC 2821] | TCP |
| 远程终端 | Telnet [RFC 854] | TCP |
| Web | HTTP [RFC 2616] | TCP |
| 文件传输 | FTP [RFC 959] | TCP |
| 流媒体 | HTTP(如 YouTube)、RTP [RFC 1889] | TCP 或 UDP |
| 网络电话 | SIP、RTP、专有(如 Skype) | TCP 或 UDP |
记忆分界:前四个全是 TCP,后两个是「TCP 或 UDP」。
为什么后两个可以二选一:多媒体应用容忍丢包, 用 UDP 能避免重传带来的卡顿;但用 TCP 能穿过只放行 TCP 的防火墙 —— 所以实际部署中两种都有(YouTube 走 HTTP over TCP,Skype 优先 UDP)。
十一、保护 TCP:SSL
| 说明 | |
|---|---|
| TCP & UDP 本身 | 不加密;明文密码进入套接字后以明文穿越互联网 |
| SSL 提供什么 | 加密的 TCP 连接、数据完整性、端点认证 |
| SSL 在哪一层 | SSL 在应用层 —— 应用使用 SSL 库,库再与 TCP「对话」 |
| SSL 套接字 API | 明文密码进入套接字后以加密形式穿越互联网 |
「SSL 位于应用层」是极易出错的 MCQ 点。
为什么容易错:SSL 提供的是「加密的 TCP 连接」,字面上看像传输层的东西。 但它的实现是一个应用可以链接的库 —— 应用调 SSL 库,SSL 库再调普通的 TCP 套接字。 传输层内核代码完全不知道 SSL 的存在。
💡 一个实测佐证:Week 04 的 Wireshark tutorial 里, HTTP Basic 认证的密码是 Base64 编码(不是加密)—— 抓包就能还原出明文。 这正是「TCP 不加密,需要 SSL」的直接演示。
第四部分:Web 与 HTTP
十二、基本概念
- 网页由对象(objects)组成;对象可以是 HTML 文件、JPEG 图片、Java applet、音频文件
- 网页由一个基础 HTML 文件 + 若干引用对象构成
- 每个对象由 URL 寻址:
www.someschool.edu/someDept/pic.gif |
十三、HTTP 概览
| 特性 | 说明 |
|---|---|
| 全称 | HyperText Transfer Protocol |
| 模型 | 客户/服务器 |
| 客户是谁 | 浏览器 —— 请求、接收、「显示」Web 对象 |
| 服务器是谁 | Web 服务器 —— 响应请求发送对象 |
| 传输 | TCP,端口 80 |
| 状态性 | HTTP 是无状态的(stateless) |
一次 HTTP 交互的四步
| 步骤 | 动作 |
|---|---|
| 1 | 客户发起到服务器 80 端口的 TCP 连接(创建套接字) |
| 2 | 服务器接受来自客户的 TCP 连接 |
| 3 | 浏览器与 Web 服务器之间交换 HTTP 消息 |
| 4 | TCP 连接关闭 |
为什么 HTTP 要设计成无状态(讲义的旁注)
「维护状态的协议很复杂!」
原因 说明 必须保存历史 服务器要为每个客户记住之前发生过什么 崩溃后不一致 若服务器/客户崩溃,双方对状态的看法可能不一致,还得协调修复 代价:要加状态就得另想办法 —— 这就是 Cookie 存在的理由(第十八节)。
十四、持久 vs 非持久 HTTP(核心考点)
| 非持久 HTTP | 持久 HTTP | |
|---|---|---|
| 每条 TCP 连接 | 最多发送一个对象,然后连接关闭 | 可发送多个对象 |
| 多对象 | 需要多条连接 | 单条连接上完成 |
| 请求时机 | 逐个来回 | 客户一遇到引用对象就发请求 |
非持久 HTTP 的完整六步(讲义 p23)
场景:用户输入
www.someSchool.edu/someDepartment/home.index(含文本和
10 张 jpeg 的引用)
| 步骤 | 动作 |
|---|---|
| 1a | 客户发起到
www.someSchool.edu 80 端口的 TCP 连接 |
| 1b | 服务器在 80 端口等待,接受连接,通知客户 |
| 2 | 客户把 HTTP 请求消息(含 URL)送进套接字 |
| 3 | 服务器收到请求,构造含被请求对象的响应消息,送进套接字 |
| 4 | 服务器关闭 TCP 连接 |
| 5 | 客户收到响应,显示 HTML;解析 HTML,发现 10 个引用的 jpeg 对象 |
| 6 | 对这 10 个对象各重复一次步骤 1–5 |
注意步骤 4 的位置 —— 服务器在发完一个对象后就主动关连接, 所以取 10 张图要重新建 10 次 TCP 连接。这就是「非持久」的字面含义。
十五、响应时间公式(必背)
RTT 定义:一个小分组从客户到服务器再回来的时间。
三个组成部分的时间轴:
客户 服务器 |
| 组成 | 用途 |
|---|---|
| 1 个 RTT | 发起 TCP 连接 |
| 1 个 RTT | HTTP 请求 + 响应的前几个字节返回 |
| 文件传输时间 | 传完整个文件 |
持久 HTTP:所有引用对象最少可以只用 1 个 RTT。
非持久 HTTP 的三个问题(讲义 p25)
| # | 问题 |
|---|---|
| 1 | 每个对象需要 2 个 RTT |
| 2 | 每条 TCP 连接都有操作系统开销 |
| 3 | 浏览器常开并行 TCP 连接来抓取引用对象 |
三种方式的 RTT 通用公式(自己推的,考试直接套)
基础对象永远要
| 方式 | 引用对象部分 | 总计 |
|---|---|---|
| 非持久·串行 | ||
| 非持久·并行(上限 |
||
| 持久 + 并行(上限 |
||
| 持久 + 流水线(无并行上限) |
⚠️ 「持久」有两种口径,别混用:
口径 引用对象耗时 什么时候用 持久 + 流水线 所有对象共 1 个 RTT 题目说「persistent HTTP with pipelining」或没提并行上限 持久 + 并行上限 分 轮,每轮 1 个 RTT 题目给了「maximum of k parallel TCP connections」 本课程 tutorial 和 Kurose 交互题用的都是第二种(给了
)。 时两者相同,所以小题看不出区别 —— 时才会分家。
代入不同的引用对象数
| 非持久串行 | 非持久并行 | 持久+并行 | 持久+流水线 | |
|---|---|---|---|---|
| 0 | 2 RTT | 2 RTT | 2 RTT | 2 RTT |
| 1 | 4 RTT | 4 RTT | 3 RTT | 3 RTT |
| 3 | 8 RTT | 4 RTT | 3 RTT | 3 RTT |
| 5 | 12 RTT | 4 RTT | 3 RTT | 3 RTT |
| 10 | 22 RTT | 6 RTT | 4 RTT | 3 RTT |
| 20 | 42 RTT | 10 RTT | 6 RTT | 3 RTT |
讲义的典型题:「一个页面含 1 个 HTML + 10 张图,非持久 HTTP 需要多少 RTT(忽略传输时间)?」 答案:
个 RTT。 注意
、 这一行:持久+并行是 4 个 RTT 而不是 3 —— 10 个对象要分 2 轮,每轮 1 个 RTT。这一行正是 Kurose 交互题的标准配置。 💡 和 Week 05 的 DNS tutorial 联动: 那道题在这几条公式前面再加一个 DNS 查询时延,形式完全一样。
十六、HTTP 请求消息
ASCII 格式(人类可读)。讲义给的实例:
GET /index.html HTTP/1.1\r\n ← 请求行 |
通用格式:
请求行: 方法 sp URL sp 版本 cr lf |
\r\n是回车(CR)+ 换行(LF) —— 连续两个\r\n表示首部结束、实体体开始。 这个「空行分隔」的设计和邮件消息格式(RFC 822)是一样的。
十七、提交表单输入的两种方式
| 方式 | 做法 | 特点 |
|---|---|---|
| POST 方法 | 输入放在实体体(entity body)中上传 | 数据不出现在 URL 里 |
| URL 方法 | 用 GET 方法,输入放在请求行的 URL 字段里 | 数据出现在 URL 里 |
URL 方法的例子:
www.google.com.au/search?q=new&ie=utf-8 |
十八、方法类型(按版本区分,易考)
| 版本 | 方法 |
|---|---|
| HTTP/1.0 | GET、POST、HEAD |
| HTTP/1.1 | GET、POST、HEAD + PUT、DELETE |
| 方法 | 作用 |
|---|---|
| GET | 请求对象 |
| POST | 在实体体中上传表单输入 |
| HEAD | 要求服务器在响应中「不要」包含被请求的对象(只回首部) |
| PUT | 把实体体中的文件上传到 URL 指定的路径 |
| DELETE | 删除 URL 字段指定的文件 |
PUT 和 DELETE 是 1.1 才有的 —— 这是常考的版本区分点。
HEAD 的用途:想知道对象的元信息(大小、修改时间)但不想下载它 —— 比如爬虫检查链接是否有效、缓存检查对象是否变化。
十九、HTTP 响应消息与状态码
讲义给的实例:
HTTP/1.1 200 OK\r\n ← 状态行 |
状态码出现在服务器→客户响应消息的第一行。
| 状态码 | 含义 |
|---|---|
| 200 OK | 请求成功,对象在本消息后面 |
| 301 Moved Permanently | 对象已移动,新位置在本消息的
Location: 中 |
| 400 Bad Request | 服务器无法理解该请求消息 |
| 404 Not Found | 服务器上找不到该文档 |
| 505 HTTP Version Not Supported | 不支持的 HTTP 版本 |
| 304 Not Modified | 条件 GET 的响应 —— 缓存副本仍是最新的(见第二十三节) |
状态码的首位数字是分类:2xx 成功、3xx 重定向、4xx 客户端错误、5xx 服务器错误。 讲义给的 5 个刚好覆盖了 2/3/4/5 四类。
二十、自己动手试 HTTP(讲义 p39)
telnet cis.poly.edu 80 # 打开到 80 端口的 TCP 连接 |
然后输入(敲两次回车):
GET /~ross/ |
「敲两次回车」正是因为需要那个空行来标志首部结束 —— 呼应第十六节的消息格式。 这个练习的价值:HTTP 是纯 ASCII 协议,人手就能敲出一个合法请求。
第五部分:HTTP/2
二十一、要解决什么
核心目标:降低多对象 HTTP 请求的时延(decreased delay in multi-object HTTP requests)。
HTTP/1.1 的问题:
| 问题 | 说明 |
|---|---|
| 流水线 GET | HTTP/1.1 引入了单条 TCP 连接上的多个流水线 GET |
| FCFS 响应 | 服务器按先来先服务(first-come-first-served)顺序响应 |
| 队头阻塞 | FCFS 导致小对象可能排在大对象后面等待 —— Head-of-Line (HOL) blocking |
| 丢包放大 | 丢包恢复(重传丢失的 TCP 段)会阻塞对象传输 |
HOL 阻塞的量化示意
场景(讲义 p34):客户请求 1 个大对象 O1 + 3 个小对象 O2/O3/O4。 假设 O1 需要 100 个时间单位,O2–O4 各需 1 个单位。
| 协议 | O1 完成 | O2 完成 | O3 完成 | O4 完成 | 小对象平均完成时刻 |
|---|---|---|---|---|---|
| HTTP/1.1(FCFS) | 100 | 101 | 102 | 103 | 102 |
| HTTP/2(分帧交错) | 103 | 1 | 2 | 3 | 2 |
代价与收益一目了然:
- 小对象平均完成时刻从 102 降到 2 —— 快了约 51 倍
- O1 只从 100 推迟到 103 —— 讲义原话「O1 slightly delayed」
这就是为什么分帧交错值得做:牺牲一点大对象的完成时间,换取所有小对象的大幅提前。
二十二、HTTP/2 的改进 [RFC 7540, 2015]
| 改进 | 说明 |
|---|---|
| 兼容性 | 方法、状态码、大多数首部字段与 HTTP/1.1 不变 |
| 传输顺序 | 按客户端指定的对象优先级传输,不必是 FCFS |
| 服务器推送 | 主动推送客户未请求的对象 |
| 分帧 | 把对象切成帧,调度帧的发送以缓解 HOL 阻塞 |
帧与流(Frames and Streams)
| 概念 | 定义 |
|---|---|
| Frame(帧) | HTTP/2
的基本数据单元,取代 HTTP/1.1 的「首部 +
体」格式 二进制编码(更高效) 分 Header frames 和 Data frames |
| Stream(流) | 传输帧的双向通道,取代 HTTP/1.1 的请求-响应模式 |
一句话记住整个架构:单条 TCP 连接承载多个流,每个流由多个帧组成。
HTTP/2 的两大变化:
- 二进制分帧(取代文本格式)
- 多路复用的流(取代一问一答)
服务器推送(Server Push)
HTTP/2 的 Server Push 机制允许服务器在「相信客户会需要」时主动发送资源, 而不必等待请求。
典型用法:客户请求
index.html,服务器知道这个页面必然会引用style.css和app.js, 于是不等客户解析完 HTML 就把这两个文件推过去 —— 省掉一个 RTT。
第六部分:Cookie 与 Web 缓存
二十三、Cookie:给无状态的 HTTP 加状态
四个组成部分(考点)
| # | 组成 |
|---|---|
| 1 | HTTP 响应消息中的 cookie
首部行(Set-cookie:) |
| 2 | 下一个 HTTP 请求消息中的 cookie
首部行(cookie:) |
| 3 | 保存在用户主机上的 cookie 文件,由用户的浏览器管理 |
| 4 | 网站后端的数据库 |
完整流程(讲义 p40–41 的 Amazon 例子)
客户 服务器(Amazon) |
注意 cookie 文件里可以同时存多个站点的条目(讲义画的是
ebay 8734和amazon 1678)—— 浏览器按域名分别管理,发请求时只带对应站点的那条。
用途与隐私
| 能用来做什么 | 隐私问题 |
|---|---|
| 授权(authorization) | cookie 让站点能了解你很多信息 |
| 购物车 | 你可能会向站点提供姓名和邮箱 |
| 推荐 | |
| 用户会话状态(Web 邮件) |
讲义总结的两种保持状态的方式:
方式 说明 协议端点 在发送方/接收方跨多次事务维护状态 Cookie 由 HTTP 消息携带状态 HTTP 选了第二条路 —— 状态不在服务器的连接里,而在每次请求都带上的那个 ID 里。 这样服务器仍然是无状态的(不为连接保存上下文),状态被外置到了数据库。
二十四、Web 缓存(代理服务器)
工作方式
目标:在不惊动源服务器的情况下满足客户请求。
| 步骤 | 动作 |
|---|---|
| 1 | 用户设置浏览器:所有 HTTP 请求先发给缓存 |
| 2 | 若对象在缓存中 → 缓存直接返回 |
| 3 | 否则 → 缓存向源服务器请求,再返回给客户 |
缓存既是客户又是服务器(高频 MCQ)
Q:缓存扮演客户还是服务器? A:两者都是。
面向谁 扮演什么 最初发请求的客户 服务器 源服务器 客户
缓存通常由 ISP 安装(大学、公司、住宅 ISP)。
为什么要 Web 缓存
| 理由 | 说明 |
|---|---|
| 减少客户请求的响应时间 | — |
| 减少机构接入链路上的流量 | 这才是缓存最主要的经济价值 |
| 让「穷」内容提供者也能有效交付内容 | 💡 讲义补了一句:P2P 文件共享也有同样作用 |
二十五、完整算例(讲义 p46–49,必考)
假设条件
| 参数 | 值 |
|---|---|
| 平均对象大小 | 100 K bits |
| 浏览器到源服务器的平均请求率 | 15 /秒 |
| 到浏览器的平均数据率 | 1.50 Mbps |
| 机构路由器到任意源服务器的 RTT | 2 秒 |
| 接入链路速率 | 1.54 Mbps |
| 局域网 | 1 Gbps |
数据率的来源:
三个方案的完整对照
| 方案 | 走接入链路的数据率 | 接入链路利用率 | 总时延 | 成本 |
|---|---|---|---|---|
| ① 原始配置 | 1.50 Mbps | 99% | 2 秒 + 数分钟 + 微秒 | — |
| ② 加粗到 154 Mbps | 1.50 Mbps | 约 1% | 毫秒级 | 不便宜! |
| ③ 装缓存(命中 0.4) | 0.9 Mbps | 0.58 | 约 1.2 秒 | 便宜 |
方案①:为什么会「数分钟」
总时延 = 互联网时延 + 接入时延 + LAN 时延 = 2 秒 + 数分钟 + 微秒
关键理解:接入链路利用率接近 100% 时,排队时延会爆炸。 这是排队论的基本结论 —— 利用率趋近 1 时排队时延趋于无穷。
💡 自己核算:
,讲义写 99%(教材的取整口径),结论不变:接近饱和。
方案②:加粗链路
⚠️ 讲义 p47 标注的「9.9%」需要留意:
Kurose 原书给的是约 0.99% —— 讲义上的 9.9% 极可能是 0.99% 的笔误(小数点错位)。 考试时按「利用率降到约 1%」理解即可。
方案③:装本地缓存(三步解题模板)
假设缓存命中率
第一步 —— 算走接入链路的数据率:
第二步 —— 算利用率:
第三步 —— 算总时延:
注意 2.01 这个数:2 秒 RTT + 0.01 秒接入链路时延(利用率 0.58 时排队时延已经很小)。
讲义的结论:比 154 Mbps 的链路时延更低,而且更便宜。
命中率的敏感性分析(自己算的,帮助理解)
| 命中率 |
接入链路利用率 | 总时延 |
|---|---|---|
| 0% | 97.4% | 2.01 s |
| 20% | 77.9% | 1.61 s |
| 40% | 58.4% | 1.21 s |
| 60% | 39.0% | 0.80 s |
| 80% | 19.5% | 0.40 s |
规律:命中率每提高 0.2,利用率降约 19.5 个百分点,总时延降约 0.4 秒 —— 两者都是线性的(因为公式里
是一次项)。
二十六、条件 GET(Conditional GET)
目标:如果缓存已有最新版本,就不要再传对象。 好处:无对象传输时延、更低的链路利用率。
| 方向 | 内容 |
|---|---|
| 缓存 → 服务器 | 在 HTTP
请求中写明缓存副本的日期:If-modified-since: <date> |
| 服务器 → 缓存(未修改) | HTTP/1.0 304 Not Modified,响应不含对象 |
| 服务器 → 缓存(已修改) | HTTP/1.0 200 OK
+ 数据 |
缓存 服务器 |
If-modified-since与304 Not Modified这一对是必考组合。💡 实测版本见 Week 04 笔记的 Wireshark tutorial —— 那里能看到第一次 GET 没有
If-modified-since、第二次有且服务器返回 304 的真实抓包。
第七部分:FTP
二十七、基本特性
| 特性 | 说明 |
|---|---|
| 功能 | 在远程主机之间传输文件 |
| 模型 | 客户/服务器 |
| 客户是谁 | 发起传输的一方(无论上传还是下载) |
| 服务器是谁 | 远程主机 |
| RFC | RFC 959 |
| 端口 | 控制连接 21,数据连接 20 |
二十八、分离的控制与数据连接(核心考点)
FTP 客户 FTP 服务器 |
| 步骤 | 动作 |
|---|---|
| 1 | FTP 客户用 TCP 连接服务器的端口 21 |
| 2 | 客户在控制连接上完成授权 |
| 3 | 客户在控制连接上浏览远程目录、发送命令 |
| 4 | 服务器收到文件传输命令时,另开第 2 条 TCP 数据连接到客户 |
| 5 | 传完一个文件后,服务器关闭数据连接 |
| 6 | 要传下一个文件,服务器再开一条新的数据连接 |
两个必考结论
① 控制连接是「带外(out of band)」的
命令和数据走两条不同的 TCP 连接。 对比 HTTP:HTTP 是「带内(in band)」的 —— 请求和数据在同一条连接上。
② FTP 服务器维护状态
要记住:当前目录、之前的认证。 与无状态的 HTTP 形成鲜明对比 —— 这是本讲最常考的一组反差。
二十九、常用命令与返回码
命令以 ASCII 文本在控制通道发送:
| 命令 | 作用 |
|---|---|
USER username |
用户名 |
PASS password |
密码 |
LIST |
返回当前目录的文件列表 |
RETR filename |
取回(get)文件 |
STOR filename |
存储(put)文件到远程主机 |
返回码是状态码 + 短语(与 HTTP 类似):
| 返回码 | 含义 |
|---|---|
331 Username OK, password required |
用户名对了,要密码 |
125 data connection already open; transfer starting |
数据连接已开,开始传 |
425 Can't open data connection |
打不开数据连接 |
452 Error writing file |
写文件出错 |
第八部分:电子邮件
三十、三大组件
| 组件 | 说明 |
|---|---|
| 用户代理(User Agent) | 又叫「邮件阅读器」;撰写、编辑、阅读邮件;如
Outlook、Thunderbird、iPhone
邮件客户端 收发的消息都存在服务器上 |
| 邮件服务器 | 邮箱(mailbox)存放该用户的收件 消息队列(message queue)存放待发邮件 |
| SMTP | 在邮件服务器之间发送邮件的协议 |
三十一、SMTP [RFC 2821]
| 特性 | 说明 |
|---|---|
| 传输 | TCP,端口 25 |
| 传输方式 | 直接传输:发送方服务器 → 接收方服务器(中间不经过其他邮件服务器) |
| 三个阶段 | 握手(greeting)→ 消息传输 → 关闭 |
| 交互 | 命令/响应(像 HTTP、FTP);命令是 ASCII,响应是状态码 + 短语 |
| 编码限制 | 消息必须是 7 位 ASCII |
| 连接 | 使用持久连接 |
| 消息结束标志 | 用 CRLF.CRLF
判断消息结束 |
Alice 发给 Bob 的六步(讲义 p59)
| 步骤 | 动作 |
|---|---|
| 1 | Alice 用 UA 撰写发往
bob@someschool.edu 的邮件 |
| 2 | Alice 的 UA 把消息发给她的邮件服务器,放入消息队列 |
| 3 | SMTP 的客户端打开到 Bob 邮件服务器的 TCP 连接 |
| 4 | SMTP 客户端通过该 TCP 连接发送 Alice 的消息 |
| 5 | Bob 的邮件服务器把消息放入 Bob 的邮箱 |
| 6 | Bob 调用他的用户代理阅读消息 |
注意步骤 3 的措辞:Alice 的邮件服务器此刻扮演「SMTP 客户端」 —— 这又是「客户/服务器是进程角色而非机器身份」的例子。
三十二、SMTP 会话样例(要能认出)
S: 220 hamburger.edu |
命令顺序:HELO → MAIL FROM → RCPT TO → DATA → QUIT
注意那个单独一行的
.—— 这就是CRLF.CRLF结束标志的实际样子。自己动手试(讲义 p61):
telnet servername 25,看到 220 回复后依次输入上面的命令 —— 这样就能不用邮件客户端发出一封邮件。
三十三、SMTP vs HTTP(超高频 MCQ)
| 维度 | HTTP | SMTP |
|---|---|---|
| 推/拉 | pull(拉) | push(推) |
| 对象封装 | 每个对象封装在自己的响应消息里 | 多个对象放在一条多部分(multipart)消息里 |
| 交互形式 | ASCII 命令/响应 + 状态码 | 同左 |
| 编码限制 | 无 7 位限制 | 必须 7 位 ASCII |
| 消息结束标志 | Content-Length 等 | CRLF.CRLF |
| 连接 | 1.1 起用持久连接 | 持久连接 |
「HTTP 是 pull,SMTP 是 push」是最常考的一句。
怎么理解:HTTP 是「我去服务器拿东西」;SMTP 是「我把东西推到你的服务器上」。 方向不同,发起方也不同。
三十四、邮件消息格式(RFC 822)
To: bob@hamburger.edu ┐ |
极易混淆的考点:
RFC 822 的
To:/From:首部 ≠ SMTP 的MAIL FROM:/RCPT TO:命令!
属于什么 类比 To:/From:消息内容的一部分 信纸上写的收件人 MAIL FROM:/RCPT TO:协议层的信封 信封上写的地址 邮局按信封投递,不看信纸 —— 这就是为什么可以伪造
From:首部(钓鱼邮件的原理)。
三十五、邮件访问协议
关键区分:
- SMTP:投递/存储到接收方的服务器(push)
- 邮件访问协议:从服务器取回(pull)
Alice 的 UA ──SMTP──→ Alice 的邮件服务器 ──SMTP──→ Bob 的邮件服务器 |
| 协议 | RFC | 特点 |
|---|---|---|
| POP3 | RFC 1939 | 授权 + 下载 |
| IMAP | RFC 1730 | 功能更多,包括在服务器上操作已存消息 |
| HTTP | — | 用浏览器访问 webmail(如
https://webmail.sydney.edu.au) |
POP3 协议的两个阶段
授权阶段:
| 客户命令 | 服务器响应 |
|---|---|
user bob |
+OK |
pass hungry |
+OK user successfully logged on |
服务器响应只有两种:
+OK和-ERR。
事务阶段:
| 命令 | 作用 |
|---|---|
list |
列出消息编号(和大小) |
retr |
按号取回消息 |
dele |
删除 |
quit |
结束 |
完整会话样例:
S: +OK POP3 server ready |
三十六、POP3 vs IMAP(必考对照)
| POP3 | IMAP | |
|---|---|---|
| 消息存放 | 下载到本地 | 全部保留在服务器一处 |
| 组织能力 | 无 | 允许用户用文件夹组织消息 |
| 跨会话状态 | POP3 跨会话是无状态的 | 保留用户跨会话的状态:文件夹名、消息 ID 与文件夹的映射 |
POP3 的两种模式
| 模式 | 后果 |
|---|---|
| 「下载并删除」 | 换客户端后读不到旧邮件 |
| 「下载并保留」 | 不同客户端上都有副本 |
「POP3 下载并删除 ⇒ 换设备就读不到旧邮件」是经典 MCQ 情境题。
这也解释了为什么现代邮件几乎都用 IMAP —— 手机、平板、电脑要看到同一份邮箱, 就必须让服务器保存状态。
第九部分:MCQ 速查表
端口号(背熟)
| 协议 | 端口 |
|---|---|
| HTTP | 80 |
| SMTP | 25 |
| FTP 控制 | 21 |
| FTP 数据 | 20 |
| DNS | 53 |
状态性
| 协议 | 有无状态 |
|---|---|
| HTTP | 无状态 |
| FTP | 有状态(当前目录、认证) |
| POP3 | 跨会话无状态 |
| IMAP | 有状态(文件夹、映射) |
层次归属
| 项 | 所在层 |
|---|---|
| SSL | 应用层(不是传输层!) |
| HTTP / FTP / SMTP / POP3 / IMAP / DNS | 应用层 |
推 vs 拉
| 协议 | 方向 |
|---|---|
| HTTP | pull |
| SMTP | push |
带内 vs 带外
| 协议 | 控制信息 |
|---|---|
| HTTP | 带内(in band) |
| FTP | 带外(out of band,独立控制连接) |
计算题模板
| 题型 | 公式 |
|---|---|
| 非持久 HTTP(单对象) | |
| 非持久·串行(n 个引用对象) | |
| 非持久·并行(上限 k) | |
| 持久 + 并行(上限 k) | |
| 持久 + 流水线(无上限) | |
| 缓存后的链路利用率 | |
| 缓存后的总时延 |
HTTP 版本区分
| 版本 | 新增 |
|---|---|
| 1.0 | GET、POST、HEAD |
| 1.1 | + PUT、DELETE;+ 持久连接;+ 流水线 GET |
| 2 | + 二进制分帧;+ 多路复用的流;+ 优先级;+ 服务器推送 |
最容易错的 7 个点
- SSL 在应用层,不是传输层
- FTP 数据端口是 20,21 是控制
- FTP 有状态,HTTP 无状态 —— 常放在一起考
- RFC 822 的
To:≠ SMTP 的RCPT TO:(信纸 vs 信封) - HTTP 是 pull,SMTP 是 push
- PUT / DELETE 是 HTTP/1.1 才有的
- 持久 HTTP 别一律套「3 个 RTT」 —— 题目给了并行上限
时是 个 RTT;只有「流水线、无并行上限」才是恒定 3 个
第十部分:本讲在考纲中的位置
| Week | 主题 | 笔记 |
|---|---|---|
| 1 | Introduction | Week 01 |
| 2 | Performance | Week 02 |
| 3 | Applications | 本文 |
| 4 | DNS and P2P | Week 04 |
| 5 | Transport | Week 05 |
| 6 | TCP | ⚠️ Canvas 未发布 |
本讲与前后的三条连接:
连接 说明 P2P 的 self-scalability 本讲只给了定性描述,Week 04 给出定量公式 「为什么要有 UDP」 本讲提了问题,Week 05 给出四点答案 HTTP 的 RTT 公式 Week 05 的 DNS tutorial 在此基础上加 DNS 查询时延 tutorial 与 lecture 的一周错位: 本讲的配套练习是 Week 4 模块里的 HTTP Wireshark tutorial —— 完整解析见 Week 04 笔记第四部分, 那里实测了条件 GET 的 304 响应和 Basic 认证的 Base64 明文密码。
配套练习:20 题期中模拟卷 的板块二(Q7–Q11)专测本讲内容。