写在前面
这个问题一般是前端面试极其爱问的,然后延伸出其他的问题,特此总结下。
1 首先是域名解析(DNS解析)
浏览器访问到服务器的唯一方式就是通过 ip 地址访问,因此仅凭用户输入的 URL 是无法访问到服务器的,浏览器会开始对 URL 进行域名解析,域名解析系统即是 DNS(Domain Name System)解析的过程如下:
- 浏览器会根据输入的 URL 先查找浏览器里的 DNS 缓存记录,看看是否有对应的 ip, 若有则直接使用浏览器里的 DNS 缓存记录里的 ip,若没有,则查找 OS(操作系统)里的缓存。
- 其次浏览器会查找本地硬盘的 host 文件,看看有没有这个域名对应的 ip ,如果有,则直接使用这个 ip。若没有,则进行下一步查找。
- 浏览器会发送一个 DNS 请求到本地 DNS 域名解析服务器,本地DNS服务器一般是用户使用的网络接入服务商提供的,如中国电信、中国移动。
- DNS 请求到达本地DNS服务器后,DNS 服务器会查看其缓存记录中是否有该 URL 对应的 ip,若有,则直接返回给浏览器,若没有,本地 DNS 服务器会向根域名服务器发送请求。
- 根域名服务器不会记录具体的域名和 ip 的关系,而是根据本地 DNS 发送的 URL 返回对应的顶级域名服务器 ip 地址,如 baidu.com 会返回 .com 顶级域名服务器的 ip 地址。
- 本地 DNS 服务器拿到返回的顶级域名 ip 地址后会向顶级域名服务器发送请求,顶级域名服务器和根域名服务器一样也不会记录具体的域名和 ip 的关系,而是返回其 URL 对应的二级域名服务器的 ip 地址。
- 本地 DNS 服务器拿到二级域名服务器的 ip 后会再次向二级域名服务器发送请求,二级域名服务器经查找,返回给本地服务器其请求的 URL 对应的 ip 地址。
- 本地 DNS 服务器拿到 URL 对应的 IP 地址后返回给浏览器,并将当前 ip 存入本地 DNS 的缓存中,方便下次访问时加快访问速度。
- 同时,浏览器在拿到 ip 地址后,也会对其进行缓存,将其缓存到浏览器里的 DNS 缓存区。但浏览器的 DNS 缓存时间一般比较短,如 chrom、firefox 等缓存时间都是 1 分钟。同时不仅浏览器,操作系统也会对返回的 ip 做一定的缓存。类似开头访问的过程。
2 建立 TCP 连接
浏览器在拿到服务器对应的 ip 地址后,会向对应的 web 服务器发起 TCP 连接请求,通过 TCP 三次握手,在客户端和服务端建立 TCP 连接。
3 建立 HTTP 请求
建立了 TCP 连接后,浏览器向服务器端发送 HTTP 请求。
4 服务器处理 HTTP 请求
服务器在接收到请求后,根据请求参数调度资源文件,连接数据库处理后,返回资源给浏览器。
5 关闭 TCP 连接
在本次数据传输完成后,为了避免服务器和客户端双方自愿的占用和损耗,会经过 TCP 四次挥手,关闭 TCP 连接。
6 浏览器解析资源
浏览器在拿到服务器端返回的资源文件后开始解析资源文件,如解析 HTML 文件生成 DOM 树,解析 CSS 文件生成 CSS 规则树,然后通过 DOM 树和规则树生成渲染树。
7 浏览器渲染页面
浏览器生成渲染树后渲染页面布局,根据 css 、js 动态改变,然后绘制出页面。
8 问题延伸
8.1 浏览器会不会缓存 DNS?
8.2 https 多了什么步骤
- https(http secure): http + 通信加密 + 证书 + 完整性保护
- 证书可以证明服务器或客户端的身份
- ssl: secure socket layer,安全套接层
- 多了SSL安全套接层。HTTP直接和TCP通信。当使用SSL时,则变为先和SSL通信,再由SSL和TCP通信。所以HTTPS可以看做身披SSL协议外壳的HTTP。
参考与来源
从输入url到页面展示出来,中间发生了什么?
浅谈DNS缓存机制—浏览器和OS篇
都9012了,听说你还不了解缓存?
继续磕面经(前端)