Skip to content

从输入 URL 到页面展示发生了什么? ​

浏览器先解析地址,强缓存命中就直接用本地副本。否则做 DNS、建立连接、发 HTTP 请求,再把响应解析成页面。这道题按「缓存、寻址、连接、请求、渲染」五段讲,每一段点到对应的专题即可。

原理 ​

  1. 解析 URL。分出协议、主机、端口、路径和查询。地址栏输入还会先走搜索或历史记录的判断。
  2. 查强缓存。命中则不再访问网络。见 HTTP 缓存。
  3. DNS。先看浏览器和操作系统缓存、hosts,再问递归解析,得到 IP。
  4. 建立连接。TCP 三次握手:客户端 SYN,服务器 SYN+ACK,客户端 ACK。双方借此同步序列号并确认能收发。HTTPS 在这之后做 TLS 握手,见 HTTPS。
  5. 发送请求。同源 Cookie 会自动带上。服务器处理完返回状态码和正文;协商缓存未变化时是 304。
  6. 解析并渲染。HTML 变成 DOM,CSS 变成 CSSOM,合成渲染树后布局、绘制、合成。同步脚本会挡住解析。见 渲染流程。
  7. 连接怎么复用。HTTP/1.1 用 keep-alive 留着连接。HTTP/2 在同一连接上多路复用。页面里的图片、脚本会重复缓存和请求这两步。

TCP 挥手是四次,因为每一端都要单独关掉自己的发送方向,还要处理路上可能残留的数据。

追问 ​

哪一步最可能慢?

先看网络面板里的分段:DNS、连接、TTFB、内容下载,不要默认是「渲染慢」。TTFB 长,查服务器和网络;下载长,查体积和缓存;主线程长任务,查脚本和布局。见 性能排查。

三次握手能少一次吗?

前两次还不能确认双方的序列号和收发能力。TCP 把第三次 ACK 和数据放在一起发送,所以建立连接的往返是一次。QUIC / HTTP/3 把传输握手和 TLS 合在一起,新连接可以更快发出请求。

易错点 ​

  • 强缓存命中时,不会发生 DNS 和请求。不要把七步说成每次必然全走。
  • 三次握手不是 TLS 握手。HTTPS 是 TCP 之后再来一轮 TLS。
  • 「页面出来了」不等于 load。首屏绘制可以早于图片全部加载完成。

相关 ​