一个完整的 HTTP/HTTPS 请求流程

HTTP

一个完整的 HTTP 请求流程可以分为以下几个步骤:

1. DNS 解析

  • 当客户端(通常是浏览器)输入 URL(例如 https://www.example.com)时,它首先需要解析出对应的 IP 地址。
  • 这个过程涉及 DNS(域名系统),浏览器会查询本地缓存、系统缓存,或者向 DNS 服务器发送请求,最终获取到 www.example.com 的 IP 地址(如 192.168.1.1)。

2. 建立 TCP 连接

  • 通过 三次握手 与服务器建立 TCP 连接:
    1. 客户端发送 SYN(同步)请求。
    2. 服务器返回 SYN + ACK(同步确认)。
    3. 客户端发送 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):
    • 仅在 POSTPUT 等请求方法时才有,例如 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 相同)。
    1. 客户端发送 SYN
    2. 服务器响应 SYN + ACK
    3. 客户端发送 ACK
  • 目的:保证客户端和服务器都能发送和接收数据。

3. SSL/TLS 握手(HTTPS 独有)

在 TCP 连接建立后,客户端和服务器通过 TLS(Transport Layer Security)/SSL(Secure Sockets Layer) 进行安全通信:

  1. 客户端发送 ClientHello
    • 指定支持的 TLS 版本(如 TLS 1.2 / TLS 1.3)
    • 支持的加密算法(Cipher Suites)
    • 生成的随机数(用于后续密钥计算)
  2. 服务器响应 ServerHello
    • 确定 TLS 版本
    • 选择加密算法
    • 生成随机数
    • 发送 SSL 证书(包含服务器公钥)
  3. 客户端验证服务器证书
    • 检查证书是否可信(是否由受信 CA 签发)
    • 证书是否过期
    • 证书的域名是否匹配
  4. 密钥交换
    • 客户端使用服务器公钥加密一个对称密钥(用于数据加密)
    • 服务器用自己的私钥解密,获得对称密钥
    • 后续通信将使用这个对称密钥进行加密
  5. 握手完成
    • 客户端和服务器发送 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 的完整请求流程!

相关推荐
LUCIAZZZ7 小时前
计算机网络-TCP的重传机制
java·网络·网络协议·tcp/ip·计算机网络·操作系统·springboot
何政@9 小时前
从零实现APP实时聊天功能:WebSocket+离线消息+多媒体传输全解析
websocket·网络协议·idea·hbuilderx·前后端调试·好友聊天
Dontla9 小时前
HTTP查询参数示例(XMLHttpRequest查询参数)(带查询参数的HTTP接口示例——以python flask接口为例)flask查询接口
python·http·flask
coding随想10 小时前
Ollama本地服务无法通过IP访问的终极解决方案
网络·人工智能·网络协议·tcp/ip
写代码的小王吧10 小时前
【网络安全】安全的网络设计
网络·网络协议·tcp/ip·安全·web安全·网络安全·docker
今夜有雨.10 小时前
使用C++实现HTTP服务
开发语言·网络·c++·后端·网络协议·tcp/ip·http
希望_睿智12 小时前
C++网络编程之IO多路复用(二)
c++·网络协议
java搬砖工-苤-初心不变13 小时前
解决 Git 通过 SSH 克隆仓库时自动转换为 HTTPS 的问题
git·https·ssh
气π13 小时前
【JavaWeb-Spring boot】学习笔记
spring boot·http·tomcat
CppPlayer-程序员阿杜14 小时前
字节二面:TCP 链接中,接收方不调用 recv,会出现什么情况?——拆解大厂面试题(校招)
网络协议·计算机网络·tcp·c++面试·c++面试真题