浏览器相关知识
浏览器解析 URL
问
从浏览器输入 URL
到渲染成功的过程中,究竟发生了什么?
经历过程:
- 用户输入 URL 地址
- 对 URL 地址进行 DNS 域名解析
- 建立 TCP 连接(三次握手)
- 浏览器发起 HTTP 请求报文
- 服务器返回 HTTP 响应报文
- 关闭 TCP 连接(四次挥手)
- 浏览器解析文档资源并渲染页面
- 重绘与回流(在这里进行防抖与节流)
那么:
- 什么是 DNS 解析?
- 什么是 TCP 三次握手,什么是 TCP 四次挥手,它们的流程是怎样的?
- 浏览器解析文档资源并渲染页面是个怎样的流程?
DNS 解析
DNS
(Domain Name System)是 域名系统 的英文缩写,提供的服务是用于将主机名和域名转换为IP 地址
的工作:
所以,当用户在浏览器输入网址时,DNS
经历了以下步骤:
- 浏览器根据地址,在自身缓存中查找 DNS(域名服务器) 中的解析记录。
- 如果存在,则直接返回 IP 地址;
- 如果不存在,则查找 操作系统中的
hosts
文件 是否有该域名的 DNS 解析记录,如果有就返回。
- 如果不存在,则查找 操作系统中的
- 浏览器缓存或者操作系统的 hosts 文件中都没有这个域名的 DNS 解析记录,或者已经过期,则向 域名服务器 发起请求解析这个域名。
- 先向 本地域名服务器 中请求,让它解析这个域名,如果解析不了,则向 根域名服务器 请求解析。
- 根服务器 给本地域名服务器返回一个主域名服务器。
- 本地域名服务器向主域名服务器发起解析请求。
- 主域名服务器 接收到解析请求后,查找并返回域名对应的域名服务器的地址。
- 域名服务器会查询存储的域名和
IP
的映射关系表,返回目标IP
记录以及一个TTL
(Time To Live)值。 - 本地域名服务器接收到
IP
和TTL
值,进行缓存,缓存的时间由TTL
值控制。 - 将解析的结果返回给用户,用户根据
TTL
值缓存在本地系统缓存中,域名解析过程结束。
TCP 三次握手 四次挥手
TCP
(Transmission Control Protocol 传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。
简单来说,它的作用就是将数据流从一台主机可靠地传输到另一台主机。
三次握手:
- 第一次握手:起初两端都处于
CLOSED
关闭状态,Client
将标志位SYN
置为1
,随机产生一个值seq = x
,并将该数据包发送给Server
,Client
进入SYN-SENT
状态,等待Server
确认。 - 第二次握手:
Server
收到数据包后由标志位SYN = 1
得知Client
请求建立连接,Server
将标志位SYN
和ACK
都置为1
,ack = x + 1
,随机产生一个值seq = y
,并将该数据包发送给Client
以确认连接请求,Server
进入SYN-RCVD
状态,此时操作系统为该TCP
连接分配TCP
缓存和变量。 - 第三次握手:
Client
收到确认后,检查seq
是否为x + 1
,ACK
是否为1
,如果正确则将标志位ACK
置为1
,ack = y + 1
,并且此时操作系统为该TCP
连接分配TCP
缓存和变量,并将该数据包发送给Server
,Server
检查ack
是否为y + 1
,ACK
是否为1
,如果正确则连接建立成功,Client
和Server
进入established
状态,完成三次握手,随后Client
和Server
就可以开始传输数据。
四次挥手:
- 第一次挥手:
Client
的应用进程先向其TCP
发出连接释放报文段(FIN = 1,序号 seq = u),并停止再发送数据,主动关闭TCP
连接,进入FIN-WAIT-1
(终止等待1)状态,等待Server
的确认。 - 第二次挥手:
Server
收到连接释放报文段后即发出确认报文段,(ACK = 1,确认号 ack = u + 1,序号 seq = v),Server
进入CLOSE-WAIT
(关闭等待)状态,此时的TCP
处于半关闭状态,Client
到Server
的连接释放。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
状态。
浏览器解析文档资源并渲染页面
解析:
- 浏览器通过
HTMLParser
根据深度遍历的原则把HTML
解析成DOM Tree
- 浏览器通过
CSSParser
将CSS
解析成CSS Rule Tree
(CSSOM Tree
) - 浏览器将
JavaScript
通过DOM API
或者CSSOM API
将JS
代码解析并应用到布局中,按要求呈现响应的结果 - 根据
DOM
树和CSSOM
树来构造render Tree
layout
:重排(也可以叫回流),当render tree
中任一节点的几何尺寸发生改变,render tree
就会重新布局,重新来计算所有节点在屏幕的位置repaint
:重绘,当render tree
中任一元素样式属性(几何尺寸没改变)发生改变时,render tree
都会重新画,比如字体颜色,背景等变化paint
:遍历render tree
,并调动硬件图形API
来绘制每个节点。
参考文章
OSI
- 物理层
- 二进制传输,比特
bit
- 二进制传输,比特
- 数据链路层
- 帧(含MAC地址,即物理地址)
- 网络层
- 包
- IP地址
- 传输层
- 段
- 端口号
- 会话层
- 表示层
- 应用层