fedorthinks

速成课 · No. 14

每一次页面加载,机器之间都在进行一场快速而精确的对话:找到彼此的地址,开通一条线路,提出一个问题,再把答案封进一个别人都读不到的信封里。这一切都不是魔法——它只是几个清晰的想法,顶着吓人的名字。学会这些名字,整个 Web 就变得读得懂了。

21 个概念 · 每个都有图 · 结尾有速查表

§ 01

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

地图:六组里的 21 个概念

一张地铁图:先看整条线路,再一站一站地坐过去。

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

BasicsPacketIP addressClient–serverNamesDomain nameDNSCaching · TTLConnectionTCPUDPPortHTTPRequest / responseMethodsHeaders + bodyStatus codesStatelessHTTPSTLS encryptionCertificateMan-in-the-middleSpeedLatency / bandwidthRound tripCDNLoad balancer
六组概念 —— 第 1–6 章依次讲解。

怎么读每个概念

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

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

Packet —— 数据分成小块上路

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

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

Messagea whole pagepacket 1from A · to Bpacket 2from A · to Bpacket 3from A · to BMessageput back togethersender splitseach packet travels on its ownreceiver rebuilds
发送方把消息切成数据包,每个包各走各的路,接收方再把它们拼回去。
ConceptPacket· 数据包,network packet
是什么
一小块数据,标着“从哪来”和“到哪去”。
怎么运作
大消息被切成数据包;每个包各自穿过网络;最后再重新拼装。
例子
一个网页是以许多数据包的形式到达你这里的。
坑
数据包可能丢失,也可能乱序到达 —— TCP 负责解决这个问题。
关联
数据包上的地址就是 IP 地址。

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

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

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

Your laptopIP 203.0.113.5ServerIP 142.250.74.78to 142.250.74.78reply to 203.0.113.5the sender's own IP is the return address
请求发往服务器的 IP;回复回到发送方的 IP —— 也就是回信地址。
ConceptIP Address· IP 地址,Internet Protocol address
是什么
标识网络上一台机器的数字。
怎么运作
每个数据包都带着目的地址和发送方地址,这样回复就知道往哪走。
例子
142.250.74.78 —— 你的请求正前往的那台服务器。
坑
没人记得住数字 —— 所以我们需要名称和 DNS。
关联
它带你到机器;端口带你到机器上的那项服务。

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

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

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

Clientbrowser · appServerruns the siterequest: give me this pageresponse: here is the pagethe client asks first · the server answers
客户端用请求开启对话;服务器作答。
ConceptClient–Server· 请求–响应模型,request–response model
是什么
一方提问、另一方回答的模型。
怎么运作
客户端发送请求;服务器处理并响应。
例子
你的手机请求一个页面 —— 数据中心里的服务器把它返回。
坑
角色取决于这场对话:一台服务器也可以是另一台服务器的客户端。
关联
在 Web 上,这场对话的语言是 HTTP。

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

§ 02

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

Domain Name —— 名字给人用,数字给机器用

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

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

wikipedia.orgdomain nameDNStranslates198.35.26.96IP addresseasy for humanswhat routers route to✗ no router can route a name
名字给人,IP 给网络;DNS 夹在中间。
ConceptDomain Name· 域名,domain
是什么
网站的可读名称,是为人设计的。
怎么运作
它本身哪儿也去不了 —— 要先被翻译成 IP 地址。
例子
wikipedia.org → 198.35.26.96。
坑
路由器不懂名字 —— 只认数字。
关联
DNS 把名字翻译成地址。

DNS —— 互联网的电话簿

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

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

Browserwants example.comDNSDomain Name System1 · what is the IP of example.com?2 · here is the IP addressWeb serverat that IP3 · only now connectlookup happens first, every time, in ms
浏览器先向 DNS 询问地址 —— 然后才去找服务器。
ProtocolDNS· 域名系统,Domain Name System
是什么
把域名变成 IP 地址的服务。
怎么运作
浏览器问“这个名字的 IP 是什么?”,然后拿回一个数字。
例子
example.com → 一个 IP 地址 → 然后才连接到服务器。
坑
它是每次加载的第一步:DNS 坏了,网站就“不存在”了。
关联
它的答案由带有 TTL 的 DNS 缓存保存。

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

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

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

ask the nearest memory first · go further only on a missBrowsercacheOScacheNetworkresolver cacheFull lookupslow pathanswer + TTL (time to live), e.g. 3600 sreuse it until the TTL runs out, then ask againa DNS change spreads only as old cached answers expire
先问最近的记忆;只有没命中时才做完整查询。TTL 决定一个答案能活多久。
ConceptDNS Caching · TTL· DNS 缓存,DNS cache,存活时间,time to live
是什么
被记住的 DNS 答案,以及它能被信任多久。
怎么运作
浏览器、操作系统和网络保存这个答案;TTL 用完之前,地址都来自记忆。
例子
你访问过的网站能被瞬间找到 —— 它的地址就躺在某个缓存里。
坑
改了 DNS,旧答案仍会在缓存里活到 TTL 过期。改动扩散得很慢。
关联
和 CDN 是同一招:把答案放得更近。

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

§ 03

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

TCP —— 可靠、有序的线路

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

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

ClientServerSYN · let's talkSYN-ACK · ok, let's talkACK · connectedpacket 1got 1 ✓packet 2 · re-sent if lost── handshake done · data flows in order ──
先握手(SYN、SYN-ACK、ACK),再传带确认的数据;丢了的会被重发。
ProtocolTCP· 传输控制协议,Transmission Control Protocol
是什么
一条可靠的线路:全部到达,没有丢失,全都有序。
怎么运作
握手建立连接;接收方确认数据包;丢了的会被重发。
例子
网页、电子邮件、大多数应用。
坑
可靠是要花速度的:握手,以及等待确认。
关联
快速的替代品是 UDP;HTTP 运行在 TCP 之上。

UDP —— 用速度换可靠

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

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

UDP · fire and forgetSenderno handshakeReceiver✗ lostfast and light: live video, calls, gamesa lost frame is fine · waiting is not
UDP 发出去就不回头:没人会重发丢失的包。
ProtocolUDP· 用户数据报协议,User Datagram Protocol
是什么
一条快速的线路,不保证送达,也不保证顺序。
怎么运作
没有握手,没有重试:发出去就不管了。
例子
直播视频、语音通话、在线游戏。
坑
数据包会丢 —— 应用必须能容忍。
关联
在旋钮上与 TCP 处于相反的一端。

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

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

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

one machine · one IP:80web · HTTP:443web · HTTPS:5432a databaseBrowserIP + port142.250.74.78:443IP = the buildingport = the door
一个 IP 就是一栋楼;端口选择那扇门 —— 也就是服务。
ConceptPort· 端口,port number
是什么
在一台机器上选定某项服务的数字。
怎么运作
每项服务在自己的端口上“监听”;请求发往 IP:端口。
例子
80 是 HTTP,443 是 HTTPS;数据库在自己的端口上监听。
坑
IP 对了但端口错了,就是敲错了门。
关联
补全 IP 地址;TCP 和 UDP 都会用到。

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

§ 04

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

HTTP —— 请求与响应

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

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

ClientServerRequestwhat I want · GET /pageResponsethe result · 200 OK + pageone exchange per page, image or API call
一次 HTTP 交换:请求发出,响应返回。
ProtocolHTTP· 超文本传输协议,HyperText Transfer Protocol
是什么
Web 的请求与响应语言。
怎么运作
客户端发送请求,服务器返回响应;每样东西一次交换。
例子
一个页面、一张图片、一次 API 调用 —— 各是一次独立的 HTTP 交换。
坑
普通 HTTP 没有加密 —— 路径上的任何人都能读到。
关联
由方法、头部 + 正文、状态码组成;安全的版本是 HTTPS。

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

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

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

GETfetch dataload a page · must change nothingPOSTsend new datasubmit a form · expected to changePUTupdate somethingchange what already existsDELETEremove somethingdelete an item
HTTP 的四个主要动词及其含义。
ConceptHTTP Methods· HTTP 动词,HTTP verbs
是什么
请求开头的那个词,说明你想做什么。
怎么运作
GET 获取,POST 创建,PUT 更新,DELETE 删除。
例子
打开页面是 GET;提交表单是 POST。
坑
会改变东西的 GET 是设计上的 bug。
关联
位于请求的第一行,在头部之前。

Headers 与 Body —— 细节与货物

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

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

POST /orders HTTP/1.1Host: shop.exampleContent-Type: application/jsonCookie: session=42{ "item": "book", "qty": 1 }method + paththe intentheadersdetails · metadatabodythe cargo · optionalone HTTP request, as plain text
HTTP 请求不过是文本:先是一行方法,然后是头部,最后是正文。
ConceptHeaders · 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 上最有用的单项调试技能。

2xxsuccess200 OKit worked3xxredirectlook over therego elsewhere4xxclient error404 Not Found · 403 Forbiddenyou asked wrong5xxserver error500 Internal Server Errorit broke
第一位数字就是一半的诊断:成功、重定向、你的错,还是服务器的错。
ConceptStatus Codes· HTTP 状态码,HTTP status codes
是什么
响应里的一个三位数字,说明结果如何。
怎么运作
2xx 成功,3xx 重定向,4xx 客户端错误,5xx 服务器错误。
例子
404 —— 没有这个页面;500 —— 服务器坏了。
坑
把 4xx 和 5xx 搞混,就是在错误的一边找 bug。
关联
每个 HTTP 响应里你最先检查的东西。

Stateless 与 Cookies —— HTTP 会忘了你

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

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

ClientServerremembers nothingrequest 1 · Cookie: session=42request 2 · Cookie: session=42request 3 · no cookieevery request must carry proof of who you areno cookie → a stranger again
服务器什么都不记得:每个请求都带着 cookie,没有它你就又成了陌生人。
ConceptStateless · Cookie· 服务器无记忆;会话 cookie
是什么
服务器忘记过去的请求;cookie 把记忆带在身上。
怎么运作
浏览器把 cookie 或令牌附加到每个请求的头部。
例子
你能保持登录,是因为每个请求都带着你的会话 cookie。
坑
没有 cookie —— 你对服务器来说就是陌生人。
关联
cookie 搭在头部里;无状态让负载均衡器更省事。

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

§ 05

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

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

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

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

HTTP · a postcardYouServerpassword=hunter2anyone on the path can read itHTTPS = HTTP + TLS · a sealed envelopeYouServerx8#Qz!k2@vL…café Wi-Fi, ISP, attacker see only gibberish
HTTP 是路径上任何人都能读的明信片;HTTPS 是只给他们看到噪音的信封。
ProtocolTLS · HTTPS· 传输层安全,Transport Layer Security;HTTP + TLS
是什么
给线路加密;HTTPS 就是跑在 TLS 之上的 HTTP。
怎么运作
TLS 握手之后,内容被打乱 —— 路径上只能看到乱码。
例子
地址栏里的锁;端口 443。
坑
光有加密还不够 —— 你还得知道服务器是真的。
关联
服务器的身份由证书来证明。

Certificate —— 证明你在和谁说话

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

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

Certificate authoritytrusted by your browserBrowserchecks it automaticallyyourbank.comholds the certificatesigns: name is theirshere is my certificateis the signature real?
证书颁发机构签发证书;服务器出示它;浏览器验证签名。
ConceptCertificate· TLS 证书,TLS certificate,证书颁发机构(CA)
是什么
一张数字身份证:“这台服务器拥有这个名字”。
怎么运作
CA 签发证书;服务器出示它;浏览器自己验证签名。
例子
网站证书缺失或有误时,浏览器会警告你。
坑
别点掉证书警告硬往下走 —— 那可能是假的。
关联
把中间人挡在门外。

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

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

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

YouMan-in-the-middlereads · changesServeryou think you talk straight to the serverplain HTTP: read and changed, silentlyHTTPS: sealed + verified, the fake can't pass
中间的攻击者能读取并改动普通 HTTP;HTTPS 既读不了也伪造不了。
TermMan-in-the-Middle· 中间人攻击,MITM attack
是什么
位于你和服务器之间、读取或改动流量的攻击者。
怎么运作
你以为自己在和服务器说话,其实是经过他们在说话。
例子
一个恶意 Wi-Fi 网络在窥探普通 HTTP。
坑
它是隐形的:一切都“正常工作”,而你的数据在泄露。
关联
防御靠 TLS(封条)+ 证书(身份检查)。

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

§ 06

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

Latency 与 Bandwidth —— 等待与宽度

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

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

Latency · how long until the first drop arrivesthe round-trip time for a message to go and come backBandwidth · how much flows per seconda wide pipe can still be a long pipe · they are independent
延迟是水管的长度,带宽是水管的宽度。它们是两回事。
ConceptLatency · Bandwidth· 延迟与吞吐,delay and throughput
是什么
延迟 —— 你要等多久;带宽 —— 每秒多少数据。
怎么运作
它们互相独立:可以很宽,同时等待很久。
例子
大文件下载很快,但在一个遥远的网站上每次点击都卡。
坑
“网速快、网站慢”通常是延迟问题,不是带宽问题。
关联
延迟随每次往返而增长;CDN 能降低它。

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

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

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

BrowserFar serverDNSTCPTLSHTTPmore round trips × longer distance = slower page
DNS、TCP、TLS、HTTP —— 每一步都至少要跑一趟遥远的服务器。
ConceptRound Trip· 往返,RTT,round-trip time
是什么
一条消息去往服务器再回来的旅程。
怎么运作
每一步 —— DNS、握手、请求 —— 都至少要花一趟。
例子
绕地球半圈要几十毫秒,即使是光。
坑
许多小请求(“话痨式”设计)会把延迟累加起来。
关联
更少的往返,或更短的路径(CDN),意味着更低的延迟。

CDN —— 把答案放得更近

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

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

Origin serverone place, far awayEdge · Tokyoa copyuser in TokyoEdge · Berlina copyuser in BerlinEdge · São Pauloa copyuser in São Paulocopiesshort trip
副本放在附近的边缘服务器上;每个用户去最近的那个,而不是跨越大洋。
ToolCDN· 内容分发网络,Content Delivery Network
是什么
一批遍布全球、存有你内容副本的服务器。
怎么运作
用户由最近的服务器提供服务,而不是源服务器。
例子
东京的用户从附近的城市拿到页面。
坑
这些副本是缓存:更新不会瞬间到达。
关联
降低延迟和很长的往返;是 DNS 缓存的近亲。

Load Balancer —— 把工作分摊开

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

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

UsersLoad balancerServer 1Server 2Server 3down · skippedadd servers behind it to scale · it routes around failures
负载均衡器把请求交给健康的服务器,并绕开出故障的那台。
ToolLoad Balancer· 负载均衡器,LB
是什么
把请求分摊到多台服务器上的中间人。
怎么运作
每个请求都交给其中一台存活的服务器;挂掉的会被跳过。
例子
流量增长了 —— 你在均衡器后面加服务器。
坑
如果某台服务器把会话存在自己的内存里,其他服务器就不知道它。
关联
之所以好用,是因为 HTTP 是无状态的。

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

§ 07

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

加载一个 URL 时发生了什么

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

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

1DNSexample.com → IP address2TCPopen a connection to that IP, port 4433TLSencrypt the line, check the certificate4HTTP requestGET · headers · maybe a body5HTTP responsestatus code · headers · body6Renderthe browser draws the page (maybe via a CDN)
一次点击 —— 六个步骤,每一步都有这门课里自己的词。

这些概念如何连在一起

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

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

HTTPmethods · headers · body · statusTLSencryption + certificate → HTTPSTCP / UDPreliable or fast · portsIPaddresses · packetsClient–serverwho asksDNSname → IPLatencycost of distanceCDNanswer closercutsLoad balancerspreads loadeach layer rides on the one below it
对话的各层以及周围的帮手:每一层都运行在下一层之上。
旅程,按顺序
  • DNS 把域名解析成 IP 地址。
  • 向那个 IP 的某个端口(HTTPS 是 443)打开一条 TCP 连接。
  • TLS 握手把线路加密,并检查服务器的证书。
  • 客户端发送一个 HTTP 请求 —— 一个方法、头部,也许还有正文。
  • 服务器返回一个状态码、头部和正文。
  • CDN 可能从附近提供它;负载均衡器可能挑选服务器。
说明你已经看懂 Web 的迹象
  • 404 与 500 一对比,立刻就知道是你的错还是服务器的错。
  • “网速快但网站慢”,你会读成延迟问题,而不是带宽问题。
  • 锁意味着加密并且身份已验证 —— 你清楚它保证了什么。
  • 你能解释为什么在每个无状态请求上保持登录都需要一个 cookie。
  • 你可以不看资料,把上面整个 URL 旅程讲出来。

速查表:全部 21 个概念

基础

Packet数据包

一小块标着“从哪来”和“到哪去”的数据。

IP AddressIP 地址,Internet Protocol address

标识网络上一台机器的数字。

Client–Server请求–响应模型

客户端提问,服务器回答。

名称

Domain Name域名

网站的可读名称,为人而设计。

DNS域名系统,Domain Name System

电话簿:名字 → IP 地址。

DNS Caching · TTLDNS 缓存

答案被记住;TTL 说明能信任多久。

连接

TCP传输控制协议,Transmission Control Protocol

可靠的线路:握手、全部有序、丢了就重发。

UDP用户数据报协议,User Datagram Protocol

不作保证的快速线路:发出去就不管。

Port端口

门牌号:机器上的哪项服务。

HTTP

HTTP超文本传输协议,HyperText Transfer Protocol

Web 的语言:请求与响应。

HTTP MethodsGET · POST · PUT · DELETE

请求的动词 —— 你的意图。

Headers · Body元数据与载荷

消息的细节,以及货物本身。

Status CodesHTTP 状态码

2xx 成功,3xx 重定向,4xx 你的错,5xx 服务器的错。

Stateless · Cookie服务器无记忆

服务器会忘掉你;cookie 搭在每个请求上。

HTTPS

TLS · HTTPS加密

把对话封起来;HTTPS = HTTP + TLS。

CertificateTLS 证书,CA

一张签发的身份证:服务器拥有它的名字。

Man-in-the-MiddleMITM

中间的攻击者;HTTPS 能抵御它。

速度

Latency · Bandwidth等待与宽度

你等多久,以及每秒多少数据。是不同的两件事。

Round TripRTT,往返

去了再回来;每一趟都要花时间。

CDN内容分发网络,Content Delivery Network

把内容副本放在靠近用户的地方。

Load Balancer负载均衡器,LB

把请求分摊到多台服务器上,并绕开故障。

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

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

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