0

    《浏览器工作原理与实践》笔记之浏览器端发起 HTTP 请求流程

    2023.06.30 | admin | 138次围观

    你可以通过工具软件 curl 来查看返回请求数据curl -i 注意这里加上了-i是为了返回响应行、响应头和响应体的数据。

    首先服务器会返回响应行,包括协议版本和状态码。但并不是所有的请求都可以被服务器处理的,那么一些无法处理或者处理出错的信息,怎么办呢?服务器会通过请求行的状态码来告诉浏览器它的处理结果

    正如浏览器会随同请求发送请求头一样,服务器也会随同响应向浏览器发送响应头。响应头包含了服务器自身的一些信息,比如服务器生成返回数据的时间、返回的数据类型(JSON、HTML、流媒体等类型),以及服务器要在客户端保存的 Cookie 等信息。发送完响应头后,服务器就可以继续发送响应体的数据,通常,响应体就包含了 HTML 的实际内容。

    通常情况下,一旦服务器向客户端返回了请求数据,它就要关闭 TCP 连接。不过如果浏览器或者服务器在其头信息中加入了:Connection:Keep-Alive 那么 TCP 连接在发送后将仍然保持打开状态,这样浏览器就可以继续通过同一个 TCP 连接发送请求。保持 TCP 连接可以省去下次请求时需要建立连接的时间浏览器工作原理是怎样的,提升资源加载速度。比如,一个 Web 页面中内嵌的图片就都来自同一个 Web 站点,如果初始化了一个持久连接,你就可以复用该连接,以请求其他资源,而不需要重新再建立新的 TCP 连接。

    比如当你在浏览器中打开 geekbang.org 后,你会发现最终打开的页面地址是 。curl -I geekbang.org

    从图中你可以看到,响应行返回的状态码是 301,状态 301 就是告诉浏览器浏览器工作原理是怎样的,我需要重定向到另外一个网址,而需要重定向的网址正是包含在响应头的 Location 字段中,接下来,浏览器获取 Location 字段中的地址,并使用该地址重新导航,这就是一个完整重定向的执行流程。

    Q: 为什么很多站点第二次打开速度会很快?

    《浏览器工作原理与实践》笔记之浏览器端发起 HTTP 请求流程

    如果第二次页面打开很快,主要原因是第一次加载页面过程中,缓存了一些耗时的数据--DNS 缓存和页面资源缓存 缓存处理过程如图所示

    从上图的第一次请求可以看出,当服务器返回 HTTP 响应头给浏览器时,浏览器是通过响应头中的 Cache-Control 字段来设置是否缓存该资源。通常,我们还需要为这个资源设置一个缓存过期时长,而这个时长是通过 Cache-Control 中的 Max-age 参数来设置的,比如上图设置的缓存过期时间是 2000 秒。

    Cache-Control:Max-age=2000

    这也就意味着,在该缓存资源还未过期的情况下, 如果再次请求该资源,会直接返回缓存中的资源给浏览器。 但如果缓存过期了,浏览器则会继续发起网络请求,并且在 HTTP 请求头中带上:

    If-None-Match:"4f80f-13c-3a1xb12a"

    服务器收到请求头后,会根据 If-None-Match 的值来判断请求的资源是否有更新。

    如果没有更新,就返回 304 状态码,相当于服务器告诉浏览器:“这个缓存可以继续使用,这次就不重复发送数据给你了。”如果资源有更新,服务器就直接返回最新资源给浏览器。

    简要来说,很多网站第二次访问能够秒开,是因为这些网站把很多资源都缓存在了本地,浏览器缓存直接使用本地副本来回应请求,而不会产生真实的网络请求,从而节省了时间。同时,DNS 数据也被浏览器缓存了,这又省去了 DNS 查询环节。

    版权声明

    本文仅代表作者观点。
    本文系作者授权发表,未经许可,不得转载。

    发表评论