浏览器原理 · 50/51
1. addEventListener 第三个参数 2. addEventListener 与 attachEvent 区别 3. 浏览器兼容性测试与内核 4. 浏览器兼容性问题 5. 浏览器内核与引擎 6. 浏览器图层创建条件 7. 浏览器多进程架构 8. 浏览器渲染机制 9. 浏览器存储方案 10. 浏览器版本检测方法 11. children 与 childNodes 区别 12. 常见浏览器兼容性问题 13. Chrome 页面进程数量 14. 坐标系统对比 15. 多标签页通讯方案 16. 删除 Cookie 17. 自定义事件 18. DOM 事件处理方式演进 19. 元素尺寸属性对比 20. DOM 节点操作 21. DOM 事件机制 22. addEventListener 与 attachEvent 的区别 23. 获取页面所有复选框 24. HTMLCollection 与 NodeList 区别 25. Hybrid 应用开发 26. 强缓存命中机制 27. 浏览器缓存机制 28. 页面编码与资源编码不一致处理 29. jQuery 事件绑定方法对比 30. Input 点击触发的事件顺序 31. JavaScript 浏览器兼容性问题 32. jQuery 多事件绑定实现 33. JSBridge 原理 34. 链接点击后 Hover 失效解决方案 35. 减少重绘和回流的性能优化 36. 移动端 300ms 点击延迟问题 37. 移动端视口配置 38. 移动端点击穿透问题解决 39. 移动端兼容性问题 40. JSBridge 原理与实现 41. 移动端 1px 像素问题解决方案 42. 浏览器渲染流程 43. 页面加载完成事件对比 44. Offset、Scroll、Client 属性对比 45. 同源策略与跨域解决方案 46. Script 标签位置对页面加载的影响 47. Service Worker 与 PWA 48. 存储方案对比:Cookie、Storage、IndexedDB 49. 强缓存默认时间 50. URL 到页面显示的完整过程 51. V8 引擎 JavaScript 执行过程

URL 到页面显示的完整过程

从输入 URL 到页面渲染的每个步骤

问题

描述从浏览器输入 URL 到页面显示的完整过程,包括 DNS 解析、TCP 连接、HTTP 请求、HTML 解析和页面渲染。

解答

1. URL 解析

浏览器解析输入的 URL,提取协议、域名、端口、路径等信息。

https://www.example.com:443/path?query=1#hash
  │          │           │    │      │     │
协议       域名        端口  路径   查询   哈希

2. DNS 解析

将域名解析为 IP 地址,查找顺序:

浏览器缓存 → 系统缓存 → hosts 文件 → 本地 DNS 服务器 → 递归查询

递归查询过程:

本地 DNS → 根 DNS → 顶级域 DNS (.com) → 权威 DNS → 返回 IP

3. TCP 连接(三次握手)

客户端                    服务器
   │                        │
   │──── SYN=1, seq=x ─────→│  第一次:客户端发起连接
   │                        │
   │←─ SYN=1, ACK=1 ───────│  第二次:服务器确认并发起连接
   │   seq=y, ack=x+1       │
   │                        │
   │─── ACK=1 ─────────────→│  第三次:客户端确认
   │   seq=x+1, ack=y+1     │

4. TLS 握手(HTTPS)

客户端                           服务器
   │                               │
   │──── Client Hello ────────────→│  支持的加密套件、随机数
   │←─── Server Hello ─────────────│  选择的加密套件、证书、随机数
   │──── 验证证书、生成预主密钥 ───→│  用服务器公钥加密
   │←─── Finished ─────────────────│  双方生成会话密钥

5. HTTP 请求与响应

// 请求
GET /path HTTP/1.1
Host: www.example.com
User-Agent: Mozilla/5.0
Accept: text/html

// 响应
HTTP/1.1 200 OK
Content-Type: text/html
Content-Length: 1234

<!DOCTYPE html>
<html>...

6. HTML 解析与 DOM 构建

// 解析过程(简化示意)
字节流 → 字符 → Token → 节点 → DOM

// 遇到不同资源的处理
<script>        // 阻塞解析,下载并执行
<script async>  // 异步下载,下载完立即执行
<script defer>  // 异步下载,HTML 解析完后执行
<link>          // 异步下载 CSS,但会阻塞渲染
<img>           // 异步下载,不阻塞

7. 渲染流程

        HTML                CSS
          │                  │
          ↓                  ↓
       DOM 树            CSSOM 树
          │                  │
          └────────┬─────────┘

              Render 树


          Layout(布局/回流)


          Paint(绘制)


          Composite(合成)

各阶段说明:

// Layout - 计算元素位置和大小
// 触发回流的操作:
element.offsetWidth    // 读取布局属性
element.style.width    // 修改几何属性

// Paint - 绘制像素
// 触发重绘的操作:
element.style.color    // 修改颜色
element.style.visibility

// Composite - 合成图层
// 只触发合成的操作(性能最好):
element.style.transform
element.style.opacity

8. TCP 断开(四次挥手)

客户端                    服务器
   │                        │
   │──── FIN=1 ────────────→│  第一次:客户端请求断开
   │←─── ACK=1 ─────────────│  第二次:服务器确认
   │←─── FIN=1 ─────────────│  第三次:服务器请求断开
   │──── ACK=1 ────────────→│  第四次:客户端确认

完整流程图

输入 URL


URL 解析


DNS 解析 ──→ 获取 IP


TCP 三次握手


TLS 握手(HTTPS)


发送 HTTP 请求


服务器处理并返回响应


解析 HTML → 构建 DOM


解析 CSS → 构建 CSSOM


合并为 Render 树


Layout → Paint → Composite


页面显示

关键点

  • DNS 解析:多级缓存(浏览器→系统→路由器→ISP),递归查询获取 IP
  • TCP 三次握手:确保双方收发能力正常,建立可靠连接
  • 渲染阻塞:CSS 阻塞渲染,JS 阻塞 HTML 解析(async/defer 可优化)
  • 渲染流程:DOM + CSSOM → Render 树 → Layout → Paint → Composite
  • 性能优化方向:DNS 预解析、TCP 复用、资源压缩、减少回流重绘、使用 transform/opacity