graph LR
A[DNS查询] --> B[TCP握手连接]
B --> C[TLS协商]
C --> D[建立连接]
D --> F[获取数据]
2.1 DNS 查询
当用户在浏览器地址栏输入域名(如 www.example.com)时,首先需要将域名解析为对应的 IP 地址。
DNS 查询的过程:
查找 浏览器缓存(最近访问过的 DNS 记录,2-30 分钟)。
查找 系统缓存(操作系统 hosts 文件)。
查找 路由器缓存。
查找 ISP DNS 缓存(本地运营商 DNS 服务器)。
递归查询:若仍未命中缓存,则依次向根域名服务器、顶级域名服务器、权威域名服务器发起查询,直到找到目标 IP 地址。
DNS 查询结果通常会被缓存(TTL 时间内有效),加快后续访问速度。
2.2 TCP 三次握手
得到服务器 IP 地址后,浏览器通过 TCP 三次握手 与服务器建立可靠的连接:
客户端 → 服务器:发送一个 SYN 请求,表示“我要建立连接”。
服务器 → 客户端:收到请求后,回复 SYN+ACK,表示“我同意并确认”。
客户端 → 服务器:再发一个 ACK,确认收到。
至此,TCP 连接建立完成。
2.3 TLS 协商(HTTPS)
如果目标站点使用 HTTPS,还需要进行 TLS 握手 来确保数据传输安全。其过程包括:
浏览器发送支持的加密算法、随机数。
服务器返回数字证书、加密套件、随机数。
浏览器验证证书有效性。
浏览器生成“预主密钥”,用服务器公钥加密并发送。
服务器用私钥解密,双方生成会话密钥。
之后所有通信都使用对称加密。
这样可以保证数据的机密性和完整性,防止中间人攻击。
2.4 建立连接
完成 TCP 和 TLS 的握手后,连接建立成功,浏览器可以正式向服务器发送请求。
2.5 获取数据
1. 发送 HTTP 请求
浏览器首先检查缓存,若命中缓存则直接返回资源。
否则,构造 HTTP 请求(包含请求方法、URI、请求头等),并发送给服务器。
常见请求方法有:GET、POST、PUT、DELETE 等。
2. 接收 HTTP 响应
服务器处理请求并返回响应,包括:
状态码(200 成功、301 重定向、404 未找到、500 服务器错误)。
响应头(缓存策略、内容类型等)。
响应体(HTML、JSON、图片等)。
成功返回 HTML 文件后,浏览器会将渲染任务交给渲染进程继续处理。
三、浏览器渲染工作流
当渲染进程接收到 HTML 文档时,便会启动页面渲染流程:
graph LR
A[解析HTML] --> B[解析CSS]
B --> C[执行JavaScript]
C --> D[构建渲染树]
D --> E[布局Layout]
E --> F[分层]
F --> G[绘制]
G --> H[分块]
H --> I[光栅化Raster]
I --> J[合成与显示]
3.1 解析 HTML
浏览器会对 HTML 文档进行 词法分析,生成 Token 流,并进一步构建 DOM 树。
例如:
html复制代码
<div class="root">Hello</div>
会被解析成一个包含节点层级关系的 DOM 结构。
3.2 解析 CSS
CSS 会被解析成 CSSOM(CSS 对象模型),与 DOM 结合后形成 渲染树(Render Tree)。