写在前面

这个问题一般是前端面试极其爱问的,然后延伸出其他的问题,特此总结下。

1 首先是域名解析(DNS解析)

浏览器访问到服务器的唯一方式就是通过 ip 地址访问,因此仅凭用户输入的 URL 是无法访问到服务器的,浏览器会开始对 URL 进行域名解析,域名解析系统即是 DNS(Domain Name System)解析的过程如下:

  1. 浏览器会根据输入的 URL 先查找浏览器里的 DNS 缓存记录,看看是否有对应的 ip, 若有则直接使用浏览器里的 DNS 缓存记录里的 ip,若没有,则查找 OS(操作系统)里的缓存。
  2. 其次浏览器会查找本地硬盘的 host 文件,看看有没有这个域名对应的 ip ,如果有,则直接使用这个 ip。若没有,则进行下一步查找。
  3. 浏览器会发送一个 DNS 请求到本地 DNS 域名解析服务器,本地DNS服务器一般是用户使用的网络接入服务商提供的,如中国电信、中国移动。
  4. DNS 请求到达本地DNS服务器后,DNS 服务器会查看其缓存记录中是否有该 URL 对应的 ip,若有,则直接返回给浏览器,若没有,本地 DNS 服务器会向根域名服务器发送请求。
  5. 根域名服务器不会记录具体的域名和 ip 的关系,而是根据本地 DNS 发送的 URL 返回对应的顶级域名服务器 ip 地址,如 baidu.com 会返回 .com 顶级域名服务器的 ip 地址。
  6. 本地 DNS 服务器拿到返回的顶级域名 ip 地址后会向顶级域名服务器发送请求,顶级域名服务器和根域名服务器一样也不会记录具体的域名和 ip 的关系,而是返回其 URL 对应的二级域名服务器的 ip 地址。
  7. 本地 DNS 服务器拿到二级域名服务器的 ip 后会再次向二级域名服务器发送请求,二级域名服务器经查找,返回给本地服务器其请求的 URL 对应的 ip 地址。
  8. 本地 DNS 服务器拿到 URL 对应的 IP 地址后返回给浏览器,并将当前 ip 存入本地 DNS 的缓存中,方便下次访问时加快访问速度。
  9. 同时,浏览器在拿到 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了,听说你还不了解缓存?
继续磕面经(前端)