浏览器从输入URL发生了什么

199 阅读3分钟

基本是跟该文章的内容一样

原文地址

  • DNS域名解析
  • 建立TCP连接(三次握手)
  • http请求,服务器处理请求,返回响应
  • 关闭TCP连接(4次挥手)
  • 浏览器渲染

DNS域名解析

DNS(Domain Name Server,域名服务器)是进行域名(domain name)和与之相对应的IP地址 (IP address)转换的服务器。通过域名,获取该域名对应的主机Ip的过程就叫域名解析

DNS有三级,根DNS服务器、顶级域DNS服务器,权威DNS服务器

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

但是从网络上有分两种:本地DNS服务器和线上DNS服务器。本地DNS服务器优先。输入URL之后,顺序如下

客户端-->浏览器缓存-->本地hosts文件-->本地DNS解析器缓存-->本地DNS服务器

如果本地没有查找到,那么通过本地DNS转发器进行递归查询。

DNS转发器就相当于代理ip一样是种递归查询。就是本地dns不能解析了,请求外部的去解析,而第一个也不能解析(便成了转发器),再请求其他dns解析,其他dns把结果发个转发器,转发器在发给本地dns

TCP连接

基本就是三次握手。具体内容,我就不介绍了。可以查看顶部的原文地址

http请求,服务器返回响应

http的报文结构,请求头、请求提、响应头、响应体。这里涉及到http缓存CORS。具体可以这查看http缓存和CORS

关闭TCP连接

基本就是4次挥手。具体内容,我就不介绍了。可以查看顶部的原文地址

浏览器的渲染

参考文档

  • 构建DOM Tree
  • 样式计算 CSSOM Tree
  • RenderObject Tree也成Render Tree(DOM Tree+CSSOM Tree)
  • LayOut(布局)
  • RenderLayer tree(生成图层树)
  • Rendering(渲染方式)
    • 绘制
    • 合成

构建DOM Tree

  • 转码(Bytes -> Characters)—— 读取接收到的 HTML 二进制数据,按指定编码格式将字节转换为 HTML 字符串
  • Tokens 化(Characters -> Tokens)浏览器将字符串转换成W3C HTML5 标准规定的各种 token,例如、,以及其他尖括号内的字符串。每个 token 都具有一定特殊含义和规则。生成标签
  • 构建 Nodes(Tokens -> Nodes)—— 每个 Node 都添加特定的属性(或属性访问器),通过指针能够确定 Node 的父、子、兄弟关系和所属 treeScope(例如:iframe 的 treeScope 与外层页面的 treeScope 不同)。生成节点
  • 构建 DOM 树(Nodes -> DOM Tree)—— 最重要的工作是建立起每个结点的父子兄弟关系 生成DOM Tree

样式计算 CSSOM Tree

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

RenderObject Tree也成Render Tree(DOM Tree+CSSOM Tree)

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

LayOut(布局)

布局计算是一个递归的过程,这是因为一个节点的大小通常需要先计算它的孩子节点的位置、大小等信息。为了计算节点在页面中的确切大小和位置,浏览器会从 RenderObject tree 的根节点开始进行遍历。

RenderLayer tree(图层树)

渲染引擎不会直接食用Render Tree进行绘制,为了处理position、clipping、transform等,浏览器会对特定的render Tree生成对应的RenderLayer Tree。以下条件会产生RenderLayer Tree

  • 根节点
  • 非static的postion,transform
  • 透明节点
  • 有 overflow,alpha 和 reflection 的样式
  • 有 filter样式
  • canvas 元素
  • video 元素

Rendering(渲染方式)

渲染有绘制和合成两个阶段