浏览器输入url后发生的事情以及每步可以做的优化
首先总结下输入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后发生的事情以及每步可以做的优化的更多相关文章
- 在浏览器输入URL后发生了什么?
摘录部分一:https://www.cnblogs.com/kongxy/p/4615226.html 从输入URL到浏览器显示页面发生了什么 当在浏览器地址栏输入网址,如:www.baidu.com ...
- 天龙八步"细说浏览器输入URL后发生了什么
本文摘要: 1.DNS域名解析: 2.建立TCP连接: 3.发送HTTP请求: 4.服务器处理请求: 5.返回响应结果: 6.关闭TCP连接: 7.浏览器解析HTML: 8.浏览器布局渲染: 总结 输 ...
- 【转】浏览器输入URL后发生了什么
转自:http://www.cnblogs.com/webdeve/p/7865520.html本文摘要: 输入网址 当我们在浏览器输入网址并回车后,一切从这里开始. 一.DNS域名解析 我们在浏览器 ...
- “天龙八步”细说浏览器输入URL后发生了什么
本文摘要: 1.DNS域名解析: 2.建立TCP连接: 3.发送HTTP请求: 4.服务器处理请求: 5.返回响应结果: 6.关闭TCP连接: 7.浏览器解析HTML: 8.浏览器布局渲染: 总结 输 ...
- 细说浏览器输入URL后发生了什么
本文摘要: 1.DNS域名解析: 2.建立TCP连接: 3.发送HTTP请求: 4.服务器处理请求: 5.返回响应结果: 6.关闭TCP连接: 7.浏览器解析HTML: 8.浏览器布局渲染: 总结 ...
- 浏览器输入URL后发生了什么
假如在浏览器中输入了www.cnblogs.com,然后回车 DNS解析 浏览器检查浏览器缓存是否有域名对应的IP. 浏览器查找操作系统是否有对应的DNS解析成果(hosts文件). 查找路由器缓存. ...
- [译]当你在浏览器输入url后发生了什么
面试题会经常问这个,之前也被问过,回答的不是很好,后来看到百度前端的一篇博客,啰嗦了好多,很么触摸屏都上了..后来看到stackoverflow上的一个回答,比较短. 原文地址:http://stac ...
- 前端基础:”天龙八步“细说浏览器输入URL后发生了什么
参考:https://www.xuecaijie.com/it/157.html#1Q64p5DeC8dKFF 本文摘要: 1.DNS域名解析: 2.建立TCP连接: 3.发送HTTP请求: 4.服务 ...
- 【转】浏览器中输入url后发生了什么
原文地址:http://www.jianshu.com/p/c1dfc6caa520 在学习前端的过程中经常看到这样一个问题:当你在浏览器中输入url后发生了什么?下面是个人学习过程中的总结,供个人复 ...
随机推荐
- 微信小程序开发(七)获取手机网络类型
// succ.wxml <view>手机网络状态:{{netWorkType}}</view> // succ.js var app = getApp() Page({ da ...
- shell 中的通配符:
shell 中的通配符: *: 代表 0 个或者多个任意字符 ?: 代表一定有一个的任意字符 []: 代表一定有一个在括号内的字符(非任意字符).例如[abcd]代表一定有一个字符,可能是 abcd ...
- Java笔记(第七篇 JDBC操作数据库)
JDBC是连接数据库和java程序的桥梁,通过JDBC API可以方便地实现对各种主流数据库的操作.学习java语言,必须学习JDBC技术,因为JDBC技术实在java语言中被广泛使用的一种操作数据库 ...
- 洛谷P1363 幻想迷宫【dfs】
题目:https://www.luogu.org/problemnew/show/P1363 题意: 有一个地图,起点是S,障碍物用#表示.可以将这个地图不断的在四周重复,问从起点开始是否可以走到无限 ...
- config文件的实现
https://www.cnblogs.com/jiayouwyhit/p/3836510.html //Config.h #pragma once #include <string> # ...
- WHU 583 Palindrome ( 回文自动机 && 本质不同的回文串的个数 )
题目链接 题意 : 给你一个串.要你将其划分成两个串.使得左边的串的本质不同回文子串的个数是右边串的两倍.对于每一个这样子的划分.其对答案的贡献就是左边串的长度.现在要你找出所有这样子的划分.并将贡献 ...
- Gradle 的项目导入到 IntelliJ 后子项目源代码不能导入
在一个 Gradle 项目中,有若干子项目. 当 Gradle 到如后,子项目不能被 IntelliJ 识别代码. 如下图的这个代码就没有被自动识别. 这个有可能是因为你的这个子项目没有被添加到父项 ...
- 小米oj 重拍数组求最大和
重排数组求最大和 序号:#34难度:困难时间限制:1000ms内存限制:10M 描述 假设有一个n元素的数组(数组的元素索引从1开始),针对这个数组有q个查询请求,每个请求由一对整数li,ri组成, ...
- HZOJ 20190819 NOIP模拟26题解
考试过程: 照例开题,然后觉得三道题都挺难,比昨天难多了(flag×1),T1 dp?T2 数据结构? T3 dp?事实证明我是sb然后决定先搞T2,但是,woc,这题在说什么啊,我怎么看不懂题啊,连 ...
- 【CUDA 基础】5.3 减少全局内存访问
title: [CUDA 基础]5.3 减少全局内存访问 categories: - CUDA - Freshman tags: - 共享内存 - 归约 toc: true date: 2018-06 ...