【输入url发生了什么】详细过程

90 阅读7分钟

一、缓存

浏览器缓存-系统缓存-路由器缓存

1.浏览器缓存数据

输入url的地址栏中会有url缓存,相关的静态资源也有会缓存

2.DNS缓存与解析

输入url后会对域名进行解析,会进行浏览器dns缓存->操作系统dns缓存->hosts 文件->DNS解析

DNS解析是递归和迭代的过程

(1)先搜索浏览器的DNS缓存
(2)搜索操作系统的DNS缓存
(3)搜索host文件,比如可以配置locolhost对应127.0.0.1
(4)若都没有命中缓存,操作系统将域名发送至本地DNS服务器,本地DNS服务器若没有命中缓存则发起解析请求(递归的:主机向本地DNS发送请求,并且最后本地DNS会返回映射给主机)
(5)本地DNS服务器向根DNS服务器发送请求,返回一张ip列表包含顶级域名服务器的地址(迭代)
(6)本地DNS服务器向顶级域名服务器发送请求
(7)本地DNS服务器向权威DNS服务器发送请求,权威 DNS 服务器可以返回主机 - IP 的最终映射
(8)本地DNS服务器将ip地址的映射返回给主机。
🔸DNS优化
dns-prefetch:即DNS预查询,DNS预解析是与页面加载并行处理的,并且不会影响到页面加载的性能,在点击链接无需进行DNS解析,减少用户等待时间

preconnect:在真正开始加载资源之前,完成对资源服务器的DNS解析,并和资源服务器之间建立连接
prefetch:预先加载一个资源,当跳转的时候会更快响应,但是不会解析不会执行js
prerender:会加载资源、解析页面,进行预渲染。浏览器可能会分配少量资源预渲染,也可能会放弃预渲染

3.ARP(地址解析协议)缓存

本质是一个IP地址与MAC地址的对应表。当ARP被询问一个已知ip地址节点的MAC地址时,会先在缓存中查看,若不存在发送ARP请求查询。 主机会将ARP请求广播到局域网上所有主机,并接收返回消息,以此确定目标的物理地址。

由于建立在网络中各个主机相互信任的基础上,所以主机收到应答不会检测真实性。若有攻击者发送伪ARP应答报文则构成ARP欺骗。 相关协议还有RARP

4.TCP发送/接收缓冲区

用来临时存放双方通信的数据,保证通信数据不会丢包。TCP的全双工的工作模式以及TCP的流量控制都是依赖两个buffer的
发送缓冲区:为已发送的数据保留一个副本,直到对方确认才可以删除。
接收缓冲区:等待数据拷贝到应用层用户的buffer里面,拷贝后就删掉已确认的数据。
由于发送速度可能大于接收速度,接收端的应用程序未能及时从接收缓冲区读取数据,接收缓冲区不够大不能缓存所有接收到的报文等原因,TCP接收端的接收缓冲区很快就会被塞满;从而导致不能接收后续的数据,发送端此后发送数据是无效的,因此需要流控制

5.HTTP请求缓存

强缓存

http1.0中定义了Expries字段,指定过期时间,是一个绝对时间的 GMT 格式的时间字符串。但是当服务器和客户端时间偏差太大时,导致误差很大
http1.1中引入Cache-Control,Cache-Control比Expires优先级高
📝max-age代表资源有效时间;
📝no-cache:不使用本地缓存,需要使用缓存协商;
📝no-store:禁止浏览器缓存数据;
📝public:可以被所有的缓存,包括终端用户和 CDN 等中间代理服务器;
📝private:只能被终端用户的浏览器缓存

协商缓存:服务器判断是否使用缓存资源

Last-Modify和If-Modify-Since,表示资源最后修改时间。但是有时候只改了时间没有改内容也会导致变化,而且检查能力是秒级的,不能检测出1s内的频繁变化
Etag和If-None-Match,保证每个资源都有唯一的etag
如果命中缓存会返回304状态码

二、建立连接

1.TCP三次握手

(1)客户端给服务器发送一个SYN报文(同步序列编号),并且指明客户端的初始序列号seq=x
(2)服务端收到后应答,发送一个SYN+ACK包,应答客户端接下来可以发送的序列号ack=x+1,服务端初始化序列号seq=y
(3)客户端向服务器发送确认ACK报文(ack=k+1)
若只有两次握手可能会有丢包问题,比如服务端发送的应答报文丢失,服务端已经准备好接收数据但客户端不知道服务端是否准备好了

2.TCP四次挥手

(1)客户端发送一个FIN报文,并且会指定一个序列号
(2)服务端收到报文会发送ACK报文,并把客户端发送的序列号+1作为ACK的序列号
(3)服务端发送FIN报文,并指定一个序列号
(4)客户端收到后发送ACK应答,并且ack=x+1。等待一段时间后,保证服务端收到报文后再进入关闭状态。(若服务端没有收到应答,会重新发送FIN)

3.建立HTTP/HTTPS请求

https默认443端口号,安全加密算法主要由CA+对称/非对称构成,如下:
(1)客户端发送请求,包括客户端支持的SSL版本、支持的加密算法以及密钥的长度
(2)服务端返回支持的SSL、加密算法以及CA证书(包含公钥),服务端会自己有一个私钥不传输
(3)浏览器会验证CA证书(签名的时候生成一个hash函数,计算内容,并且和使用公钥的计算结果对比/逐级向上确认)
(4)客户端随机生成一个字符串key,并用公钥加密
(5)服务端收到后用自己的私钥解密,拿到key之后是对称加密算法,都用key来加密解密

4.读取页面请求

浏览器接收服务器的响应资源后,会对资源进行分析。
首先查看 Response header,根据不同状态码做不同的事。如果响应资源进行了压缩(比如 gzip),还需要进行解压。 然后,对响应资源做缓存,之后解析相应内容

三、渲染解析

1.构建DOM树

由html解析器接收html将字节转成字符,并对字符进行词法分析解析成标记(令牌),对标记进行语法分析转成DOM。栈底为document(即DOM树根节点),最终形成DOM树

遇到没有async和defer(异步与延迟)的script标签时,解析可能被打断

2.计算样式

浏览器将CSS转换成styleSheets,之后对计算好的样式(计算规则主要是继承和层叠)进行标准化。
默认情况下CSS是流式布局的,元素与元素之间不会重叠,但浮动、定位等原因会导致元素脱离文档流

3.构建布局

DOM树和CSSOM树合并成一颗渲染树,忽略不可见/不需要渲染的节点,并添加伪元素到渲染树

回流/重排:元素的内容、结构、尺寸、位置发生变化,需要重新计算重新生成渲染树

4.生成图层树

5.生成绘制列表

把图层拆成一个个绘制指令,渲染主线程会把绘制列表交给合成线程

重绘:元素只有一些外观样式的变化

6.栅格化

合成线程把图层拆成图块,再把视口附近的图块转成位图

7.合成与显示

当栅格化完成后,按照合理的顺序合并图层,合成线程发出命令告诉浏览器显示到屏幕上
优化——开启GPU加速
一些dom(比如动画)提升成独立的层之后,不会影响其他dom的布局。比如可以使用transform实现移动、伸缩变化,而非改变宽高,避免重排

8.执行js

语法分析->预编译->执行->Event Loop