文章目录

  • 前言
  • 一、HTTP首部
    • 1.报文首部内容
    • 2.报文首部的意义
  • 二、报文首部字段
    • 1.通用首部字段
    • 2.请求首部字段
    • 3.响应首部字段
    • 4.实体首部字段
  • 三、HTTP缓存
    • 1.HTTP缓存是什么?
    • 2.HTTP缓存的意义/好处?
    • 3.HTTP缓存规则
      • 1.流程
      • 2.协商缓存
        • 1.ETag和If-None-Match
        • 2.Last-Modified 和 If-Modified-Since
      • 3.强制缓存
        • Expires和Cache-Control
        • 4.协商缓存和强制缓存优先级
    • 四、较为完整的缓存流程
  • 总结

前言

这篇文章是来记录博主对《图解HTTP》书中知识点进行梳理,作为强化学习。网上对此书非常推崇,博主认为这本书是小白入门计网的绝佳选择。我会捋清书中每一章的知识点,梳理出主要且常用的知识点记录总结。看之前最好结合目录问题看,带着问题读完会书中的知识会更有效果。


一、HTTP首部

1.报文首部内容

HTTP 协议的请求和响应报文中必定包含 HTTP 首部。首部内容为客户端和服务器分别处理请求和响应提供所需要的信息。对于客户端用户来说,这些信息中的大部分内容都无须亲自查看。报文首部由几个字段构成。

HTTP 请求报文
在请求中,HTTP 报文由方法、URI、HTTP 版本、HTTP 首部字段等部分构成。

HTTP 响应报文
在响应中,HTTP 报文由 HTTP 版本、状态码(数字和原因短语)、HTTP 首部字段 3 部分构成。

2.报文首部的意义

首部字段传递重要信息
HTTP 首部字段是构成 HTTP 报文的要素之一。在客户端与服务器之间以 HTTP 协议进行通信的过程中,无论是请求还是响应都会使用首部字段,它能起到传递额外重要信息的作用。使用首部字段是为了给浏览器和服务器提供报文主体大小、所使用的语言、认证信息等内容。

二、报文首部字段

接下来就是报文首部的内容了(太多了QAQ),参考了解,不需要死记硬背,下面博主会介绍常用的几个。

1.通用首部字段

2.请求首部字段

3.响应首部字段

4.实体首部字段

三、HTTP缓存

hhh,看了上面那么多字段内容是不是头晕了。如果是初学者不建议死记硬背,我们来通过HTTP是如何缓存的来理解上面几个常用的命令。这样我们学起来可以更加牢固轻松。至于为什么选择HTTP缓存来解释呢?(因为博主了解的也不多,并且HTTP缓存也是面试常考的重要内容)

首先先声明缓存是应用程序中很重要的一个概念,在有大量数据交换的应用程序中,我们会采取一些方式将那些实时性要求不高的数据生成副本并存储在某个相对来说可快速到达、访问、获取的仓库,这样在需要这些数据的时候我们直接从这个仓库中获取数据。

1.HTTP缓存是什么?

HTTP 缓存指的是: 当客户端向服务器请求资源时,会先抵达浏览器缓存,如果浏览器有“要请求资源”的副本,就可以直接从浏览器缓存中提取而不是从原始服务器中提取这个资源。

常见的 HTTP 缓存只能缓存 GET 请求响应的资源,对于其他类型的响应则无能为力,所以后续说的请求缓存都是指 GET 请求。

2.HTTP缓存的意义/好处?

缓存的好处主要有几点:

  1. 提升数据交换的性能(速度)
  2. 提高用户体验
  3. 减少网络传输
  4. 缓解服务器或数据库的压力

3.HTTP缓存规则

1.流程

当用户开始访问一个网站时,浏览器会从目标服务器获取一些资源用以构建最终的 WEB 页面,比如 css、js、html 等静态文件。

假设我们不采取任何措施,则用户每次访问这个网站都要发起一系列 HTTP 请求,试想,如果这个网站的 pv 达到上百万甚至上千万,会对网站的后台服务器造成多大的压力。

为了尽可能提升网站的性能,HTTP 协议给出了一个优化方案,其大体规则如下图所示:

注意:

  1. 当用户第一次请求一个资源时的时序图,浏览器会先询问是否有命中缓存
  2. 没有命中的缓存则浏览器再从服务器获取资源并将资源放进缓存仓库中,下次则可以从缓存中拿资源了。

2.协商缓存

如果每次客户端都需要向服务器端询问,因为不清楚本地缓存的内容是否为最新的内容,需要进行协商那么就是协商缓存。

从这里开始就涉及到我们报文首部的内容了。

1.ETag和If-None-Match

虽然在上面表格已经说过,但是在这里我在此解释一下这两个字段的含义。
Etag: ETag就是一个URL资源的标识符。

If-None-Match: 和Etag类似的实体标志。

当服务器返回时,可以根据返回内容计算一个hash值或者就是一个数字版本号,具体返回什么值要看服务器的计算策略。然后将它加到responseheader里面。

比如 Etag可能这样:ETag: "df551425fcc55e4d42a148795d9f2"

客户端拿到后会将这个ETag和返回值一起存下来,等下次请求时,使用配套的If-None-Match,将这个放到requestheader里面。

值可能与Etag一致:If-None-Match: "df551425fcc55e4d42a148795d9f2"

然后服务端拿到请求里面的If-None-Match跟当前版本的ETag比较下:

如果是一样的话,直接返回304,语义为Not Modified,不返回内容(body),只返回header,告诉浏览器直接用缓存。
如果不一样的话,返回200和最新的内容
与ETag配套的还有一个不太常用的request header ----If-Match,这个和前面If-None-Match的语义是相反的。前面If-None-Match的语义是如果不匹配就下载。

2.Last-Modified 和 If-Modified-Since

Last-Modified: 获取资源的更新日期时间。
If-Modified-Since: 用于确认代理或客户端拥有的本地资源的有效日期。

Last-Modified和If-Modified-Since也是配套使用的,类似于ETag和If-None-Match的关系。只不过ETag放的是一个版本号或者hash值,Last-Modified放的是资源的最后修改时间。Last-Modified是放到responseheader里面的,可能长这样:

Last-Modified: Wed, 21 Oct 2000 07:28:00 GMT

而客户端浏览器在使用时,应该将配套的If-Modified-Since放到requestheader里面,长这样:

If-Modified-Since: Wed, 21 Oct 2000 07:28:00 GMT

服务端拿到这个头后,会跟当前版本的修改时间进行比较:

当前版本的修改时间比这个晚,也就是这个时间后又改过了,返回200和新的内容
当前版本的修改时间和这个一样,也就是没有更新,返回304,不返回内容,只返回头,客户端直接使用缓存

服务端拿到这个头后,也会跟当前版本的修改时间进行比较:

  1. 如果这个时间后没有更新,服务器返回200,并返回内容。
  2. 如果这个时间后有更新,其实就是这个if不成立,会返回错误代码412,语义为Precondition Failed

3.强制缓存

强制缓存就是知道在某个时间段完全不用去问服务端,直接去用本地缓存的内容就行。

Expires和Cache-Control

Expires
Expires比较简单,就是服务器responseheader带上这个字段:
Expires: Wed, 21 Oct 2000 07:28:00 GMT
然后在这个时间前,客户端浏览器都不会再发起请求,而是直接用缓存资源。

Cache-Control
Cache-Control相对比较复杂,可设置属性也比较多,max-age只是其中一个属性,长这样:
Cache-Control: max-age=20000

max-age 指令

这表示当前资源在20000秒内都不用再请求了,直接使用缓存。

其他常用属性还有:
no-cache:使用缓存前,强制要求把请求提交给服务器进行验证(协商缓存验证)。

no-store:不存储有关客户端请求或服务器响应的任何内容,即不使用任何缓存。

Expires和Cache-Control的优先级
如果在Cache-Control响应头设置了 max-age 或者 s-maxage 指令,那么 Expires 头会被忽略。

4.协商缓存和强制缓存优先级

这个其实很好理解,协商缓存需要发请求跟服务器协商,强制缓存如果生效,根本就不会发请求。所以这个优先级就是:先判断强制缓存,如果强制缓存生效,直接使用缓存;如果强制缓存失效,再发请求跟服务器协商,看要不要使用缓存。

四、较为完整的缓存流程

刚刚上述是一个简单过程,但是事实上的缓存策略还要更复杂一点。下面是一个较为完整的缓存流程:


总结

本文介绍了大致的报文首部内容,并用HTTP缓存为例子介绍报文首部字段内容是如何在报文中发挥着他们的作用。HTTP缓存介绍了大概的流程,并且把HTTP缓存机制分为强制缓存和协商缓存两类,并且从报文字段入手详细说明了其中的区别和流程。

五、《图解HTTP》报文首部和HTTP缓存相关推荐

  1. 一篇文章带你详解 HTTP 协议之报文首部及字段详解(中)

    在上一篇中,我们已经讲解了一到五的内容,还没看过的可以先看, 下面接着讲剩余内容: 六.HTTP 报文首部之首部字段(重点分析) 七.HTTP 响应状态码(重点分析) 八.HTTP 报文实体 九.与 ...

  2. 前端学HTTP之报文首部

    前面的话 首部和方法配合工作,共同决定了客户端和服务器能做什么事情.在请求和响应报文中都可以用首部来提供信息,有些首部是某种报文专用的,有些首部则更通用一些.本文将详细介绍HTTP报文中的首部 结构 ...

  3. TCP_数据报文首部格式

    TCP报文首部格式 字段 说明 源/目标端口 分别写入源端口号和目标端口号 序列号 也就是我们tcp三次握手中的seq,表示的是我们tcp数据段发送的第一个字节的序号,范围[0,2^32 - 1],例 ...

  4. tcp/ip 协议栈Linux源码分析五 IPv6分片报文重组分析一

    做防火墙模块的时候遇到过IPv6分片报文处理的问题是,当时的问题是netfilter无法基于传输层的端口拦截IPv6分片报文,但是IPv4的分片报文可以.分析了内核源码得知是因为netfilter的连 ...

  5. TCP连接之报文首部

    在面试时,会经常被问到TCP报文的一些细节,可以说TCP报文是不少企业用来考察面试者对网络的掌握程度的一道题目. TCP连接作为网络传输的一个环节,是不可或缺的一部分.例如,OSI七层模型的应用层HT ...

  6. http accept字段有用吗_http协议(六)报文首部

    参考:老张http协议(六)报文首部 报文(message)是网络中交换与传输的数据单元,即站点一次性要发送的数据块.报文包含了将要发送的完整的数据信息,其长短很不一致,长度不限且可变 报文也是网络传 ...

  7. HTTP报文首部字段

    HTTP报文首部@TOC #一.http报文首部结构 ##1.结构 ##2.请求报文构成 eg: ##3.http响应报文 #二.HTTP首部字段结构 首部字段名:字段值 eg:ConTent-Typ ...

  8. HTTP 报文首部之首部字段(重点分析)

    文章目录 1.首部字段概述 2.首部字段结构 3.首部字段类型 4.通用首部字段(HTTP/1.1) 4.1 Cache-Control 4.1.1 可用的指令一览 4.1.2 表示能否缓存的指令 4 ...

  9. IPv4_数据报文首部格式

    IPv4数据报首部格式 IPv4数据报首部分为固定部分(20字节)与可变部分(0~40字节) 用WireShark抓包的IPv4协议中报文首部格式一一对应: 字段 说明 版本号 目前广泛使用的ip协议 ...

最新文章

  1. [mysql] mysql 5.6.X 慢查询日志
  2. 免费的HTML5连载来了《HTML5网页开发实例具体解释》连载(四)HTML5中的FileSystem接口...
  3. python定义一个圆_Python-矩形和圆形
  4. idea 线程内存_Java线程池系列之-Java线程池底层源码分析系列(一)
  5. angular ngoninit 刷新html页面_web前端入门到实战:实现html页面自动刷新
  6. 前端学习(3186):ant-design的button介绍按钮属性
  7. Python List相关函数使用实例
  8. Exchange 2016之用EMS配置全局OWA语言和时区设置
  9. python面向对象中类对象、实例对象、类变量、实例变量、类方法、实例方法、静态方法...
  10. php redis stream,php redis-close() 之后为什么还能使用 $redis-get('key') 获取数据?
  11. [易飞]关于应付账款明细帐余额余总账不平解决方案
  12. 关于AWS负载均衡器的使用
  13. 网易云音乐基于用户的推荐系统
  14. 前端框架之bootstrap学习(一)
  15. SAP调用外围系统接口SXI_MONITOR有显示但是实际上没有调用接口的问题
  16. library sort(图书馆排序)
  17. 【机器学习】常见问题
  18. 09-面向对象综合训练综合练习
  19. 我看电影阿凡达(Avatar)
  20. svn不支持中文路径问题的解决

热门文章

  1. AI文件资源导出方法
  2. 明日之后怎么跳过实名认证_明日之后新手视频攻略如何跳过 明日之后新手教程内容说明...
  3. 简单的html图片上传工具
  4. H3C新华三 端口加入vlan命令
  5. [渝粤教育] 南通大学 模拟电子技术 参考 资料
  6. 【java】Java 包(package)
  7. Stanford iOS7 Lecture 1-3 demo
  8. CSS高级篇——属性选择器 (attribute selectors)
  9. 【思特奇杯·云上蓝桥-算法集训营】第1周(第八题:excel 地址)(出错)
  10. DEVC++第五人格V2.0