首先总结下输入url按下回车后的大致流程:

  • 查询url的ip地址。
  • 建立tcp连接,连接服务器。
  • 浏览器发起http/https请求。
  • 服务器响应浏览器的请求。
  • 网页的解析与渲染。

下面分析每个过程

查询url的ip地址详细过程:

  • 浏览器解析出url中的域名。
  • 查询浏览器的DNS缓存。
  • 浏览器中没有DNS缓存,则查找本地客户端hosts文件有无对应的ip地址。
  • hosts中无,则查找本地DNS服务器有无对应的缓存。
  • 若本地DNS服务器没有缓存,则向根服务器查询,进行递归查找。
  • 递归查找从顶级域名开始(如.com),一步步缩小范围,最终客户端取得ip地址。

这个过程的目的就是想知道url对应的ip地址,想加快这个过程可以从两方面考虑。

  • 对于从未访问过的url

主要看DNS服务器 (比如阿里云,dnspod,腾讯云) 本身的解析速度, 使用这几个大厂的服务,解析速度差别几乎可以忽略不计,使用哪个都可以,有条件的甚至可以搭建自己的DNS服务器。

  • 对于二次访问的url可以利用缓存

关于DNS缓存的机制这里再啰嗦一下,一条域名的DNS记录会在本地有两种缓存:浏览器缓存和操作系统(OS)缓存。上面也说了在浏览器中访问的时候,会优先访问浏览器缓存,如果未命中则访问OS缓存,最后再访问DNS服务器,然后DNS服务器会递归式的查找域名记录,然后返回。 DNS记录中会有一个TTL值(time to live),单位是秒,意思是这个记录最大有效期是多少,经过实验,OS缓存会参考TTL值,但是不完全等于TTL值,而浏览器DNS缓存的时间跟TTL值无关,每种浏览器都使用一个固定值。
对于浏览器缓存 我们无能为力,但是可以设置下操作系统缓存,即设置TTL的值。

那么域名解析的TTL只应该设置为多少合适呢,下面有两个建议,你可以结合自己参考一下:

一.增大TTL值,以节约域名解析时间,给网站访问加速。 一般情况下,域名的各种记录是极少更改的,很可能几个月、几年内都不会有什么变化。你可以增大域名记录的TTL值让记录在各地DNS服务器中缓存的时间加长,这样在更长的一段时间内,访问这个网站时,本地的DNS服务器就不需要向域名的DNS服务器发出解析请求,而直接从缓存中返回域名解析记录。 国内和国际上很多平台的TTL值都是以秒为单位的,很多的默认值都是3600,也就是默认缓存1小时,这个值实在有点小了,难道会有人一个小时就改一次域名记录吗?你可以根据自己的需要把这个值适当的扩大,例如要缓存一天就设置成86400。
二.减小TTL值,减少更换空间时的不可访问时间。 更换空间因为TTL缓存的问题,新的域名记录,在有的地方可能生效了,有的地方可能等上一两天甚至更久才生效。结果就是有的人访问到了新服务器,有的人访问到了旧服务器。如果原来的域名TTL值设置的小,各地的域名缓存服务器服务器就会很快的访问你域名的权威DNS解析服务器,尽快把你域名的DNS解析IP返回给查询者。 这就是说如果想要解析速度,各地ISP的DNS服务器缓存你的域名,你就需要把TTL值设置大一些,如果想让域名更换空间或者IP后能尽快解析到新的IP上,就需要把TTL值设置小一些。 对于IP地址相对固定,或短期内不会变更IP地址的用户来说TTL值设置的大些如几个小时或更大些为宜。调大TTL值可以显著的提高域名的解析稳定性和速度。而对于近期有计划变更IP地址的用户需要提前把TTL值改小,以便使缓存在世界各地DNS服务器上的旧域名记录迅速过期,等IP地址固定下来后再把TTL值改大。以阿里云为例,阿里云设置TTL的方法可以看 这里

  • 另外如果页面还有其他域名的,可以使用DNS预解析,这样就提前对域名进行了解析, 使用方法如下:
<meta http-equiv="x-dns-prefetch-control" content="on">

另外说下修改本地的hosts文件这个,这一般只有开发同学才会用,不过在修改hosts的时候,有可能会修改完,发现没效果,这应该就是浏览器缓存,或者操作系统缓存导致的了,清除缓存就可以了。

建立tcp连接

这个过程网上其他文章讲的也不错 这里就不讨论了,可以看 这里

加速tcp连接的策略

笔者还没做过这方面的实践,据我了解,关于tpc加速的方法一般都是采用锐速和BBR加速,需要在服务端进行相关的配置,有兴趣的同学可以查阅相关资料,自己试下。

浏览器发请求与服务器响请求

打开浏览器的调试工具,看下NetWork,到这步的时候,还没出现任何请求,也就是还没请求到任何资源, 如果这么过程慢了,就会发现浏览器左上角一直在加载,但是NetWork下没有任何请求,这是因为服务器还没把请求返回回来。 影响这个过程速度的原因有以下几点:

  • 用户本身的网络速度

这个是硬伤,可以使用某些加速软件。

  • 页面发送的请求过多

页面第一加载,发送的请求过多,就会导致服务器的崩溃,服务器一次性处理不了这么多请求,就变呆了,所以要很长时间才给浏览器反馈。

  • 服务器的配置

服务器本身的配置,包括带宽,CPU,内存等,服务器说到底也是一个电脑,客户端把这么多请求发送到服务器,服务器也得接收并处理,然后才能返回给客户端。

网页的解析与渲染

这一步终于在NewWork下可以看到有资源在下载了,下载的时间都会显示出来,这里以简书首页为例:

  • 域名的加载时间好长,这时候就需要后端同学协助了,可以让后端同学进行相关优化,比如数据库方面的。
  • 再看看其他资源的加载时间,如果是接口加载的时间长就找后端,如果是前端相关的就找前端,前端可以把常见的大文件包括html, js, css, 图片,对于这些的优化html可以开启GZIP压缩,js,css,图片都进行压缩,小的图片可以使用雪碧图,或者转成base64格式的这样就减少了图片请求。
  • 考虑到css 和js 会阻塞渲染,会把css放在头部,js放在尾部或者延迟加载。
  • 静态资源使用缓存,缓存这个说起来也挺多的,直接引用其他作者的文章了,看这里 一般情况下对于静态资源,我们打包的时候都会带上类似于hash的标识,比如
nav-logo-4c7bbafe27adc892f3046e6978459bac.png

每次打包的时候要确保变化的资源才改变hsah值,对于不变的资源,hash值就不要改变了了,不然缓存就没意义了,就是所谓的持久化缓存。

浏览器输入url后发生的事情以及每步可以做的优化的更多相关文章

  1. 在浏览器输入URL后发生了什么?

    摘录部分一:https://www.cnblogs.com/kongxy/p/4615226.html 从输入URL到浏览器显示页面发生了什么 当在浏览器地址栏输入网址,如:www.baidu.com ...

  2. 天龙八步&quot;细说浏览器输入URL后发生了什么

    本文摘要: 1.DNS域名解析: 2.建立TCP连接: 3.发送HTTP请求: 4.服务器处理请求: 5.返回响应结果: 6.关闭TCP连接: 7.浏览器解析HTML: 8.浏览器布局渲染: 总结 输 ...

  3. 【转】浏览器输入URL后发生了什么

    转自:http://www.cnblogs.com/webdeve/p/7865520.html本文摘要: 输入网址 当我们在浏览器输入网址并回车后,一切从这里开始. 一.DNS域名解析 我们在浏览器 ...

  4. “天龙八步”细说浏览器输入URL后发生了什么

    本文摘要: 1.DNS域名解析: 2.建立TCP连接: 3.发送HTTP请求: 4.服务器处理请求: 5.返回响应结果: 6.关闭TCP连接: 7.浏览器解析HTML: 8.浏览器布局渲染: 总结 输 ...

  5. 细说浏览器输入URL后发生了什么

    本文摘要: 1.DNS域名解析: 2.建立TCP连接: 3.发送HTTP请求: 4.服务器处理请求: 5.返回响应结果: 6.关闭TCP连接: 7.浏览器解析HTML: 8.浏览器布局渲染: 总结   ...

  6. 浏览器输入URL后发生了什么

    假如在浏览器中输入了www.cnblogs.com,然后回车 DNS解析 浏览器检查浏览器缓存是否有域名对应的IP. 浏览器查找操作系统是否有对应的DNS解析成果(hosts文件). 查找路由器缓存. ...

  7. [译]当你在浏览器输入url后发生了什么

    面试题会经常问这个,之前也被问过,回答的不是很好,后来看到百度前端的一篇博客,啰嗦了好多,很么触摸屏都上了..后来看到stackoverflow上的一个回答,比较短. 原文地址:http://stac ...

  8. 前端基础:”天龙八步“细说浏览器输入URL后发生了什么

    参考:https://www.xuecaijie.com/it/157.html#1Q64p5DeC8dKFF 本文摘要: 1.DNS域名解析: 2.建立TCP连接: 3.发送HTTP请求: 4.服务 ...

  9. 【转】浏览器中输入url后发生了什么

    原文地址:http://www.jianshu.com/p/c1dfc6caa520 在学习前端的过程中经常看到这样一个问题:当你在浏览器中输入url后发生了什么?下面是个人学习过程中的总结,供个人复 ...

随机推荐

  1. 电脑设置自动关机和取消自动关机代码bat命令

    一.设置定时关机bat 1.首先在桌面新建一个记事本txt 2.打开记事本,输入“shutdown -s -t 1260 ”1260是指1260秒,即21分钟内关机.可以修改成别的时间. 3.保存后, ...

  2. 查看tensorflow Pb模型所有层的名字

    代码如下: import tensorflow as tf def get_all_layernames(): """get all layers name"& ...

  3. 牛客练习赛51 C 勾股定理 (数学,结论)

    链接:https://ac.nowcoder.com/acm/contest/1083/C来源:牛客网 题目描述 给出直角三角形其中一条边的长度n,你的任务是构造剩下的两条边,使这三条边能构成一个直角 ...

  4. PHP配置文件(php.ini)详解

    [PHP] ; PHP还是一个不断发展的工具,其功能还在不断地删减 ; 而php.ini的设置更改可以反映出相当的变化, ; 在使用新的PHP版本前,研究一下php.ini会有好处的 ;;;;;;;; ...

  5. CSS3 -- column 实现瀑布流布局

    本例使用 CSS column 实现瀑布流布局 关键点,column-count: 元素内容将被划分的最佳列数 关键点,break-inside: 避免在元素内部插入分页符 html div.g-co ...

  6. 单例模式(Singleton)的同步锁synchronized

    单例模式,有“懒汉式”和“饿汉式”两种. 懒汉式 单例类的实例在第一次被引用时候才被初始化. public class Singleton { private static Singleton ins ...

  7. Codeforces Round #509 (Div. 2) F. Ray in the tube(思维)

    题目链接:http://codeforces.com/contest/1041/problem/F 题意:给出一根无限长的管子,在二维坐标上表示为y1 <= y <= y2,其中 y1 上 ...

  8. python json模块小技巧

    python的json模块通常用于与序列化数据,如 def get_user_info(user_id): res = {"user_id": 190013234,"ni ...

  9. Python模块之目录

     1.加密算法有关 hmac模块 hashlib模块 2.进程有关 multiprocessing模块 3.线程有关 threading模块 4.协程有关 asyncio模块 5.系统命令调用 sub ...

  10. 阿里OSS Vue上传文件提示The OSS Access Key Id you provided does not exist in our records.解决方法

    vue项目 1.安装OSS的Node SDK npm install ali-oss --save 2.参考官方提示https://help.aliyun.com/document_detail/11 ...