企业🤖AI Agent构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
[TOC] # 概况 ![](https://img.kancloud.cn/30/48/304861a3e52b248623fa84f3df0e9d05_1142x423.png) <br> 浏览器中的 HTTP 请求从发起到结束一共经历了如下八个阶段:构建请求、查找缓存、准备 IP 和端口、等待 TCP 队列、建立 TCP 连接、发起 HTTP 请求、服务器处理请求、服务器返回请求和断开连接。 <br> # 构建请求 首先,浏览器构建请求行信息(如下所示),构建好后,浏览器准备发起网络请求。 ``` GET /index.html HTTP1.1 ``` <br> <br> # 查找缓存 在真正发起网络请求之前,浏览器会先在浏览器缓存中查询是否有要请求的文件。 当浏览器发现请求的资源已经在浏览器缓存中存有副本,它会拦截请求,返回该资源的副本,并直接结束请求,而不会再去源服务器重新下载。 这样做的好处有: * 缓解服务器端压力,提升性能(获取资源的耗时更短了); * 对于网站来说,缓存是实现快速资源加载的重要组成部分。 当然,如果缓存查找失败,就会进入网络请求过程了。 <br> <br> # 准备 IP 地址和端口 因为浏览器使用 HTTP 协议作为应用层协议,用来封装请求的文本信息;并使用 TCP/IP 作传输层协议将它发到网络上,所以在 HTTP 工作开始之前,浏览器需要通过 TCP 与服务器建立连接。 ![](https://img.kancloud.cn/d5/17/d51761e3005a1d601b14f8793395cce2_1142x570.png) 在第一步浏览器会请求 DNS 返回域名对应的 IP。当然浏览器还提供了 DNS 数据缓存服务,如果某个域名已经解析过了,那么浏览器会缓存解析的结果,以供下次查询时直接使用,这样也会减少一次网络请求。 拿到 IP 之后,接下来就需要获取端口号了。通常情况下,如果 URL 没有特别指明端口号,那么 HTTP 协议默认是 80 端口。 <br> <br> # 等待 TCP 队列 Chrome 有个机制,同一个域名同时最多只能建立 6 个 TCP 连接,如果在同一个域名下同时有 10 个请求发生,那么其中 4 个请求会进入排队等待状态,直至进行中的请求完成。 如果当前请求数量少于 6,会直接进入下一步,建立 TCP 连接。 <br> <br> # 建立 TCP 连接 排队等待结束之后,终于可以快乐地和服务器握手了,在 HTTP 工作开始之前,浏览器通过 TCP 与服务器建立连接。 <br> <br> # 发送 HTTP 请求 一旦建立了 TCP 连接,浏览器就可以和服务器进行通信了。 ![](https://img.kancloud.cn/44/a5/44a55ef4ca793503e1c45e36c127bf6d_1142x656.png) <br> <br> # 服务器端处理 HTTP 请求流程 ## 返回请求 一旦服务器处理结束,便可以返回数据给浏览器了。 ![](https://img.kancloud.cn/6b/f5/6bf5bee0ea1d4755e4df953a42876afc_1142x651.png) ## 断开连接 通常情况下,一旦服务器向客户端返回了请求数据,它就要关闭 TCP 连接。不过如果浏览器或者服务器在其头信息中加入了: ``` Connection:Keep-Alive ``` 那么 TCP 连接在发送后将仍然保持打开状态,这样浏览器就可以继续通过同一个 TCP 连接发送请求。**保持 TCP 连接可以省去下次请求时需要建立连接的时间,提升资源加载速度。**比如,一个 Web 页面中内嵌的图片就都来自同一个 Web 站点,如果初始化了一个持久连接,你就可以复用该连接,以请求其他资源,而不需要重新再建立新的 TCP 连接。 ## 重定向 ![](https://img.kancloud.cn/6a/5c/6a5c8a50b8d24211526ff69eb17e5666_2525x1130.png) 响应行返回的状态码是 301,状态 301 就是告诉浏览器,我需要重定向到另外一个网址,而需要重定向的网址正是包含在响应头的 Location 字段中,接下来,浏览器获取 Location 字段中的地址,并使用该地址重新导航,这就是一个完整重定向的执行流程。 <br> # 参考资料 [浏览器工作原理](https://time.geekbang.org/column/article/113513)