持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第27天,点击查看活动详情
前情回顾
之前我们说过url解析前两个步骤:DNS解析和TCP三次握手,现在已经建立了连接,我们需要进行下一步了,发送HTTP请求。
正文
发送HTTP请求
一旦TCP/IP成功建立连接,浏览器就会向远程服务器发送HTTP请求,这里HTTP请求也分为两种情况:第一次访问和非第一次访问。
- 首次访问url网址,没有缓存信息,但是服务器会响应一些header信息,比如expires、cache-control、last-modified、etag等,这些是用来记录是否缓存并且如何缓存的字段信息。
- 再次访问该url的时候,根据上一次访问的返回的header信息,根据命中的缓存类型,是否过期决策如何请求。并且确定是否缓存本次访问,如何缓存。
详细步骤
这两张图片就展示了上述的两种情况:第一个访问和非第一个访问
再一次访问
浏览器的缓存机制分为强缓存和写上缓存。
当浏览器再一次访问访问过的网址时,会先获取资源的header信息,判断是否命中强缓存。
- 如果命中强缓存,直接从缓存中获取资源,包括响应的header信息,(强缓存不会和服务器通信)。
- 如果没有命中强缓存,浏览器就会发送请求到服务器,该请求会携带上一次请求返回的header信息,由服务器根据header信息判断是否命中协商缓存,(协商缓存会和服务器通信)。
- 如果命中协商缓存,服务器会返回新的header信息,更新缓存中的header信息。但是不返回资源内容,而是告诉浏览器直接从缓存中取。
- 如果没有命中协商缓存,返回最新的资源内容。
强缓存字段
- 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。