HTTP 简介
在拆解报文结构之前,我们先搞清楚 HTTP 到底是什么、怎么来的、为什么它如此重要。理解背景,后面学到细节时就不会觉得突兀。
HTTP 是什么?
HTTP 是 HyperText Transfer Protocol(超文本传输协议)的缩写,它是应用层的客户端-服务器协议。说人话就是:浏览器(客户端)按某种格式发请求,服务器按同一种格式返回响应,这套格式就是 HTTP。
它工作在 TCP/IP 模型中的应用层,下面通常走 TCP(HTTP/3 走 QUIC/UDP)。默认端口:HTTP 用 80,HTTPS 用 443。
诞生简史:Web 的同发明人
HTTP 由英国科学家 Tim Berners-Lee 在 1989 年于欧洲核子研究组织(CERN)提出,和他同时发明的还有 HTML 和 URL——三者合起来就是万维网(World Wide Web)。HTTP 最早的版本非常简单,几经演进:
- HTTP/0.9(1991):极简版,只能 GET 纯文本 HTML,没有头、没有状态码。
- HTTP/1.0(1996):引入了 header、状态码、Content-Type,可以传图片等其他类型。
- HTTP/1.1(1997,1999 标准化):沿用至今最广的版本,引入 keep-alive 长连接、Host 头、管道化、分块传输。
- HTTP/2(2015):基于 Google SPDY,引入二进制分帧、多路复用、头部压缩、服务器推送。
- HTTP/3(2022):基于 QUIC(UDP),连接建立更快、抗丢包、抗切换网络。
HTTP 的核心特点
- 客户端-服务器模型:永远是一端发请求,另一端回响应,角色清晰。
- 无状态(Stateless):服务器不会自动记住"这个客户端上一次请求了什么"——每个请求都是独立的。这点下面单独讲。
- 文本协议(HTTP/1.x):报文是人类可读的纯文本,便于调试;HTTP/2 之后改成二进制帧,但语义还是同一套。
- 可扩展:通过自定义 header 扩展语义(如
X-Request-Id、Authorization),协议本身允许任意头字段。 - 支持任意数据类型:HTML、JSON、图片、视频、二进制流都可以传,靠
Content-Type区分。
"无状态"是什么意思?为什么要有 Cookie?
无状态(Stateless)是 HTTP 最重要的设计哲学:服务器不保存客户端的任何上下文。对服务器来说,你的第 1 个请求和第 100 个请求完全独立,它不会自动把它们关联起来。
# 第 1 次请求
GET /cart HTTP/1.1
Host: shop.example.com
# 服务器响应: 你购物车是空的
# 第 2 次请求(用户点了"加入购物车"之后)
POST /cart HTTP/1.1
Host: shop.example.com
Content-Type: application/x-www-form-urlencoded
item=apple&qty=2
# 第 3 次请求(再看购物车)
GET /cart HTTP/1.1
Host: shop.example.com
# 服务器为什么还记得购物车有 apple?
# 因为第 2 次响应里服务器发了一个 Set-Cookie,后续请求自动带上这带来了好处:服务器实现简单、易水平扩展(任何一台服务器都能处理任意请求)、不用清理过期会话。但也带来麻烦:购物车、登录态这种"需要记住用户"的场景怎么办?答案是 Cookie + Session——服务器在响应里发一个小令牌,浏览器后续请求自动带上,服务器据此识别同一用户。详见本系列第 7 篇 Cookie 与 Session。
HTTP 版本演进:为什么越来越快?
网页从早期的"一个 HTML"变成现在"上百个 JS/CSS/图片资源",HTTP 协议本身也在拼命提速:
# HTTP/1.1 — 多个请求需要排队(或开多个 TCP 连接)
GET /a.css HTTP/1.1 <-- 请求 1
GET /b.css HTTP/1.1 <-- 请求 2 (要等请求 1 响应完)
GET /c.css HTTP/1.1 <-- 请求 3 (继续等)
# HTTP/2 — 一个连接多路复用,可以并发
:method: GET :path: /a.css <-- 同时发出
:method: GET :path: /b.css <-- 同时
:method: GET :path: /c.css <-- 同时
# HTTP/3 — 基于 QUIC(UDP),连接建立更快,
# 切换 WiFi/4G 不掉线- HTTP/1.1 队头阻塞:同一个 TCP 连接上,前一个请求没响应完,后面的就得等。浏览器只能开 6 个并发连接绕过。
- HTTP/2 多路复用:一个连接里可以同时跑几十个请求/响应,互不阻塞;头部还用 HPACK 压缩,重复的 Cookie/Header 不再重传。
- HTTP/3 上 QUIC:换 UDP 底座,0~1 个 RTT 就能建连,切 WiFi/4G 不掉线。Google、Cloudflare、Akamai 大规模使用多年。
对你开发而言:写代码时几乎感知不到版本差异——语义(方法、状态码、头)是同一套,只是底层传输不同。
HTTP 与 HTTPS 的关系
HTTP 明文传输,任何人(运营商、黑客、WiFi 提供方)都能看到、能改。HTTPS = HTTP + TLS/SSL 加密层:传输内容被加密、服务器身份被证书证明。现代 Web 几乎强制 HTTPS——浏览器把 HTTP 站点标"不安全",Google 也把它作为排名因素。详见第 8 篇 HTTPS 与 SSL/TLS。
本系列的学习目标
读完这 9 篇,你将能:
- 看懂浏览器 F12 → Network 面板里的每一行请求/响应;
- 用
curl手搓任意 HTTP 请求调试接口; - 正确选择 GET/POST/PUT/DELETE,正确设置
Content-Type; - 理解 200/301/304/401/403/404/500 各自的含义;
- 掌握 Cookie、Session、Token 的会话保持原理;
- 说清 HTTPS 加密流程、为什么需要证书。
← 返回 HTTP 教程目录
下一篇 HTTP 报文结构 →