学习HTTP首部的结构和首部中各字段的用法。

HTTP首部字段

使用首部字段是为了给浏览器和server提供报文主体大小、所使用的语言、认证信息等内容。

  • 首部字段相应单个HTTP首部能够有多个值。假设首部字段反复,依据浏览器逻辑处理。有的以第一个为准,有的以最后出现的为准。

  • 4种首部字段类型

    • 通用首部字段(General Header Fields)
    • 请求首部字段(Request Header Fields)
    • 响应首部字段(Response Header Fields)
    • 实体首部字段(Entity Header Fields):针对请求报文和响应报文的实体部分使用的首部。补充了资源内容更新时间与实体有关的信息。

  • 首部字段一览

    在HTTP通信过程中。不限于下面规范中的字段,还有CookieSet-CookieContent-Disposition等字段。



    watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbWJhaWl1/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="请求首部字段" title="">



    watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbWJhaWl1/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="实体首部字段" title="">

End-to-end首部和Hop-by-hop首部

HTTP首部字段依据缓存代理和非缓存代理的行为,分成2种类型(也能够依据类型分为通用、请求、响应、实体首部字段):

  • 端到端首部(End-to-end Header)

    此类别中的首部会转发给请求/响应相应的终于接收目标,且必须保存在由缓存生成的响应中,它必须被转发。

  • 逐跳首部(Hop-by-hop Header)

    此类别中的首部仅仅对单次转发有效。会因通过缓存或代理而不再转发。必须要提供Connnection字段才干使用hop-by-hop首部。

    它们有(除了这些全是端到端首部):

    Connection、Keep-Alive、Proxy-Authenticate、Proxy-Authorization、Trailer、TE、Transfer-Encoding、Upgrade

通用首部字段:

  • Cache-Control:通过该命令,就能操作缓存的工作机制;參数是多选的,通过,分隔。

    • 表示能否缓存的指令:

      Cache-Control:public,表明其他用户也能够利用缓存

      Cache-Control:private。仅仅让特定用户缓存,缓存server会对该特定用户提供资源缓存的服务。

    • no-cache指令:

      请求使用时,则表示client将不会接收缓存过的响应。于是缓存server必须转发给源server。

      响应使用时,则表示缓存server不能缓存资源,源server也不正确缓存server请求中提出的资源有效性进行确认,且禁止其对响应资源进行缓存操作。

    • 控制可运行缓存对象的指令no-store

      no-store指令暗示请求(和相应的响应)中包括机密信息。因此规定缓存不能在本地存储请求或响应的任一部分。

    • 指定缓存期限和认证的指令

    • max-age=60(秒)

      请求使用时,则判定缓存资源的缓存时间,小就获取缓存,大则缓存server转发给源server。

      响应使用时,缓存server将不正确资源的有效性再作确认。该时间表示资源有效时间。

    • s-maxage=60(秒):功能和max-age指令同样。但s-maxage仅仅适用于供多位用户使用的公共缓存server。即对同一用户反复返回响应的server不起作用。使用s-maxage后,Expiresmax-age会被忽略。
    • min-refresh=60(秒):要求缓存server返回至少还未过指定时间的缓存资源。
    • max-stale=60(秒):表示缓存资源即使过期,但仍处于该指令指定时间内,仍旧会被client接收。

      如未指定详细数值,则缓存资源一直有效。

    • only-if-cached:要求缓存server不又一次载入响应。也不确认资源的有效性,直接返回。若缓存server无该缓存,则返回504。
    • must-revalidate:代理会向源server再次验证即将返回的响应缓存眼下是否仍然有效。若代理无法连接到源server的话。则返回504。使用must-revalidate时会忽略max-stale指令。

      假设缓存过了新奇期,则必须又一次验证.而不是试图返回一个不在新奇期的缓存.与no-cache的差别在于,no-cache,全然无视新奇期的概念.总是强制又一次验证.理论上,must-revalidate更节省流量,但相比no-cache,可能并不总是那么精准.由于即使缓存者。觉得是新奇的,也不能保证server端没有做过更新.假设缓存者是一个缓存代理server,假设其试图又一次验证时,无法连接上原始server,则也不同意返回一个不新奇的,缓存中的副本.而是必须返回一个504 Gateway timeout.

    • proxy-revalidate:限制上与must-revalidate相似.差别在于受体的范围.proxy-revalidate,是要排除掉用户代理(浏览器)的缓存的.即,其规则并不应用于用户代理的本地缓存上.
    • no-transform:不管请求还是响应中,缓存都不能改变实体主体的媒体类型。能够防止缓存或代理压缩图片等操作。
    • cache-extension:通过该指令标记,能够扩展Cache-Control首部字段内的指令。



      watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbWJhaWl1/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="缓存响应指令" title="">

  • Connection:

    两个作用:

    • 控制不再转发给代理的首部字段

      client发送请求和server返回的响应内。使用Connection首部字段可控制不再转发给代理的首部字段(Hop-by-hop首部)。
    • 管理持久连接

      Connection:closeConnection:Keep-Alive表示服务端想断开连接或保持持久连接。
  • Date:表明HTTP报文的日期和时间

  • Pragma:Progma:no-cache遗留字段, 仅仅在client发送的请求中,要求缓存server不返回缓存的资源。
  • Trailer:说明在报文主体后记录了哪些首部字段。可应用在分块传输编码时。
  • Transfer-Encoding:规定了传输报文主体时採用的编码方式。仅对分块传输编码有效。

  • Upgrade:在使用该字段时。需额外指定Connection:Upgrade,用于检測是否可使用更高的版本号进行通信。能够指定一个全然不同的通信协议。

  • Via:追踪client和server之间的请求和响应报文的传输路径,能够避免请求回环的发送。报文经过代理或网关时,会先在首部字段Via中附加该server的信息。然后转发。
  • Warning:告知用户一些与缓存相关的问题的警告。

请求首部字段

  • Accept:可通知server,用户代理能够处理的媒体类型及媒体类型的相对优先级。

    可用用type/subtype这样的形式。一次指定多种媒体类型。

  • Accept-Charset:通知server用户代理支持的字符集及字符集的相对优先顺序。可一次指定多种字符集。

  • Accept-Encoding:告知server用户代理支持的内容编码及内容编码的优先级顺序。

    可一次指定多种内容编码。

    gzipcompressdeflateidentity

  • Accept-Language:告知server用户代理能够处理的自然语言集,以及优先级。可一次指定多种。
  • Authorization:
  • Expect:告知server,期望出现的某种特定行为。因server无法理解client的期望作出回应而错误发生时,会返回417 Expectation Failed。
  • From:告知server用时用户代理的用户的电子邮件地址。

  • Host:虚拟主机运行在同一个IP上,使用Host区分。必须被包括在请求内的首部字段。

  • 形如If-xxx这样的请求首部。都可成为条件请求。

    server接收到附带条件的请求后,仅仅有推断指定条件为真时。才会运行请求。

    • If-Match:它会告知server匹配资源所用的实体标记(ETag)值,这时的server无法使用弱ETag值。server会对照If-Match的字段值和资源的ETag值。仅当两者一致时,才会运行请求。反之,返回412 Precondition Failed。能够使用*指定If-Match值。server会忽略ETag值,仅仅要资源存在就处理请求。

    • If-None-Match:和If-Match作用相反。

      仅仅有在If-None-Match值与ETag值不一致时,可处理该请求。

    • If-Modified-Since:server在If-Modified-Since值后资源更新过,则处理该请求。假设没有更新过,则返回304 Not Modified。用于确认代理或client拥有的本地资源的有效性。
    • If-Range:告知server指定的If-Range值(ETag值或时间)和请求资源的ETag值或时间相一致时。则作为范围请求处理。反之,则返回全体资源。

      一般和Range请求头连用。

    • If-Unmodified-Since:和If-Modified-Since相反。指定的请求资源仅仅有在字段值内指定的日期时间之后。未发生更新的情况下,才干处理请求。反之返回412 Precondition Failed。
  • Max-Forwards:通过Trace或OPTIONS方法,发送包括首部字段Max-Forwards请求时,十进制整数。每转发一次,值减一,为0值。则不再转发,直接返回响应。

  • Proxy-Authorization:接收到从代理server发来的认证质询时,client会使用该首部,以告知server认证所须要的信息。
  • Range:获取部分资源的范围请求。

    成功处理时,返回206 Partial Content响应;无法处理时,返回200 OK。

  • Referer:会告知server请求的原始资源的URI。
  • TE:告知serverclient能够处理的传输编码方式及相对优先级。和Accept-Encoding功能非常像,但用于传输编码。

    还能够指定伴随trailer字段的分块传输编码方式。仅仅须要TE:trailers来指明。
  • User-Agent:会将创建请求的浏览器和用户代理名称等信息传达给server。

响应首部字段

  • Accept-Ranges:用来告知clientserver能否处理范围请求。以指定获取server某个部分的资源。两个值:Accept-Ranges:bytesAccept-Ranges:none

  • Age:单位是秒。指源server多久前创建了响应;假设是缓存server时,表示缓存后的响应再次发起认证到认证完毕的时间值。代理创建的响应必须加上Age。
  • ETag:ETag能告知client实体标识。它是一种可将资源以字符串形式做唯一性标识的方式。server会为每份资源分配相应的ETag值。

    强ETag值:实体发生的细微变化都会改变其值

    弱ETag值:仅仅用于提示资源是否同样。仅仅有发生根本性改变。ETag值才会变化,会在字段值開始处附加W/
  • Location:将响应接收方引导至某个与请求URI位置不同的资源。

    基本上它会和3xx : Redirection重定向一块使用。差点儿全部浏览器在接收到Location响应后,都会强制性的尝试对已提示的重定向资源的訪问。

  • Proxy-Authenticate:把由代理server所要求的认证信息发送给client。
  • Retry-After:告知client应该在多久之后再次发送请求,主要配合503 Service Unavalible或3xx Redirection一起使用。字段值能够指定详细日期时间、或创建响应后的秒数。
  • Server:告知client当前server上安装的HTTPserver应用程序的信息。包括软件应用名称、可能还有版本号号和安装时启用的可选项。

  • Vary:该首部能够对缓存进行控制。源server会向代理server传达关于本地缓存用法的命令。

    从代理server接收到源server返回包括Vary指定项的响应之后,再次接收到请求时,仅返回同样Vary首部的缓存;其他则必须要从源server又一次获取。
  • WWW-Authenticate:用于HTTP訪问认证。会告知client适用于訪问请求URI所指定资源的认证方案和带參数提示的质询。

    状态码401 Unauthorized响应中,肯定有这个首部字段。

实体首部字段

实体首部字段是在请求报文和响应报文中的实体部分所使用的首部。用于补充内容的更新时间等与实体相关的信息。

实体:作为请求或响应的有效载荷数据被传输,其内容由实体首部和实体主体组成。

  • Allow:

    用于通知client能够能够支持Request-UIR指定资源的全部HTTP方法。当server接收到不支持的HTTP方法时,会返回状态码405 Method Not Allowed,同一时候会把全部能支持的HTTP方法写入首部字段Allow后返回。
  • Content-Encoding:

    告知clientserver对实体的主体部分选用的内容编码方式。

  • Content-Language:

    告知client。实体主体使用的自然语言。

  • Content-Length:

    表明了实体主体部分的大小(字节)。

    对实体主体进行内容编码传输时。不能再使用Content-Length首部字段。

  • Content-Location:

    给出与报文主体部分相相应的URI,表示返回的资源相应的URI。
  • Content-MD5:

    是一串由MD5算法生成的值,其目的在于检查报文主体在传输过程中是否保持完整。以及确认传输到达。
  • Content-Range:Content-Range:bytes5001-10000/10000

    告诉client作为响应返回的实体的哪个部分符合范围请求。

    以字节为单位。表示当前发送部分及整个实体大小。

  • Content-Type:

    说明了实体主体内对象的媒体类型。

  • Expires:

    会将资源失效的日期告知client。

    缓存server在接收到含有首部字段Expires的响应后,会以缓存来应答请求,在Expires字段值指定时间之前,缓存一直有效。超过是,会向源server请求资源。

    源server不希望缓存server对资源缓存时。在Expries字段内写入与首部字段Date同样的时间值。

    当Cache-Control指定了max-age指令时。会有限处理。

  • Last-Modified

    指明资源终于改动时间。

为Cookie服务的首部字段

  • Set-Cookie:

    • name:必须项。name=xxx
    • expires:指定浏览器可发送Cookie的有效期。
    • path:可用于限定Cookie的发送范围的文件文件夹。不能保证安全。

    • domain:通过该属性指定的域名可做到与结尾匹配一致就可以发送Cookie。
    • secure:该属性用于限制Web页面仅在HTTPS安全连接时,才干够发送Cookie。

      Set-Cookie:name=xxx;secure

      HttpOnly:使Js脚本无法获得Cookie,防止XSS(Cross-site scripting)对Cookie的信息窃取。Set-Cookie:name=xxx;HttpOnly

  • Cookie:告知server,当client想获得HTTP状态管理支持时。就会在请求中包括从server接收到的Cookie。接收到多个Cookie时。能够以多个Cookie形式发送。

參考:

你应该了解的 一些web缓存相关的概念.

图解HTTP第六章:HTTP首部的更多相关文章

  1. 第六章 HTTP首部

    第六章 HTTP首部 HTTP首部包括:请求行<方法,URI,版本号>/响应行<版本,状态码>.请求/响应首部字段.通用首部字段.实体首部字段 1.HTTP首部字段 HTTP首 ...

  2. 《图解HTTP》阅读笔记--第六章--HTTP首部

    第六章.HTTP首部 <非常重要且恐怖的一章了> HTTP报文=报文首部+(CR+LF)+报文实体 首部字段:HTTP报文首部字段=(首部字段名:字段值)们---类型*4: 通用首部字段( ...

  3. C#图解教程 第六章 深入理解类

    深入理解类 类成员成员修饰符的顺序实例类成员静态字段从类的外部访问静态成员 静态字段示例静态成员的生存期 静态函数成员其他静态类成员类型成员常量常量与静态量属性 属性声明和访问器属性示例使用属性属性和 ...

  4. 图解HTTP第六章

    HTTP 报文 1>HTTP 报文 2>HTTP 请求报文 在请求中,HTTP 报文由方法.URI.HTTP 版本.HTTP 首部字段.报文主体(不一定需要)等部分构成. 3>HTT ...

  5. 图解HTTP(六)HTTP首部

    一.HTTP报文的结构: 二.4种首部字段: 1. 通用首部字段 请求报文和响应报文都会使用的首部. 首部字段名 说明 Cache-Control 控制缓存行为 Connection 逐跳首部.连接的 ...

  6. 与http协作的web服务器、http首部(第五章、第六章)

    第五章 与http协作的web服务器 1.用单台虚拟主机实现多个域名 通过域名访问主机,经过DNS解析成ip地址,反向代理,可以代理多台服务器,正向代理则相反,代理客户端 2.通信数据转化程序:代理. ...

  7. HTTP图解笔记(六)—— 第6章 HTTP首部

    前言 为啥第一章直接跳到第六章呢,因为...博主当初看书的时候挑着看..只看了第一章和第六章┗( ▔, ▔ )┛ HTTP图解对于不熟悉HTTP的小伙伴来说是很好的书籍,建议入手! 一. HTTP报文 ...

  8. 图解 TCP/IP 第六章 TCP与UDP 笔记6.1 传输层的作用

     图解 TCP/IP  第六章 TCP与UDP   笔记6.1 传输层的作用   传输层必须指出这个具体的程序,为了实现这一功能,使用端口号这样一种识别码.根据端口号,就可以识别在传输层上一层的应用程 ...

  9. 《图解Http》 2-6章: 基础,报文,状态码,首部。

    HTTP协议和Cookie 是stateless协议,自身不对请求和响应之间的通信状态进行保存.但随着技术发展,为了实现保存状态的功能,引入了Cookie技术. Cookie在请求和响应报文中写入信息 ...

随机推荐

  1. 调试钩取技术 - 记事本WriteFile() API钩取

    @author: dlive 0x01 简介 本章将讲解前面介绍过的调试钩取技术,钩取记事本的kernel32!WriteFile() API 调试钩取技术能进行与用户更具有交互性(interacti ...

  2. Zabbix监控服务器异常IP登录

    保存下面的脚本到任意路径 名字.py 修改属组和权限: chown zabbix:zabbix * chmod 755 * 演示的路径为:/usr/local/zabbix/scripts/ # -* ...

  3. AsBcd的意思

  4. ORA-01940: cannot drop a user that is currently connected

    https://www.cnblogs.com/lwlxqlccc/p/8694696.html

  5. Android集成高德地图如何自定义marker

    高德地图自定义Marker 高德地图默认的marker样式是这种 一般的修改样式是通过icon接口来调整 MarkerOptions markerOptions = new MarkerOptions ...

  6. Python的功能模块[3] -> binascii -> 编码转换

    binascii模块 / binascii Module binascii模块包含很多在二进制和 ASCII 编码的二进制表示之间的转换方法.关于进制转换可以参考一些内置函数. hexlify 与 u ...

  7. nodejs微服务

    近来公司增加了nodejs微服务 它的主要任务是接收来自于现场的采集数据:作业记录和流转记录,动态构建一个基地的全景实时数据        暂时不涉及数据库. 如果要进行数据库操作,不建议使用本模块, ...

  8. Kruskal+LCA【p2245】 星际导航

    Description sideman做好了回到Gliese 星球的硬件准备,但是sideman的导航系统还没有完全设计好.为了方便起见,我们可以认为宇宙是一张有\(N\) 个顶点和\(M\) 条边的 ...

  9. Xamarin XAML语言教程隐藏文件使用Progress属性设置进度条

    Xamarin XAML语言教程隐藏文件使用Progress属性设置进度条 Xamarin XAML语言教程隐藏文件中使用Progress属性设置进度条进度,开发者除了可以在XAML中使用Progre ...

  10. Matrix.LookAtLH()和Matrix.LookAtRH()所表达的涵义

    function lookAtLH(eye:Vector3D, at:Vector3D, up:Vector3D) 一个摄像机矩阵可有由三个部分组成:摄像机位置.目标位置以及摄像机上下方.对应的就是上 ...