0%

浏览器原理学习笔记-http请求流程

http 请求流程

HTTP协议,正是建立在 TCP 连接的基础之上。HTTP是一种允许浏览器上服务器获取资源的协议,是Web的基础,通常由浏览器发起请求,用来获取不同类型的文件。http也是浏览器使用最多的最广的协议。

浏览器端发起http请求

如果你在浏览器里面输入一个url,浏览器会完成哪些动作呢?

1.构建请求

首先,浏览器构建请求行信息,构建好后浏览器发起请求。

1
GET /index.html HTTP1.1

2.查找缓存

在真正发起请求之前,浏览器会先在浏览器缓存中查询是否有需要请求的文件。其中,浏览器缓存是一种在本地保存资源副本,以供下次请求时直接使用的技术。

浏览器发现请求的资源已经有缓存的副本,它会直接拦截请求,返回该资源的副本,并直接结束请求,而不会再去源服务器里面去下载。这样的好处有:

  • 缓解服务端压力,提升性能(获取资源的耗时更短了)
  • 对于网站来说,缓存时实现快速资源加载的重要组成部分

如果缓存失败,就会进入网络请求过程了。

3.准备 IP 地址和端口

浏览器使用HTTP作为应用层协议,用来封装请求的文本信息;并使用TCP/IP 做传输层协议将它发到网络上去

,所以在HTTP开始工作之前,浏览器需要通过TCP与服务器先建立连接。HTTP 的内容是通过TCP的传输数据阶段来实现的

image-20200519095343595

在上一节中,有讲到数据包都是通过 IP 地址传输给接受方。由于 IP 地址是数学标识,比较难记,使用域名就会容易记忆,所以基于域名和IP的映射关系又出现了一套服务,负责把域名和IP地址做一一映射的关系。这套服务就叫做“域名系统”,简称DNS

所以这样推导下来,第一步浏览器会请求 DNS 返回域名对应的IP。浏览器也提供DNS数据缓存服务,如果某个域名解析过了,那么浏览器就会缓存解析的结果,下次查询的时候可以直接使用。

拿到IP之后,就会去获取端口号,一般在没有指明端口的情况下,HTTP默认端口号是80。

4.等待TCP队列

IP地址和端口都准备好的情况下,也不会直接建立 TCP 链接,根据Chrome的机制,同一个域名同时最多只能建立 6 个 TCP 连接。如果同一域名下同时有 10 个请求,其中 4 个请求就会进入排队等待状态,直到进行中的请求结束。

如果当前请求数量小于 6,就会直接进入下一步连接。

5.建立TCP连接

排队等待结束之后,就可和服务器快乐握手了。过程参考上一篇文章。

6.发送HTTP请求

一旦建立了 TCP 链接,浏览器就可以和服务器通信了。而 HTTP 中的数据正是在这个通信过程中完成。

image-20200519200612664

浏览器会向服务器发送请求头,它包含了请求方法、请求 URI 和 HTTP 协议版本

具体参数含义可自行百度。

7.服务端处理 HTTP 请求流程

1. 返回请求

服务器处理结束之后,就会把数据返回给浏览器。可以通过工具软件 curl 来查看返回的请求数据,具体使用方法是:

1
curl -i baidu.com

返回的数据格式为:

image-20200519201116461

首先会返回响应行。包括有协议版本和状态码。

服务器会通过状态码告诉浏览器处理结果。

发送完响应头之后,服务器就可以继续发送响应体数据,一般里面会包括 HTML 的实际内容。

2.断开连接

一般情况下,服务端返回了数据后,就会关闭 TCP 连接。不过浏览器或者服务器在其头信息中加入了:

1
Connection: keep-Alive

这样在发送之后就仍然可以保持打开状态,这样浏览器就可以继续通过同一个TCP连接发送请求。保持 TCP 连接可以省去下次请求时需要连接的时间,提升资源加载速度。

3.重定向

到这里请求流程似乎就结束了,不过还有种情况时需要考虑的,例如我们打开geekbang.org之后,最终的页面地址是https://www.geekbang.org

两个url不同的原因是因为会有个重定向的操作。

1
curl -I geekbang.org // 大写 I 表示只需要响应头和响应行数据,不需要响应体

image-20200519202211622

极客时间上还有个问题解答,可以去看一看:https://time.geekbang.org/column/article/116588