一句话定位:HTTP 是 Web 的基石——理解 HTTP 就理解了浏览器和服务器之间"怎么说话"。
学习路径:1 HTTP 基础 → 2 请求与响应 → 3 HTTP 方法 → 4 状态码 → 5 HTTP 版本 → 6 HTTPS 与 TLS → 7 Cookie 与 Session → 8 跨域与缓存 → 9 实战调试
图表在
/HTTP学习笔记/diagrams/目录。图注名即原图文件名,看图注就能直接找到原图用 draw.io 编辑。
📌 打个比方:HTTP 像寄信——你写好信封(请求头)和信纸(请求体),交给邮局(TCP),服务器收到后回一封信(响应)。每次寄信都是独立的,邮局不记得你上次寄过什么。
📌 HTTP 通信至少经历 4 步:DNS 解析 → TCP 握手 → HTTP 请求/响应 → TCP 挥手。HTTPS 还多一步 TLS 握手。理解这个流程是排查网络问题的基础。
请求行三要素:
/api/users?id=1HTTP/1.1、HTTP/2、HTTP/3| 请求头 | 说明 | 示例 |
|---|---|---|
Host |
目标主机(HTTP/1.1 必须有) | Host: api.example.com |
User-Agent |
客户端标识 | Mozilla/5.0 ... |
Accept |
期望的响应类型 | Accept: application/json |
Content-Type |
请求体类型 | application/json |
Content-Length |
请求体字节数 | 42 |
Authorization |
认证凭证 | Bearer <token> |
Cookie |
携带的 Cookie | session_id=abc123 |
Origin |
请求来源(跨域用) | https://example.com |
Referer |
来源页面 URL | https://google.com |
Accept-Encoding |
可接受的压缩 | gzip, deflate, br |
If-None-Match |
缓存校验 | "abc123" |
| 响应头 | 说明 | 示例 |
|---|---|---|
Content-Type |
响应体类型 | text/html; charset=utf-8 |
Content-Length |
响应体字节数 | 1024 |
Cache-Control |
缓存策略 | max-age=3600 |
Set-Cookie |
设置 Cookie | session=abc; HttpOnly; Secure |
Location |
重定向目标 | https://example.com/new |
Access-Control-Allow-Origin |
CORS 跨域允许 | * 或 https://example.com |
ETag |
资源版本标识 | "v3.14" |
Last-Modified |
资源最后修改时间 | Wed, 21 Oct 2025 07:28:00 GMT |
Content-Encoding |
压缩方式 | gzip |
Strict-Transport-Security |
HSTS 强制 HTTPS | max-age=31536000 |
📌 Content-Type 是最重要的头。它告诉对方"我发的是什么格式"。常见值:application/json、text/html、application/x-www-form-urlencoded、multipart/form-data(文件上传)、text/plain。
| 方法 | 语义 | 幂等? | 安全? | 有请求体? |
|---|---|---|---|---|
GET |
获取资源 | 是 | 是 | 否 |
POST |
创建资源 | 否 | 否 | 是 |
PUT |
完整替换资源 | 是 | 否 | 是 |
PATCH |
部分修改资源 | 否 | 否 | 是 |
DELETE |
删除资源 | 是 | 否 | 可选 |
HEAD |
只取响应头(不要体) | 是 | 是 | 否 |
OPTIONS |
查询服务器支持的方法 | 是 | 是 | 否 |
📌 幂等性:同一个请求执行一次和多次效果相同。GET/PUT/DELETE 幂等,POST/PATCH 不幂等。
为什么重要?网络可能重试请求。幂等方法重试安全,不幂等方法重试可能产生副作用(如重复下单)。设计 API 时要考虑这一点。
📌 RESTful 核心:URL 表示资源,HTTP 方法表示操作。URL 是名词,方法是动词。不要写成 /api/createUser(动词在 URL 里)——应该是 POST /api/users(动词在方法里)。
| 类别 | 范围 | 语义 |
|---|---|---|
| 1xx | 100-199 | 信息性(很少用) |
| 2xx | 200-299 | 成功 |
| 3xx | 300-399 | 重定向 |
| 4xx | 400-499 | 客户端错误 |
| 5xx | 500-599 | 服务器错误 |
| 状态码 | 短语 | 说明 |
|---|---|---|
| 200 | OK | 请求成功 |
| 201 | Created | 资源创建成功(POST 常用) |
| 204 | No Content | 成功但无返回体(DELETE 常用) |
| 301 | Moved Permanently | 永久重定向(浏览器缓存) |
| 302 | Found | 临时重定向 |
| 304 | Not Modified | 资源未修改,用缓存 |
| 400 | Bad Request | 请求格式错误(参数不对) |
| 401 | Unauthorized | 未认证(没登录/没带 token) |
| 403 | Forbidden | 已认证但无权限 |
| 404 | Not Found | 资源不存在 |
| 405 | Method Not Allowed | 方法不允许(如对只读资源 POST) |
| 409 | Conflict | 冲突(如重复创建) |
| 413 | Payload Too Large | 请求体太大 |
| 429 | Too Many Requests | 请求频率超限(限流) |
| 500 | Internal Server Error | 服务器内部错误 |
| 502 | Bad Gateway | 网关错误(上游服务挂了) |
| 503 | Service Unavailable | 服务不可用(维护中/过载) |
| 504 | Gateway Timeout | 网关超时(上游响应超时) |
📌 401 vs 403:401 是"你是谁?"(没认证),403 是"我知道你是谁,但你不能做这个"(没权限)。
301 vs 302:301 永久重定向——浏览器会缓存,下次直接跳新地址。302 临时重定向——每次都先访问旧地址再跳。SEO 用 301 传递权重,临时跳转用 302。
GETPOST、HEADConnection: keep-alive):多个请求复用一个 TCP 连接PUT、DELETE、PATCH、OPTIONS📌 HTTP/1.1 队头阻塞:虽然管道化可以连续发请求,但响应必须按顺序返回。如果第一个请求处理慢,后面的请求即使处理完了也得等。浏览器解决方案:对同一域名开 6 个并发连接。
📌 HTTP/2 多路复用解决了 HTTP/1.1 的队头阻塞——多个请求并行处理,互不等待。但 HTTP/2 仍有 TCP 层队头阻塞:如果 TCP 包丢失,所有流都要等重传。
📌 HTTP/3 为什么用 UDP?TCP 是操作系统内核实现的,更新慢。QUIC 在 UDP 上自己实现可靠传输,可以快速迭代。而且 TCP 的队头阻塞是内核级的,应用层无法解决。QUIC 在应用层解决,一个流丢包不影响其他流。
| 特性 | HTTP/1.0 | HTTP/1.1 | HTTP/2 | HTTP/3 |
|---|---|---|---|---|
| 传输层 | TCP | TCP | TCP | UDP(QUIC) |
| 连接 | 短连接 | 持久连接 | 多路复用 | 多路复用 |
| 格式 | 文本 | 文本 | 二进制 | 二进制 |
| 队头阻塞 | 有 | 有(HTTP层) | 有(TCP层) | 无 |
| 头部压缩 | 否 | 否 | HPACK | QPACK |
| 服务器推送 | 否 | 否 | 是 | 是 |
📌 打个比方:HTTP 像明信片——邮递员(中间人)能看到内容。HTTPS 像密封信封——只有收件人有钥匙能打开。而且信封上有防伪封条(证书),确认是本人寄的。
📌 为什么需要三个随机数?客户端随机数 + 服务器随机数 + 预主密钥 → 生成会话密钥。三个随机数保证每次连接的密钥不同,即使有人记录了所有加密流量,也无法复现密钥。
📌 证书的本质:CA(证书颁发机构)用私钥给网站证书签名,浏览器用 CA 公钥验证签名。信任 CA = 信任 CA 签名的所有证书。Let's Encrypt 提供免费证书,是当下最流行的 CA。
| 维度 | 对称加密 | 非对称加密 |
|---|---|---|
| 密钥 | 加密解密同一把 | 公钥加密,私钥解密 |
| 速度 | 快 | 慢(约 100-1000x) |
| 用途 | 大量数据加密 | 密钥交换、数字签名 |
| TLS 中的角色 | 会话密钥加密 HTTP 数据 | 握手阶段交换会话密钥 |
📌 HTTPS 用了两者的组合:非对称加密安全但慢,用来交换会话密钥;对称加密快但需要共享密钥,用交换来的会话密钥加密实际数据。各取所长。
Cookie 属性:
| 属性 | 说明 |
|---|---|
Domain |
Cookie 适用的域名 |
Path |
Cookie 适用的路径 |
Max-Age / Expires |
过期时间 |
HttpOnly |
JS 不能访问(防 XSS) |
Secure |
只在 HTTPS 下发送 |
SameSite |
跨站发送策略(Strict/Lax/None) |
📌 HttpOnly + Secure + SameSite 是 Cookie 安全三件套。HttpOnly 防 XSS 偷 Cookie,Secure 防中间人窃听,SameSite 防 CSRF 跨站请求伪造。
| 维度 | Cookie | Session | Token (JWT) |
|---|---|---|---|
| 存储位置 | 浏览器 | 服务器 | 客户端 |
| 大小限制 | ~4KB | 无限制 | ~4KB |
| 服务器开销 | 无 | 需存储 | 无(签名验证) |
| 扩展性 | 好 | 差(需共享 Session) | 好 |
| 失效控制 | 浏览器删 | 服务器删 | 自然过期 |
| 适用场景 | 简单状态 | 传统 Web 登录 | API 认证、微服务 |
📌 JWT 的优势:服务器不需要存储 Session——Token 自包含用户信息+签名,服务器只验证签名。适合微服务/分布式场景。缺点:签发后无法主动撤销(除非维护黑名单)。
同源:协议 + 域名 + 端口三者相同。
CORS(跨域资源共享):
📌 CORS 是浏览器行为,不是服务器限制。服务器正常处理请求并返回,是浏览器检查响应头决定是否让 JS 读取。curl 不受 CORS 限制。
简单请求(GET/POST + 简单头)不需要预检。复杂请求(PUT/DELETE/自定义头)先发 OPTIONS 预检。
强缓存(不发请求,直接用本地副本):
协商缓存(发请求验证,没改用 304):
📌 缓存优先级:Cache-Control > Expires。ETag > Last-Modified(ETag 更精确,基于内容哈希)。
no-cache 不是不缓存!它的意思是"可以缓存,但每次用之前必须向服务器验证"。真正不缓存用 no-store。
| 现象 | 可能原因 | 排查方法 |
|---|---|---|
| 页面空白 | JS 报错 / 跨域 | Console + Network 面板 |
| 401 | 未登录 / Token 过期 | 检查 Authorization 头 |
| 403 | 权限不足 / CORS | 检查 CORS 响应头 |
| 404 | 路径错误 / 资源未部署 | 确认 URL 路径 |
| 502/504 | 服务器挂了 / 超时 | 检查后端服务状态 |
| 慢 | DNS/TLS/大文件 | Network Timing 面板 |
| 乱码 | Content-Type charset 不对 | 检查 Content-Type 头 |
| CORS 报错 | 跨域未配置 | 检查 Access-Control-Allow-* 头 |
📌 安全头是"免费"的安全加固——只需在服务器/CDN 配置响应头,不需要改代码。用 securityheaders.com 扫描你的网站评级。
| Content-Type | 用途 |
|---|---|
text/html |
HTML 页面 |
text/plain |
纯文本 |
application/json |
JSON API |
application/x-www-form-urlencoded |
表单提交(默认) |
multipart/form-data |
文件上传 |
application/octet-stream |
二进制流(下载) |
image/png / image/jpeg |
图片 |
application/xml |
XML 数据 |