前端八股文系列四(url输入之后做了什么)

237 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第27天,点击查看活动详情

前情回顾

之前我们说过url解析前两个步骤:DNS解析和TCP三次握手,现在已经建立了连接,我们需要进行下一步了,发送HTTP请求。

正文

发送HTTP请求

一旦TCP/IP成功建立连接,浏览器就会向远程服务器发送HTTP请求,这里HTTP请求也分为两种情况:第一次访问和非第一次访问。

  1. 首次访问url网址,没有缓存信息,但是服务器会响应一些header信息,比如expires、cache-control、last-modified、etag等,这些是用来记录是否缓存并且如何缓存的字段信息。
  2. 再次访问该url的时候,根据上一次访问的返回的header信息,根据命中的缓存类型,是否过期决策如何请求。并且确定是否缓存本次访问,如何缓存。

详细步骤

image.png

image.png

这两张图片就展示了上述的两种情况:第一个访问和非第一个访问

再一次访问

浏览器的缓存机制分为强缓存写上缓存

当浏览器再一次访问访问过的网址时,会先获取资源的header信息,判断是否命中强缓存

  1. 如果命中强缓存,直接从缓存中获取资源,包括响应的header信息,(强缓存不会和服务器通信)。
  2. 如果没有命中强缓存,浏览器就会发送请求到服务器,该请求会携带上一次请求返回的header信息,由服务器根据header信息判断是否命中协商缓存,(协商缓存会和服务器通信)。
  3. 如果命中协商缓存,服务器会返回新的header信息,更新缓存中的header信息。但是不返回资源内容,而是告诉浏览器直接从缓存中取。
  4. 如果没有命中协商缓存,返回最新的资源内容。

强缓存字段

  • Expires:HTTP/1.0提供的,其值是服务器返回的数据到期时间,如果客户端和服务器的时间产生偏差,那么强缓存就可能失效。
  • Cache-Conctrol:HTTP/1.1提供的,优先级要高于Expires。Cache-Control有五个取值。
    • pubulic:所有内容都会被缓存,客户端和服务器都可以缓存
    • private:只有客户端可以缓存,也是默认缓存取值
    • no-cache:可以在客户端缓存,也可以在服务器缓存,但是需要服务器进行验证才能使用
    • no-store:所有的内容都不会被缓存
    • max-age:xxx:缓存将会失效的时间,超过xxx秒强制缓存将会失效

协商缓存字段

  • last-modified/if-modified-since:last-modified是资源在服务器最后呗修改的时间。当客户端再次发起请求,会携带着上次请求返回的last-modified的值。服务器根据if-midified-since和last-modified的值进行对比判断是否过期,如果过期需要重新请求资源状态码是200,如果没有过期就使用缓存内容状态码是304。

强缓存和协商缓存的区别