HTTP实体实现目标
.可以被正确识别(通过Content-Type和Content-Launage)
.可以被正确解包(通过Content-Lenght首部和Content-Encoding首部)
.是最新的(通过实体验证码和缓存过期控制)
.符合用户需要(基于Accept系列的内容协商首部)
.在网络上可以快速有效的传输(通过范围请求、差异编码以及其他数据压缩方法)
.完整到达、未被篡改(通过传输编码首部和Content-MD5校验和首部)
一、报文是箱子,实体是货物
1.HTTP基本实体首部
.Content-Type
实体所承载对象的类型
.Content-Length
实体主体的长度或大小
.Content-Launage
与所传送实体最相配的语言
.Content-Encoding
实体数据是不是已经被压缩
.Content-Location
备用位置
.Content-Range
如果这是部分实体,则说明它是整体的哪部分
.Content-MD5
实体主体内容的校验和
.Last-Modified
所传输的内容在服务器上创建或最后修改的日期
.Expires
实体数据将要失效的日期
.Allow
该资源所允许的各种请求方法,例如,GET、Post等
.ETag
这份文档特定实例的唯一验证码
.Cache-Control
应该如何缓存该文档
2.实体主体
二、Content-Length:实体的大小
1.检测截尾
客户端需要通过Content-Length来检测报文结尾以区分到底是报文结束时正常的连接关闭
还是报文传输时服务器崩溃而导致的连接关闭
缓存代理服务器不会为没有Content-Length首部的HTTP主题作缓存
2.错误的Content-Length
3.Content-Length与持久连接
因为持久连接,客户端无法通过连接关闭来判断报文是否结束,故必须带有Content-Length
首部.
但是当分块编码时可以没有Content-Length首部,因为数据分为一系列的块来传送,每块都
有大小说明
4.内容编码
如果对主体进行了内容编码(压缩),则Content-Length就是编码后的主体的长度
5.确定实体主体长度的规则
a.如果特定的HTTP报文类型不允许带有主体,就忽略Content-Length首部
b.如果报文中含有描述传输编码的Transfer-Encoding,那实体就由一个称为零字节块的
特殊模式结束
c.如果报文中含有Content-Length首部,而没有Transfer-Encoding首部,那么Content-
Length的值就是主体的长度,如果两者皆有,则应该忽略Content-Length的值
d.如果报文使用了multipart/byteranges媒体类型,并且没有用Content-Length首部指定
实体主体长度,那么多部分报文的每个部分都要说明自己的大小
e.如果以上规则均无法匹配,则就在连接关闭的时候结束
三、实体摘要 发送方在生成初始主体时,生成一个数据校验和,接收方可以通过检查这个校验和来捕获所有
意外的实体修改
服务器使用Content-MD5首部发送对实体主体运行MD5算法
四、媒体类型和字符集
Content-Type指明的是原始主体的媒体类型
1.文本的字符编码
Content-Type:text/html; charset=xxxxx
2.多部分媒体类型
3.多部分表格提交
Content-Type:multipart/form-data; boundary=[abcdefg......]
boundary表明分隔主题中不同部分所用的字符串
4.多部分范围响应
Content-Type:multipart/byteranges
五、内容编码
1.过程
a.网站服务器生成原始响应报文,其中有原始的Content-Type和Content-Length首部
b.内容编码服务器创建编码后的报文,并增加Content-Encoding首部,以便接受的应用程序
进行解码
c.接收程序得到编码后的报文,进行解码,获得原始报文
2.内容编码类型
![](https://img-my.csdn.net/uploads/201302/15/1360902121_9689.png)
3.Accept-Encoding首部
客户端会把自己能够识别的编码列表放在Accept-Encoding首部里发出去,如果http请求中
没有包含首部,则表示客户端可以接受任何编码方式
六、传输编码和分块编码
传输编码与内容编码的区别:
经过内容编码的报文只是对报文的实体部分进行编码,而对于经过传输编码的报文,编码
作用在整个报文上,报文自身的结构发生了变化
使用传输编码(Transfer-encoding)是为了改变报文中的数据在网络上的传输方式
1.可靠传输
传输报文会引发的问题
.未知的尺寸
有些网关应用程序或则内容编码器要想知道报文的大小,这时可以采用传输编码来发
送数据,并用特别的结束脚注表明数据结束
.安全性
可以用传输编码把报文内容扰乱,然后在共享的传输网络上发送
2.Transfer-Encoding
.Transfer-Encoding:
告知接收方为了可靠的传输报文,已经对其进行了何种编码
.TE:
用在请求首部,告知服务器可以使用哪些传输编码
3.分块编码
.把报文分割为若干大小已知的块,块之间是紧挨着发送的
.分块编码是一种传输编码,是报文的属性,而不是主体的属性
3.1.分块与持久连接
.若客户端与服务器不是持久连接,则服务端不需要知道它正在读取的主体的长度,只需
要读到服务器关闭主体连接为止
.服务器在写主体之前必须知道主体的大小,如果服务器动态创建内容,就无法知道长度,
分块编码只要服务器逐块发出并且说明每块大小即可,服务器可以用大小为0的块作为
主体结束的信号
![](https://img-my.csdn.net/uploads/201302/15/1360902137_3766.png)
3.2.分块报文的拖挂
4.内容编码与传输编码的结合
![](https://img-my.csdn.net/uploads/201302/15/1360902151_3353.png)
5.传输编码规则
.传输编码集合中必须包含分块,唯一的例外是使用关闭连接来结束报文
.当使用分块传输编码时,它必须是最后一个作用在报文中主体之上的
.分块传输编码不能多次作用到一个报文主体之上
以上规则使得接收方能确定报文的长度
七、验证码与新鲜度
1.新鲜度
.服务器告知客户端能够将内容缓存多长时间,在这个时间之内是新鲜的
.可以用Expires首部或者Cache-Control
2.有条件的请求和验证码
有条件的请求:
.当资源改变时才请求副本
.通过If-Modified-Since首部实现
验证码:
.弱验证码
.强验证码
强验证码能唯一标识一个实例
八、范围请求