HTTP 基于 TCP 的三次握手
目的:确保客户端和服务端双向通信通道正常建立。
Client Server
| |
| SYN=1, seq=x |
|------------------------------>| (SYN_SENT)
| | (SYN_RCVD)
| SYN=1, ACK=1, seq=y, |
| ack=x+1 |
|<------------------------------|
| |
| ACK=1, seq=x+1, |
| ack=y+1 |
|------------------------------>| (ESTABLISHED)
| | (ESTABLISHED)
步骤解析:
-
第一次握手(SYN) :
- 客户端发送
SYN=1(同步标志)和随机序列号seq=x。 - 客户端进入
SYN_SENT状态。
- 客户端发送
-
第二次握手(SYN+ACK) :
- 服务端回复
SYN=1+ACK=1(确认标志),发送自己的序列号seq=y,并确认客户端的ack=x+1。 - 服务端进入
SYN_RCVD状态。
- 服务端回复
-
第三次握手(ACK) :
- 客户端确认服务端的
ack=y+1,发送ACK=1。 - 双方进入
ESTABLISHED状态,连接建立完成。
- 客户端确认服务端的
为什么需要三次?
- 防止历史重复连接初始化导致的资源浪费(两次无法确认客户端接收能力)。
TCP 四次挥手(关闭连接)
目的:安全释放双向连接,确保数据完整传输。
Client Server
| |
| FIN=1, seq=u |
|------------------------------>| (FIN_WAIT_1)
| | (CLOSE_WAIT)
| ACK=1, ack=u+1 |
|<------------------------------|
| | (FIN_WAIT_2)
| |
| FIN=1, seq=v, |
| ack=u+1 |
|<------------------------------| (LAST_ACK)
| |
| ACK=1, ack=v+1 |
|------------------------------>| (TIME_WAIT)
| | (CLOSED)
(等待2MSL后进入CLOSED)
步骤解析:
-
第一次挥手(FIN) :
- 客户端发送
FIN=1(结束标志)和序列号seq=u,进入FIN_WAIT_1状态。
- 客户端发送
-
第二次挥手(ACK) :
- 服务端返回
ACK=1和确认号ack=u+1,进入CLOSE_WAIT状态。 - 客户端收到后进入
FIN_WAIT_2状态(半关闭状态)。
- 服务端返回
-
第三次挥手(FIN) :
- 服务端处理完剩余数据后,发送
FIN=1和序列号seq=v,进入LAST_ACK状态。
- 服务端处理完剩余数据后,发送
-
第四次挥手(ACK) :
- 客户端确认
ack=v+1,进入TIME_WAIT状态(等待2MSL时间确保服务端收到ACK)。 - 服务端收到后立即关闭连接(
CLOSED)。
- 客户端确认
为什么需要四次?
-
TCP 是全双工协议,需分别关闭两个方向的连接:
- 客户端→服务端方向(第一次挥手)。
- 服务端→客户端方向(第三次挥手)。
HTTP 与 HTTPS
1. HTTP 明文传输的风险
2. HTTPS 加密通信
二、HTTPS 加密原理图解
1. 混合加密机制
-
关键点:
- 非对称加密保护对称密钥传输(安全)。
- 对称加密加密实际数据(高效)。
2. 数字证书验证流程
HTTP/1.0、HTTP/1.1 和 HTTP/2 的主要区别
HTTP/1.0(非持久连接)
- 每个请求需新建TCP连接,高延迟。
HTTP/1.1(持久连接 + 管道化)
- 同一连接发送多个请求,但响应必须按顺序返回(队头阻塞)。
HTTP/2(多路复用)
- 请求/响应并行交错传输,互不阻塞。
前端生产环境解决跨域的常见方式
1.代理服务器 (推荐)
# Nginx配置示例
location /api {
proxy_pass http://backend-server;
}
2. 服务端设置CORS
Access-Control-Allow-Origin: https://yourdomain.com
Access-Control-Allow-Methods: GET, POST, PUT, DELETE
Access-Control-Allow-Headers: Content-Type, Authorization
Access-Control-Allow-Credentials: true
HTTP 复杂请求与简单请求的区别
简单请求(Simple Request)
条件(同时满足以下所有条件):
- 方法限制:仅限以下 HTTP 方法:
- GET
- HEAD
- POST
- Header限制:仅允许以下安全头部字段:
- Content-Type (仅限以下值)
text/plainmultipart/form-dataapplication/x-www-form-urlencoded
- Content-Type (仅限以下值)
特点:
- 不会触发预检请求(OPTIONS)
复杂请求(Complex Request)
- 触发条件(满足任一条件):
- 使用了非简单方法:
- PUT
- DELETE
- CONNECT
- OPTIONS
- TRACE
- PATCH
- 设置了非简单头部:
Content-Type不是简单值 (如application/json)
特点:
- 会触发预检请求(OPTIONS)