http

75 阅读3分钟

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)

步骤解析

  1. 第一次握手(SYN)

    • 客户端发送 SYN=1(同步标志)和随机序列号 seq=x
    • 客户端进入 SYN_SENT 状态。
  2. 第二次握手(SYN+ACK)

    • 服务端回复 SYN=1 + ACK=1(确认标志),发送自己的序列号 seq=y,并确认客户端的 ack=x+1
    • 服务端进入 SYN_RCVD 状态。
  3. 第三次握手(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)

步骤解析

  1. 第一次挥手(FIN)

    • 客户端发送 FIN=1(结束标志)和序列号 seq=u,进入 FIN_WAIT_1 状态。
  2. 第二次挥手(ACK)

    • 服务端返回 ACK=1 和确认号 ack=u+1,进入 CLOSE_WAIT 状态。
    • 客户端收到后进入 FIN_WAIT_2 状态(半关闭状态)。
  3. 第三次挥手(FIN)

    • 服务端处理完剩余数据后,发送 FIN=1 和序列号 seq=v,进入 LAST_ACK 状态。
  4. 第四次挥手(ACK)

    • 客户端确认 ack=v+1,进入 TIME_WAIT 状态(等待 2MSL 时间确保服务端收到ACK)。
    • 服务端收到后立即关闭连接(CLOSED)。

为什么需要四次?

  • TCP 是全双工协议,需分别关闭两个方向的连接:

    • 客户端→服务端方向(第一次挥手)。
    • 服务端→客户端方向(第三次挥手)。

HTTP 与 HTTPS

1. HTTP 明文传输的风险 

image.png

2. HTTPS 加密通信

image.png

二、HTTPS 加密原理图解

1. 混合加密机制

image.png

  • 关键点

    • 非对称加密保护对称密钥传输(安全)。
    • 对称加密加密实际数据(高效)。

2. 数字证书验证流程

image.png

HTTP/1.0、HTTP/1.1 和 HTTP/2 的主要区别

HTTP/1.0(非持久连接)

image.png

  • 每个请求需新建TCP连接,高延迟。

HTTP/1.1(持久连接 + 管道化)

image.png

  • 同一连接发送多个请求,但响应必须按顺序返回(队头阻塞)。

HTTP/2(多路复用)

image.png

  • 请求/响应并行交错传输,互不阻塞。

前端生产环境解决跨域的常见方式

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)

条件(同时满足以下所有条件):
  1. 方法限制:仅限以下 HTTP 方法:
    • GET
    • HEAD
    • POST
  2. Header限制:仅允许以下安全头部字段:
    • Content-Type (仅限以下值)
      • text/plain
      • multipart/form-data
      • application/x-www-form-urlencoded
特点:
  • 不会触发预检请求(OPTIONS)

复杂请求(Complex Request)

  • 触发条件(满足任一条件):
  1. 使用了非简单方法
    • PUT
    • DELETE
    • CONNECT
    • OPTIONS
    • TRACE
    • PATCH
  2. 设置了非简单头部
    • Content-Type 不是简单值 (如 application/json)
特点:
  • 会触发预检请求(OPTIONS)