--- title: HTTP 协议 tags: [概念, http, 协议, web, tcp, rest, network] created: 2026-07-21 updated: 2026-08-12 sources:
- raw/day37 web应用层详解part1.md
- raw/day29 CDN层详解上.md
- raw/day46 跨域问题及cookie、session、jwt.md
- raw/day47 ssl、tls及全站https.md aliases: [HTTP 协议, 超文本传输协议, HTTPS, TLS 握手, Keep-Alive 长连接, 同源策略, 跨域, CORS, CSRF, XSS]
HTTP 协议
HTTP(Hyper Text Transfer Protocol,超文本传输协议)是互联网上应用最广泛的应用层协议,基于 TCP 协议,主要用于浏览器/服务器(B/S)架构通信。它是整个 Web 世界的通信基石。
发展历程
| 版本 | 年份 | 关键特性 | 连接方式 |
|---|---|---|---|
| HTTP/0.9 | 1991 | 仅 GET,纯文本 | 短连接 |
| HTTP/1.0 | 1996 | POST/DELETE/PUT,超文本,头部,Cookie | 短连接(可 keep-alive) |
| HTTP/1.1 | 1997 | 默认长连接,管道化,Host 头 | 长连接(默认) |
连接演进
短连接(HTTP/0.9 默认):
TCP 三次握手 → HTTP 请求/响应 → 服务端主动断开
TCP 三次握手 → HTTP 请求/响应 → 服务端主动断开
问题:每个请求都要三次握手,高并发下消耗巨大。
长连接(HTTP/1.0 Keep-Alive / HTTP/1.1 默认):
TCP 三次握手 → 请求1+响应1 → 请求2+响应2 → ... → 空闲超时断开
一个 TCP 连接处理多个请求,大幅减少握手开销。
无状态问题与解决方案
HTTP 协议本质是无状态的——每次请求都是独立的,服务器无法识别请求来自谁。
Cookie 独立存储
| 步骤 | 说明 |
|---|---|
| 首次访问 | 服务端 Set-Cookie: k=v → 浏览器存入本地 |
| 后续请求 | 浏览器自动携带 Cookie: k=v |
| 缺点 | 客户端可篡改,不安全 |
Cookie + Session
| 步骤 | 说明 |
|---|---|
| 首次认证 | 服务端创建 Session,返回 Session ID(写入 Cookie) |
| 后续请求 | 携带 Session ID,服务端查 Session |
| 优点 | 敏感数据在服务端,安全 |
| 缺点 | 集群需 Session 共享(存入 Redis) |
JWT(JSON Web Token)
| 结构 | 说明 |
|---|---|
| Header | 算法类型(HS256/RSA) |
| Payload | 用户身份等声明数据 |
| Signature | 签名防篡改 |
- 客户端存储 Token,服务端无状态,天然集群友好
- 签名机制保证数据不可篡改
| 方案 | 存储位置 | 安全性 | 负载均衡支持 | 主动废止 |
|---|---|---|---|---|
| Cookie 独立 | 客户端 | 低(可篡改、明文) | 好(无状态) | 不支持 |
| Cookie+Session | 服务端 + 客户端 | 高(服务端验证) | 需会话共享(Redis) | 支持(删除 Session) |
| JWT | 客户端 | 高(签名防篡改) | 好(无状态) | 不支持 |
集群下的会话共享
Session 只存单台 Web 本地时,负载均衡把请求分发到其他机器即丢失登录状态。三种方案:
| 方案 | 原理 | 适用场景 |
|---|---|---|
| ip_hash | 同一 IP 固定到同一台服务器 | 简单场景,但违背负载均衡初衷 |
| NFS 共享 | 所有 Web 共享 Session 文件目录 | 小规模环境 |
| Redis 共享 | 所有 Web 从 Redis 读写 Session | 生产环境推荐 |
Redis 方案通过配置 session.save_handler = redis、session.save_path = "tcp://IP:6379" 把 Session 集中存储,任何 Web 节点都能读到同一份会话。
同源策略与跨域
域 = 协议 + 域名 + 端口,三者完全一致才同源;任一不同即跨域(http vs https、example.com vs www.example.com、端口不同)。
同源策略限制响应、不限制请求:请求可正常发出且服务器正常返回,但浏览器拦截响应,JavaScript 无法读取。核心目标:“一个域只能拿自己域里的数据”。
例外:<img>、<script>、<link> 标签允许跨域加载资源。
CORS(跨域资源共享):被跨域访问的后端主动通过响应头告诉浏览器“我允许被跨域拿结果”:
| 响应头 | 作用 |
|---|---|
Access-Control-Allow-Origin | 允许哪些域名(生产用具体域名,勿用 *) |
Access-Control-Allow-Methods | 允许的 HTTP 方法 |
Access-Control-Allow-Headers | 允许的请求头 |
Access-Control-Allow-Credentials | 是否允许携带 Cookie |
Access-Control-Max-Age | OPTIONS 预检缓存时间 |
OPTIONS 预检请求应返回 204。
Web 安全:CSRF 与 XSS
CSRF(跨站请求伪造)
利用“用户已登录 + 浏览器自动携带 Cookie”:用户访问恶意站点,恶意页面自动向正常站点发请求(img/fetch),浏览器自动携带 Cookie,服务端误认为是本人操作。同源策略防不了 CSRF——它限制的是读取响应,不是发送请求。
攻击条件:① 用户登录正常站点未退出 ② 浏览器保存了该站点 Cookie ③ 用户点击了恶意链接。
防御:
- CSRF Token:表单嵌入随机 Token,服务端验证
- SameSite Cookie:
SameSite=Strict或SameSite=Lax - 验证 Referer 头:检查请求来源是否合法
- 二次验证:敏感操作要求输入密码或验证码
XSS(跨站脚本攻击)
攻击者在网页注入恶意 JavaScript,用户访问时执行。
防御:
- 输入过滤与转义
- CSP(Content Security Policy):限制脚本来源
- Cookie
HttpOnly:防止 JavaScript 读取
报文结构
请求报文
请求行:GET /index.html HTTP/1.1
请求头:Host: example.com
User-Agent: Chrome/...
Cookie: session_id=abc123
空行
请求体(POST 时包含数据)
响应报文
状态行:HTTP/1.1 200 OK
响应头:Content-Type: text/html
Set-Cookie: k=v
空行
响应体(HTML/JSON/二进制等)
状态码分类
| 分类 | 范围 | 含义 | 常见举例 |
|---|---|---|---|
| 1xx | 100-199 | 信息 | 100 Continue |
| 2xx | 200-299 | 成功 | 200 OK, 201 Created |
| 3xx | 300-399 | 重定向 | 301 Moved, 302 Found |
| 4xx | 400-499 | 客户端错误 | 400 Bad Request, 401 Unauthorized, 403 Forbidden, 404 Not Found |
| 5xx | 500-599 | 服务端错误 | 500 Internal Server Error, 502 Bad Gateway, 503 Service Unavailable |
HTTPS / TLS
HTTPS = HTTP + TLS(传输层安全协议),解决 HTTP 明文传输的三大安全问题:窃听(加密传输)、篡改(Hash + 数字签名)、伪装(数字证书 + CA 中心)。
完整加密原理、证书体系、认证流程与 HTTPS 配置见 SSL/TLS 与 HTTPS 加密体系。
TLS 握手简流程
Client Hello → Server Hello + 证书 → 密钥交换 → 加密通信
详细单向/双向认证流程(含 Pre-Master Secret 密钥交换)见 SSL/TLS 与 HTTPS 加密体系。
证书类型
| 类型 | 验证级别 | 适用 |
|---|---|---|
| DV | 域名所有权 | 个人/博客 |
| OV | 企业认证 | 企业官网 |
| EV | 最高级 | 金融/银行 |
证书申请方式与域名数量维度(单域名/通配符/多域名)见 SSL/TLS 与 HTTPS 加密体系。
HTTP/2 多路复用
- 一个 TCP 连接上并发送多个请求/响应
- 解决 HTTP/1.x 的队头阻塞问题
浏览器访问完整流程
1. DNS 解析(域名 → IP)
2. TCP 三次握手(建立连接)
3. TLS 协商(HTTPS 时)
4. HTTP 请求/响应(数据传输)
5. 浏览器渲染(解析 HTML/CSS/JS)
6. TCP 四次挥手(关闭连接)
上下游通信原则
上下游之间,通信协议能对上就可以。上游用什么协议封装,下游就用什么协议解封。
相关页面
- SSL/TLS 与 HTTPS 加密体系:加密原理 / 证书体系 / 认证流程 / HTTPS 配置
- Day47:SSL/TLS 及全站 HTTPS:Day47 完整课程摘要
- HTTP 协议详解:Day37 完整原文
- 跨域问题及 Cookie/Session/JWT:Day46 同源策略 / CORS / CSRF/XSS / 会话保持实战
- CDN 层(上):HTTPS 证书、TLS 握手
- CDN 层(下):OpenResty 缓存(HTTP 缓存头)
- 进程控制(下):TCP 三次握手/四次挥手
- Nginx:Nginx 七层代理(HTTP 协议解析)