==========================================================
本文讲述4个问题
gzip编码与Content-Length的关系
分块编码与Content-Length的关系
file文件已经在服务端进行gzip压缩,那为何在node中用request请求这张图片时(请求的方法为head/get)返回头首部Content-Length还是未压缩前的图片大小?
响应头一定会包含Content-Length首部吗?
内容编码gzip介绍
Accept-Encoding和Content-Encoding是HTTP中用来对「采用何种编码格式传输正文」进行协定的一对头部字段。
工作原理:
浏览器发送请求时,通过Accept-Encoding带上自己支持的内容编码格式列表,服务端从中挑选一种用来对内容编码,编好码的数据就放在实体主体中,再通过Content-Encoding响应头指明选定的格式,浏览器拿到相应正文后再依据Content-Encoding进行解压。
具体过程:
网站服务器生成原始响应报文,其中有原始的Content-Type和Content-Length首部。
内容编码服务器创建编码后的报文,编码后的报文有同样的Content-Type和不同的Content-Length,同时增加了Content-Encoding首部。
接收程序得到编码后的报文,进行解码,获得原始报文。
http的head方法与get方法返回的首行和首部完全相同,不同的是get方法的响应头中会有主体,而head方法在响应中只返回首部,不会返回主体部分,这就允许客户端在未获取实际资源的情况下,对资源的首部进行检查。
Content-Length 实体的大小
在http的协议中Content-Length首部告诉浏览器报文中实体主体的大小。这个大小是包含了内容编码的,比如对文件进行了gzip压缩,Content-Length就是压缩后的大小,而不是原始大小(这点对我们编写服务器非常重要)。除非使用了分块编码,否则Content-Length首部就是带有实体主体的报文必须使用的。使用Content-Length首部是为了能够检测出服务器崩溃而导致的报文截尾,并对共享持久连接的多个报文进行正确分段.
另外Content-Length首部对于长连接是必不可少的,长连接代表在连接期间会有多个http请求响应在排队,而服务器不能够关闭连接,客户端只能通过Content-Length知道一条报文在哪里结束,下一条报文在哪里开始。
除非使用了分块编码Transfer-Encoding: chunked,否则响应头首部必须使用Content-Length首部。(HTTP1.1必须支持chunk模式。因为当不确定消息长度的时候,可以通过chunk机制来处理这种情况。也就是有chunk就不能有content-length 。) [摘自http权威指南]
传输编码和分块编码
分块编码把「报文」分割成若干个大小已知的块,块之间是紧挨着发送的,这样就不需要在发送之前知道整个报文的大小了。(也意味着不需要写回Content-Length首部了)
当使用持久连接时,在服务器写主体之前,必须知道它的大小并在Content-Length首部中发送。如果服务器动态创建内容,可能在发送之前无法知道主体大小,分块编码就是为了解决这种情况。服务器把主体逐块发送,说明每一块的大小。服务器再用大小为0的块作为结束块。,为下一个响应做准备。
再回过头看请求file文件服务器的图片时响应头的首部信息发现了这个首部:Transfer-Encoding: chunked
这也说明了这个图片请求的响应是采用分块编码的传输方式,采用这种传输方式进行响应时,没必要带上Content-Length这个首部信息。因为即使带上了也是不准确的。再回过头看上述file图片的响应头中确实没有Content-Length首部。
对于在发送HTTP头部前,无法计算出Content-Length的HTTP请求及回复(例如WEB服务端产生的动态内容),可以使用分块传输,使得不至于等待所有数据产生后,再发送带有Content-Length的HTTP头部,而是将已经产生的数据一块一块发送出去。普通的静态页面、图片之类的基本上都用不到这个。
HTTP BODY数据成连续的块传输,每块数据的最开始处,指明了该数据块的大小,随后则是CRLF,数据,及结尾CRLF:
《HTTP权威指南》
http://www.mamicode.com/info-detail-75113.html
HTTP1.1采用了持久的连接,也就是一次TCP的连接不马上释放,允许许多的请求跟响应在一个TCP的连接上发送,所以客户机与服务器需要某种方式来标示一个报文在哪里结束和在下一个报文在哪里开始。简单的方法是使用呢content-length,但这只有当报文长度可以预先判断的时候才起作用,而对于动态的内容或者在发送数据前不能判定长度的情况下,可以使用分块的方法来传送编码。
相关推荐
The response mode in HTTP protocol is explained clearly and vividly
针对如何将IPv4环境下的包标记技术应用于IPv6的问题, 结合已有的算法思想提出一种改进的算法, 该算法采取固定概率将路由信息标记到扩展首部hop-by-hop, 隧道模式下节点标记数据包时增加一个复制操作, 扩大标记算法的...
09. 08 HTTP模块:HTTP首部字段-上 10. 09 HTTP模块:HTTP首部字段-下 11. 10 HTTP模块:HTTPS协议 12. 11 HTTP模块:HTTP认证 13. 补充:HTTP模块:实验虚拟机网卡连接说明 14. 补充:HTTP模块:解决网卡无法...
http头部cache-control字段解析,包含一个doc文件和一个pdf文件
跨域资源共享标准新增了一组 HTTP 首部字段,允许服务器声明哪些 源站通过浏览器有权限访问哪些资源 CORS 是通过设置一个响应头来告诉浏览器,该请求允许跨域,浏览器收到该响应 以后就会对响应放行。 ajaxDemo....
--------packet_content start--------- 52 54 00 12 35 02 08 00 27 73 a8 bf 08 00 ------>以太网头部---14字节 45 00 00 29 77 51 40 00 40 06 00 00 0a 00 02 0f 8c cd da 0e ------>IP协议头部---20字节 ...
unsigned short udp_length; unsigned short udp_checksum; }; /* ----------------------------------------------------------------------------------------------------------------------- ICMP协议...
大学生网络实验课 (1)在界面上,用户能够输入或编辑IP协议包各字段数据,例如,“协议”字段应该是下拉选择 方式; (2)程序能够自动检查IP地址的合法性,且主机可用;...检验“首部校验和”字段的计算结果:
传输层协议-TCP首部结构传输层协议-TCP首部结构传输层协议-TCP首部结构
1、通用首部字段(请求报文与响应报文都会使用的首部字段) 2、请求首部字段(请求报文会使用的首部字段) 3、响应首部字段(响应报文会使用的首部字段) 4、实体首
IP首部
tcp首部
原来在 CORS-跨域资源共享 中,可以使用 OPTIONS 方法发起一个预检请求,以检测实际请求...当你的Content-Type设置为“application/json;charset=utf-8”并自定义请求头可能就会导致这种情况。但并不会产生什么影响。
4-1-1 首部部分格式 4-1-2 问题部分格式 4-1-3 资源记录格式 4-1-4 消息压缩 4-2 传送 4-2-1 UDP应用 4-2-2 TCP应用 第5章 主文件 5-1 格式 5-2 定义区域的主文件的应用 5-3 主文件举例 第6章 名称服务器实现 6-1 ...
如何计算IP_UDP首部检验和
计算机网络原理-115第5章 传输层--TCP首部.mp4
4-2 CAPWAP DTLS首部 4-3 CAPWAP首部 4-4 CAPWAP数据消息 4-4-1 CAPWAP数据通道保持激活 4-4-2 数据净荷 4-4-3 建立DTLS数据通道 4-5 CAPWAP控制消息 4-5-1 控制消息格式 4-5-2 服务质量 4-5-3 重传 4-6 ...
计算机网络原理-117第5章 传输层--TCP首部标记位.mp4
HTTP报文 客户端传递给服务器的内容 和 服务器传递给客户端的内容 都属于HTTP报文 起始行:请求起始行 响应起始行 首部:请求首部 响应首部 ... 设置响应头信息 设置响应主体内容 Ajax : async javascript and xm
计算机网络各层协议首部讲解 自己整理的,仅供大家参考