HTTP实体和编码——《HTTP权威指南》系列

析构薄雾
• 阅读 2015

WilsonLiu's blog 首发地址

实体和编码

每天都有数以亿计的各种媒体对象经由HTTP传送,如图像,文本,影片以及软件程序等。HTTP会确保它的报文被正确的传送,识别,提前以及适当的处理,则需要满足以下条件。

  1. 可以被正确的识别(通过Content-Type首部说明媒体格式,Content-Language首部说明语言),以便浏览器和其他客户端能够正确的处理内容

  2. 可以被正确的解包(通过Content-Length首部和Content-Encoding首部)

  3. 是最新的(通过实体验证码和缓存过期控制)

  4. 符合用户的需要(基于Accept系列的内容协商首部)

  5. 在网络上可以快速有效地传输(通过范围请求,差异编码以及其他数据压缩方法)

  6. 完整到达,未被篡改过(通过传输编码首部和Content-MD5校验和首部)

为了实现上述目标,HTTP/1.1版本定义了以下10个基本实体首部字段。

  • Content-Type

  • Content-Length

  • Content-Language

  • Content-Encoding

  • Content-Location

  • Content-Range

  • Content-MD5

  • Last-Modified

  • Expires

  • Allow

  • Etag

  • Cache-Control

Content-Length:实体的大小

Content-Length首部指示出报文中编码后实体主体的字节大小。使用Content-Length首部是为了能够检测出服务器崩溃而导致的报文截尾,并对共享持久连接的多个报文进行正确的分段。

Content-Length首部对于持久连接是必不可少的,如果响应通过持久连接传输,就可能有另一条HTTP响应紧随其后。客户端通过Content-Length首部就可以知道报文在何处结束,下一条报文从何处开始。因为连接是持久的,客户端无法依赖连接关闭来判别报文的结束。

在使用分块编码(chunked encoding)时,可以没有Content-Length,此时,数据是分为一系列的块来发送的,每块都有大小说明。

HTTP/1.1规范中建议对于带有主体但没有Content-Length首部的请求,服务器如果无法确定报文的长度,就应当发送400 Bad Request响应或411 Length Required响应,后一种表明服务器要求收到正确的Content-Length首部。

实体摘要

为检测实体主体的数据是否被修改过,发送方可以在生成初始的主体时,生成一个数据的校验和。Content-MD5首部是在对内容作了所有需要的内容编码之后,还没做任何传输编码之前,计算出来的。

媒体类型和字符集

Content-Type首部字段说明了实体主体的MIME类型,同时还支持可选的参数来进一步说明内容的类型。
Content-Type: text/html; charset=iso-8859-4

多部分媒体类型
MIME中的multipart电子邮件报文中包含多个报文,它们合在一起作为单一的复杂报文发送。每一部分都是独立的,有各自的描述其内容的集,不同的部分之间用分界字符串连接在一起。
HTTP也支持多部分主体。不过,通常只用在下列两种情形之一:提交填写好的表格,或是作为承载若干文档片段的范围响应。
HTTP使用Content-Type:multipart/form-data或Content-Type:multipart/mixed这样的首部以及多部分主体来发送这种请求。

内容编码 Content-Encoding

HTTP应用程序有时在发送之前需要对内容进行编码,当内容经过编码之后,编好码的数据就防止实体主体中,像往常一样发送给接收方。此时Content-Length变为编码后的长度。
同时,我们不希望服务器用客户端无法解码的方式来对内容进行编码,因此,客户端需要把自己能够支持的内容编码列表防止请求的Accept-Encoding首部。

传输编码和分块编码 Transfer-Encoding

使用传输编码是为了改变报文中的数据在网络上传输的方式。

分块编码
分块编码是HTTP规范唯一定义的传输编码方式。
分块编码把报文分割为若干个大小已知的块。块之间是紧挨着发送的,这样就不需要在发送之前就知道整个报文的大小了。

范围请求 Range

范围请求是指客户端实际上只请求文档的一部分,或者说某个范围。比如,下载电影下到一半网络故障,连接中断了,此时可利用范围请求来继续下载。
Range: bytes=4000-
代表客户端请求的是文档开头4000字节以后的步伐内容。

Range首部在流行的点对点(Peer-to-Peer)文件共享客户端软件中得到广泛的应用,他们从不同的对等实体同时下载多媒体文件的不同部分。

差异编码

差异编码是HTTP协议的一个扩展,它通过交换对象改变的部分而不是完整的对象来优化传输性能。

请求报文

A-IM: diffe   //Accept-Instance-Manipulation
If-None-Match: ababdisdksada //验证是否新鲜

响应报文

IM:diffe //差异编码的算法
Etag: zdsdsfsafsd  //更新后的版本号
Delta-base: ababdisdksada //差异算法基于的Etag
点赞
收藏
评论区
推荐文章
blmius blmius
4年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
Wesley13 Wesley13
4年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
1年前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Stella981 Stella981
4年前
KaliTools说明书+BurpSuit实战指南+SQL注入知识库+国外渗透报告
!(https://oscimg.oschina.net/oscnet/d1c876a571bb41a7942dd9752f68632e.gif"15254461546.gif")0X00KaliLinux Tools中文说明书!(https://oscimg.oschina.net/oscnet/
Wesley13 Wesley13
4年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
4年前
PHP创建多级树型结构
<!lang:php<?php$areaarray(array('id'1,'pid'0,'name''中国'),array('id'5,'pid'0,'name''美国'),array('id'2,'pid'1,'name''吉林'),array('id'4,'pid'2,'n
Wesley13 Wesley13
4年前
Java日期时间API系列36
  十二时辰,古代劳动人民把一昼夜划分成十二个时段,每一个时段叫一个时辰。二十四小时和十二时辰对照表:时辰时间24时制子时深夜11:00凌晨01:0023:0001:00丑时上午01:00上午03:0001:0003:00寅时上午03:00上午0
Wesley13 Wesley13
4年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Python进阶者 Python进阶者
2年前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这