输入一个url到呈现一个页面,到底发生了啥?

1. 输入阶段

  1. 输入第一个字符开始,浏览器会检索历史记录,显示匹配的地址(如果有的话)

  1. 输入完毕之后,浏览器会根据URL的规则判断输入的内容是搜索内容还是URL,如果是搜索内容,则回车之后通过默认的搜索引擎,拼接url跳转。如果是URL,则会加上协议(如果缺少的情况下),拼成完成的URL进行访问。

2. URL请求阶段

浏览器通过进程间的通信(IPC)把URL请求发送到网络进程,网络进程发起真正的URL请求。

发起请求前,网络进程根据请求的URL查询是否缓存了该资源。如果有,那么直接返回资源给浏览器进程;如果没有,会进程DNS解析。

首先查看浏览器是否对该域名有缓存,然后是hosts文件,如果都没有,则需要请求域名服务器进行查询。如果协议请求是HTTPS,还需要建立TLS连接。

接下来就是通过IP地址和服务器建立TCP连接(三次握手),连接之后,浏览器会构造请求行、请求头,向服务器发送构建的请求信息。

3. 服务端阶段

如果是静态网站,一般会经nginx做反向代理,根据请求的域名做location到服务器的某个静态文件上,比如:/root/www/index.html;

如果是动态网站,会由controller处理(MVC),返回一个页面。

3.1 服务端重定向

有些服务端会把http重定向到https,这时,服务端会返回301或者302的状态码,并提供一个Location的响应头,这时浏览器会重新发起上述第二步开始进行。

3.2 响应数据类型

通过Content-type来区分是文件还是文本。

  • text/html HTML格式
  • application/octet-stream 字节流

4 连接阶段

4.2 等待TCP连接

http/1.1 一个tcp同时只能处理一个请求,浏览器会为每个域名维护6个tcp连接! 但是每个tcp连接是可以复用的,也就是处理完一个请求之后,不断开这个tcp连接,可以用来处理下个http请求! 不过http2是可以并行请求资源的,所以如果使用http2,浏览器只会为每个域名维护一个tcp连接

4.2断开连接

通常情况,一但服务端向客户端返回了数据,就要关闭TCP连接,不过可以通过添加头信息保持通道打开状态

Connection:Keep-Alive

5. 预渲染阶段

5.1 准备渲染进程

Chrome 的默认策略是,每个标签对应一个渲染进程。但如果从一个页面打开了另一个新页面,而新页面和当前页面属于同一站点的话,那么新页面会复用父页面的渲染进程。官方把这个默认策略叫 process-per-site-instance。

同一站点(same-site),Chrome会使用同一个渲染进程。

5.2 提交文档

浏览器进程将网路进程接受到HTML数据提交给渲染进程。

  1. 网络进程将资源下载完毕之后,告诉浏览器进程
  2. 浏览器进程向渲染进程发送“提交文档”的消息
  1. 渲染进程和网络进程建立传输数据的“管道”
  2. 文档数据传输完毕之后,渲染进程告诉浏览器进程“确认提交”的消息
  1. 浏览器进程更新UI界面中的状态,比如安全状态、地址栏的URL、前进后退的历史状态

6. 渲染阶段

6.1 构建DOM树

将HTML转为浏览器认识的DOM树,保存在内存中树状结构

6.2 样式计算

  • 渲染引擎把CSS转为浏览器可以理解的结构——styleSheets
  • 转换演示表中的属性值,使其标准化

  • 计算每个DOM节点中的每个元素的具体样式,计算过程中遵循CSS的继承和层叠规则。(Computed Style)

6.3 布局阶段

  • 遍历DOM树种可见元素,添加到构建布局树(LayoutTree)
  • 布局计算
  • 分层。针对z-index、负责的3D转换、页面滚动等,渲染引擎还需要生成图层树(LayerTree)
  • 图层绘制。把图层的绘制拆分成很小的绘制指令,然后再把这些绘制指令按照顺序组成绘制列表。
  • 栅格化(raster)操作。
  • 合成和显示。一旦所有的图块都被栅格化,合成线程就会生成一个绘制图块的命令——“DrawQuad”,然后将该命令提交给浏览器进程。然后通过浏览器进程中名叫“viz”的组件,将页面绘制到内存中,最后再将内存显示到屏幕上。

操作解释|相关概念

分层

创建分层的条件:

  • 拥有层叠上下文属性的元素会被提升为单独的一层,比如定位属性、透明属性、CSS滤镜
  • 需要剪裁的地方也会被创建为新的图层。文字超过div会被剪裁,如果出现滚动条,也会被提升为单独的图层
<style>
  div {
    width: 200px;
    height: 200px;
    overflow: auto;
    background: gray;
  }
</style>
<body>
  <div>123123123</div>
  <div>
    <p>
      所以元素有了层叠上下文的属性或者需要被剪裁,那么就会被提升成为单独一层,你可以参看下图:
    </p>
    <p>
      从上图我们可以看到,document层上有A和B层,而B层之上又有两个图层。这些图层组织在一起也是一颗树状结构。
    </p>
    <p>
      图层树是基于布局树来创建的,为了找出哪些元素需要在哪些层中,渲染引擎会遍历布局树来创建层树(Update
      LayerTree)。
    </p>
  </div>
</body>

栅格化

图层的绘制列表准备好之后,由浏览器主进程把列表提交(commit)合成线程。

一个页面可能高度很高,显示器并不能完全显示网页的所有内容,而当前显示器所有显示的可见区域就叫做视口(ViewPort)。

合成线程会将图层划分为图块(tile),图块大小通常是256*256或者512*512。

合成线程会优先视口附近的图块来生成位图。栅格化的含义就是将图块转为位图。

重排

重绘

直接合成

可以避开重排和重绘阶段,直接在非主线程上执行合成动画操作,提升了绘制效率。

### 回答1: 好的,我了解了。关于您的问题,整个过程可以分为以下几个步骤: 1. 输入URL:当您在浏览器地址栏中输入URL时,浏览器会将该URL发送到域名系统(DNS),通过域名系统将URL转化为IP地址。 2. 发送HTTP请求:浏览器根据URL发起HTTP请求,请求访问Web服务器的特定资源。 3. 服务器响应:当Web服务器接收到请求时,它将处理请求并返回所请求的资源。 4. 浏览器渲染:浏览器收到服务器响应后,它将解析HTML源代码,并根据CSS样式表和JavaScript代码来渲染页面。 5. 页面展示:最终,浏览器将HTML、CSS和JavaScript代码解析完毕后,它会在屏幕上展示出页面内容。 以上就是从输入URL页面展示的整个过程,希望能够帮到您。 ### 回答2: 当我们在浏览器的地址栏中输入URL时,整个过程可以分为以下几个步骤: 1. DNS解析:浏览器首先会根据URL中的域名(例如www.example.com)进行DNS解析,将域名解析为对应的IP地址。这一步骤是为了找到存放网页的服务器。 2. 建立TCP连接:浏览器通过IP地址与服务器建立TCP连接。TCP协议提供可靠的连接,确保数据的完整性。 3. 发起HTTP请求:一旦建立了TCP连接,浏览器会向服务器发起HTTP请求,请求包括请求方法、请求头、请求体等信息。请求方法可以是GET、POST等,服务器根据请求的不同做出相应的响应。 4. 服务器处理请求并响应:服务器接收到浏览器的请求后,会根据请求的内容进行相应的处理。处理包括读取数据库、执行后端代码等操作。之后,服务器会生成响应对象,包含响应状态码、响应头、响应体等信息。 5. 接收服务器响应:浏览器接收到服务器的响应后,根据响应头中的Content-Type确定响应的数据类型。如为HTML类型,则浏览器会将响应的HTML代码解析成DOM树。 6. 解析页面并渲染:浏览器根据DOM树构建渲染树,并依据CSS样式对各元素进行布局和样式计算,最终生成页面的渲染结果。同时,浏览器也会执行页面中的JavaScript代码。 7. 页面展示:最后,浏览器将渲染好的页面内容显示在用户的视窗中,用户可以看到页面的展示效果。 总结起来,从输入URL页面展示,经历了DNS解析、建立TCP连接、发起HTTP请求、服务器处理请求并响应、接收服务器响应、解析页面并渲染等多个步骤。最终,浏览器将渲染好的页面内容显示给用户。 ### 回答3: 从输入URL页面展示,大致经历如下步骤: 1. 域名解析:当我们在浏览器输入URL后,首先会进行域名解析。浏览器会向DNS服务器发送域名请求,获取该域名对应的IP地址。 2. 建立连接:浏览器通过获取到的IP地址与Web服务器建立TCP连接。这个过程使用的是三次握手协议,确保连接的可靠性。 3. 发送请求:建立连接后,浏览器会发送HTTP请求给Web服务器,请求的内容包括请求的类型(GET/POST等)、地址、头部信息、可能还包括cookie等相关信息。 4. 服务器处理请求:Web服务器收到请求后,会根据请求内容进行处理。处理过程可能包括调取数据库、运行后台程序等动作。 5. 服务器响应:Web服务器根据请求的内容,返回一个HTTP响应给浏览器。响应的内容包括状态码、响应头部、实际的网页内容等。 6. 下载页面资源:浏览器接收到服务器返回的响应后,会开始下载网页的资源,如HTML、CSS、JavaScript、图片等。浏览器会根据响应头部中的Content-Type确定如何解析资源。 7. 页面渲染:当所有的资源下载完成后,浏览器会根据HTML结构、CSS样式,解析并渲染出网页。浏览器会从上到下解析HTML文档,解析过程包括构建DOM树、计算CSS样式、布局页面等。 8. JavaScript执行:在渲染过程中,浏览器会遇到JavaScript代码。浏览器会逐行解析执行JavaScript代码,并根据代码修改DOM树和样式,可能还会触发网络请求等。 9. 页面展示:当页面渲染和JavaScript执行完成后,页面便可以完整地展示给用户了。用户可以看到页面内容,与页面进行交互。 以上仅是一个大致的过程,实际上还有很多细节和额外的步骤,比如缓存机制、重定向、Cookie处理等等。不同的浏览器服务器也可能会有些许差异。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值