从输入网址后发生了什么
用户输入 URL,浏览器会根据用户输入的信息判断是搜索还是网址,如果是搜索内容,就将搜索内容+默认搜索引擎成新的 URL;如果用户输入的内容符合 URL 规则,浏览器就会根据 URL 协议,在这段内容上加上协议成合法的 URL
一整套过程
DNS 域名解析
建立 tcp 连接
发送 http 请求
服务器处理请求
返回响应结果
关闭 tcp 连接
浏览器解析 html
浏览器布局渲染
把他们扩展一下就是 dns: 从客户端到本地服务器属于递归查询, 而 dns 服务器之间的交互属于迭代查询。
建立 tcp 连接:三次握手原理 客户端发送 syn 标志的数据包给服务端,服务端收到后,回传一个带有 syn/ack 标志的数据包已示传达确认信息,最后客户端在回传一个带有 ack 标志的数据包,代表握手结束,连接成功。
发送 http 请求:与服务器建立连接后, 就向服务器发起请求了
服务器处理请求: 服务器收到请求后由 web 服务器处理请求,web 服务器解析用户请求,知道了需要调度哪些资源文件,在通过相应的这些资源文件处理用户请求和参数,并调用数据库信息,最后将结果通过 web 服务器返回给浏览器客户端。
关闭 TCP 连接: 与创建 tcp 连接的三次握手类似,关闭 tcp 连接,需要 4 次握手。
客户端: 我这边没有数据要给你了,关闭连接吧
服务端: 好的,我看我这边还有数据要传给吗
服务端: 我这边也没有数据要传给你了,咱们可以关闭连接了
客户端: 好的。
浏览器解析 html: 渲染树与 dom 树不同,渲染树中并没有 head、display 为 none 等不必显示的节点。
浏览器布局渲染: 根据 css 样式,即每个节点在页面中的大小和位置等。html 默认是流式布局,css 和 js 会打破这种布局。改变 dom 的外观样式以及大小和位置。
第一步 DNS 涉及到的东西
通过 dns 解析域名的实际 ip 地址
dns 解析首先会从你的浏览器的缓存中去寻找是否有这个网址对应的 ip 地址,如果没有就向 os 系统的 dns 缓存中寻找,如果没有就是路由器的 dns 缓存,如果没有就是 isp 的 dns 缓存中寻找。 浏览器-> 系统-> 路由器-> isp
期间涉及到的缓存有哪些
dns 缓存
查询浏览器以及操作系统中的 DNS 缓存,再查询本地 host 文件,如果还未找到的话,就向自己的 DNS 服务器查询。 浏览器缓存->系统缓存->路由器缓存->IPS 服务器缓存->根域名服务器缓存->顶级域名服务器缓存->主域名服务器缓存。
浏览器搜索自身的 dns 缓存,
搜索操作系统自身的 dns 缓存
读取本地的 hosts 文件,查询有无域名对应解析
浏览器发起的 dns
浏览器缓存机制
查询浏览器中是否有对应网页的强缓存(Expires 或 Cache-Control 未过期),如果命中缓存则直接取本地磁盘的 html(状态码为 200, 内存或者磁盘)
如果没有命中强缓存,则会向浏览器发起请求(先进行下一步的 TCP 连接),服务器通过 Etag 和 last-Modify 来与服务器确认返回的响应是否被更改(协商缓存),若无更改返回状态码(304 Not Modified),浏览器取本地缓存;
若强缓存和协商缓存都没有命中则返回请求结果
本地存储
四个和缓存有关的
cache-control 相对时间 优先级高于 expires
expires 绝对时间
last-modified 文件最后修改的时间
ETag 生成 hash 值, 优先级高于 last-modified
cdn 缓存与回源
DNS 可以返回一个合适的机器的 IP 给用户,例如可以根据每台机器的负载量,该机器离用户地理位置的距离等等,这种过程就是 DNS 负载均衡,又叫做 DNS 重定向。大家耳熟能详的 CDN (Content Delivery Network)就是利用 DNS 的重定向技术,DNS 服务器会返回一个跟用户最接近的点的 IP 地址给用户,CDN 节点的服务器负责响应用户的请求,提供所需的内容。
cdn 往往用来存放静态资源
『缓存』就是说我们把资源 copy 一份到 cdn 服务器上这个过程。
『回源』就是说 cdn 发现自己没有这个资源(一般是缓存的数据过期了),转头向根服务器(或者它的上层服务器)去要这个资源的过程。
浏览器的绘制
DNS 预解析
dns Prefetch, 即 dns 预获取, 是前端优化的一部分, 一般来说, 在优化中与 dns 有关的有两点: 一是减少 dns 的请求次数, 另一个就是进行 dns 预获取.
减少 dns 解析时间和次数是个很好的优化方式。DNS Prefetching 是让具有此属性的域名不需要用户点击链接就在后台解析,而域名解析和内容载入是串行的网络操作,所以这个方式能 减少用户的等待时间,提升用户体验 。
默认情况下浏览器会对页面中和当前域名(正在浏览网页的域名)不在同一个域的域名进行预获取,并且缓存结果,这就是隐式的 DNS Prefetch。如果想对页面中没有出现的域进行预获取,那么就要使用显示的 DNS Prefetch 了。
dns prefetch 应该经量的放在网页的前面, 推荐放在 <meta charset="UTF-8">
如果要禁止隐式的 dns prefetch, 可以使用以下的标签
最后更新于
这有帮助吗?