HTTP
一个完整的 HTTP 请求流程可以分为以下几个步骤:
1. DNS 解析
- 当客户端(通常是浏览器)输入 URL(例如
https://www.example.com
)时,它首先需要解析出对应的 IP 地址。 - 这个过程涉及 DNS(域名系统),浏览器会查询本地缓存、系统缓存,或者向 DNS 服务器发送请求,最终获取到
www.example.com
的 IP 地址(如192.168.1.1
)。
2. 建立 TCP 连接
- 通过 三次握手 与服务器建立 TCP 连接:
- 客户端发送 SYN(同步)请求。
- 服务器返回 SYN + ACK(同步确认)。
- 客户端发送 ACK(确认),连接建立成功。
3. 发送 HTTP 请求
客户端向服务器发送 HTTP 请求,主要包括:
- 请求行(Request Line):
GET /index.html HTTP/1.1
- 请求头(Headers):
Host: www.example.com
User-Agent: Mozilla/5.0
Accept: text/html
Connection: keep-alive
- 请求体(Body):
- 仅在
POST
、PUT
等请求方法时才有,例如 JSON 数据、表单数据等。
- 仅在
4. 服务器处理请求
- 服务器解析请求:
- 检查 URL 路由
- 验证权限
- 查询数据库
- 处理业务逻辑
- 服务器生成 HTTP 响应。
5. 服务器返回 HTTP 响应
服务器返回 HTTP 响应,主要包括:
- 状态行:
HTTP/1.1 200 OK
- 响应头:
Content-Type: text/html; charset=UTF-8
Content-Length: 1024
Set-Cookie: sessionId=abc123; Path=/
- 响应体(Body):
- 例如 HTML 页面内容、JSON 数据等。
6. 浏览器解析 & 渲染
- 浏览器解析 HTML、CSS、JavaScript,并开始渲染页面。
- 如果遇到额外的资源(如 CSS、JS、图片),浏览器会再次发起 HTTP 请求获取这些资源。
7. 连接关闭
- HTTP/1.1 默认使用 Keep-Alive,可以复用 TCP 连接。
- 如果
Connection: close
,则服务器和客户端会进行 四次挥手 关闭 TCP 连接。
8. 用户交互 & 进一步请求
- 用户可能会点击页面上的链接,触发新的 HTTP 请求,重复上述过程。
这就是一个完整的 HTTP 请求流程! 🚀
HTTPS
完整的 HTTPS 请求流程
HTTPS(HyperText Transfer Protocol Secure)是在 HTTP 的基础上增加了 SSL/TLS 加密,以保证数据的安全性。相比 HTTP,HTTPS 主要增加了 SSL/TLS 握手 过程。完整的 HTTPS 请求流程如下:
1. DNS 解析
- 作用:将域名解析为 IP 地址,和 HTTP 一样。
- 过程:
- 浏览器先查询本地 DNS 缓存
- 若无结果,向系统 DNS 服务器或公共 DNS(如
8.8.8.8
)发起查询 - DNS 服务器返回
example.com -> 192.168.1.1
2. 建立 TCP 连接
- 通过 三次握手 建立 TCP 连接(和 HTTP 相同)。
- 客户端发送
SYN
- 服务器响应
SYN + ACK
- 客户端发送
ACK
- 客户端发送
- 目的:保证客户端和服务器都能发送和接收数据。
3. SSL/TLS 握手(HTTPS 独有)
在 TCP 连接建立后,客户端和服务器通过 TLS(Transport Layer Security)/SSL(Secure Sockets Layer) 进行安全通信:
- 客户端发送 ClientHello
- 指定支持的 TLS 版本(如 TLS 1.2 / TLS 1.3)
- 支持的加密算法(Cipher Suites)
- 生成的随机数(用于后续密钥计算)
- 服务器响应 ServerHello
- 确定 TLS 版本
- 选择加密算法
- 生成随机数
- 发送 SSL 证书(包含服务器公钥)
- 客户端验证服务器证书
- 检查证书是否可信(是否由受信 CA 签发)
- 证书是否过期
- 证书的域名是否匹配
- 密钥交换
- 客户端使用服务器公钥加密一个对称密钥(用于数据加密)
- 服务器用自己的私钥解密,获得对称密钥
- 后续通信将使用这个对称密钥进行加密
- 握手完成
- 客户端和服务器发送 Finished 消息,表示握手完成
- 之后的 HTTP 请求/响应都通过 TLS 加密通道传输
4. 发送 HTTPS 请求
- 请求格式 与 HTTP 相同,但数据已经加密:
GET /index.html HTTP/1.1
Host: www.example.com
User-Agent: Mozilla/5.0
Accept: text/html
Authorization: Bearer token
5. 服务器处理请求
- 解密 HTTPS 请求
- 解析 HTTP 请求
- 处理业务逻辑(如数据库查询、身份验证)
- 生成 HTTP 响应
6. 服务器返回 HTTPS 响应
- 响应数据通过 对称密钥加密 后传输
- 响应格式(加密传输):
HTTP/1.1 200 OK
Content-Type: text/html
Set-Cookie: sessionId=abc123
Body: <html>...</html>
7. 浏览器解析 & 渲染
- 浏览器解密 HTTPS 响应,解析 HTML/CSS/JS
- 发现额外资源(如 CSS、JS、图片),再次发起 HTTPS 请求(重复上述流程)
8. 连接关闭
- Keep-Alive 模式:TCP 连接可以复用,减少握手开销
- 关闭连接:
- 若
Connection: close
,则通过 四次挥手 关闭 TCP 连接
- 若
HTTPS 相比 HTTP 的优势
✅ 数据加密(防止窃听)
✅ 身份验证(防止伪造服务器)
✅ 数据完整性(防止中间人篡改数据)
HTTPS 比 HTTP 更安全,但也有 握手开销,导致首次请求稍慢。不过,现代优化技术(如 TLS 1.3、Session Resumption)已经大大减少了这个影响。
🚀 这就是 HTTPS 的完整请求流程!