一个url请求后的过程

1. 浏览器输入域名

例如输入:www.csdn.net

2. 浏览器查找域名的IP地址

浏览器会把输入的域名解析成对应的 IP,其过程如下:

(1)查找浏览器缓存:浏览器一般会缓存 DNS 记录一段时间,一般 2-30min 不等。如果有缓存,直接返回IP,否则下一步。

(2)查找系统缓存:浏览器缓存中找不到 IP 之后,浏览器会进行系统调用,查找本机的 hosts 文件,如果找到,直接返回 IP,否则下一步。

(3)查找路由器缓存:如果 1,2 步都查询无果,则需要借助网络,路由器一般都有自己的 DNS 缓存,将前面的请求发给路由器,查找 ISP 服务商缓存 DNS 的服务器,如果查找到 IP 则直接返回,没有的话继续查找。

(4)递归查询:所谓递归查询就是如果主机所询问的本地域名服务器不知道被查询域名的IP地址,那么本地域名服务器就以 DNS 客户的身份,向其他根域名服务器继续发出查询请求报文,而不是让该主机自己进行下一步查询。

(5)迭代查询:所谓迭代查询就是当根域名服务器收到本地域名服务器发出的查询请求报文后,要么告诉本地域名服务器下一步应该查询哪一个域名服务器,然后本地域名服务器自己进行后续的查询。

3. 建立TCP连接

(1)主机浏览器通过 DNS 解析得到了目标服务器的 IP 地址后,与服务器建立 TCP 连接

(2)TCP 3次握手连接

  • 浏览器所在的客户机向服务器发出连接请求报文(SYN 标志为1);
  • 服务器接收报文后,同意建立连接,向客户机发出确认报文(SYN,ACK 标志位均为1);
  • 客户机接收到确认报文后,再次向服务器发出报文,确认已接收到确认报文;此处客户机与服务器之间的TCP 连接建立完成,开始通信

4. 通过HTTP协议发送请求

浏览器向服务器发起一个 HTTP-GET 方法报文请求。

这个请求报文会包括这次请求的信息,主要是请求方法,请求说明和请求附带的数据,并将这个 http 请求封装在一个 tcp 包中,这个 tcp 包会依次经过传输层,网络层,数据链路层,物理层到达服务器,服务器解析这个请求来作出响应。

5. 某些服务会做永久重定向响应

对于大型网站存在多个主机站点,为了负载均衡或者导入流量,提高 SEO 排名,往往不会直接返回请求页面,而是重定向。返回的状态码就不是 200OK,而是 301,302 以3开头的重定向码,浏览器在获取了重定向响应后,在响应报文中 Location 项找到重定向地址,浏览器重新第一步访问即可。

重定向的作用:重定向是为了负载均衡或者导入流量,提高 SEO 排名。利用一个前端服务器接受请求,然后负载到不同的主机上,可以大大提高站点的业务并发处理能力;重定向也可将多个域名的访问,集中到一个站点;由于baidu.com,www.baidu.com会被搜索引擎认为是两个网站,照成每个的链接数都会减少从而降低排名,永久重定向会将两个地址关联起来,搜索引擎会认为是同一个网站,从而提高排名

6. 浏览器跟踪重定向地址

当浏览器知道了重定向后最终的访问地址之后,重新发送一个 http 请求,发送内容同上。

7. 服务器处理请求

服务器接收到获取请求,然后处理并返回一个响应。

8. 服务器发出一个HTML响应

返回状态码 200 OK,表示服务器可以响应请求,返回报文,由于在报头中 Content-type 为 “text/html”,浏览器以 HTML 形式呈现,而不是下载文件。

返回相应的 html 给浏览器,因为 html 是一个树形结构,浏览器根据这个 html 来构建 DOM 树,在dom
树的构建过程中如果遇到 JS 脚本和外部 JS 连接,则会停止构建 DOM 树来执行和下载相应的代码,这会造成阻塞,这就是为什么推荐 JS 代码应该放在 html 代码的后面,之后根据外部样式,内部样式,内联样式构建一个 CSS 对象模型树 CSSOM 树,构建完成后和 DOM 树合并为渲染树,这里主要做的是排除非视觉节点,比如 script,meta 标签和排除 display 为 none 的节点,之后进行布局,布局主要是确定各个元素的位置和尺寸,之后是渲染页面,因为 html 文件中会含有图片,视频,音频等资源,在解析 DOM 的过程中,遇到这些都会进行并行下载,浏览器对每个域的并行下载数量有一定的限制,一般是 4-6 个。

9. 释放TCP连接

(1)浏览器所在主机向服务器发出连接释放报文,然后停止发送数据

(2)服务器接收到释放报文后发出确认报文,然后将服务器上未传送完的数据发送完

(3)服务器数据传输完毕后,向客户机发送连接释放报文

(4)客户机接收到报文后,发出确认,然后等待一段时间后,释放TCP连接

10. 浏览器显示页面

在浏览器没有完整接收全部 HTML 文档时,它就已经开始显示这个页面了,浏览器接收到返回的数据包,根据浏览器的渲染机制对相应的数据进行渲染。渲染后的数据,进行相应的页面呈现和脚步的交互。