数据类型与编码
在TCP/IP协议栈里,传输数据基本上都是"header+body"的格式,但是TCP,UDP因为是传输层的协议,它们并不关心body数据是什么,只要把数据送到对方就可以了。
而HTTP协议则不同,它是应用层的协议,数据到达之后工作只能说是完成了一半,还必须要告诉上层应用这是什么数据才行,否则上层应用就会不知所措。
那么这里简单列举一下在HTTP里经常遇到的几个类别:
1.text:即文本格式的可读数据,我们最熟悉的应该就是text/html了,表示超文本文档,此外还有纯文本text/plain,样式表text/css等。
2.image:即图像文件,有image/gif,image/jpeg,image/png等。
3.audio/video:音频和视频数据,可能是文本也可能是二进制,必须由上层应用程序来解释。
常见的有application/json,application/javascript,application/pdf等,另外,如果实在是不知道数据是什么类型,就会是application/octet-stream,即不透明的二进制数据。
但仅有上面这些MIME type还不够,因为HTTP在传输时为了节约带宽,有时候还会压缩数据,还需要有一个"Encoding type",告诉数据是用的什么编码格式,这样对方才能正确解压缩,还原出原始数据。
通常Encoding type有下面三种类型:
1.gzip:GNU zip压缩格式,也是互联网上最流行的压缩格式
2.deflate:zlib(deflate)压缩格式,流行程度仅次于gzip
3.br:一种专门为HTTP优化的新压缩算法(Brotli)
数据类型使用的头字段
有了上面两种类型,无论是浏览器还是服务器就都可以轻松识别出body的类型,也就能正确处理数据了。
HTTP协议为此定义了两个Accept请求头子段和两个Content实体头字段,用于客户端和服务器进行内容协商。也就是说,客户端用Accept头告诉服务器希望接收什么样的数据,而服务器用Content头告诉客户端实际发送了什么样的数据。
![d28ee16642e45605c47fb07a5b31f777.png](https://i-blog.csdnimg.cn/blog_migrate/f5ac0c776ac2378ecdef3a580c88c8a9.jpeg)
Accept字段标记的是客户端可理解的MIME type,可用“,”做分隔符列出多个类型,让服务器有更多的选择余地,例如下面的这个头:
Accept: text/html,application/xml,image/webp,image/png
这就是告诉服务器:我能够看懂HTML,XML的文本,还有webp和png的图片,请给我这四类格式的数据。
相应的,服务器会在响应报文里用头子段Content-Type告诉实体数据的真实类型:
Content-Type: text/htmlContent-Type: image/png
这样浏览器看到报文里的类型是"text/html"就知道是HTML文件,会调用排版引擎渲染出页面,看到image/png就知道是一个PNG文件,就会在页面上显示出图像。
Accept-Encoding字段标记的是客户端支持的压缩格式,例如上面说的gzip,deflate等,同样也可以用