前言: 写这篇文章的原因有两个;
- 1: 坦白说我自己对http相关的东西不是很熟悉,只知道常用的那些东西并没有一个字段一个字段的去研究。
- 2: 在查找资料或者翻看书时候,很多名词听起来很拗口,也无法理解其意思,或者说理解的模棱两可(ps:有时候我真觉得是机翻版~~~哈哈)。
1. HTTP Headers 组成
- General Header
(通用头 (请求响应都会有) ) - Request Header
(请求头) - Response Header
(响应头) - Entity Header
(实体头 (针对body体) )
我们画个图看看
-
请求报文 -
响应报文
下边我们一个个来看下都是什么
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
- 注意:(下边这个示例有些字段可能没有(如上边的 TE Range 等),可能和场景有关系,这里不做深究)
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 (长连接)
- 注意:(下边这个示例有些字段可能没有(如上边的 Vary Retry-After等),可能和场景有关系,这里不做深究)
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》