最近公司的视频设备在下载视频的时候,出现了很诡异的现象,在新旧服务器一样的tpp包,下载下来后,新服务器无法解析,旧服务器没问题。且tpp包并没有改动。

后面找了挺久,终于发现了视频下载的时候是断点续传。且http报文不一致。是Content-Length的问题。特此记录如下:

在HTTP协议中,有Content-Length的详细解读。Content-Length用于描述HTTP消息实体的传输长度the transfer-length of the message-body。在HTTP协议中,消息实体长度和消息实体的传输长度是有区别,比如说gzip压缩下,消息实体长度是压缩前的长度,消息实体 的传输长度是gzip压缩后的长度。

  在具体的HTTP交互中,客户端是如何获取消息长度的呢,主要基于以下几个规则:

  响应为1xx,204,304相应或者head请求,则直接忽视掉消息实体内容。

  如果有Transfer-Encoding,则优先采用Transfer-Encoding里面的方法来找到对应的长度。比如说Chunked模式。

  “如果head中有Content-Length,那么这个Content-Length既表示实体长度,又表示传输长度。如果实体长度和传输 长度不相等(比如说设置了Transfer-Encoding),那么则不能设置Content-Length。如果设置了Transfer- Encoding,那么Content-Length将被忽视”。这句话翻译的优点饶,其实关键就一点:有了Transfer-Encoding,则不能 有Content-Length。

  Range传输。不关注,没详细看了:)

  通过服务器关闭连接能确定消息的传输长度。(请求端不能通过关闭连接来指明请求消息体的结束,因为这样可以让服务器没有机会继续给予响应)。这种情况主要对应为短连接,即非keep-alive模式。

  HTTP1.1必须支持chunk模式。因为当不确定消息长度的时候,可以通过chunk机制来处理这种情况。

  在包含消息内容的header中,如果有content-length字段,那么该字段对应的值必须完全和消息主题里面的长度匹配。

  “The entity-length of a message is the length of the message-body before any transfer-codings have been applied”

  也就是有chunk就不能有content-length 。

  其实后面几条几乎可以忽视,简单总结后如下:

  1、Content-Length如果存在并且有效的话,则必须和消息内容的传输长度完全一致。(经过测试,如果过短则会截断,过长则会导致超时。)

  2、如果存在Transfer-Encoding(重点是chunked),则在header中不能有Content-Length,有也会被忽视。

  3、如果采用短连接,则直接可以通过服务器关闭连接来确定消息的传输长度。(这个很容易懂)

  结合HTTP协议其他的特点,比如说Http1.1之前的不支持keep alive。那么可以得出以下结论:

  1、在Http 1.0及之前版本中,content-length字段可有可无。

  2、在http1.1及之后版本。如果是keep alive,则content-length和chunk必然是二选一。若是非keep alive,则和http1.0一样。content-length可有可无。

最新文章

  1. shell-for循环
  2. Markdown入门
  3. ZooKeeper测试笔记
  4. 【POJ2482】Stars in Your Window(线段树,扫描线)
  5. 【第一篇】Android环境搭建
  6. 从AsyncTask中获取数据的问题
  7. 【python】unittest中常用的assert语句
  8. Python练习题 026:求100以内的素数
  9. Linux忘记mysql的root密码的解决办法
  10. SQL2008和SQL2000可以跨服务器连接查询的测试实例
  11. 常用命令常用sql:SHOWVARIABLESLIKE'character%'
  12. codeforces 277.5 div2 F:组合计数类dp
  13. angular自定义验证 ngModel的一些理解
  14. 应用教程之帕克西AR虚拟试妆3D动态美妆
  15. iOS APP之间到跳转,以及热门应用,手机自带到应用跳转
  16. Django 提交 form 表单(使用sqlite3保存数据)
  17. 2017-12-19python全栈9期第四天第二节之列表的增删查改之按切片删除
  18. opencv学习之路(29)、轮廓查找与绘制(八)——轮廓特征属性及应用
  19. Bootstrap如何关闭弹窗
  20. redis下载地址

热门文章

  1. leetcode290
  2. 控制 TextBox 的滚动条
  3. HashMap,Hash优化与高效散列
  4. 在MarkDown中插入数学公式对照表(持续更新)
  5. k8s 1.10 关于rbac的坑
  6. 图片放大镜——jQuery插件Cloud Zoom
  7. 解决opacity属性在低版本IE浏览器下失效的方法
  8. Halcon二维仿射变换实例探究
  9. 2.QWidget类
  10. Windows环境和Linux环境下Redis主从复制配置