从输入 URL 开始
前言
好久没写博客了,我原先的标题是 “从输入url到页面加载完成的XXX”?
但想着,这是别人嚼烂很多次的内容,缺乏挑战性,而且,页面操作过程中能优化的地方实在太多了。
那就干脆给自己挖个坑吧,好歹也在运维开发部待过一年的时间。
本文将尝试从前后端或运维多个角度,来述说整个站点从解析到操作过程中的优化。
1. 流程回顾
1. URL的输入到浏览器解析的一系列事件
很多大公司面试喜欢问这样一道面试题,输入URL到看见页面发生了什么?,今天我们 来总结一下。 简单来说,共有以下几个过程
- 浏览器中输入网址
- 域名解析(
DNS
),找到IP服务器 - 发起
TCP
连接,HTTP
三次握手,发送请求(Request
) - 服务器响应HTTP(Response)
- 浏览器下载资源
html css js images
等 - 浏览器解析代码(如果服务器有
gzip
压缩,浏览器先解压) - 浏览器渲染呈现给用户
2. 结合操作页面到关闭标签页
我们在页面渲染完成之后执行某些操作:
- 按钮重复点击
- 滚动操作
- 条件查询检索
姑且将以上都归为 ==> 8. 界面操作
还在步骤3:发起TCP连接 前插入:
- 浏览器允许的并发请求优化
下面就让我们从DNS解析开始...
2. DNS解析流程
以Chrome
浏览器为例:
-
Chrome浏览器 会首先搜索浏览器自身的DNS缓存。
(缓存时间比较短,默认只有1分钟,且只能容纳1000条缓存)
注:
chrome://net-internals/#dns
来进行查看Chrome
自身的缓存)
- 如果浏览器自身 的缓存里面没有找到对应的条目,那么
Chrome
会搜索操作系统自身的DNS缓存
-
Windows
- 在Windows
中查看DNS
缓存条目的过程非常简单。只需打开命令提示符并输入以下命令:ipconfig /displaydns
。 -
Mac
- 在Mac
上查看DNS
缓存条目的过程略有不同。需要先打开控制台应用,从左侧边栏选择设备,然后输入:any:mdnsresponder
进入搜索栏。接下来,打开命令行并输入以下命令:sudo log config --mode "private_data:on"
sudo killall -INFO mDNSResponder然后,返回控制台应用程序并查看缓存的DNS记录列表。例如,下面的屏幕截图显示了
wx.qlogo.cn
的缓存CNAME
记录。
-
如果在系统的DNS缓存也没有找到,那么尝试读取
hosts
文件。看看这里面有没有该域名对应的IP地址,如果有则解析成功。- 注:
Windows
位于C:\Windows\System32\drivers\etc
,Mac
则是/etc/hosts
。 - 这种操作系统级别的域名解析通常会被不怀好意的人利用,通过修改你
hosts
文件里的内容把域名解析到他指定的ip
地址上,造成所谓的域名劫持,所以将hosts
文件设置成了只读模式,防止被恶意篡改。
- 注:
-
如果在
hosts
文件中也没有找到对应的条目,浏览器就会发起一个DNS
的系统调用,请求本地域名服务器localDNS
(LDNS
)来解析这个域名。
- 通过
UDP
协议向DNS
的53端口发起请求,这个请求是递归的请求,也就是运营商的DNS
服务器必 须得提供给我们该域名的IP
地址) - 第一次就会请求本地域名服务器(
LDNS
)来解析这个域名,这台服务一般在你城市的某个角落,距离不会很远,并且他的性能很好,一般都会缓存域名解析结果,大概80%的域名解析到这里都结束了。 - 如果本地域名解析服务器也没有该域名的记录,则开始递归+迭代解析
直到这里,浏览器能做的所有DNS解析已完成,接下来的步骤就是和服务器相关了。不想看的可以忽略。
- 如果
localDNS
仍然没有命中,就直接到Root Server
域名服务器请求解析。 - 根域名服务器返回给本地域名服务器一个所查询的主域名服务器(
gTLD Server
)地址。gTLD
是国际顶级域名服务器,如.com
、.cn
、.org
等,全球只有13台左右。 - 本地域名服务器
localDNS
再向上一步返回的gTLD
服务器发送请求。 - 接受请求的
gTLD
服务器查找并返回此域名对应的Name Server
域名服务器的地址,这个Name Server
通常就是用户注册的域名服务器,例如用户在某个域名服务提供商申请的域名,那么这个域名解析任务就由这个域名提供商的服务器来完成。 Name Server
域名服务器会查询存储的域名和IP的映射关系表,在正常情况下都根据域名得到目标IP地址,连同一个TTL值返回给DNS Server
域名服务器。- 返回该域名对应的
IP
和TTL
值,LDNS
会缓存这个域名和IP
的对应关系,缓存时间由TTL
值控制。 - 把解析的结果返回给用户,用户根据TTL值缓存在本地系统缓存中,域名解析过程结束。
注:在实际的DNS解析过程中,可能还不止这11步(第1步其实可以忽略不计。),如Name Server
可能有很多级,或者有一个GTM
来负载均衡控制,这都有可能会影响域名解析过程。
不想看文字可以看图: