整个过程包括两个子过程:导航和渲染
一、导航
- 用户输入url并回车
- 浏览器进程检查url,组装协议,构成完整的url
- 浏览器进程通过进程间通信(IPC)把url请求发送给网络进程
- 网络进程接收到url请求后检查本地缓存是否缓存了该请求资源,如果有则将资源返回给浏览器进程
如果没有,网络进程向服务器发起http请求(网络请求),请求过程如下:
进行DNS解析,获取服务器的ip地址,端口
- 本地域名服务器查看本地缓存
- 根域名服务器
- 顶级域名服务器
- 权威域名服务器
- 利用ip地址和端口构建进程间通信的接口socket套接字,后续TCP端到端的传输的端也是指的是socket套接字
- 建立tcp连接(三次握手)
- 构造请求行、请求头和请求体,利用建立好的tcp连接发送构建好的请求信息
- 服务器收到请求信息,构造响应行、响应头和响应体,利用建立好的tcp连接发送给客户端
- 客户端浏览器的网络进程接收响应头和响应信息,并解析响应内容
网络进程解析响应流程
- 检查状态码,如果是301/302,则需要重定向,从Location自动读取地址,重新进行第4步操作,如果是200,则继续处理请求
200响应处理
- 检查响应的Content-Type,如果是字节流类型,则将该请求提交给下载管理器,该导航流程结束,不再进行后续的渲染。如果是text/html类型,则通知浏览器进程准备渲染进程准备进行渲染
准备渲染进程
- 浏览器进程检查当前的url是否和之前打开的页面的url主域名是否相同,如果相同,则复用之前页面的渲染进程。如果不同,则创建新的渲染进程
传输数据,更新状态
- 渲染进程准备好后,浏览器进程向渲染进程发送“提交文档”信号
- 渲染进程接收到信号后建立“管道”与网络进程进行数据的传输
- 数据传输完毕后,渲染进程发送“确认提交”信号给浏览器进程
- 浏览器进程接收到确认信号后更新浏览器界面的状态:安全信息、地址栏url、前进后退的历史状态、更新web页面等
二、渲染
- 渲染进程将 HTML 内容转换为能够读懂的 DOM 树结构。(使用栈来实现,遇到“<p"就入栈,遇到"</p"就出栈
- 渲染引擎将 CSS 样式表转化为浏览器可以理解的 styleSheets,计算出 DOM 节点的样式。构造渲染树。
- 创建布局树,并计算元素的布局信息。
- 对布局树进行分层,并生成分层树。
- 为每个图层生成绘制列表,并将其提交到合成线程。
- 合成线程将图层分成图块,并在光栅化线程池中将图块转换成位图。
- 合成线程发送绘制图块命令 DrawQuad 给浏览器进程。
- 浏览器进程根据 DrawQuad 消息生成页面,并显示到显示器上。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。