浏览器如何工作(二)导航

AI summary
date
Aug 13, 2024
slug
how-browser-navigate
status
Published
tags
技术
summary
访问页面时,浏览器的第一个操作就是导航,理解进程之间的协作,浏览器好像栩栩如生的小世界。
type
Post

一个经典的问题

“从输入 URL 敲下回车到页面完成渲染,发生了什么?” —— 一道 old school 经典面试题
关于这个过程,可以概括为两个主要阶段
  1. 导航:用户输入 URL,敲下回车,从请求网页到浏览器准备渲染网页的过程。
  1. 渲染:根据获取的数据渲染页面的过程。
 
本篇就来聊聊第一个阶段 —— 导航

1. 输入处理

访问页面,一切从用户在浏览器中输入一个 URL 开始。
notion image
在 《浏览器架构》那篇我们讲过,浏览器是多进程架构。
而导航的核心工作由主进程完成。
比如这个导航栏,由主进程 UI线程 负责。
 
  1. 处理输入
当用户在地址栏输入内容时,UI 线程 会立即开始处理输入。它会分析用户输入的字符串,判断这是一个查询(Query)还是一个 URL。
  • 如果输入看起来像一个 URL(包含常见的 URL 协议如 http://https://ftp:// 等,或者是一个常见的域名格式),UI 线程会将其视为 URL。
  • 如果输入不符合 URL 的格式,UI 线程会将其视为一个查询(Query),并准备进行搜索引擎的查询。
URL 处理:
UI 线程会将用户的输入交给网络线程
查询处理:
UI 线程 使用默认搜索引擎,构建查询 URL,然后再执行 URL 处理
notion image
 

2. 请求资源

UI 线程通知网络线程发起网络调用,并使标签页左端显示 loading 图标
notion image
 
然后我们的主角来到了 浏览器主进程 网络线程
网络线程经过一系列操作,建立连接,请求数据(此处先不展开)
📌
重定向
这个过程中,网络线程可能收到服务器的重定向头部 (301) ,此时网络线程会和UI线程通信,通知UI线程发起重定向,UI 线程开始使用另一个 URL 执行之前的流程。
 

3. 识别响应

网络线程获取到服务器响应数据,会检查收到的前几个字节。响应头的 Content-Type 应该描述该数据的类型,如果没有此字段,浏览器会进行 MIME 类型嗅探(根据内容推测类型)
notion image
如果响应是 HTML 文件 (即 Content-Typetext/html) ,则进入下一步,把数据交给渲染器进程
notion image
(浏览器对于不同类型的返回处理不同,比如 zip 类型,就会使用下载管理器下载此文件,如果是图片,视频,PDF,浏览器可能会使用其内置的显示程序。)
 

4. 通信渲染进程

当网络进程确认了需要渲染的数据,则会通知 UI 线程
  • 主进程中:
网络线程:I’m ready,leader,数据已经准备好。
UI线程:好的,网络线程,我这就把它交给渲染进程部门
 
  • 渲染进程:
主线程:通过 IPC 收到 HTML 数据流,当收集完毕后,再告知浏览器主进程,我已ok
 
  • 主进程收到确认通知,导航阶段完成。
  • 开始文档加载阶段(渲染阶段)
 
notion image
🦄
有趣的想法: 写到这儿,我觉得一个进程好像一个 “部门”,而线程则是部门中的各个员工。 同一个部门的员工相互交流非常方便,只需要走几步就到对方的旁边。而跨部门的交流则更加低效一些。部门的拆分,有助于管理大型的公司,拆分进程也是同样的道理。 上述的过程可以这样想象: 网络线程 和 UI 线程同属于 浏览器主进程(同一个部门),于是他们的交流特别方便: 网络线程 转过身告诉了 UI 线程数据已经准备好 而 UI 线程要跨进程通信 (IPC): UI 线程 将数据装到信封,打包好,投进邮局,邮到了渲染进程—主线程签收。 渲染进程—主线程 收到后,回信给 主进程 — UI线程,我已收到。
 
优化策略:
网络线程可能需要花费几百毫秒才能获取到响应。
因此 UI 线程可以在这个期间提前联系到渲染进程,于是当数据实际准备好时,已经有一个渲染进程准备待命了。
但这个过程中也可能导致准备好的渲染进程用不上(比如发生了重定向)
 

5. 后续

到此,导航阶段已经完成,进入渲染阶段,当页面初次渲染完成后,渲染进程通知浏览器主进程的 UI 线程,UI线程将 Loading 状态改为该网站的图标,并显示网站标签名
notion image
notion image
 
 

总结

访问页面时,浏览器的第一个操作就是导航,理解进程之间的协作,浏览器好像栩栩如生的小世界。