当我们在浏览器上输入 www.xxx.com 然后回车,回车这一瞬间到底发生了什么?
首先是域名解析,然后是建立 TCP 三次握手,建立 TCP 连接之后发起 HTTP 请求,服务器响应请求,浏览器获得 HTML 代码,浏览器解析 HTML 代码,并请求 HTML 代码中的资源,浏览器开始对页面进行渲染将页面呈现给用户。
域名解析
- 首先浏览器会搜索自身的 DNS 缓存,如果有该条目,如果没有过期则返回。
- 如果浏览器缓存中没有找到,此时会查找操作系统本地 DNS 缓存,查看方式 ipconfig/displaydns。
- 如果操作系统的 DNS 缓存没有查找到则开始读取 host 文件的缓存,如果有则解析成功。
- 如果 host 文件中没有找到则计算机发起一个 DNS 的系统调用,向本地配置的 DNS 服务器发送一个域名解析的请求,运营商的 DNS 服务器首先会查找本地缓存,如果有则解析成功,如果没有则 DNS 服务器会代替我们浏览器发起迭代的请求,首先想根域名,然后从右向左,逐一进行请求。
浏览器拿到 index.html 文件后,就开始解析其中的 html 代码,遇到 js/css/image 等静态资源时,就向服务器端去请求下载(会使用多线程下载,每个浏览器的线程数不一样),这个时候就用上 keep-alive 特性了,建立一次HTTP连接,可以请求多个资源,下载资源的顺序就是按照代码里的顺序,但是由于每个资源大小不一样,而浏览器又多线程请求请求资源,所以从下图看出,这里显示的顺序并不一定是代码里面的顺序。
浏览器在请求静态资源时(在未过期的情况下),向服务器端发起一个 http 请求(询问自从上一次修改时间到现在有没有对资源进行修改),如果服务器端返回304状态码(告诉浏览器服务器端没有修改),那么浏览器会直接读取本地的该资源的缓存文件。