外观
从输入 URL 到页面展示发生了什么?
浏览器先解析地址,强缓存命中就直接用本地副本。否则做 DNS、建立连接、发 HTTP 请求,再把响应解析成页面。这道题按「缓存、寻址、连接、请求、渲染」五段讲,每一段点到对应的专题即可。
原理
- 解析 URL。分出协议、主机、端口、路径和查询。地址栏输入还会先走搜索或历史记录的判断。
- 查强缓存。命中则不再访问网络。见 HTTP 缓存。
- DNS。先看浏览器和操作系统缓存、hosts,再问递归解析,得到 IP。
- 建立连接。TCP 三次握手:客户端 SYN,服务器 SYN+ACK,客户端 ACK。双方借此同步序列号并确认能收发。HTTPS 在这之后做 TLS 握手,见 HTTPS。
- 发送请求。同源 Cookie 会自动带上。服务器处理完返回状态码和正文;协商缓存未变化时是 304。
- 解析并渲染。HTML 变成 DOM,CSS 变成 CSSOM,合成渲染树后布局、绘制、合成。同步脚本会挡住解析。见 渲染流程。
- 连接怎么复用。HTTP/1.1 用 keep-alive 留着连接。HTTP/2 在同一连接上多路复用。页面里的图片、脚本会重复缓存和请求这两步。
TCP 挥手是四次,因为每一端都要单独关掉自己的发送方向,还要处理路上可能残留的数据。
追问
哪一步最可能慢?
先看网络面板里的分段:DNS、连接、TTFB、内容下载,不要默认是「渲染慢」。TTFB 长,查服务器和网络;下载长,查体积和缓存;主线程长任务,查脚本和布局。见 性能排查。
三次握手能少一次吗?
前两次还不能确认双方的序列号和收发能力。TCP 把第三次 ACK 和数据放在一起发送,所以建立连接的往返是一次。QUIC / HTTP/3 把传输握手和 TLS 合在一起,新连接可以更快发出请求。
易错点
- 强缓存命中时,不会发生 DNS 和请求。不要把七步说成每次必然全走。
- 三次握手不是 TLS 握手。HTTPS 是 TCP 之后再来一轮 TLS。
- 「页面出来了」不等于
load。首屏绘制可以早于图片全部加载完成。