总览:四大阶段
- DNS 解析:将域名转换为 IP 地址。
- TCP 连接:与服务器建立可靠的传输通道。
- TLS/SSL 握手:建立安全的加密连接。
- HTTP 请求与响应:获取并渲染页面内容。
阶段一:DNS 解析 - 找到服务器的地址
浏览器并不知道 www.example.com 在哪里,它需要先找到对应的 IP 地址(如 93.184.216.34)。
-
检查浏览器缓存:浏览器首先查看自己的缓存里是否有这个域名的 IP 地址。
-
检查操作系统缓存:如果浏览器缓存没有,会去查询操作系统的 hosts 文件和缓存(在 Windows 上是
hosts文件,在 Linux/macOS 上是/etc/hosts和nscd缓存)。 -
查询路由器缓存:如果本地系统也没有,请求会发送到局域网路由器,路由器可能存有缓存。
-
查询 ISP 的 DNS 服务器:如果以上都没有,计算机会向网络服务提供商(ISP)分配的 DNS 服务器发送查询请求。
-
递归查询:
- ISP 的 DNS 服务器会从根域名服务器开始查询。
- 根服务器会告知负责
.com顶级域(TLD)的服务器地址。 - ISP 的 DNS 服务器再询问
.comTLD 服务器,TLD 服务器会告知负责example.com的权威域名服务器的地址。 - 最后,ISP 的 DNS 服务器询问
example.com的权威服务器,权威服务器返回www.example.com的真实 IP 地址。
-
返回结果并缓存:ISP 的 DNS 服务器将 IP 地址返回给你的计算机,并且各级都会缓存这个结果一段时间(TTL 决定)。
至此,浏览器拿到了目标服务器的 IP 地址。
阶段二:TCP 三次握手 - 建立可靠连接
浏览器使用拿到的 IP 地址和默认的 HTTPS 端口 443,开始与服务器建立 TCP 连接。这是为了确保后续数据传输的可靠性。
- SYN:客户端(你的浏览器)向服务器发送一个 SYN(同步)包,表示请求建立连接。
- SYN-ACK:服务器收到请求后,回复一个 SYN-ACK(同步-确认)包,表示同意连接。
- ACK:客户端再向服务器发送一个 ACK(确认)包。至此,连接建立成功。
这个过程就是著名的 TCP 三次握手。
阶段三:TLS/SSL 握手 - 建立安全加密通道
在 TCP 连接的基础上,需要建立一个安全的加密层,这就是 TLS 握手(SSL 的升级版)。
-
Client Hello:客户端向服务器发送信息,包括:
- 支持的 TLS 版本号。
- 支持的加密套件列表。
- 一个客户端随机数。
-
Server Hello:服务器回应信息,包括:
- 确认使用的 TLS 版本。
- 从客户端列表中选择一个加密套件。
- 一个服务器随机数。
- 服务器的 SSL 证书(包含公钥)。
-
验证证书:
- 客户端(浏览器)会验证服务器发来的证书是否可信(是否由可信的证书颁发机构 CA 签发、域名是否匹配、是否过期等)。如果验证失败,浏览器会显示警告。
-
生成预主密钥:
- 客户端验证证书通过后,会生成另一个随机字符串,称为“预主密钥”。
- 客户端用服务器证书中的公钥加密这个预主密钥,然后发送给服务器。
-
服务器解密预主密钥:
- 服务器用自己的私钥解密,得到预主密钥。
-
生成会话密钥:
- 此时,客户端和服务器都拥有了三个要素:客户端随机数、服务器随机数和预主密钥。
- 双方使用这三个要素独立计算出相同的会话密钥。这个对称密钥将用于加密后续所有的通信数据。
-
握手结束:双方交换一条信息,告知后续消息将用会话密钥加密。TLS 握手完成。
为什么这么复杂? 非对称加密(公钥/私钥)用于安全地交换对称密钥,而对称加密(会话密钥)用于高效地加密大量数据传输。
阶段四:HTTP 请求与响应 - 获取页面内容
现在,安全的加密通道已经建立,浏览器才开始真正的 HTTP 通信。
-
发送 HTTP 请求:浏览器通过加密通道发送一个 HTTP GET 请求到服务器,请求
https://www.example.com/的资源。请求头中会包含信息如:Host: www.example.comUser-Agent(浏览器身份)Accept(能接受的响应类型,如 text/html)Cookie(如果有的话)
-
服务器处理请求并返回响应:服务器收到请求后,处理它(可能需要查询数据库等),然后返回一个 HTTP 响应。响应包括:
- 状态码:如
200 OK表示成功。 - 响应头:包含内容类型(
Content-Type: text/html)、内容长度、服务器信息等。 - 响应体:通常是请求的 HTML 文件内容。
- 状态码:如
-
浏览器解析和渲染页面:
- 解析 HTML:浏览器开始解析 HTML,构建 DOM(文档对象模型)树。
- 加载子资源:在解析过程中,如果遇到外部资源(如 CSS、JavaScript、图片),浏览器会重新发起 DNS 查询、TCP 连接、TLS 握手(对于 HTTPS 资源)和 HTTP 请求,去获取这些资源。注意:对于同一个域名的多个资源,通常会复用已经建立的 TCP 连接(HTTP/1.1 的持久连接或 HTTP/2 的多路复用) ,这大大提高了效率。
- 构建 CSSOM:解析 CSS,构建 CSSOM(CSS 对象模型)树。
- 执行 JavaScript:解析并执行 JavaScript 代码。
- 合并渲染树:将 DOM 和 CSSOM 合并成渲染树。
- 布局和绘制:计算每个元素在屏幕上的位置(布局),然后将像素绘制到屏幕上。
-
TCP 四次挥手 - 连接关闭:当页面完全加载后,TCP 连接可能会保持一段时间以备后续请求(保持连接)。最终,当双方确认没有更多数据需要传输时,会通过 TCP 四次挥手 来关闭连接。
总结流程图
text
输入 URL -> DNS 解析 -> TCP 三次握手 -> TLS 握手 -> 发送 HTTP 请求 -> 服务器响应 -> 浏览器解析渲染 -> (可能) TCP 关闭
关键点记住:
- DNS:找地址。
- TCP:建通道。
- TLS:上锁加密。
- HTTP:真正传输内容。