浏览器输入 https 到展示页面经历的过程

321 阅读5分钟

总览:四大阶段

  1. DNS 解析:将域名转换为 IP 地址。
  2. TCP 连接:与服务器建立可靠的传输通道。
  3. TLS/SSL 握手:建立安全的加密连接。
  4. HTTP 请求与响应:获取并渲染页面内容。

阶段一:DNS 解析 - 找到服务器的地址

浏览器并不知道 www.example.com 在哪里,它需要先找到对应的 IP 地址(如 93.184.216.34)。

  1. 检查浏览器缓存:浏览器首先查看自己的缓存里是否有这个域名的 IP 地址。

  2. 检查操作系统缓存:如果浏览器缓存没有,会去查询操作系统的 hosts 文件和缓存(在 Windows 上是 hosts 文件,在 Linux/macOS 上是 /etc/hosts 和 nscd 缓存)。

  3. 查询路由器缓存:如果本地系统也没有,请求会发送到局域网路由器,路由器可能存有缓存。

  4. 查询 ISP 的 DNS 服务器:如果以上都没有,计算机会向网络服务提供商(ISP)分配的 DNS 服务器发送查询请求。

  5. 递归查询

    • ISP 的 DNS 服务器会从根域名服务器开始查询。
    • 根服务器会告知负责 .com 顶级域(TLD)的服务器地址。
    • ISP 的 DNS 服务器再询问 .com TLD 服务器,TLD 服务器会告知负责 example.com 的权威域名服务器的地址。
    • 最后,ISP 的 DNS 服务器询问 example.com 的权威服务器,权威服务器返回 www.example.com 的真实 IP 地址。
  6. 返回结果并缓存:ISP 的 DNS 服务器将 IP 地址返回给你的计算机,并且各级都会缓存这个结果一段时间(TTL 决定)。

至此,浏览器拿到了目标服务器的 IP 地址。

阶段二:TCP 三次握手 - 建立可靠连接

浏览器使用拿到的 IP 地址和默认的 HTTPS 端口 443,开始与服务器建立 TCP 连接。这是为了确保后续数据传输的可靠性。

  1. SYN:客户端(你的浏览器)向服务器发送一个 SYN(同步)包,表示请求建立连接。
  2. SYN-ACK:服务器收到请求后,回复一个 SYN-ACK(同步-确认)包,表示同意连接。
  3. ACK:客户端再向服务器发送一个 ACK(确认)包。至此,连接建立成功。

这个过程就是著名的 TCP 三次握手

阶段三:TLS/SSL 握手 - 建立安全加密通道

在 TCP 连接的基础上,需要建立一个安全的加密层,这就是 TLS 握手(SSL 的升级版)。

  1. Client Hello:客户端向服务器发送信息,包括:

    • 支持的 TLS 版本号。
    • 支持的加密套件列表。
    • 一个客户端随机数。
  2. Server Hello:服务器回应信息,包括:

    • 确认使用的 TLS 版本。
    • 从客户端列表中选择一个加密套件。
    • 一个服务器随机数。
    • 服务器的 SSL 证书(包含公钥)。
  3. 验证证书

    • 客户端(浏览器)会验证服务器发来的证书是否可信(是否由可信的证书颁发机构 CA 签发、域名是否匹配、是否过期等)。如果验证失败,浏览器会显示警告。
  4. 生成预主密钥

    • 客户端验证证书通过后,会生成另一个随机字符串,称为“预主密钥”。
    • 客户端用服务器证书中的公钥加密这个预主密钥,然后发送给服务器。
  5. 服务器解密预主密钥

    • 服务器用自己的私钥解密,得到预主密钥。
  6. 生成会话密钥

    • 此时,客户端和服务器都拥有了三个要素:客户端随机数服务器随机数预主密钥
    • 双方使用这三个要素独立计算出相同的会话密钥。这个对称密钥将用于加密后续所有的通信数据。
  7. 握手结束:双方交换一条信息,告知后续消息将用会话密钥加密。TLS 握手完成。

为什么这么复杂?  非对称加密(公钥/私钥)用于安全地交换对称密钥,而对称加密(会话密钥)用于高效地加密大量数据传输。

阶段四:HTTP 请求与响应 - 获取页面内容

现在,安全的加密通道已经建立,浏览器才开始真正的 HTTP 通信。

  1. 发送 HTTP 请求:浏览器通过加密通道发送一个 HTTP GET 请求到服务器,请求 https://www.example.com/ 的资源。请求头中会包含信息如:

    • Host: www.example.com
    • User-Agent(浏览器身份)
    • Accept(能接受的响应类型,如 text/html)
    • Cookie(如果有的话)
  2. 服务器处理请求并返回响应:服务器收到请求后,处理它(可能需要查询数据库等),然后返回一个 HTTP 响应。响应包括:

    • 状态码:如 200 OK 表示成功。
    • 响应头:包含内容类型(Content-Type: text/html)、内容长度、服务器信息等。
    • 响应体:通常是请求的 HTML 文件内容。
  3. 浏览器解析和渲染页面

    • 解析 HTML:浏览器开始解析 HTML,构建 DOM(文档对象模型)树。
    • 加载子资源:在解析过程中,如果遇到外部资源(如 CSS、JavaScript、图片),浏览器会重新发起 DNS 查询、TCP 连接、TLS 握手(对于 HTTPS 资源)和 HTTP 请求,去获取这些资源。注意:对于同一个域名的多个资源,通常会复用已经建立的 TCP 连接(HTTP/1.1 的持久连接或 HTTP/2 的多路复用) ,这大大提高了效率。
    • 构建 CSSOM:解析 CSS,构建 CSSOM(CSS 对象模型)树。
    • 执行 JavaScript:解析并执行 JavaScript 代码。
    • 合并渲染树:将 DOM 和 CSSOM 合并成渲染树。
    • 布局和绘制:计算每个元素在屏幕上的位置(布局),然后将像素绘制到屏幕上。
  4. TCP 四次挥手 - 连接关闭:当页面完全加载后,TCP 连接可能会保持一段时间以备后续请求(保持连接)。最终,当双方确认没有更多数据需要传输时,会通过 TCP 四次挥手 来关闭连接。


总结流程图

text

输入 URL -> DNS 解析 -> TCP 三次握手 -> TLS 握手 -> 发送 HTTP 请求 -> 服务器响应 -> 浏览器解析渲染 -> (可能) TCP 关闭

关键点记住

  • DNS:找地址。
  • TCP:建通道。
  • TLS:上锁加密。
  • HTTP:真正传输内容。