HTTP协议原理
HTTP(Hyper Transfer Protocol) 超文本传输协议
本质上就是: 客户端(浏览器/前端)和服务器之间通信的规则
比如访问: http://localhost:8000/userList背后其实就是: 浏览器发请求-->服务器返回响应
HTTP工作流程
text
浏览器 → 发请求(Request) → 服务器
服务器 → 返回响应(Response) → 浏览器
比如前端代码:
javascript
fetch('/userList')
其实发的是:
GET /userList HTTP/1.1
Host: localhost:8080
HTTP请求结构
一个http请求长这样:
请求行
请求头
空行
请求体(可选)
一个真实的请求
GET /domains/example/ HTTP/1.1 // 请求行: 请求方法 请求 URI HTTP 协议/协议版本
Host:www.iana.org // 服务端的主机名
User-Agent:Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.4 (KHTML, like Gecko) Chrome/22.0.1229.94 Safari/537.4 // 浏览器信息
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 // 客户端能接收的 mine
Accept-Encoding:gzip,deflate,sdch // 是否支持流压缩
Accept-Charset:UTF-8,*;q=0.5 // 客户端字符编码集
// 空行,用于分割请求头和消息体
// 消息体,请求资源参数,例如 POST 传递的参数
1请求行
GET /userList HTTP/1.1
包含三部分:
- 请求方法(GET/PSOT/PUT/DELETE)
- 请求路径
- 协议版本
2请求头(Header)
Host:localhost:8080
Content-Type: application/json
Authorization: Bearer xxx
3请求体(body)
只有 POST/PUT 才有用
json
{
"username":"admin",
"password":"123456",
}
HTTP响应结构
text
状态行
响应头
空行
响应体
例如:
HTTP/1.1 200 OK // 状态行
Server: nginx/1.0.8 // 服务器使用的 WEB 软件名及版本
Date: Tue, 30 Oct 2012 04:14:25 GMT // 发送时间
Content-Type: text/html // 服务器发送信息的类型
Transfer-Encoding: chunked // 表示发送 HTTP 包是分段发的
Connection: keep-alive // 保持连接状态
Content-Length: 90 // 主体内容长度
// 空行 用来分割消息头和主体
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"... // 消息体
1状态行
HTTP/1.1 200 OK
2响应头
Content-Type:application/json
Set-Cookie:token=xxx
3响应体
json
{
"code":200.
"data":[]
}
HTTP常见状态码
1xx:信息性(临时响应)
100 Continue: 客户端可继续发送请求
101 Switching Protocols: 切换协议(如升级到 WebSocket)
2xx:成功
200 OK:请求成功,正常返回
201 Created:资源创建成功(常用于POST)
204 No Content:请求成功但无返回内容
3xx:重定向
301 Moved Permanently: 永久重定向
302 Found: 临时重定向
304 Not Modified:资源未修改,可使用缓存
4xx:客户端错误
400 Bad Request:请求语法错误
401 Unauthorized:未认证(需要登录)
403 Forbidden:服务器拒绝访问(权限不足)
404 Not Found:资源不存在
405 Method Not Allowed:请求方法不允许
429 Too Many Request:请求频率超限
5xx:服务器错误
500 Internet Server Error:服务器内部错误
502 Bad Gateway:网关错误
503 Service Unavailable:服务暂时不可用
504 Gateway Timeout:网关超时
HTTP 核心特点
1.无状态
HTTP 不记住你是谁,每次请求都是独立的:
登录 → 请求A
获取用户信息 → 请求B
服务器默认不知道A和B是同一个人
解决方法:
JWT
2.基于TCP
HTTP是建立在 TCP 之上的
TCP是可靠连接
HTTP方法
| 方法 | 作用 | 例子 | 参数位置 | 安全性 | 长度限制 | 幂等性 |
|---|---|---|---|---|---|---|
| GET | 查询 | 获取用户 | URL | 暴露 | 有限制 | 有 |
| POST | 创建 | 注册 | 请求体 | 相对安全 | 基本没有 | 无 |
| PUT | 修改 | 修改用户 | ||||
| DELETE | 删除 | 删除用户 |
什么是幂等: 多次执行同一个操作,结果是一样的
哪些 HTTP方法是幂等的
| 方法 | 是否幂等 | 原因 |
|---|---|---|
| GET | ✔️ | 只是获取数据 |
| PUT | ✔️ | 覆盖更新 |
| DELETE | ✔️ | 删除一次和多次一样 |
| POST | ❌ | 每次都会创建新资源 |
HTTP 缓存技术
HTTP缓存有哪些实现方式
对于一些具有重复性的HTTP 请求,比如每次请求得到的数据都一样的,我们可以把这对「请求-响应」的数据都缓存在本地,那么下次就直接读取本地的数据,不必在通过网络获取服务器的响应了,这样的话HTTP/1.1 的性能肯定肉眼可见的提升
所以,避免发送 HTTP 请求的方法就是通过缓存技术
HTTP 缓存有两种实现方式,分别是 强制缓存 和 协商缓存
强制缓存
强制缓存指的是, 只要浏览器判断缓存没过期,则直接使用浏览器的本地缓存,决定是否使用缓存的主动性在于浏览器这边
协商缓存
当我们在浏览器使用开发者工具的时候,你可能会看到过某些请求的响应码是 304,这是告诉浏览器可以使用本地缓存的资源,通常这种通过服务器告知客户端是否可以使用缓存的方式被称为协商缓存


TCP和UDP
在计算机网络中,数据传输并不是随意发送的,它依赖一套明确的通信规则, tcp 和 udp就是传输层中最核心的两种协议,他们运行在ip协议之上;二者最大的区别不在于速度,而在于 是否保证可靠性


TCP(Transmission Control Protocol)
连接导向: TCP是面向连接的协议.在发送数据之前,必须先建立一个连接
可靠: TCP提供可靠的传输,通过三次握手建立连接,通过确认和重传机制保障数据的完整性和顺序
流量控制: TCP 具备流量控制和拥塞控制机制,确保网络不被过载
按序传输: TCP保证数据包按发送顺序传输,并在接收端按相同顺序重组
下图是 TCP/IP 的主要协议之间的相关性
UDP(User Datagram Protocol)
无连接: UDP是无连接的协议,在发送数据之前无需建立连接
不可靠: UDP提供不可靠的数据传输,不保证数据的完整性和顺序
无流量控制: UDP不具备流量控制和拥塞控制机制,发送方可以毫无节制地发送数据
快速: UDP 传输速度较快,适用于对实验敏感的应用

对比
| TCP | UDP | |
|---|---|---|
| 连接方式 | 面向连接的协议,需要三次握手建立连接,确保双方准备就绪后再传输数据 | 无连接的协议,数据包可以在任何时间任意发送,无需建立连接 |
| 数据传输可靠性 | 提供可靠传输。通过序列号和确认应答确保数据按顺序传输和重组,重传丢失的数据包 | 不保证可靠性。没有重传机制,也不保证接收顺序 |
| 流量控制与拥塞控制 | 具备流量控制和拥塞控制机制,可防止发送方过快发送导致网络拥塞 | 没有流量控制和拥塞控制,发送方可连续发送数据,不考虑网络状况 |
| 数据包大小 | 每个TCP连接都有一个数据包大小限制(MSS,最大报文段大小),因而数据传输较为繁琐 | 支持更大的数据包,但每个UDP数据报的大小通常在应用网络最大传输单元(MTU)范围内 |
| 传输速度 | 较慢,因需要三次握手建立连接,并为了确保可靠性,存在重传和确认机制 | 较快,无需建立连接,亦没有重传和确认机制,适合实时应用 |
| 应用场景 | 适用于对数据传输可靠性和准确性要求较高的应用,比如 网页浏览,文件传输(FTP),电子邮件(SMTP),数据库同步等 | 适用于对传输速度和效率要求较高,但对可靠性要求较低的应用,比如实时视频,音乐流(VoIP),在线游戏,DNS查询等 |
# HTTP1.1 vs HTTP2
| 特性 | HTTP/1.0 | HTTP/1.1 | HTTP/2 | HTTP/3 |
|---|---|---|---|---|
| 连接方式 | 短连接 | 长连接(keep-alive) | 单连接(多路复用) | |
| 并发能力 | ❌ 无 | ⚠️ 有但会阻塞 | ✅ 强(多路复用) | |
| 队头阻塞 | ❌ 无概念 | ❌ 存在 | ✅ 解决 | |
| 传输格式 | 文本 | 文本 | 二进制 | |
| Host 头 | ❌ 无 | ✅ 有 | ✅ 有 | |
| 头部压缩 | ❌ 无 | ❌ 无 | ✅ HPACK | |
| 缓存控制 | 基础 | 更强(ETag等) | 同 HTTP/1.1 | |
| 断点续传 | ❌ | ✅ 支持 | ✅ 支持 | |
| 服务器推送 | ❌ | ❌ | ✅ 支持 | |
| 传输协议 | TCP | TCP | UDP |
HTTP/2 是基于 HTTPS的
HTTP1.1 出现的问题
队头阻塞(Head-of-line blocking): 一个请求慢,后面全卡住
解决办法: 开多个 TCP 连接,但是开销大
无状态:
- 好处:节省资源
- 坏处:需要重复验证
HTTP2的改进
- 多路复用: 一个TCP连接里面,可以同时发多个请求,不互相阻塞
- 头部压缩: 减少重复 Header
- 二进制传输(更高效)
HTTP和HTTPS的区别
HTTPS
HTTPS = HTTP + SSL/TLS 加密,是HTTP的安全
TLS和SSL本质上是同一类协议,但是TLS是SSL的升级版,现在实际上用的都是TLS
| 特性 | HTTP | HTTPS |
|---|---|---|
| 是否加密 | ❌ 明文 | ✅ 加密(SSL/TLS) |
| 安全性 | ❌ 易被窃听/篡改 | ✅ 防窃听、防篡改 |
| 端口 | 80 | 443 |
| 证书 | ❌ 不需要 | ✅ 需要 CA 证书 |
| 性能 | 稍快 | 略慢(但现在差距很小) |
HTTPS工作流程
- TCP三次握手
- TLS握手
- 客户端发起HTTPS请求
- 服务器返回 数字证书(包含公钥)和 随机数
- 客户端验证证书合法性(CA机构)
- 生成"对称密钥",客户端 生成一个随机密钥,用服务器公钥加密后发送
- 服务器解密,得到对称密钥
- 后续全部使用: 对称加密
普通 HTTP工作流程 浏览器输入一个URL之后,会发生什么
DNS解析
TCP三次握手
发送HTTP请求
服务器处理
返回响应
浏览器解析HTML(加载CSS/JS)
渲染页面
TCP四次挥手(断开)