星图 · 活页

一次请求背后的规矩

HTTP 与 CORS 的八个小实验:逐帧走一遍完整访问的时序,拆开请求与响应报文,把“无状态、幂等、预检、缓存、重定向、版本演进”从概念拨成手感。

讲义 · 后端第一性原理 · 第一章

一次请求背后,藏着一串规矩。

“无状态、幂等、预检、缓存、重定向”这些词,光看定义总要绕半天。这一页放了八个小实验, 每个都能拨动参数、看见结果——把概念摸成手感,比背下来牢靠。

  • 约 16 分钟
  • 8 个互动实验
  • 零依赖,纯静态
01

一次访问到底走了几步

在 HTTP 说话之前,还得先经过 DNS、TCP,HTTPS 还要加上 TLS。按「下一步」,看每一跳是谁在讲话。

DNS把域名换成 IPTCP建立可靠、有序的通道TLSHTTPS 才有,谈好加密HTTP真正传请求与响应

浏览器DNS 服务器Web 服务器域名 → IP?93.184.216.34SYNSYN + ACKACKClientHello证书 + ServerHelloGET / HTTP/1.1200 OK + HTML
DNSTCPTLSHTTP —— 点「下一步」开始。
02

拆开报文:请求与响应

骨架都是四段:起始行 + 头 + 空行 + 可选的 body。换方法、换路径、换状态码,看看报文怎么变; 带虚线的部分都可以点。

请求报文

响应报文

点报文里带虚线的部分,看它是什么意思。
03

无状态:请求会落到哪台机器

HTTP 服务器“没有记忆”。同样一次登录,靠服务器存会话和靠请求自带 token,在多台机器之间差别很大。

负载均衡随机分配
04

幂等:超时重试会不会扣两次钱

POST 天生不幂等。真正的请求确实发出去了,只是响应在路上丢了——客户端除了重试,别无选择。

已扣款:$0

05

CORS:浏览器为什么先发一个 OPTIONS

页面在 https://example.com,API 在 https://api.example.com —— 主机不同,就是跨源。调参数,看浏览器怎么决定。

06

缓存:新鲜、验证、重新下载

服务器回了 Cache-Control: max-age=10。试试这个顺序:发起 GET → 快进 6 秒 → 再 GET → 改内容 → 快进 6 秒 → 再 GET。

07

重定向:POST 的 body 还在吗

同样把 POST /old 指到 /new,挑一个状态码,看浏览器重发的时候带不带 body。

选一个状态码看看。
08

版本演进:每次都在补上一个瓶颈

从每请求一次握手,到多路复用,再到换掉 TCP——每一代都在还上一代欠下的债。

✓

把这一章收成四句话

概念是抓手,不是终点;遇到具体问题,还是回到请求与响应本身去推。

协议是约定,不是魔法

  • 请求行 + 头 + 空行 + body,四段骨架走天下。
  • 客户端该判状态码数字,而不是原因短语。

无状态是有意的设计

  • 服务器不记你是谁,身份靠每次请求自带。
  • 会话粘性、共享存储、签名 token,都是在补这一条。

安全边界在浏览器,不在服务器

  • CORS 是浏览器的同源策略在执行,不是服务器的防火墙。
  • 写操作真正要靠的,是鉴权与 CSRF 防护。

把这些规矩拆开看,它们都讲得通。

内容参考 Backend from First Principles 第一章与 RFC 9110;交互演示为原创实现,模型经过简化。

← 回到轨道