Skip to main content

浏览器相关知识

浏览器解析 URL

从浏览器输入 URL 到渲染成功的过程中,究竟发生了什么?

经历过程:

  • 用户输入 URL 地址
  • 对 URL 地址进行 DNS 域名解析
  • 建立 TCP 连接(三次握手)
  • 浏览器发起 HTTP 请求报文
  • 服务器返回 HTTP 响应报文
  • 关闭 TCP 连接(四次挥手)
  • 浏览器解析文档资源并渲染页面
  • 重绘与回流(在这里进行防抖与节流)

那么:

  1. 什么是 DNS 解析?
  2. 什么是 TCP 三次握手,什么是 TCP 四次挥手,它们的流程是怎样的?
  3. 浏览器解析文档资源并渲染页面是个怎样的流程?

DNS 解析

DNS(Domain Name System)是 域名系统 的英文缩写,提供的服务是用于将主机名和域名转换为 IP 地址的工作:

所以,当用户在浏览器输入网址时,DNS 经历了以下步骤:

  1. 浏览器根据地址,在自身缓存中查找 DNS(域名服务器) 中的解析记录。
  2. 如果存在,则直接返回 IP 地址;
    • 如果不存在,则查找 操作系统中的 hosts 文件 是否有该域名的 DNS 解析记录,如果有就返回。
  3. 浏览器缓存或者操作系统的 hosts 文件中都没有这个域名的 DNS 解析记录,或者已经过期,则向 域名服务器 发起请求解析这个域名。
  4. 先向 本地域名服务器 中请求,让它解析这个域名,如果解析不了,则向 根域名服务器 请求解析。
  5. 根服务器本地域名服务器返回一个主域名服务器
  6. 本地域名服务器主域名服务器发起解析请求。
  7. 主域名服务器 接收到解析请求后,查找并返回域名对应的域名服务器的地址。
  8. 域名服务器会查询存储的域名和 IP 的映射关系表,返回目标 IP 记录以及一个 TTL(Time To Live)值。
  9. 本地域名服务器接收到 IPTTL 值,进行缓存,缓存的时间由 TTL 值控制。
  10. 将解析的结果返回给用户,用户根据 TTL 值缓存在本地系统缓存中,域名解析过程结束。

TCP 三次握手 四次挥手

TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议

简单来说,它的作用就是将数据流从一台主机可靠地传输到另一台主机。

三次握手:

  • 第一次握手:起初两端都处于 CLOSED 关闭状态,Client 将标志位 SYN 置为 1,随机产生一个值 seq = x,并将该数据包发送给 ServerClient 进入 SYN-SENT 状态,等待 Server 确认。
  • 第二次握手:Server 收到数据包后由标志位 SYN = 1 得知 Client 请求建立连接,Server 将标志位 SYNACK 都置为 1ack = x + 1,随机产生一个值 seq = y,并将该数据包发送给Client以确认连接请求,Server 进入 SYN-RCVD 状态,此时操作系统为该 TCP 连接分配 TCP 缓存和变量。
  • 第三次握手:Client 收到确认后,检查 seq 是否为 x + 1ACK 是否为 1,如果正确则将标志位 ACK 置为 1ack = y + 1,并且此时操作系统为该 TCP 连接分配 TCP 缓存和变量,并将该数据包发送给 ServerServer 检查 ack 是否为 y + 1ACK 是否为 1,如果正确则连接建立成功,ClientServer 进入 established 状态,完成三次握手,随后 ClientServer 就可以开始传输数据。

TCP三次握手

四次挥手:

  • 第一次挥手:Client 的应用进程先向其 TCP 发出连接释放报文段(FIN = 1,序号 seq = u),并停止再发送数据,主动关闭 TCP 连接,进入 FIN-WAIT-1(终止等待1)状态,等待 Server 的确认。
  • 第二次挥手:Server 收到连接释放报文段后即发出确认报文段,(ACK = 1,确认号 ack = u + 1,序号 seq = v),Server 进入 CLOSE-WAIT(关闭等待)状态,此时的 TCP 处于半关闭状态,ClientServer 的连接释放。
    • Client 收到 Server 的确认后,进入 FIN-WAIT-2(终止等待2)状态,等待 Server 发出的连接释放报文段。
  • 第三次挥手:Server 已经没有要向 Client 发出的数据了,Server 发出连接释放报文段(FIN = 1,ACK = 1,序号 seq = w,确认号 ack = u + 1),Server 进入 LAST-ACK(最后确认)状态,等待 Client 的确认。
  • 第四次挥手:Client 收到 Server 的连接释放报文段后,对此发出确认报文段(ACK = 1,seq = u + 1,ack = w + 1),Client 进入 TIME-WAIT(时间等待)状态。此时 TCP 未释放掉,需要经过时间等待计时器设置的时间 2MSL 后,Client 才进入 CLOSED 状态。

TCP三次握手

浏览器解析文档资源并渲染页面

解析:

  1. 浏览器通过 HTMLParser 根据深度遍历的原则把 HTML 解析成 DOM Tree
  2. 浏览器通过 CSSParserCSS 解析成 CSS Rule TreeCSSOM Tree
  3. 浏览器将 JavaScript 通过 DOM API 或者 CSSOM APIJS 代码解析并应用到布局中,按要求呈现响应的结果
  4. 根据 DOM 树和 CSSOM 树来构造 render Tree
  5. layout:重排(也可以叫回流),当 render tree 中任一节点的几何尺寸发生改变,render tree 就会重新布局,重新来计算所有节点在屏幕的位置
  6. repaint:重绘,当 render tree 中任一元素样式属性(几何尺寸没改变)发生改变时,render tree 都会重新画,比如字体颜色,背景等变化
  7. paint:遍历 render tree,并调动硬件图形 API 来绘制每个节点。

参考文章

OSI

  1. 物理层
    • 二进制传输,比特bit
  2. 数据链路层
    • 帧(含MAC地址,即物理地址)
  3. 网络层
    • IP地址
  4. 传输层
    • 端口号
  5. 会话层
  6. 表示层
  7. 应用层