HTTP头部报文字段详解

3,659 阅读8分钟

前言: 写这篇文章的原因有两个;

  • 1: 坦白说我自己对http相关的东西不是很熟悉,只知道常用的那些东西并没有一个字段一个字段的去研究。
  • 2: 在查找资料或者翻看书时候,很多名词听起来很拗口,也无法理解其意思,或者说理解的模棱两可(ps:有时候我真觉得是机翻版~~~哈哈)。

1. HTTP Headers 组成

  • General Header (通用头 (请求响应都会有) )
  • Request Header (请求头)
  • Response Header (响应头)
  • Entity Header (实体头 (针对body体) )

我们画个图看看

  • 请求报文

    HTTP请求报文组成图解 (1).png

  • 响应报文

    HTTP响应报文组成图解.png

下边我们一个个来看下都是什么

1.1General Header

  • 是什么: 请求报文和响应报文两方都会使用到的Header

  • 包含哪些字段?以及字段的说明:

    Cache-Control (支持一堆指令 用于控制缓存策略,这里不做展开了)
    
    Connection 
    作用1:指定转发时候需要去掉的内容
    作用2:管理持久连接;HTTP/1.1 版本的默认连接都是持久连接。此时,客户端会在持久连接上连续发送请求。
    当服务器端想明确断开连接时,则指定 Connection 头部字段的值为 Close。
    HTTP/1.1 之前的 HTTP 版本的默认连接都是非持久连接。此时,
    如果想在旧版本的 HTTP 协议上维持持续连接,则需要指定 Connection 头部字段的值为 Keep-Alive
    
    Upgrade  用于检测 HTTP 协议及其他协议是否可使用更高的版本进行通信,其参数值可以用来指定一个完全不同的通信协议 如TLS
    
    via 代理服务器的相关信息; 报文经过代理或网关时,会先在头部字段 Via 中附加该服务器的信息,然后再进行转发(我个人觉得这个比较重要)
    
    Wraning 错误和警告通知; 这货是从 HTTP/1.0 的Response Header的(Retry-After)演变过来的。常会告知用户一些与缓存相关问题的警告
    
    Transfor-Encoding 报文主体的传输编码格式 (HTTP/1.1 中该字段仅对分块时候的传输编码有效)
    
    Trailer 会事先说明在报文主体后记录了哪些字段。该字段可应用在 HTTP/1.1 版本分块传输编码中
    
    Pragma 是 HTTP/1.1 之前版本的历史遗留字段,仅作为与 HTTP/1.0 的向后兼容而定义
    
    Date 表明创建 HTTP 报文的时间。(格林尼治时间)
    

1.2 Request Header 解析

  • 是什么: 客户端向服务端发起请求时使用到的Header

  • 包含哪些字段?以及字段的说明:

    Accept 用户可处理的媒体类型,可以一次指定多个
    
    Accept-Charset 告诉服务端客户端想要什么样的字符集
    
    Accept-Encoding 报文压缩策略 (如 gzip deflate)
    
    Accept-Language 想要的语言类型 (CN , EN ....)
    
    Authorization 携带的Web认证信息 
    
    Expect 期待服务器的特定行为
    
    From 用户的电子邮箱地址
    
    Host 请求资源所在服务器 (Host 该字段在 HTTP/1.1 规范内是唯一一个必须被包含在请求内的header字段)
    
    If-Match 附带条件的请求,使用附带的条件去和实体标记(ETag)做对比 相等返回200,
    否则返回412 Precondition Failed
    
    If-Modified-Since 比较资源的更新时间,资源更新时间大于该附带条件时候正常返回 否则返回304 Not Modified
    
    If-None-Match 比较实体标记(与 If-Match 相反)
    
    If-Range 资源未更新时,针对某资源的范围请求 
    
    If-Unmodified-Since 比较资源的更新时间(与If-Modified-Since相反)
    
    Max-Forwards 服务器在往下一个服务器转发请求之前,Max-Forwards 的 值减 1 。
    当服务器接收到 Max-Forwards 值为 0 的请求 时,则不再进行转发,而是直接返回响应
    
    Proxy-Authorization 代理服务器要求客户端的认证信息
    
    Range 范围请求 (断点续传时候使用到了)接收到附带 Range 头部字段请求的服务器,会在处理请求之
    后返回状 态码为 206 Partial Content 的响应。无法处理该范围请求时,
    则会返 回状态码 200 OK 的响应及全部资源
    
    Referer 会告知服务器请求的原始资源的 URI
    
    TE 头部字段 TE 会告知服务器客户端能够处理响应的传输编码方式及相对优先级。它和头部字段 Accept-Encoding 的功能很相像,
    但他用于传输编码。 头部字段 TE 除指定传输编码之外,还可以指定伴随trailer字段的 分块传输编码的方式。
    当使用分块传输时,只需把 trailers 赋值给该字段值
    
    User-Agent  会将创建请求的浏览器和用户代理名称等信息传达给服务器。 由网络爬虫发起请求时,
    有可能会在字段内添加爬虫作者的电子邮件 地址。此外,如果请求经过代理,那么中间也很可能被添加上代理服务器的名称
    
  • 找个请求头的示例来感受一下长啥样子

    • 注意:(下边这个示例有些字段可能没有(如上边的 TE Range 等),可能和场景有关系,这里不做深究)
      GET / HTTP/1.1
      Host: hackr.jp
      Proxy-Connection: keep-alive (可以看到这里是长链接  注意当前是http/1.1; http/1.0默认不是长链接即每次传输数据都需要创建一次链接)  
      Cache-Control: max-age=0 
      Proxy-Authorization: Basic MTYzMjc5NjgxMUAxODE0MDQyOmJhNjhiNjBmNmZkMWI5NzQ0ZGQ4ZDFmOWJkYWJjODhj
      Upgrade-Insecure-Requests: 1
      User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36
      Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
      Accept-Encoding: gzip, deflate
      Accept-Language: zh-CN,zh;q=0.9
      If-None-Match: "25e-4d2c3145df440-gzip"
      If-Modified-Since: Tue, 08 Jan 2013 08:53:29 GMT
      

1.3 Response Header 解析

  • 是什么: 服务端向客户端响应报文时使用到的Header

  • 包含哪些字段?以及字段的说明:

    Accept-Ranges 是否接受范围请求; 可指定的字段值有两种,可处理范围请求时指定其为 bytes,反之则 指定其为 none。
    
    Age 能告知客户端,源服务器在多久前创建了响应。值的单位为秒
    
    ETag 资源的匹配信息; 是一种可将资源以字符串形式做成唯一性标识的方式。服务器会为每份资源分配对应的ETag 值
    
    Location 令客户端重定向至指定URI 该字段会配合 3xx :Redirection 的响应,提供重定向的URI。
    
    Proxy-Authenticate 代理服务器对客户端的认证信息; 会把由代理服务器所要求的认证信息发送给客户端。 
    它与客户端和服务器之间的HTTP 访问认证的行为相似,不同之处在于其认证行为是在客户端与代理之间进行的。
    而客户端与服务器之间 进行认证时,其与头部字段 WWW-Authorization 有着相同的作用。
    
    Retry-After 对再次发起请求的时机要求; 告知客户端应该在多久之后再次发送请求。主要配合状态码 503 Service Unavailable 响应,
    或 3xx Redirect 响应一起使用。字段值可以指定为具体的日期时间(Wed, 04 Jul 2012 06:34:24 GMT 等格式),
    也可以是创建响应后的秒数
    
    Server HTTP服务器的安装信息; 告知客户端当前服务器上安装的HTTP服务器应用程序的信息。
    不单单会标出服务器上的软件应用名称,还有可能包括版 本号和安装时启用的可选项
    
    Vary 代理服务器缓存的管理信息; 当代理服务器接收到带有 Vary 头部字段指定获取资源的请求时,如果使用的 Accept-Language 字段的值相同,那么就直接从缓存返回响应
    
    WWW-Authenticate 服务器对客户端的认证信息; 用于 HTTP 访问认证。它会告知客户端,请求 某URI 所指定的认证方案(Basic 或是 Digest)和 带参数提示的质询(challenge)。
    状态码 401 Unauthorized ,在响应中, 肯定带有头部字段 WWW-Authenticate。
    
  • 找个响应头的示例来感受一下长啥样子

    • 注意:(下边这个示例有些字段可能没有(如上边的 Vary Retry-After等),可能和场景有关系,这里不做深究)
      HTTP/1.1 200 OK
      Date: Wed, 25 Aug 2021 02:01:10 GMT
      Last-Modified: Tue, 08 Jan 2013 08:53:29 GMT
      ETag: "25e-4d2c3145df440-gzip"
      Accept-Ranges: bytes
      Content-Encoding: gzip
      Content-Length: 379
      Content-Type: text/html
      Connection: keep-alive (长连接)
      

1.4 Entity Header解析

  • 是什么: 针对请求报文和响应报文的实体(body)使用到的Header

  • 包含哪些字段?以及字段的说明:

    Allow 资源可支持的HTTP方法
    
    Content-Encoding body适用的编码方式
    
    Content-Language body的自然语言
    
    Content-Length body的大小(单位:字节)
    
    Content-Location 替代对应资源的URI
    
    Content-MD5 body的报文摘要;md5形式
    
    Content-Range body的位置范围
    
    Content-Type body的媒体类型
    
    Expires body过期的日期时间
    
    Last-Modified 资源的最后修改日期时间
    

不得不说小日子过得不错的日本人写的这个书还挺不错的,也推荐各位同学去好好读下这本书。

参考: 《图解HTTP》