宏观视角下的浏览器之 HTTP 请求
浏览器端发起 HTTP 请求流程
- 构建请求
首先,浏览器构建请求行信息(GET /index.html HTTP1.1
),构建好后,浏览器准备发起网络请求。
- 查找缓存
在真正发起网络请求之前,浏览器会先在浏览器缓存中查询是否有要请求的文件。当浏览器发现请求的资源已经在浏览器缓存中存有副本,它会拦截请求,返回该资源的副本,并直接结束请求,而不会再去源服务器重新下载。
- 准备 IP 地址和端口
因为 HTTP 网络请求的第一步是建立 TCP 链接,建立 TCP 链接的第一步是需要准备 IP 地址和端口号。所以需要将 URL 地址转换为 IP 地址,这套系统叫做“域名系统”,简称 DNS(Domain Name System)
所以第一步浏览器会请求 DNS 返回域名对应的 IP。当然浏览器还提供了 DNS 数据缓存服务,如果某个域名已经解析过了,那么浏览器会缓存解析的结果,以供下次查询时直接使用,这样也会减少一次网络请求。拿到 IP 之后,接下来就需要获取端口号了。通常情况下,如果 URL 没有特别指明端口号,那么 HTTP 协议默认是 80 端口。
- 等待 TCP 队列
现在已经把端口和 IP 地址都准备好了,那么下一步是不是可以建立 TCP 连接了呢?答案依然是“不行”。Chrome 有个机制,同一个域名同时最多只能建立 6 个 TCP 连接,如果在同一个域名下同时有 10 个请求发生,那么其中 4 个请求会进入排队等待状态,直至进行中的请求完成。当然,如果当前请求数量少于 6,会直接进入下一步,建立 TCP 连接。
-
建立 TCP 连接
-
发送 HTTP 请求
一旦建立了 TCP 连接,浏览器就可以和服务器进行通信了。而 HTTP 中的数据正是在这个通信过程中传输的。
一个请求包含请求行、请求头和请求体。请求行包含了请求方法、请求 URI 和 HTTP 版本协议。请求头包含了浏览器所使用的操作系统、浏览器内核等信息、当前请求的域名信息、浏览器端的 Cookie 信息,等等。
服务器端处理 HTTP 请求流程
- 返回请求
返回的数据包括响应行、响应头和响应体。响应行包括协议版本和状态码。响应头包含了服务器自身的一些信息,比如服务器生成返回数据的时间、返回的数据类型(JSON、HTML、流媒体等类型),以及服务器要在客户端保存的 Cookie 等信息。
- 断开链接
通常情况下,一旦服务器向客户端返回了请求数据,它就要关闭 TCP 连接。