透视HTTP协议-进阶篇-极客时间-学习笔记

HTTP协议报文是按照header+body的形式,其中body传输的时候是二进制文件,但具体按照什么格式来读取,必须有所约定。就像一个文件,我们改变不同的后缀名,打开完全是不一样的。

报文格式借鉴了电子邮件系统的MIME,“多用途互联网邮件扩展”(Multipurpose Internet Mail Extensions)。

常见的分为下列几种:

text,文本格式的可读数据,比如text/html,text/plain,text/css;

image,图像数据,image/gif,image/jpeg;

audio/video,音视频数据,audio/mpeg,video/mp4;

application,数据格式不固定,可以是文本也可以是二进制数据。application/json,application/javascript,application/pdf。

还有一个编码方式encoding type,选择body体的压缩方式:

gzip:GNU zip 压缩格式,也是互联网上最流行的压缩格式;

deflate:zlib(deflate)压缩格式,流行程度仅次于 gzip;

br:一种专门为 HTTP 优化的新压缩算法(Brotli)。

透视HTTP协议-进阶篇-极客时间-学习笔记

这样,客户端用Accept,Accept-Encoding来说明可以接受的内容和编码方式;服务端用Content-Type,Content-Encoding来解释最终选择发送的格式和编码方式。

如果请求报文里没有 Accept-Encoding 字段,就表示客户端不支持压缩数据;如果响应报文里没有 Content-Encoding 字段,就表示响应数据没有被压缩。

我们书写的代码都是用英文书写,但客户端那边的使用者可能是各个国家,所以存在一个语言问题。Accept-language就是记录这个。与语言对应的是不同语言的字符集charset。

现在的浏览器都支持多种字符集,通常不会发送 Accept-Charset,而服务器也不会发送 Content-Language。在请求头里一般只会有 Accept-Language 字段,响应头里只会有 Content-Type 字段。对应我自己实验的现象,客户端只是提出请求语言,然后客户端回复UTF-8统一编码即可,然后再交给客户端来自行转换成需求语言。

透视HTTP协议-进阶篇-极客时间-学习笔记

响应头里没有对应的 Content-Charset,而是在Content-Type字段的数据类型后面用“charset=xxx”来表示。

在 HTTP 协议里用 Accept、Accept-Encoding、Accept-Language 等请求头字段进行内容协商的时候,还可以用一种特殊的“q”参数表示权重来设定优先级,这里的“q”是“quality factor”的意思。

权重的最大值是 1,最小值是 0.01,默认值是 1,如果值是 0 就表示拒绝。具体的形式是在数据类型或语言代码后面加一个“;”,然后是“q=value”。

这样给服务器一些可回复的选择,对应服务器对于内容协商的过程是不透明的,每个 Web 服务器使用的算法都不一样。最后会给出一个Vary参数,记录服务器在内容协商时参考的请求头字段。

透视HTTP协议-进阶篇-极客时间-学习笔记