Contents

从输入URL到页面呈现发生了什么

主流程

  1. 输入 URL
  2. DNS 解析 URL
  3. 建立 TCP 连接(连接复用)
  4. 发送 HTTP 请求
  5. 服务器收到请求,发送 HTTP 响应
  6. 浏览器解析渲染页面
  7. 关闭 TCP 连接

详细流程

从输入url到开启网络请求线程

URL中文名叫做统一资源定位符。 主要包含

  • protocol(协议)
  • hostname(主机名)
  • port(端口号)
  • path(路径)

当输入网址时,浏览器会从历史记录、书签等智能匹配url给出提示。 输入完成后,浏览器会新开一个页面进程,然后这个进程会开启一个网络线程进行http请求。

网络请求

查找强缓存

先检查强缓存,如果命中直接使用。

DNS解析

如果输入IP地址,则不需要DNS解析,如果输入域名,则需要进行DNS解析获取IP地址。

查找顺序:浏览器缓存–>操作系统缓存–>本地host文件–>路由器缓存–>ISP DNS缓存–>根DNS服务器

建立TCP连接

如果是HTTPS,要进行TLS/SSL四次握手

以随机端口(1024<端口<63535)向服务器的web程序通过三次握手建立tcp连接。

发送HTTP请求

完成tcp连接后,浏览器可以向服务器发送HTTP请求。浏览器HTTP请求包含三部分:请求行、请求头、请求体、

请求行包含请求方法、路径、HTTP协议版本。

// 请求方法是GET,路径为根路径(URI),HTTP协议版本为1.1 GET / HTTP/1.1

请求头包含各种属性,例如缓存,Cookie,时间,连接方式(是否长连接),CORS等相关。

服务器处理

服务器对浏览器请求做出响应,并把对应的html文件发送给浏览器。

浏览器解析渲染

浏览器获得HTML、css、js文件后,开始进行解析:

  1. 解析html建立dom树
  2. 解析css构建style树
  3. dom树和style树两者结合生成布局(Layout)树,然后计算布局树节点的坐标位置。

值得注意的是,这棵布局树值包含可见元素,对于 head标签和设置了display: none的元素,将不会被放入其中。

渲染过程:

  1. 建立图层树(Layer Tree)
  2. 生成绘制列表
  3. 生成图块并栅格化
  4. 显示器显示内容

图层树是根据节点的属性,例如z-index,产生的层叠上下文。 浏览器渲染的图层一般包含两大类:普通图层以及复合图层。 普通文档流可以理解为一个复合图层。 通过z-idnex、opacity、translate3D的css动画属性等会生成复合图层,两者可单独绘制,互不影响

/images/bVCZ1H.png

JS引擎解析过程

调用JS引擎执行JS代码(JS的解释阶段,预处理阶段,执行阶段生成执行上下文,VO,作用域链、回收机制等等)

  • 创建window对象:window对象也叫全局执行环境,当页面产生时就被创建,所有的全局变量和函数都属于window的属性和方法,而DOM Tree也会映射在window的doucment对象上。当关闭网页或者关闭浏览器时,全局执行环境会被销毁。
  • 加载文件:完成js引擎分析它的语法与词法是否合法,如果合法进入预编译
  • 预编译:在预编译的过程中,浏览器会寻找全局变量声明,把它作为window的属性加入到window对象中,并给变量赋值为’undefined’;寻找全局函数声明,把它作为window的方法加入到window对象中,并将函数体赋值给他(匿名函数是不参与预编译的,因为它是变量)。而变量提升作为不合理的地方在ES6中已经解决了,函数提升还存在。
  • 解释执行:执行到变量就赋值,如果变量没有被定义,也就没有被预编译直接赋值,在ES5非严格模式下这个变量会成为window的一个属性,也就是成为全局变量。string、int这样的值就是直接把值放在变量的存储空间里,object对象就是把指针指向变量的存储空间。函数执行,就将函数的环境推入一个环境的栈中,执行完成后再弹出,控制权交还给之前的环境。JS作用域其实就是这样的执行流机制实现的。

引用

浏览器的架构

浏览器层合成与页面渲染优化

[各种公司] 输入url后发生了什么

面试官:浏览器输入URL后发生了什么?