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

(0)

相关推荐

  • 广域网协议中的重点协议

    广域网协议是相对于局域网协议而说的,互联网我们就可以认定为是广域网。那么它相关的协议也就很好理解了。跟OSI模型是分不开的。下面我们来说几个典型的协议。给大家作为参考。 广域网协议是在OSI参考模型的 ...

  • TCP/IP协议中的三个参数

    TCP/IP(Transmite Control Protocol 传输控制协议/Internet Protocol网际协议)已成为计算机网络的一套工业标准协议.Internet网之所以能将广阔范围内 ...

  • YY歪歪语音如何修改签约协议中的银行卡号信息?

    请您登录多玩充值平台:https://pay.duowan.com/ 登录后点击页面左侧“佣金” → 签约 → 点击“银行帐号变更” →在新页面中输入原银行卡号 → 输入新银行卡号 → 下拉选择开户行 ...

  • 图解安全套接字SSL协议的工作原理

    背景介绍 最近在看《密码学与网络安全》相关的书籍,这篇文章主要详细介绍一下著名的网络安全协议SSL。 在开始SSl介绍之前,先给大家介绍几个密码学的概念和相关的知识。 1、密码学的相关概念 密码学(c ...

  • java 中各进制之间转换方法

    java中十进制.十六进制.二进制.ASCII码是常用的编码方式,在本篇文章中将这些编码的相互转换直接以代码的形式粘贴出来,以供参考. 十六进制字符串转十进制 01 param hex  十六进制字符 ...

  • HTTP协议是什么(HTTPS是什么意思)

    Go语言中文网,致力于每日分享编码.开源等知识,欢迎关注我,会有意想不到的收获!服务端开发避不开协议,避不开 HTTP 和 HTTPS 协议.对 HTTPS ,你真的清楚吗?还是似是而非呢?这个系列希 ...

  • VRRP虚拟路由器冗余协议介绍

    VRRP(VirtualRouterRedundancyProtocol,虚拟路由冗余协议)是一种容错协议。通常,一个网络内的所有主机都设置一条缺省路由,这样,主机发出的目的地址不在本网段的报文将被通 ...

  • TCP协议的一些认识及实践知识简介

    一、简介 引用《TCP/IP详解-卷1》中的介绍,TCP与UDP使用相同的网络层(IP层),TCP却向应用层提供了与UDP完全不同的服务。TCP提供一种面向连接的、可靠的字节流服务。 所谓面向连接的, ...

  • linux 中的MYSQL命令汇总 适合学习linux下配置mysql的朋友

    一、总结一下: 1.linux下启动mysql的命令: mysqladmin start /ect/init.d/mysql start (前面为mysql的安装路径) 2.linux下重启mysql ...