学习笔记 HTTP权威指南 第15章 实体和编码

569 阅读5分钟

前面讲了整个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