HTTP协议中Content-Length的详细解读

爱被打了一巴掌 2022-03-27 01:08 609阅读 0赞

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

发表评论

表情:
评论列表 (有 0 条评论,609人围观)

还没有评论,来说两句吧...

相关阅读

    相关 HTTP协议详细解读

    端口号的主要作用是表示一台计算机中特定的进程所提供的服务,即用来区分一个主机上的不同程序,每个程序在访问网络时,都会关联一个或者多个端口号,通过端口号区分当前的请求给谁,...

    相关 HTTP协议(超级详细

    HTTP协议介绍 基本介绍: HTTP:超文本传输协议,是从万维网服务器传输超文本到本地浏览器的传送协议 HTTP是一种应用层协议,是基于TCP/IP通信协

    相关 直播协议HTTP-FLV解读

    HTTP-FLV,即将音视频数据封装成FLV,然后通过HTTP协议传输给客户端。 这里首先要说一下,HLS其实是一个“文本协议”,而并不是一个流媒体协议。那么,什么样的协议才

    相关 Http协议实体数据详细解析

    1.数据类型与压缩 http协议是应用层协议,必须告诉上层传输的数据是什么类型,传输的数据用的是什么压缩方式,传输的语言类型以及语言使用的编码。 首先来看传输的数据类型以及

    相关 HTTP协议详细资料

    以下内容为转贴内容,如作者有相关版权要求,请与我联系,我会全部添加。 一、基础篇    HTTP(HyperTextTransferProtocol)是超文本传输协议的缩写,它