• Content-Length 首部指示出报文中实体主体的字节大小。这个大小是包含了所有内容编码的,比如,对文本文件进行了 gzip 压缩的话,Content-Length 首部就是压缩后的大小,而不是原始大小。
  • 除非使用了分块编码,否则 Content-Length 首部就是带有实体主体的报文必须使用的。
  • 使用 Content-Length 首部是为了能够检测出服务器崩溃而导致的报文截尾,并对共享持久连接的多个报文进行正确分段。

1. 检测截尾

  • HTTP 的早期版本采用关闭连接的办法来划定报文的结束。但是,没有 Content- Length 的话,客户端无法区分到底是报文结束时正常的连接关闭,还是报文传输中由于服务器崩溃而导致的连接关闭。客户端需要通过 Content-Length 来检测报文截尾。
  • 报文截尾的问题对缓存代理服务器来说尤其严重。如果缓存服务器收到被截尾的报文却没有识别出截尾的话,它可能会存储不完整的内容并多次使用它来提供服务。
  • 缓存代理服务器通常不会为没有显式 Content-Length 首部的 HTTP 主体做缓存,以此来减小缓存已截尾报文的风险。

2. 错误的 Content-Length

  • 错误的 Content-Length 比缺少 Content-Length 还要糟糕。因为某些早期的客户端和服务器在 Content-Length 计算上存在一些众所周知的错误,有些客户端、服务器以及代理中就包含了特别的算法,用来检测和纠正与有缺陷服务器的交互过程。
  • HTTP/1.1 规定用户 Agent 代理应该在接收且检测到无效长度时通知用户。

3. Content-Length与持久连接

  • Content-Length 首部对于持久连接是必不可少的。如果响应通过持久连接传送,就可能有另一条 HTTP 响应紧随其后。客户端通过 Content-Length 首部就可以知道报文在何处结束,下一条报文从何处开始。因为连接是持久的,客户端无法依赖连接关闭来判别报文的结束。
  • 采用分块编码(chunked encoding)时,使用持久连接时可以没有 Content-Length 首部。在分块编码的情况下,数据是分为一系列的块来发送的,每块都有大小说明。哪怕服务器在生成首部的时候不知道整个实体的大小(通常是因为实体是动态生成的),仍然可以使用分块编码传输若干已知大小的块。

4. 内容编码

  • HTTP 允许对实体主体的内容进行编码,比如可以使之更安全或进行压缩以节省空间。如果主体进行了内容编码,Content-Length 首部说明的就是编码后(encoded)的主体的字节长度,而不是未编码的原始主体的长度。
  • 某些 HTTP 应用程序在这方面搞错了,发送的是数据编码之前的大小,这会导致严重的错误,尤其是用在持久连接上。
  • 不幸的是,HTTP/1.1 规范中没有首部可以用来说明原始的、未编码的主体的长度,这就让客户端难以验证解码过程的完整性。(Content-MD5 首部也不行,它用来说明文档的 128 位 MD5 值,但这也是针对编码后的文档的)

5. 确定实体主体长度的规则

  • 下面列出的规则说明了在若干不同的情况下如何正确计算主体的长度和结束位置。这些规则应当按顺序应用,谁先匹配就用谁:

    1. 如果特定的 HTTP 报文类型中不允许带有主体,就忽略 Content-Length 首部,它是对(没有实际发送出来的)主体进行计算的。这种情况下,Content-Length 首部是提示性的,并不说明实际的主体长度。(考虑不周的 HTTP 应用程序会认为有了 Content-Length 就有主体存在,这样就会出问题。)
      最重要的例子就是 HEAD 响应。HEAD 方法请求服务器发送等价的 GET 请求中会出现的首部,但不要包括主体。因为对 GET 的响应会带有 Content-Length 首部,所以 HEAD 响应里面也有;但和 GET 响应不同的是,HEAD 响应中不会有主体。1XX、204 以及 304 响应也可以有提示性的 Content-Length 首部,但是也都没有实体主体。那些规定不能带有实体主体的报文,不管带有什么首部字段,都必须在首部之后的第一个空行终止。
    2. 如果报文中含有描述传输编码的 Transfer-Encoding 首部(不采用默认的 HTTP “恒等”编码),那实体就应由一个称为“零字节块”(zero-byte chunk)的特殊模式结束,除非报文已经因连接关闭而结束。
    3. 如果报文中含有 Content-Length 首部(并且报文类型允许有实体主体),而且没有非恒等的 Transfer-Encoding 首部字段,那么 Content-Length 的值就是主体的长度。如果收到的报文中既有 Content-Length 首部字段又有非恒等的 Transfer-Encoding 首部字段,那就必须忽略 Content-Length,因为传输编码会改变实体主体的表示和传输方式(因此可能就会改变传输的字节数)。
    4. 如果报文使用了 multipart/byteranges(多部分/字节范围)媒体类型,并且没有用 Content-Length 首部指出实体主体的长度,那么多部分报文中的每个部分都要说明它自己的大小。这种多部分类型是唯一的一种自定界的实体主体类型,因此除非发送方知道接收方可以解析它,否则就不能发送这种媒体类型。(因为 Range 首部可能会被不理解多部分/字节范围的更原始的代理所转发,所以如果发送方不能确定接收方是否理解这种自定界的格式的话,就必须用方法1、3 或 5 来对报文定界。)
    5. 如果上面的规则都不匹配,实体就在连接关闭的时候结束。实际上,只有服务器可以使用连接关闭来指示报文的结束。客户端不能用关闭连接来指示客户端报文的结束,因为这样会使服务器无法发回响应。(客户端可以使用半关闭,也就是只把连接的输出端关闭,但很多服务器应用程序设计的时候没有考虑到处理这种情况,会把半关闭当作客户端要从服务器断开连接来处理。HTTP 没有对连接管理进行良 好的规范。详情请参见第 4 章。)
  • 为了和使用 HTTP/1.0 的应用程序兼容,任何带有实体主体的 HTTP/1.1 请求都必须带有正确的 Content-Length 首部字段(除非已经知道服务器兼容 HTTP/1.1)。
  • HTTP/1.1 规范中建议对于带有主体但没有 Content-Length 首部的请求,服务器如果无法确定报文的长度,就应当发送 400 Bad Request 响应或 411 Length Required 响应,后一种情况表明服务器要求收到正确的 Content-Length 首部。

15.2 Content-Length 实体的大小相关推荐

  1. The maximum string content length quota (8192) has been exceeded while reading XML data

    原文: The maximum string content length quota (8192) has been exceeded while reading XML data 问题场景:在我们 ...

  2. OA项目15:权限管理实体设计及映射

    首注:本学习教程为传智播客汤阳光讲师所公布的免费OA项目视频我的文字版实践笔记,本人用此来加强巩固自己开发知识,如有网友转载,请注明.谢谢. 一 实体设计: 1.权限实体设计: 1)属性设计: 主键: ...

  3. 【Socket网络编程】15. 发送端和接收端数据大小不一致时 的分析

    发送端发送的数据大小和频率 与 接收端接收的数据大小和频率都可以不一样: 更详细的输入缓冲区和输出缓冲区以及recv()和send()等概念,参考https://blog.csdn.net/daaik ...

  4. Posted content length of 26789546 exceeds limit of 10485760

    原来jfinal中默认上传为10M(10*1024*1024),故超过10M会报错 注:https://blog.csdn.net/weixin_43706875/article/details/10 ...

  5. MAC | svn: E175002: DAV request failed: 411 Content length required.

    今天在做svn compare的时候发现的这个问题 ! 网上有人说: 这可能是因为您的后端是较旧的svn版本. 在.subversion / servers文件中添加如下代码 [global] htt ...

  6. http 权威指南 目录

    第一部分 HTTP:Web的基础 第1章 HTTP概述 1.1 HTTP--因特网的多媒体信使 1.2 Web客户端和服务器 1.3 资源 1.3.1 媒体类型 1.3.2 URI 1.3.3 URL ...

  7. React Native Keyboard使用详解

    当我们点击输入框时,手机的软键盘会自动弹出,以便用户进行输入.但有时我们想在键盘弹出时对页面布局做个调整,或者在程序中使用代码收起这个软键盘,这些借助 React Native 框架提供的Keyboa ...

  8. HTTP权威指南(国内首本HTTP及其相关核心Web技术权威著作)

    <HTTP权威指南>(国内首本HTTP及其相关核心Web技术权威著作) 基本信息 原书名:HTTP:The Definitive Guide 作者: (美)古尔利(Gourley,D.) ...

  9. ie浏览器F12查看请求挂起

    转载https://blog.csdn.net/wggoeasy/article/details/45169787 只有在IE(目前只在IE8和IE9中测试)中浏览时,发现有好些资源加载不上,在F12 ...

最新文章

  1. nodejs yarn包管理工具
  2. docker之Dockerfile实践
  3. 【Linux 内核 内存管理】内存管理架构 ⑤ ( sbrk 内存分配系统调用代码示例 | 在 /proc/pid/maps 中查看进程堆内存详情 )
  4. 嵌入式c语言检测键盘,【精华整理】C语言嵌入式系统编程修炼--键盘操作篇
  5. 结对开发石家庄地铁系统
  6. 更新maven一直在更新_海尔电视更新应用一直闪退?详细解决方法来了!
  7. (常用API)正则表达式的概念和作用
  8. 零基础入门│带你理解Kubernetes
  9. 专访余承东:华为引领行业进步 折叠屏手机即将上市
  10. 有监督学习问题的分类:回归问题和分类问题
  11. 安卓apk的编译与反编译
  12. 实现链表翻转的两种方法
  13. c语言词法分析程序实验报告,词法分析器实验报告
  14. linux 中gnu的含义是,GNU是什么意思
  15. 【OpenCV】障碍物提取
  16. 物质,精神和主要矛盾 - 《大国崛起》
  17. C# 重载 Equals() 方法、重载运算符、声明显隐式转换的简要整理
  18. Adobe Premiere基础特效(卡点和转场)(四)
  19. 如何才能做到色彩平衡?
  20. 百度语音合成 java 教程_【百度语音合成】JavaAPI方式语音合成示例

热门文章

  1. vue router meth的2个属性: keepAlive 、deepth
  2. 2021最新CSGO国服能取回皮肤的国内开箱网站大全
  3. 20-10-28 安装PHPBB3论坛和Joomla网站
  4. Learning Diary for Python
  5. VR全景打造数字化校园名片
  6. 精品MySQL面试题
  7. 深圳软件测试培训:软件测试的工资高还是开发者工资高?
  8. 关于pycharm中运行代码报错的解决思路
  9. linux 详解邮件服务器
  10. Haproxy(一)基础介绍