从URL到页面渲染,到底经历了些啥

1、构建请求行

GET / HTTP/1.1

2、查找强缓存

命中 -> 使用缓存,返回200

3、DNS解析

  1. 检查浏览器自身缓存是否有该域名对应的IP
  2. 检查本地host文件网址映射
  3. 检查TCP/IP参数中设置的首选服务器(本地DNS服务器LDNS),是否在本地配置区域资源中
  4. 到根域名服务器进行解析,根域名服务器返回所查域的主域名服务器gTLD地址(.com,.cn,……)
  5. 到主域名服务器进行解析,主域名服务器返回网站注册的域名服务器地址(Name Server)
  6. 网站服务器找到目标ip返回给本地DNS服务器
  7. 本地DNS服务器缓存该域名和地址并返回结果给浏览器

4、建立TCP连接

三次握手:为了确认服务端和客户端的接收能力和发送能力是否正常

TCP头部信息:

  • 16位源端口号
  • 16位目的端口号
  • 32位序号
  • 32位确认号(对方报文序号+1)
  • 4位头部长度
  • 6位标准位(URG、ACK、PSH、RST、SYN、FIN)
  • 16位窗口大小
  • 16位校验和
  • 16位紧急指针

http://cdn.yuanrengu.com/img/%E4%B8%89%E6%AC%A1%E6%8F%A1%E6%89%8B.jpg
具体参考三次握手

4.5、SSL/TLS握手(针对HTTPS)

client -->> server:client_hello,版本号、随机数(用于密钥生成)、支持的加密算法

client <<-- server:server_hello,版本号、随机数(用于密钥生成)、选择一个客户端支持的加密算法

client <<-- server:sever_certificate,服务端配置对应的证书,用于身份验证和密钥交换

client <<-- server:sever_hello_done,表示server_hello发送结束

client:客户端验证证书的合法性

client -->> server:client_key_exchange,客户端计算产生随机数Pre-master,用证书公钥加密发送给服务器(此时客户端已拿到所有密钥信息)

client -->> server:change_cipher_spec,客户端通知服务器后续的通信都采用协商的通信密钥和加密算法进行加密通信

client -->> server:encrypted_handshake_message,之前的通信参数的hash值加密后发送给服务端用于握手验证

client <<-- server:change_cipher_spec,解密数据并验证,通过后,发送同样加密的数据encrypted_handshake_message

但是也不是每次发送请求都要经历上述的所有过程,可以通过一个Session Identifier(会话标识符),该Session ID是 TLS 握手中生成的 Session ID。服务端可以将 Session ID 协商后的信息存起来,浏览器也可以保存 Session ID,并在后续的 Client Hello 握手中带上它,如果服务端能找到与之匹配的信息,就可以完成一次快速握手。

5、发送HTTP请求

包括:

  1. 请求行:请求方法(GET,POST),请求URI,HTTP协议版本
  2. 请求头:HOST、Connection、Cookie、Expires、Cache-Control、If-Modified-Since、If-None-Match、User-Agent
  3. 请求体:例如POST提交的表单

6、接收服务器响应

包括:

  1. 响应行:HTTP协议版本,状态码,状态描述
  2. 响应头:Connection、Set-Cookie、Cache-Control、Date、Etag、Last-Modified
  3. 响应体:数据

如果Connection为keep-alive,则TCP保持连接,不进行挥手

Content-Type值为text/html时进行浏览器渲染

7、构建DOM树

1、生成标记

2、通过堆栈入栈出栈建树:

<html> -->> HTMLHtmlElement

<head> -->> HTMLHeadElement

<body> -->> HTMLBodyElement

并有一定的容错策略

8、计算样式

  1. 格式化样式:将css文本转换为结构化的对象 —— document.styleSheets
  2. 标准化样式:while -> #000、bold -> 600
  3. 计算每个节点的样式:继承(使用父节点的样式) + 层叠(BFS,GFS……)

计算后的样式会时刻挂载到window.getComputedStyle上

9、生成布局树(layout tree)

1、遍历DOM树的节点,并将其添加到布局树中

2、计算布局树中的节点坐标位置

注意:head标签会默认display: none,chrome会使用Skia渲染

10、渲染

1、建立图层树

一般来说,当前节点图层会默认属于父节点的图层

2、生成绘制列表

将图层绘制拆分成一个个绘制指令,比如先画背景、再描绘边框......然后将这些指令按顺序组合成一个待绘制列表,相当于给后面的绘制操作做了一波计划

3、生成图块并栅格化

将图层分块、绘制视口附近的图块、首屏展示只展示低分辨率的图片、图块绘制后替换掉图片、生成位图数据

4、显示内容

浏览器绘制进程 - -》 显卡 --》显示器刷新展示图片

11、重排和重绘

触发重排:楼上的过程会重来一遍

  1. DOM大小改变:border、width、height、padding、margin
  2. DOM节点数量改变或者位置移动
  3. 读取offset、scroll、client属性族
  4. 调用getComputedStyle、getClientRects

触发重绘:

DOM自身几何属性不变,不需要更新位置信息,从而省掉了布局的过程

参考: https://www.html5rocks.com/zh/tutorials/internals/howbrowserswork/#1_1

 

 

 

 

 

### 回答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、付费专栏及课程。

余额充值