• 从输入URL到页面展示过程



    1. DNS域名解析

    • 根 DNS 服务器 :返回顶级域 DNS 服务器的 IP 地址
    • 顶级域 DNS 服务器:返回权威 DNS 服务器的 IP 地址
    • 权威 DNS 服务器 :返回相应主机的 IP 地址

    DNS的域名查找,在客户端和浏览器,本地DNS之间的查询方式是递归查询;在本地DNS服务器与根域及其子域之间的查询方式是迭代查询;

    在客户端输入 URL 后,会有一个递归查找的过程,从浏览器缓存中查找->本地的hosts文件查找->找本地DNS解析器缓存查找->本地DNS服务器查找,这个过程中任何一步找到了都会结束查找流程。

    如果本地DNS服务器无法查询到,则根据本地DNS服务器设置的转发器进行查询。若未用转发模式,则迭代查找过程如下图:

    结合起来的过程,可以用一个图表示:

    在查找过程中,有以下优化点:

    • DNS存在着多级缓存,从离浏览器的距离排序的话,有以下几种: 浏览器缓存,系统缓存,路由器缓存,IPS服务器缓存,根域名服务器缓存,顶级域名服务器缓存,主域名服务器缓存
    • 在域名和 IP 的映射过程中,给了应用基于域名做负载均衡的机会,可以是简单的负载均衡,也可以根据地址和运营商做全局的负载均衡。

    2. 建立TCP连接

    首先,判断是不是https的,如果是,则HTTPS其实是HTTP + SSL / TLS 两部分组成,也就是在HTTP上又加了一层处理加密信息的模块。服务端和客户端的信息传输都会通过TLS进行加密,所以传输的数据都是加密后的数据

    进行三次握手,建立TCP连接。

    • 第一次握手:建立连接。客户端发送连接请求报文段
    • 第二次握手:服务器收到SYN报文段。服务器收到客户端的SYN报文段,需要对这个SYN报文段进行确认
    • 第三次握手:客户端收到服务器的SYN+ACK报文段,向服务器发送ACK报文段

    SSL握手过程

    • 第一阶段 建立安全能力 包括协议版本 会话Id 密码构件 压缩方法和初始随机数
    • 第二阶段 服务器发送证书 密钥交换数据和证书请求,最后发送请求-相应阶段的结束信号
    • 第三阶段 如果有证书请求客户端发送此证书 之后客户端发送密钥交换数据 也可以发送证书验证消息
    • 第四阶段 变更密码构件和结束握手协议

    完成了之后,客户端和服务器端就可以开始传送数据

    发送HTTP请求,服务器处理请求,返回响应结果

    TCP连接建立后,浏览器就可以利用 HTTP/HTTPS 协议向服务器发送请求了。服务器接受到请求,就解析请求头,如果头部有缓存相关信息如if-none-match与if-modified-since,则验证缓存是否有效,若有效则返回状态码为304,若无效则重新返回资源,状态码为200

    这里有发生的一个过程是HTTP缓存,是一个常考的考点,大致过程如图:

    3. 关闭TCP连接

    4. 浏览器渲染

    按照渲染的时间顺序,流水线可分为如下几个子阶段:构建 DOM 树、样式计算、布局阶段、分层、栅格化和显示。如图:

    • 渲染进程将 HTML 内容转换为能够读懂DOM 树结构。
    • 渲染引擎将 CSS 样式表转化为浏览器可以理解的 styleSheets,计算出 DOM 节点的样式。
    • 创建布局树,并计算元素的布局信息。
    • 对布局树进行分层,并生成分层树。
    • 为每个图层生成绘制列表,并将其提交到合成线程。合成线程将图层分图块,并栅格化将图块转换成位图。
    • 合成线程发送绘制图块命令给浏览器进程。浏览器进程根据指令生成页面,并显示到显示器上。

    构建 DOM 树

    • 转码(Bytes -> Characters)—— 读取接收到的 HTML 二进制数据,按指定编码格式将字节转换为 HTML 字符串
    • Tokens 化(Characters -> Tokens)—— 解析 HTML,将 HTML 字符串转换为结构清晰的 Tokens,每个 Token 都有特殊的含义同时有自己的一套规则
    • 构建 Nodes(Tokens -> Nodes)—— 每个 Node 都添加特定的属性(或属性访问器),通过指针能够确定 Node 的父、子、兄弟关系和所属 treeScope(例如:iframe 的 treeScope 与外层页面的 treeScope 不同)
    • 构建 DOM 树(Nodes -> DOM Tree)—— 最重要的工作是建立起每个结点的父子兄弟关系

    样式计算

    渲染引擎将 CSS 样式表转化为浏览器可以理解的 styleSheets,计算出 DOM 节点的样式。

    CSS 样式来源主要有 3 种,分别是通过 link 引用的外部 CSS 文件、style标签内的 CSS、元素的 style 属性内嵌的 CSS。

    页面布局

    布局过程,即排除 script、meta 等功能化、非视觉节点,排除 display: none 的节点,计算元素的位置信息,确定元素的位置,构建一棵只包含可见元素布局树。如图:

    其中,这个过程需要注意的是回流和重绘

    生成分层树

    页面中有很多复杂的效果,如一些复杂的 3D 变换、页面滚动,或者使用 z-indexing 做 z 轴排序等,为了更加方便地实现这些效果,渲染引擎还需要为特定的节点生成专用的图层,并生成一棵对应的图层树(LayerTree)

    栅格化

    合成线程会按照视口附近的图块来优先生成位图,实际生成位图的操作是由栅格化来执行的。所谓栅格化,是指将图块转换为位图

    通常一个页面可能很大,但是用户只能看到其中的一部分,我们把用户可以看到的这个部分叫做视口(viewport)。在有些情况下,有的图层可以很大,比如有的页面你使用滚动条要滚动好久才能滚动到底部,但是通过视口,用户只能看到页面的很小一部分,所以在这种情况下,要绘制出所有图层内容的话,就会产生太大的开销,而且也没有必要。

    显示

    最后,合成线程发送绘制图块命令给浏览器进程。浏览器进程根据指令生成页面,并显示到显示器上,渲染过程完成。

  • 相关阅读:
    Skill Check: Fundamentals of Large Language Models
    外汇天眼:加拿大银行意外只加息50个基点 加息幅度小于预期担忧出现轻微衰退
    ASP.NET Core 6框架揭秘实例演示[25]:配置与承载环境的应用
    ENVI IDL:OMI-NO2产品均值计算与可视化(附Python代码)-年、季、月均值计算
    Python os模块:整理文件和目录最最最常用的模块
    赞评论收藏分享测评补单对速卖通、Lazada、阿里国际卖家有哪些好处和硬件要求?
    RK3399平台开发系列讲解(内存篇)15.34、 Linux 进程内存布局
    Service Worker 简单学习
    Linux命令(100)之sz
    基于ssm+vue设备配件检修管理系统
  • 原文地址:https://blog.csdn.net/php_martin/article/details/125869708