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可有可无。

时间: 2024-12-31 23:33:48

Http协议中关于Content-Length的解读的相关文章

HTTP协议中状态码的应用

HTTP状态码(HTTP Status Code)是用以表示网页服务器HTTP响应状态的3位数字代码. 所有状态码的第一个数字代表了响应的五种状态之一.   Mark from 维基百科     消息 1字头: 一类型的状态码,代表请求已被接受,需要继续处理.这类响应是临时响应,只包含状态行和某些可选的响应头信息,并以空行结束.由于 HTTP/1.0 协议中没有定义任何 1xx 状态码,所以除非在某些试验条件下,服务器禁止向此类客户端发送 1xx 响应. 100 Continue 客户端应当继续

【原创】HTTP 协议中的 chunked 编码

在 HTTP/1.1 协议中增加了如下关于 chunk 的内容:  Faster response for dynamically-generated pages, by supporting chunked encoding, which allows a response to be sent before its total length is known. 对于支持 HTTP/1.1 协议的客户端,要求能够处理以 chunked 形式组织的 response ,具体如下:  [Chunk

HTTP网络协议中的HTTP Client Hints 技术

最近几年各种 Web 技术一直在爆炸式发展,每天都有大量新东西涌现出来.针对这个现象,业内两位大佬最近先后发文表达了自己的观点:Stop pushing the web forward.Is the web platform getting too big?.其实很早之前我就意识到以我目前的精力,吃透所有 Web 新技术几乎是不可能完成的任务,我关注新技术的侧重点放在了性能优化上. 今天我要向大家介绍的技术是:HTTP Client Hints,也与性能优化有关.利用这项技术,HTTP 客户端(

radius-Radius协议中的Response Authenticator字段MD5加密如何理解?

问题描述 Radius协议中的Response Authenticator字段MD5加密如何理解? ResponseAuth = MD5(Code+ID+Length+RequestAuth+Attributes+Secret) 3个问题: 1)公式中的加号是将各部分转换成十六进制相加嘛? 2)公式中的Attributes具体意义?(一封应答报文中含有多个Attributes,长短不一,是将这些Attributes分别相加还是拓展成字符串连接起来,又或者是只将Attributes的type相加?

HTTP协议中你必须知道的三种数据格式

实习中的一个主要工作就是分析 HTTP 中的协议,自己也用 Python 写过正则表达式对 HTTP 请求和响应的内容进行匹配,然后把关键字段抽离出来放到一个字典中以备使用(可以稍微改造一下就是一个爬虫工具). HTTP 协议中的很多坑,自己都遇到过,我就针对自己遇到的几种 HTTP 常见的数据格式,来做一个总结. Zlib 压缩数据 对于 Zlib,一点也不陌生,我们平时用它来压缩文件,常见类型有 zip.rar 和 7z 等.Zlib 是一种流行的文件压缩算法,应用十分广泛,尤其是在 Lin

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   问题场景:在我们WCF服务发布后,我们要确保服务端以及客户端的配置文件允许合适大小的传输设置.笔者在发布WCF服务时,服务端的绑定未做传输大小的设置(采用了默认,maxStringContentLength默认大小为8192),而我们在传输序列化的数据时,大小超过了这个限制.  读取 XML 数据时,超出最大字符

浅谈Http协议中的Get和Post

Http HTTP(Hypertext transfer protocol),先说下着几个单词,Hypertext是超文本(除了HTML外,也可以是带有超链接的XML或JSON),protocol是协议,transfer翻译应该是移交(也可以翻译成传输,运输,还有一个更具体的词是transport),最开始学校学习Http的所有市面能见到的书籍都翻译成超文本传输协议,Http设计的本身是为了移交和操作资源,并不是为了传输资源.最开始的的网站都是静态内容类似今天云盘,实现了资源共享,URL(Uni

ssl协议-sslv1协议中“秘钥导出”的计算过程

问题描述 sslv1协议中"秘钥导出"的计算过程 不同版本计算方式不同.我只知道大致用md5和sha加密生成主秘钥,再生成6个会话秘钥.可具体多少字节过程不知道,网上也没说清楚 解决方案 你想看密钥导出的过程?你可以去OPENSSL的官网下源代码,然后你在看看这个秘钥导出的过程到底是怎么导的.密钥导出涉及到握手,握手的时候会交换是哪个随机数组,这个三个随机数组是密钥导出的根本.在握手的时候,会协商加密套件,加密套件的协商之间决定了密钥导出的算法,有了加密套件,有了随机数组(即种子),最

udp-TCP/IP协议中的IP和UDP问题

问题描述 TCP/IP协议中的IP和UDP问题 * # 既然IP协议和UDP协议都是实现数据无连接的不可靠通信协议,为什么有了IP之后还需要UDP? 解决方案 1.ISO开放系统有以下几层: 7 应用层 6 表示层 5 会话层 4 传输层 3 网络层 2 数据链路层 1 物理层 2.TCP/IP 网络协议栈分为应用层(Application).......答案就在这里:TCP.UDP.IP协议---------------------- 解决方案二: IP是网络层的,主机到主机的连接:UDP是传