😶🌫️ 我们在图表中看到了什么:
-
Bob 在浏览器的地址栏中输入了 URL;
-
浏览器会通过 DNS 来查找域的 IP 地址(为了获得更好的性能,会存在不同的缓存 <浏览器、操作系统、本地网络、ISP缓存等>);
-
接下来,浏览器首先会尝试先从缓存中进行查找,如果未查找到,它会向 DNS 服务器进行递归查询(发出请求),这个请求过程会在找到 IP 地址的同时继续进行;
-
在获得 IP 地址之后,浏览器与服务器建立一个 TCP 连接,然后向服务器发送一个 HTTP 请求;
-
最后,客户端从服务器获得响应并呈现 最终的 HTML 内容结果。
🌈 URL 的构成:
在 1. Bob enters a URL into the browser 此示例中, 我们捕获到了 URL 的四个构成部分:
- Scheme -
HTTP://通知浏览器使用 HTTP 发送连接到服务器; - Domain -
example.com站点的域名; - Path -
product/electric服务器到请求资源 phone 的路径; - Resource -
phoneBob 要访问的资源的名称。
👁️ 基于此,我们来补充一些更多的细节:
当 URl 被输入后,Browser 进程的 UI 线程会询问此次输入是查询还是 URL 地址【1】。
如果是搜索查询则转到浏览器配置的搜索引擎;如果是 URL 地址则开始请求站点,Browser 进程会通过 IPC 告知网络服务请求站点内容,同时并行查找和启动 Renderer 进程。
网络服务在接收到 Browser 进程的站点请求信息后,网络服务会进行 DNS 查找、请求的 TLS 连接等【2、3、4】。
最后在页面呈现之前,服务器会读取响应信息,通过 Content-Type 标头判断是否是 HTML,对响应数据进行安全检查(CROB),检查通过后将响应信息通过 IPC 传输给 Browser 进程。Browser 进程对响应信息进行缓存,并将数据通过 IPC 通道传输给 Renderer 进程。
Renderer 进程不断接收 Browser 进程发送的 HTML 数据并开始加载文档,这个阶段会经历:HTML: paser、DOM: css computing、DOM with CSS: layout、DOM with position: render。一旦 Renderer 进程渲染完成,会通过 IPC 告知 Browser 进程页面已经加载完成。Browser 进程会额外处理打开地址所在标签页的会话历史记录,并将记录存储在磁盘上,之后可以通过后退/前进按钮进行历史导航处理。
在这里我们并没有详细的谈到 Browser 的整个渲染是如何去做的,如果你想知道或者模拟实现浏览器在这里的处理行为,可以在这里查看 browser 如何实现。
最后的最后浏览器呈现了最终的 HTML 内容【5】。
🪄TIP:
- IPC:主进程与渲染进程之间的通信;
- Mojo:Google 开发的一种跨平台的进程间通信框架。在 Chrome 浏览器中,用于多个进程之间的通信;
了解 DNS
DNS:Domian Name System 是互联网的一项服务。它做为将域名和 IP 地址相互映射的一个分布式数据库,用于维护网站名称机器链接到的特定 IP 地址。
Reference
对于 Browser 的内容会有一个独立的专栏,后续补充关于浏览器的更多内容,包括但不限于:浏览器内存管理、V8、Blink、Js 语言词法、语法编译等等。