前面讲了整个HTTP,WEB基础以及HTTP安全,其实他们都是在为同一个事情工作,那就是传送资源.具体资源就是放在实体里面的.所以这一章就详细的介绍了实体的各个方面,包括属性和编码
- 报文,实体,实体首部,实体主体之间的关系
- 报文是实体的载体,所有实体都是通过报文发送的
- 实体首部专门描述主体各方面信息的
- 实体主体就是资源本身
- 实体首部 + 实体主体 = 实体
15.1 实体长度Content-Length
-
content-length代表什么
- 实体大小
- 如果经过实体编码的话,就是压缩后的大小
-
什么情况下可以不用content-length
- 分块传输编码时
-
content-length有什么用
- 对共享持久连接的多个报文进行正确的分段
- 正常连接一关闭说明传输完毕
- 持久连接上会一直不停的发报文
- 如果不知道长度,就不知道当前这个实体在哪里结束,下一条在哪里开始
- 能检测出服务器崩溃导致的报文截尾
- 如果服务器挂了关闭连接,导致报文没准备完就发送出去,相当于是发的半成品
- 客户端/代理以为是正常关闭连接,如果没有content-length的话,就会使用半成品,导致出错
- 对共享持久连接的多个报文进行正确的分段
-
代理如何处理content-length
- 如果响应没有content-length
- 代理一般是不会进行缓存的
-
确定content-length的规则
- 报文主体不允许带实体比如head,options方法,可忽略content-length
- 如果使用transfer-encoding首部,可不带content-length
- 如果没有transfer-encoding但有content-length,则值为实体长度
- 如果有multipart/byteranges首部但没有content-length,那么报文中每个部分都要标明自己的长度
15.2 实体编码content-md5
-
为什么需要content-md5
- 防止实体在传输中不经意的被修改
-
什么时候进行编码
- 在内容编码content-encoding后,传输编码transfer-encoding前
-
什么时候解码
- 传输解码后,实体解码前
15.3 媒体类型和字符集content-type
-
content-type的作用
- 说明实体的类型是什么,图片/文本...
- 客户端通过这个类型来调用不同的工具来处理内容
-
content-type的数据从哪里来
- IANA国际互联网号码管理局
-
content-type的组成部分
- 主媒体类型 + 斜杠 + 子媒体类型
-
content-type如何添加可选参数
- 分号后面加字符编码
content-type: text/html; charset=utf-8
-
什么是多部分媒体类型
- 多个不同类型的报文混合在一起发送
- 每个报文都有自己的实体首部
- 不同的报文之间用分界字符隔开
-
常见的多媒体类型
- multipart/formdata;
- multipart/mixed
content-type: multipart/mixed; boundary=[xxsdf234]
-
boundary的作用
- 分割不同主体的字符串
-
多部分范围响应的作用multipart/byeranges
- 下载的断点续传那种
15.4 内容编码content-encoding
-
为什么需要内容编码
- 压缩体积减少传输时间
- 加密内容防止别人偷看
-
内容编码的过程
- 服务器生成报文
- 计算原始的content-type和content-length
- 内容编码
- content-length会发生变化
- 增加content-encoding
- 客户端收到报文
- 解码
-
常用的编码/解码算法
- gzip
- compress
- deflate
- identity默认,不编码
-
客户端为什么需要accept-encoding
- 客户端可能支持gzip
- 所以发给服务器的时候就先说好,免得返回一个compress的
-
如果客户端没有传accept-endoing怎么办
- 默认就是*
- 服务器认为客户端支持所有编码方案
accept-enconding:gzip;q=1.0, compress;q=0.5
- 参数Q的作用
- 编码方案的优先级
- 值越大优先级越高
15.5 传输编码transfer-encoding
-
传输编码和内容编码的区别
- 内容编码只针对实体
- 传输编码针对整个报文,会改变报文结构
-
什么是分块传输编码chunked
- 把报文分成多个块
- 每个块紧挨着发送
- 目前传输编码也只支持chunked
-
为什么需要分块传输编码
- 如果响应是动态生成的
- 开始响应时就不知道content-length
-
怎么判断分块编码传输完毕
- 最后一个块的大小用0标记
- 收到这个块就说明响应完了
-
TE是什么的
- 请求首部里面的
- 用于告诉服务器,客户端支持哪些编码方案类似于accept-encoding
te: chunked, trailers
-
拖挂是什么
- 响应中放在分块报文后的首部字段
-
什么情况下可以加拖挂
- 请求时te: trailers后可以加
15.6 验证码和新鲜度
就是讲和缓存有关的那几个首部,具体的可以参考第7章笔记 juejin.cn/post/684490…
15.7 其他
-
范围首部range: 4000
- 请求指定范围的实体
-
范围响应multipart/byteranges
- 指定范围响应实体
- P2P电驴就是利用一台电脑向多台电脑发起范围请求,这些电脑分别响应不同的部分以达到加速的作用
-
差异编码a-im: diffe
- 请求实体时
- 服务器只响应变化的部分
- 在大型游戏下载时比较有效
- 具体差异编码见P384