-
数据类型表示实体数据的内容是什么,使用的是MIME type,相关的头字段是Accept和Content-Type;
-
text:即文本格式的可读数据,我们最熟悉的应该就是text/html了,表示超文本文档,此外还有纯文本 text/plain、样式表text/css等。
-
image:即图像文件,有image/gif、image/jpeg、image/png等。
-
audio/video:音频和视频数据,例如audio/mpeg、video/mp4等。
-
application:数据格式不固定,可能是文本也可能是二进制,必须由上层应用程序来解释。常见的有 application/json,application/javascript、application/pdf等,另外,如果实在是不知道数据是什么类 型,像刚才说的“黑盒”,就会是application/octet-stream,即不透明的二进制数据。
-
数据编码表示实体数据的压缩方式,相关的头字段是Accept-Encoding和Content-Encoding;
-
gzip:GNU zip压缩格式,也是互联网上最流行的压缩格式;
-
deflate:zlib(deflate)压缩格式,流行程度仅次于gzip;
-
br:一种专门为HTTP优化的新压缩算法(Brotli)。
-
语言类型表示实体数据的自然语言,相关的头字段是Accept-Language和Content-Language;
-
字符集表示实体数据的编码方式,相关的头字段是Accept-Charset和Content-Type;
-
客户端需要在请求头里使用Accept等头字段与服务器进行“内容协商”,要求服务器返回最合适的数 据;
-
Accept等头字段可以用“,”顺序列出多个可能的选项,还可以用“;q=”参数来精确指定权重。
-
服务器收到Range字段后,需要做四件事。
-
它必须检查范围是否合法,比如文件只有100个字节,但请求“200-300”,这就是范围越界了。服 务器就会返回状态码416,意思是“你的范围请求有误,我无法处理,请再检查一下”。
-
如果范围正确,服务器就可以根据Range头计算偏移量,读取文件的片段了,返回状态码“206 Partial Content Partial Content”,和200的意思差不多,但表示body只是原数据的一部分。
-
服务器要添加一个响应头字段Content-Range ,告诉片段的实际偏移量和资源的总大小,格式 是“bytes x-y/length bytes x-y/length”,与Range头区别在没有“=”,范围后多了总长度。例如,对于“0-10”的范围请 求,值就是“bytes 0-10/100”。
-
最后剩下的就是发送数据了,直接把片段用TCP发给客户端,一个范围请求就算是处理完了。
-
压缩HTML等文本文件是传输大文件最基本的方法;
-
分块传输可以流式收发数据,节约内存和带宽,使用响应头字段“Transfer-Encoding: chunked”来表 示,分块的格式是16进制长度头+数据块;
-
范围请求可以只获取部分数据,即“分块请求”,实现视频拖拽或者断点续传,使用请求头字 段“Range”和响应头字段“Content-Range”,响应状态码必须是206;
-
也可以一次请求多个范围,这时候响应报文的数据类型是“multipart/byteranges”,body里的多个部分 会用boundary字符串分隔。