# 网络究竟是怎么对话的

关于网络与 Web 的速成课。21 个概念 —— Packet、IP Address、DNS、TCP、UDP、Port、HTTP、Status Codes、TLS、Certificate、Latency、CDN、Load Balancer 等等 —— 每个都配英文名称、一幅图、一张卡片（是什么 → 怎么运作 → 例子 → 坑），以及它与其他概念的联系。最后：一次点击的完整旅程，和一页纸的所有术语速查表。

- **Author:** Fedor Chishchin
- **Level:** intro
- **Reading time:** 约 30 分钟阅读
- **Published:** 2026-06-13
- **Source:** https://fedorthinks.com/zh/learn/networking-express

---

## 1. 网络不过是消息

剥掉术语，网络就是一件简单的事：机器互相发送消息。其余的一切，都是关于这些消息如何找到去路、又如何保持可靠的细节。

### 地图：六组里的 21 个概念

> 一张地铁图：先看整条线路，再一站一站地坐过去。

这门课里的每个词都属于六个组之一。每一组就是对话的一步：**基础**（谁和谁说话）、**名称**（怎么找到地址）、**连接**（怎么开通一条线路）、**HTTP**（提问用的语言）、**HTTPS**（怎么把它封起来）和**速度**（为什么会变慢）。

_Diagram: 六组概念 —— 第 1–6 章依次讲解。_

### 怎么读每个概念

> 一本护照：每个人的栏目都一样，所以很容易比较。

下面每个概念都有相同的部分：它的**英文名称**（记住它 —— 这是你在文档里会碰到的术语）、一幅日常生活的画面、一张**图**，以及一张带栏目的**卡片**：_是什么_、_怎么运作_、_例子_、*坑*和*关联*的概念。最后一章里，所有的词会汇成一次点击 —— 从地址栏到完成的页面。

### Packet —— 数据分成小块上路

> 一套庞大的邮政系统：任何一栋楼都能给任何另一栋楼递一张纸条，只要它在信封上写对地址。

**网络**不过是连在一起、能互相发送数据的计算机。数据以小小的**数据包**（packet）形式传输 —— 就像把一张纸条拆成几张明信片，每张都标明从哪来、到哪去。互联网就是把这件事放大到全球规模：数十亿台机器，任何一台都能把数据包传给另一台。这就是全部的基础；其余的是我们如何让它变得可靠、有意义。

_Diagram: 发送方把消息切成数据包，每个包各走各的路，接收方再把它们拼回去。_

#### Packet (数据包，network packet)

- **是什么:** 一小块数据，标着“从哪来”和“到哪去”。
- **怎么运作:** 大消息被切成数据包；每个包各自穿过网络；最后再重新拼装。
- **例子:** 一个网页是以许多数据包的形式到达你这里的。
- **坑:** 数据包可能丢失，也可能乱序到达 —— **TCP** 负责解决这个问题。
- **关联:** 数据包上的地址就是 **IP 地址**。

### IP Address —— 每台机器都有地址

> 地球上每栋楼都有唯一的邮政地址。没有地址，邮递员既无处投递，也无处回信。

数据包要送达，目的地就需要一个地址。这就是 **IP 地址** —— 标识网络上一台机器的数字，比如 `142.250.74.78`。每台联网的设备都有一个。你的笔记本发出请求时，会盖上自己的 IP 作为回信地址，让答案知道往哪回。没有地址，就没有对话。

_Diagram: 请求发往服务器的 IP；回复回到发送方的 IP —— 也就是回信地址。_

#### IP Address (IP 地址，Internet Protocol address)

- **是什么:** 标识网络上一台机器的数字。
- **怎么运作:** 每个数据包都带着目的地址和发送方地址，这样回复就知道往哪走。
- **例子:** `142.250.74.78` —— 你的请求正前往的那台服务器。
- **坑:** 没人记得住数字 —— 所以我们需要名称和 **DNS**。
- **关联:** 它带你到机器；**端口**带你到机器上的那项服务。

### Client–Server —— 客户端提问，服务器回答

> 一家餐馆和一间厨房。一边下单，另一边备餐并端回来。整顿饭里，角色是固定的。

Web 的大部分都运行在**客户端–服务器**模型上。**客户端** —— 你的浏览器、你的应用 —— 发出请求；**服务器** —— 运行网站或服务的机器 —— 返回响应。你的手机是那个说“给我这个页面”的客户端；某处的服务器用页面作答。记住这一对 —— 下面的每个想法，都是为了让这套请求与响应运转起来。

_Diagram: 客户端用请求开启对话；服务器作答。_

#### Client–Server (请求–响应模型，request–response model)

- **是什么:** 一方提问、另一方回答的模型。
- **怎么运作:** 客户端发送请求；服务器处理并响应。
- **例子:** 你的手机请求一个页面 —— 数据中心里的服务器把它返回。
- **坑:** 角色取决于这场对话：一台服务器也可以是另一台服务器的客户端。
- **关联:** 在 Web 上，这场对话的语言是 **HTTP**。

> **框架性问题:** “谁是提问的客户端，谁是回答的服务器，每条消息需要什么地址才能送达？”

> 网络就是机器之间传递带地址的消息。客户端提问，服务器回答 —— 其余的一切都是为了让它可靠。

## 2. 找到地址 —— DNS

你输入的是 `example.com` 这样的名字，但网络只会按数字来路由。得有个东西把你记得住的名字翻译成机器需要的地址。这个东西就是 DNS。

### Domain Name —— 名字给人用，数字给机器用

> 你靠名字记住朋友，但电话系统只会拨号码 —— 所以你有一本通讯录，把一个换成另一个。

人们记得住 `wikipedia.org`；网络需要的是像 `198.35.26.96` 这样的 IP 地址。**域名**是便于人使用的标签；IP 是便于机器使用的地址。两者必须关联起来，因为没人想背数字，而路由器也没法路由一个名字。弥合这道鸿沟是一整套系统，每次点击都在不停地、悄无声息地运行。

_Diagram: 名字给人，IP 给网络；DNS 夹在中间。_

#### Domain Name (域名，domain)

- **是什么:** 网站的可读名称，是为人设计的。
- **怎么运作:** 它本身哪儿也去不了 —— 要先被翻译成 IP 地址。
- **例子:** `wikipedia.org` → `198.35.26.96`。
- **坑:** 路由器不懂名字 —— 只认数字。
- **关联:** **DNS** 把名字翻译成地址。

### DNS —— 互联网的电话簿

> 一本巨大的、永远开放的目录：你给它一个名字，它还你一个可以拨的号码。你从来看不到它工作 —— 你只是拿到了号码。

**DNS** —— **域名系统**（**Domain Name System**）—— 是把域名翻译成 IP 地址的服务。浏览器要取回 `example.com` 之前，会先问 DNS“这个名字的地址是什么？”，然后拿回一个数字。这次**查询**（也叫**解析**）每次都最先发生，只需几毫秒。这是不起眼的一步，却让可读的网址成为可能。

_Diagram: 浏览器先向 DNS 询问地址 —— 然后才去找服务器。_

#### DNS (域名系统，Domain Name System)

- **是什么:** 把域名变成 IP 地址的服务。
- **怎么运作:** 浏览器问“这个名字的 IP 是什么？”，然后拿回一个数字。
- **例子:** `example.com` → 一个 IP 地址 → 然后才连接到服务器。
- **坑:** 它是每次加载的第一步：DNS 坏了，网站就“不存在”了。
- **关联:** 它的答案由带有 **TTL** 的 **DNS 缓存**保存。

### DNS Caching 与 TTL —— 答案会被记住

> 你查一次朋友的号码，写在便利贴上 —— 下次直接看便利贴，不必再翻整本目录。

每个名字都从头查起会很慢，所以 DNS 的答案会被**缓存**（cache）—— 在你的浏览器、操作系统和网络中被记住一段时间。地址会附带一个 **TTL**（time to live，存活时间），说明在重新检查之前可以放心复用多久。这就是为什么你访问过的网站能瞬间找到地址，也是为什么 DNS 的改动需要时间才能扩散开。

_Diagram: 先问最近的记忆；只有没命中时才做完整查询。TTL 决定一个答案能活多久。_

#### DNS Caching · TTL (DNS 缓存，DNS cache，存活时间，time to live)

- **是什么:** 被记住的 DNS 答案，以及它能被信任多久。
- **怎么运作:** 浏览器、操作系统和网络保存这个答案；TTL 用完之前，地址都来自记忆。
- **例子:** 你访问过的网站能被瞬间找到 —— 它的地址就躺在某个缓存里。
- **坑:** 改了 DNS，旧答案仍会在缓存里活到 TTL 过期。改动扩散得很慢。
- **关联:** 和 **CDN** 是同一招：把答案放得更近。

> **DNS 的问题:** “我输入一个名字时，是什么把它变成了网络真正路由的数字 —— 过期的缓存答案会不会把我指向错误的地方？”

> DNS 就是电话簿：把你记得住的名字变成网络需要的 IP 地址，然后缓存起来，下次就是瞬间完成。

## 3. 开通一条线路 —— TCP 与端口

知道地址，不等于就有了对话。在消息可靠地流动之前，两台机器要先建立连接 —— 并约定去敲服务器的哪一扇“门”。

### TCP —— 可靠、有序的线路

> 一通带确认的电话：你说一句话，对方说“收到”，每一部分都得到确认、按顺序到位之前，什么都不往下走。

**TCP**（**Transmission Control Protocol**，传输控制协议）是最常见的可靠发送数据的方式。它先用一次快速的**握手**（handshake）建立连接 —— 双方同意开始对话 —— 然后保证每个数据包都按顺序到达，丢了的会被重发。你用一点速度，换来没有任何东西被丢掉或弄乱的保证。Web、电子邮件和大多数应用都运行在 TCP 上，正是为了这份可靠。

_Diagram: 先握手（SYN、SYN-ACK、ACK），再传带确认的数据；丢了的会被重发。_

#### TCP (传输控制协议，Transmission Control Protocol)

- **是什么:** 一条可靠的线路：全部到达，没有丢失，全都有序。
- **怎么运作:** 握手建立连接；接收方确认数据包；丢了的会被重发。
- **例子:** 网页、电子邮件、大多数应用。
- **坑:** 可靠是要花速度的：握手，以及等待确认。
- **关联:** 快速的替代品是 **UDP**；**HTTP** 运行在 TCP 之上。

### UDP —— 用速度换可靠

> 在嘈杂的房间里隔空喊话通报消息 —— 有些词会丢，但你不会停下来逐个确认，因为跟上节奏比听清每个词更重要。

**UDP**（**User Datagram Protocol**，用户数据报协议）是快速、不作保证的替代方案：它不握手，也不重发丢失的包，直接把数据包发出去。你失去了可靠，换来了速度和低开销。对直播视频、语音通话和游戏来说，这是正确的取舍 —— 丢一帧无所谓，但等待不行。知道两者都存在，你就明白网络里始终有一个**速度与可靠**的旋钮。

_Diagram: UDP 发出去就不回头：没人会重发丢失的包。_

#### UDP (用户数据报协议，User Datagram Protocol)

- **是什么:** 一条快速的线路，不保证送达，也不保证顺序。
- **怎么运作:** 没有握手，没有重试：发出去就不管了。
- **例子:** 直播视频、语音通话、在线游戏。
- **坑:** 数据包会丢 —— 应用必须能容忍。
- **关联:** 在旋钮上与 **TCP** 处于相反的一端。

### Port —— 一台机器上编了号的门

> 一栋楼，许多扇门，每扇都按用途编号 —— 送货走 80 号门，办公室走另一扇。同一个地址，不同的入口。

一台机器上运行着许多服务，所以光有 IP 地址还不够 —— 你还需要一个**端口**（port），用一个数字选定要访问哪项服务。Web 流量按惯例使用端口 `80`（HTTP）或 `443`（HTTPS）；数据库可能监听另一个端口。地址带你到那栋楼；端口带你到对的那扇门。**IP 加端口**合在一起，就指明了一个确切的目的地。

_Diagram: 一个 IP 就是一栋楼；端口选择那扇门 —— 也就是服务。_

#### Port (端口，port number)

- **是什么:** 在一台机器上选定某项服务的数字。
- **怎么运作:** 每项服务在自己的端口上“监听”；请求发往 IP:端口。
- **例子:** `80` 是 HTTP，`443` 是 HTTPS；数据库在自己的端口上监听。
- **坑:** IP 对了但端口错了，就是敲错了门。
- **关联:** 补全 **IP 地址**；**TCP** 和 **UDP** 都会用到。

> **连接的问题:** “这里需要 TCP 的“绝不丢失”的保证，还是 UDP 的速度 —— 而我到底在敲机器上的哪个端口、哪扇门？”

> TCP 是可靠、有序的线路；UDP 又快又会丢。IP 找到那栋楼，端口选中那扇门。

## 4. 这场对话 —— HTTP

线路一旦开通，双方就需要一门共同的语言来提问和回答。在 Web 上，这门语言就是 HTTP —— 每个请求和每个回复都遵循的一种简单而严格的格式。

### HTTP —— 请求与响应

> 一场正式的书信往来：一封结构清晰的请求寄出，一封结构清晰的回复寄回，双方都遵循同一套约定好的格式。

**HTTP**（**HyperText Transfer Protocol**，超文本传输协议）是 Web 的语言。客户端发送**请求**（request）—— 它想要什么 —— 服务器发回**响应**（response）—— 结果。每个页面、每张图片、每次 API 调用，都是这样一次交换。它基于文本、结构清晰，所以有那么多工具都能讲它。掌握一次请求和响应的形状，你就明白整个 Web 是怎么运转的。

_Diagram: 一次 HTTP 交换：请求发出，响应返回。_

#### HTTP (超文本传输协议，HyperText Transfer Protocol)

- **是什么:** Web 的请求与响应语言。
- **怎么运作:** 客户端发送请求，服务器返回响应；每样东西一次交换。
- **例子:** 一个页面、一张图片、一次 API 调用 —— 各是一次独立的 HTTP 交换。
- **坑:** 普通 HTTP 没有加密 —— 路径上的任何人都能读到。
- **关联:** 由**方法**、**头部 + 正文**、**状态码**组成；安全的版本是 **HTTPS**。

### HTTP Methods —— 动词说明你想要什么

> 在图书馆的柜台：你可以借一本书、还一本书，或者请求新增一本。同一个柜台，不同的意图 —— 工作人员对每种的处理也不同。

每个请求都有一个**方法**（method）—— 也就是动词。**GET** 获取数据（加载页面）。**POST** 发送新数据（提交表单）。**PUT** 更新某样东西；**DELETE** 删除它。方法让服务器一眼就看出你的意图，而规范的系统会区别对待它们 —— GET 绝不该改变任何东西，而 POST 则被期望会改变。这些动词是 API 设计的骨架。

_Diagram: HTTP 的四个主要动词及其含义。_

#### HTTP Methods (HTTP 动词，HTTP verbs)

- **是什么:** 请求开头的那个词，说明你想做什么。
- **怎么运作:** GET 获取，POST 创建，PUT 更新，DELETE 删除。
- **例子:** 打开页面是 GET；提交表单是 POST。
- **坑:** 会改变东西的 GET 是设计上的 bug。
- **关联:** 位于请求的第一行，在**头部**之前。

### Headers 与 Body —— 细节与货物

> 信封外面写着备注 —— 给谁的、里面是什么、怎么处理 —— 真正的信在里面。

每个请求和响应都有**头部**（headers）—— 一行行带标签的元数据，比如内容类型、语言、是谁在请求，以及认证令牌 —— 还有一个可选的**正文**（body），即真正的载荷（上传的表单数据，或返回的页面、JSON）。头部是双方在不碰货物的前提下协商细节的方式。一次交换里的大部分“怎么做”都在头部里。

_Diagram: HTTP 请求不过是文本：先是一行方法，然后是头部，最后是正文。_

#### Headers · Body (元数据与载荷，metadata and payload)

- **是什么:** 头部是关于消息的元数据；正文是数据本身。
- **怎么运作:** 头部以“名称: 值”的行出现；正文跟在后面。
- **例子:** `Content-Type: application/json` 表示正文是 JSON；正文就是表单数据。
- **坑:** 不是每条消息都有正文：普通的 GET 就没有。
- **关联:** **Cookie** 搭在头部里 —— 这就是在**无状态**的 HTTP 上实现登录的办法。

### Status Codes —— 结果如何

> 回复的红绿灯：绿灯表示通行，重定向指向别处，红灯告诉你哪里出了错 —— 以及是谁的错。

每个响应都带着一个**状态码**（status code）。**2xx** 表示成功（`200 OK`）。**3xx** 是重定向（去那边看看）。**4xx** 表示客户端错了 —— `404 Not Found`、`403 Forbidden` —— 是*你*请求错了。**5xx** 表示服务器错了 —— `500` —— 是*它*坏了。读第一位数字，你就能立刻知道成没成、谁的错、该往哪看。这是 Web 上最有用的单项调试技能。

_Diagram: 第一位数字就是一半的诊断：成功、重定向、你的错，还是服务器的错。_

#### Status Codes (HTTP 状态码，HTTP status codes)

- **是什么:** 响应里的一个三位数字，说明结果如何。
- **怎么运作:** 2xx 成功，3xx 重定向，4xx 客户端错误，5xx 服务器错误。
- **例子:** `404` —— 没有这个页面；`500` —— 服务器坏了。
- **坑:** 把 4xx 和 5xx 搞混，就是在错误的一边找 bug。
- **关联:** 每个 **HTTP** 响应里你最先检查的东西。

### Stateless 与 Cookies —— HTTP 会忘了你

> 一个对你上次来访毫无记忆的柜台职员 —— 每次你走上前，都得重新自我介绍，再把票出示一遍。

HTTP 是**无状态**（stateless）的：每个请求都是独立的，服务器默认不会记住上一个请求的任何东西。所以要保持登录，每个请求都必须携带你是谁的证明 —— 头部里的一个 **cookie** 或令牌。无状态正是 Web 能扩展到数十亿请求的原因，而理解它，也就明白了为什么你的身份要搭在每一次调用上。

_Diagram: 服务器什么都不记得：每个请求都带着 cookie，没有它你就又成了陌生人。_

#### Stateless · Cookie (服务器无记忆；会话 cookie)

- **是什么:** 服务器忘记过去的请求；cookie 把记忆带在身上。
- **怎么运作:** 浏览器把 cookie 或令牌附加到每个请求的头部。
- **例子:** 你能保持登录，是因为每个请求都带着你的会话 cookie。
- **坑:** 没有 cookie —— 你对服务器来说就是陌生人。
- **关联:** cookie 搭在**头部**里；无状态让**负载均衡器**更省事。

> **HTTP 的问题:** “方法（意图）是什么，头部和正文里有什么，状态码又说明了结果如何、是谁的错？”

> HTTP 就是请求与响应：用方法表达意图，用头部交代细节，用正文装载货物，再用状态码准确告诉你结果如何。

## 5. 封好的信封 —— HTTPS

普通 HTTP 是一张明信片 —— 经手的人都能读。HTTPS 是同一场对话，被封进一个只有正确的服务器才能拆开的信封里，并且有签名，让你知道自己在和谁说话。

### TLS 与 HTTPS —— 加密把消息封起来

> 把一张能读的明信片，换成一只只有收件人持有钥匙的上锁盒子 —— 快递员负责运送，但没有一个人能读到里面的内容。

**HTTPS** 是用 **TLS**（**Transport Layer Security**，传输层安全）把 HTTP 包进**加密**之中。它把内容打乱，让你和服务器之间的任何人 —— 咖啡馆的 Wi-Fi、网络运营商、攻击者 —— 看到的都只是乱码，而不是你的密码或消息。地址栏里的锁图标表示这层封条已经就位。在现代 Web 上，它是默认配置，因为没封好的对话，就是任何人都能读的对话。

_Diagram: HTTP 是路径上任何人都能读的明信片；HTTPS 是只给他们看到噪音的信封。_

#### TLS · HTTPS (传输层安全，Transport Layer Security；HTTP + TLS)

- **是什么:** 给线路加密；HTTPS 就是跑在 TLS 之上的 HTTP。
- **怎么运作:** TLS 握手之后，内容被打乱 —— 路径上只能看到乱码。
- **例子:** 地址栏里的锁；端口 `443`。
- **坑:** 光有加密还不够 —— 你还得知道服务器是真的。
- **关联:** 服务器的身份由**证书**来证明。

### Certificate —— 证明你在和谁说话

> 一本由可信机构查验过的护照 —— 它证明这个人就是他所声称的人，而不是顶着他名字的冒牌货。

光有加密还不够；你还需要知道这台服务器确实是 `yourbank.com`，而不是假货。**证书**（certificate）是一张数字身份证，由受信任的**证书颁发机构**（**CA**）签发，证明服务器确实拥有它所声称的名字。你的浏览器会自动检查它，缺失或有误时会警告你。正是这一点，让攻击者即使在加密连接上也无法冒充网站。

_Diagram: 证书颁发机构签发证书；服务器出示它；浏览器验证签名。_

#### Certificate (TLS 证书，TLS certificate，证书颁发机构（CA）)

- **是什么:** 一张数字身份证：“这台服务器拥有这个名字”。
- **怎么运作:** CA 签发证书；服务器出示它；浏览器自己验证签名。
- **例子:** 网站证书缺失或有误时，浏览器会警告你。
- **坑:** 别点掉证书警告硬往下走 —— 那可能是假的。
- **关联:** 把**中间人**挡在门外。

### Man-in-the-Middle —— 为什么锁很重要

> 就像寄一封封好并经过验证的信，和在拥挤的房间里大声喊出你的银行信息之间的区别。

没有 HTTPS，网络路径上的任何人都能读取甚至篡改你的流量 —— 一个悄悄坐在你和服务器之间的**中间人**（**man-in-the-middle**，**MITM**）。有了 HTTPS，消息被封起来，发送方也得到验证。这就是为什么登录页面、支付，乃至如今几乎一切都用 HTTPS，也是为什么浏览器把普通 HTTP 标成“不安全”。那把锁是个小图标，代表的却是一项重大的保证。

_Diagram: 中间的攻击者能读取并改动普通 HTTP；HTTPS 既读不了也伪造不了。_

#### Man-in-the-Middle (中间人攻击，MITM attack)

- **是什么:** 位于你和服务器之间、读取或改动流量的攻击者。
- **怎么运作:** 你以为自己在和服务器说话，其实是经过他们在说话。
- **例子:** 一个恶意 Wi-Fi 网络在窥探普通 HTTP。
- **坑:** 它是隐形的：一切都“正常工作”，而你的数据在泄露。
- **关联:** 防御靠 **TLS**（封条）+ **证书**（身份检查）。

> **HTTPS 的问题:** “这场对话有没有被封好，让中间没人能读到它 —— 并且经过验证，让我知道服务器就是它所声称的那个？”

> HTTPS 用加密封住消息，用证书证明服务器的身份 —— 隐私与信任，尽在一把锁里。

## 6. 速度与距离

Web 感觉是瞬时的，但距离和物理总在收一笔过路费。两个词 —— 延迟和带宽 —— 解释了大部分“为什么感觉快、为什么感觉慢”。

### Latency 与 Bandwidth —— 等待与宽度

> 一根水管：第一滴水多久到是一回事；每秒能流多少水是另一回事。再宽的水管，水流到远端之前也有延迟。

**延迟**（**latency**）是响应开始之前的等待 —— 一条消息去了再回来的往返时间。**带宽**（**bandwidth**）是你每秒能传输多少数据。两者互相独立：一条连接可以带宽很高、延迟也很高。大文件下载在乎带宽；一个灵敏、反应快的网站在乎延迟。把两者混为一谈，就是“我网速很快，但网站感觉很慢”让人困惑的原因。

_Diagram: 延迟是水管的长度，带宽是水管的宽度。它们是两回事。_

#### Latency · Bandwidth (延迟与吞吐，delay and throughput)

- **是什么:** 延迟 —— 你要等多久；带宽 —— 每秒多少数据。
- **怎么运作:** 它们互相独立：可以很宽，同时等待很久。
- **例子:** 大文件下载很快，但在一个遥远的网站上每次点击都卡。
- **坑:** “网速快、网站慢”通常是延迟问题，不是带宽问题。
- **关联:** 延迟随每次**往返**而增长；**CDN** 能降低它。

### Round Trip —— 每一趟都要花时间

> 向另一个大陆上的人提问：即使以光速，一来一回也有一个无法突破的下限。

向遥远的服务器发出的请求，要走一次实实在在的**往返**（round trip），而光在全球范围内也不是瞬间到达的 —— 绕地球半圈有几十毫秒的硬下限。更糟的是，加载一个页面往往需要许多次往返。这就是为什么**话痨式**（**chatty**）的设计在远距离下感觉迟钝，也是为什么减少往返次数是最古老的性能技巧之一。

_Diagram: DNS、TCP、TLS、HTTP —— 每一步都至少要跑一趟遥远的服务器。_

#### Round Trip (往返，RTT，round-trip time)

- **是什么:** 一条消息去往服务器再回来的旅程。
- **怎么运作:** 每一步 —— DNS、握手、请求 —— 都至少要花一趟。
- **例子:** 绕地球半圈要几十毫秒，即使是光。
- **坑:** 许多小请求（“话痨式”设计）会把延迟累加起来。
- **关联:** 更少的往返，或更短的路径（**CDN**），意味着更低的**延迟**。

### CDN —— 把答案放得更近

> 一本热门书在各地的本地图书馆都有，而不是只有一座中央档案馆、得靠邮寄去借 —— 你附近的那一本到得快得多。

**CDN**（**content delivery network**，内容分发网络）是一批遍布全球的服务器，把你的内容副本保存在靠近用户的地方。东京的用户加载你的网站时，是由附近城市提供服务，而不是由远在大洋彼岸的**源**（origin）服务器 —— 延迟因此大幅下降。CDN 就是把缓存用在地理上，也正是它让全球性的网站在每个地方都感觉像本地的。

_Diagram: 副本放在附近的边缘服务器上；每个用户去最近的那个，而不是跨越大洋。_

#### CDN (内容分发网络，Content Delivery Network)

- **是什么:** 一批遍布全球、存有你内容副本的服务器。
- **怎么运作:** 用户由最近的服务器提供服务，而不是源服务器。
- **例子:** 东京的用户从附近的城市拿到页面。
- **坑:** 这些副本是缓存：更新不会瞬间到达。
- **关联:** 降低**延迟**和很长的**往返**；是 **DNS 缓存**的近亲。

### Load Balancer —— 把工作分摊开

> 银行里的排队管理员，把客户引向任何一个有空的柜员，这样就不会有一个窗口被淹没、而其他窗口闲着。

当一台服务器扛不住全部流量时，**负载均衡器**（**load balancer**）会站在几台服务器前面，把请求分摊给它们。大型网站就是这样应对数百万用户的 —— 在均衡器后面增加更多服务器 —— 也是这样挺过某台服务器故障的，因为均衡器会直接绕开它。这个名字恰好描述了它做的事：它让负载保持均衡。

_Diagram: 负载均衡器把请求交给健康的服务器，并绕开出故障的那台。_

#### Load Balancer (负载均衡器，LB)

- **是什么:** 把请求分摊到多台服务器上的中间人。
- **怎么运作:** 每个请求都交给其中一台存活的服务器；挂掉的会被跳过。
- **例子:** 流量增长了 —— 你在均衡器后面加服务器。
- **坑:** 如果某台服务器把会话存在自己的内存里，其他服务器就不知道它。
- **关联:** 之所以好用，是因为 HTTP 是**无状态**的。

> **速度的问题:** “慢的是每次往返的等待（延迟），还是数据的体量（带宽）—— 把答案挪近一些，或把负载分摊开，会有帮助吗？”

> 延迟是等待；带宽是宽度。距离总会收一笔过路费 —— CDN 把答案挪近，负载均衡器把工作分摊开。

## 7. 完整的旅程

现在，跟着一次点击，从地址栏一直走到渲染出的页面，把每个词串起来。如果你能把这个过程讲出来，你就明白网络是怎么对话的了。

### 加载一个 URL 时发生了什么

> 一封信的完整旅程：查地址、开通线路、封好信封、提出问题、收到回复 —— 全都在远不到一秒的时间里。

你输入 `example.com`。**DNS** 把名字变成 **IP 地址**。你的浏览器向那个 IP 的**端口** 443 打开一条 **TCP** 连接，双方进行 **TLS** 握手，让线路被加密，并检查服务器的**证书**。在这条封好的线路上，浏览器发出一个 **HTTP** **GET** **请求**；服务器回复一个**状态码**和一个**正文**。页面可能来自附近的 **CDN**，以降低**延迟**。浏览器读取响应并画出页面。这门课里的每个术语，都只是在为这一秒钟平凡的旅程命名其中的一步。

_Diagram: 一次点击 —— 六个步骤，每一步都有这门课里自己的词。_

### 这些概念如何连在一起

> 套娃：每一层都套在下一层里，从外面你只看得见最上面那一层。

这些概念不是孤立存在的 —— 它们一层层叠起来。最底层是 **IP**，带着它的数据包和地址。在它之上跑着 **TCP** 或 **UDP**，带着它们的端口。TCP 之上是 **TLS**，最顶层是 **HTTP**，请求与响应的语言。旁边站着一些帮手：**DNS** 为最底层提供地址，而 **CDN** 和**负载均衡器**则对抗延迟和负载。

_Diagram: 对话的各层以及周围的帮手：每一层都运行在下一层之上。_

#### 旅程，按顺序

- **DNS** 把域名解析成 **IP 地址**。
- 向那个 IP 的某个**端口**（HTTPS 是 443）打开一条 **TCP** 连接。
- **TLS** 握手把线路加密，并检查服务器的**证书**。
- 客户端发送一个 **HTTP 请求** —— 一个**方法**、**头部**，也许还有**正文**。
- 服务器返回一个**状态码**、**头部**和**正文**。
- **CDN** 可能从附近提供它；**负载均衡器**可能挑选服务器。

#### 说明你已经看懂 Web 的迹象

- **404** 与 **500** 一对比，立刻就知道是你的错还是服务器的错。
- “网速快但网站慢”，你会读成**延迟**问题，而不是**带宽**问题。
- **锁**意味着加密*并且*身份已验证 —— 你清楚它保证了什么。
- 你能解释为什么在每个**无状态**请求上保持登录都需要一个 **cookie**。
- 你可以不看资料，把上面整个 **URL 旅程**讲出来。

## 速查表：全部 21 个概念

### 基础

- **Packet** (数据包): 一小块标着“从哪来”和“到哪去”的数据。
- **IP Address** (IP 地址，Internet Protocol address): 标识网络上一台机器的数字。
- **Client–Server** (请求–响应模型): 客户端提问，服务器回答。

### 名称

- **Domain Name** (域名): 网站的可读名称，为人而设计。
- **DNS** (域名系统，Domain Name System): 电话簿：名字 → IP 地址。
- **DNS Caching · TTL** (DNS 缓存): 答案被记住；TTL 说明能信任多久。

### 连接

- **TCP** (传输控制协议，Transmission Control Protocol): 可靠的线路：握手、全部有序、丢了就重发。
- **UDP** (用户数据报协议，User Datagram Protocol): 不作保证的快速线路：发出去就不管。
- **Port** (端口): 门牌号：机器上的哪项服务。

### HTTP

- **HTTP** (超文本传输协议，HyperText Transfer Protocol): Web 的语言：请求与响应。
- **HTTP Methods** (GET · POST · PUT · DELETE): 请求的动词 —— 你的意图。
- **Headers · Body** (元数据与载荷): 消息的细节，以及货物本身。
- **Status Codes** (HTTP 状态码): 2xx 成功，3xx 重定向，4xx 你的错，5xx 服务器的错。
- **Stateless · Cookie** (服务器无记忆): 服务器会忘掉你；cookie 搭在每个请求上。

### HTTPS

- **TLS · HTTPS** (加密): 把对话封起来；HTTPS = HTTP + TLS。
- **Certificate** (TLS 证书，CA): 一张签发的身份证：服务器拥有它的名字。
- **Man-in-the-Middle** (MITM): 中间的攻击者；HTTPS 能抵御它。

### 速度

- **Latency · Bandwidth** (等待与宽度): 你等多久，以及每秒多少数据。是不同的两件事。
- **Round Trip** (RTT，往返): 去了再回来；每一趟都要花时间。
- **CDN** (内容分发网络，Content Delivery Network): 把内容副本放在靠近用户的地方。
- **Load Balancer** (负载均衡器，LB): 把请求分摊到多台服务器上，并绕开故障。

> 加载一个页面，就是一场快速的对话：找到地址、开通线路、封好、提问、回答。每个吓人的词，都只是那一秒钟里的一步。

速成课结束 · 7 章 · 21 个概念

接下来是练习：打开浏览器的开发者工具，进入 Network 标签页，加载任意一个网站。看着真实的请求出现 —— 方法、状态码、头部、耗时 —— 并把每一项对应到这门课里的一个词。抽象的东西，在你亲眼看到它发生的那一刻就变得具体了。但请把一个想法放在所有想法之上：Web 不是魔法。它就是机器找到一个地址、开通一条线路、把它封好，再用一个问题换回一个答案 —— 而现在，你已经掌握了每一步的词汇。
