--- 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.91991仅 GET,纯文本短连接
HTTP/1.01996POST/DELETE/PUT,超文本,头部,Cookie短连接(可 keep-alive)
HTTP/1.11997默认长连接,管道化,Host 头长连接(默认)

连接演进

短连接(HTTP/0.9 默认):

TCP 三次握手 → HTTP 请求/响应 → 服务端主动断开
TCP 三次握手 → HTTP 请求/响应 → 服务端主动断开

问题:每个请求都要三次握手,高并发下消耗巨大。

长连接(HTTP/1.0 Keep-Alive / HTTP/1.1 默认):

TCP 三次握手 → 请求1+响应1 → 请求2+响应2 → ... → 空闲超时断开

一个 TCP 连接处理多个请求,大幅减少握手开销。

无状态问题与解决方案

HTTP 协议本质是无状态的——每次请求都是独立的,服务器无法识别请求来自谁。

步骤说明
首次访问服务端 Set-Cookie: k=v → 浏览器存入本地
后续请求浏览器自动携带 Cookie: k=v
缺点客户端可篡改,不安全
步骤说明
首次认证服务端创建 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-AgeOPTIONS 预检缓存时间

OPTIONS 预检请求应返回 204。

Web 安全:CSRF 与 XSS

CSRF(跨站请求伪造)

利用“用户已登录 + 浏览器自动携带 Cookie”:用户访问恶意站点,恶意页面自动向正常站点发请求(img/fetch),浏览器自动携带 Cookie,服务端误认为是本人操作。同源策略防不了 CSRF——它限制的是读取响应,不是发送请求。

攻击条件:① 用户登录正常站点未退出 ② 浏览器保存了该站点 Cookie ③ 用户点击了恶意链接。

防御:

  1. CSRF Token:表单嵌入随机 Token,服务端验证
  2. SameSite Cookie:SameSite=Strict 或 SameSite=Lax
  3. 验证 Referer 头:检查请求来源是否合法
  4. 二次验证:敏感操作要求输入密码或验证码

XSS(跨站脚本攻击)

攻击者在网页注入恶意 JavaScript,用户访问时执行。

防御:

  1. 输入过滤与转义
  2. CSP(Content Security Policy):限制脚本来源
  3. 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/二进制等)

状态码分类

分类范围含义常见举例
1xx100-199信息100 Continue
2xx200-299成功200 OK, 201 Created
3xx300-399重定向301 Moved, 302 Found
4xx400-499客户端错误400 Bad Request, 401 Unauthorized, 403 Forbidden, 404 Not Found
5xx500-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 四次挥手(关闭连接)

上下游通信原则

上下游之间,通信协议能对上就可以。上游用什么协议封装,下游就用什么协议解封。

相关页面