**定个小目标,吃透这本书,每天最少一章 CSDN 见**
- 报文是乡镇,实体是货物
如果吧HTTP报文想象成因特尔网货运系统中的箱子,那么HTTP实体就是报文中实际的货物。
HTTP实体首部描述了HTTP报文的内容,HTTP/1.1版定义了一下10个基础字体首部:
Content-Type:实体中所承载对象的类型
Content-Length:所传输实体的长度或大小
Content-Language:与传输对象最相配的人类语言
Content-Encoding:对象数据所做的任意转换(比如,压缩)
Content-Location:一个备用位置,请求时可通过它获得对象。
Content-Range:如果这是部分实体,这个首部说明它是整体的那个部分。
Content-MD5:实体主体内容的校验和
Last-Modified:所传输内容在服务器上创建或最后修改时间
Expires:实体数据将要失效的日期时间
Allow:该只有所允许的各种请求方法,例如,GET和HEAD。
ETag:这分文档特定实例的惟一验证码。ETag首部没有证书定义实体首部,但它对许多涉及实体的操作来说,都是一个重要的首部。
Cache-control:指出应该如何缓存该文档。和ETag首部类似,Cache-control首部也没由定义为实体首部 - Content-Length:实体的大小
Content-Length首部指示出报文中实体主体的字节大小。Content-Length的正确性是非常重要的。
Content-Length首部对于持久链接是必不可少的。如果响应通过持久链接传输,就可能由另一条HTTP响应紧随其后。客户端通过Content-Length首部就可以知道报文在何处接受,下一条报文从何处开始。如果特定的HTTP报文类型中不允许携带由主体,就忽略Content-Length首部。 - 实体摘要
服务器要使用Content-MD5首部发送对实体主体允许MD5算法的结果。只产生响应的原始服务器可以技术按并发送Content-MD5首部。中间代理和缓存不应当修改或添加这个首部。 - 媒体类型和字符集
Content-Type首部字段说明了实体主体的MIME类型,MIME类型是标准话的名字;用以说明作为货物运至实体的基本媒体类型。![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/e8cc8c0e3f03831b2600c21047c26138.png)
- 内容编码
HTTP应用程序有时在发送之前,需要对内容进行编码。例如在把很大的HTML文档发送给通过满是链接接上来的客户端之前,服务器可能会对它进行压缩,这样有助于减少传输实体的时间。服务器还可以把内容搅乱或加加密,以此来防止未授权的第三方看到文档内容。![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/11407ea3408176f61ff7e04ac479e53c.png)
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/3d86aa5bbe81a8c5b7fb5a7b0e8a03bf.png)
我们不希望服务器用客户端无法理解的编码的方式来对内容编码,为了避免服务器使用客户端不支持的编码方式,客户端就吧字节支持的内容编码方式列表防止亲贵去Accept-Encoding首部里发送出去,如果HTTP请求中没有包含Accept-Encoding首部,服务器就可以假定客户端能够接受任何编码方式。![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/f0ffeeba652493c4a1edeb04b4a776e3.png)
- 传输编码和分块编码
内容编码是和内容的集体格式细节紧密相关的。
长久以来,在其他的一些协议中会用传输编码来保证报文经过网络时能得到“可靠传输”。在HTTP协议中可靠传输关注的焦点有所不同,因为底层的传输设施已经标准话且容错性更好。
HTTP协议中只定义了下面两个首部来描述和控制传输编码
Transfer-Encoding:告诉接受方为了可靠的传输报文,已经对其进行了何种编码。
TE:用在请求首部,告诉服务器可以使用那些传输编码扩展。
分块编码把报文分割为若干个大小以知的块。块之间是紧挨着发送的,这样就不需要在发送之前知道整个报文的大小了。需要注意的是;分开编码是一种传输编码,因此是报文的属性,它和分块编码是完全独立的。
若客户端和服务器之间不是持久链接,客户端就不需要知道它正在读取的主体长度,而只需要读到服务器关闭主体链接为止。。
当使用持久链接时,在服务器写主体之前,必须知道它正在读取的主体的长度。如果服务器动态创建内容,就可能在发送之前无法知道主体的长度。
分块编码为这种困难提供了解决方案,只要允许服务器吧主体逐块发送,说明每块的大小就可以了,因为主体是动态创建的,服务器可以缓存它的一部分,发送其大小和相应的块,然后主体发送完之前,重复这个过程。服务器可以用大小为0的块作为主体结束信号,这样就可以保持继续链接,为下一个响应做准备。![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/3633a2fe4d8e09cc1b7213c0c51701fa.png)
内容编码与传输编码可以同时结合使用
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/9675074ed8350dfc2952321ff84ecaac.png)
对报文主体使用传输编码是,必须遵守一下规则:
传输编码集合中必须包括“分块”。惟一的例外是使用关闭链接来结束报文
当使用分块传输编码时,它必须是最后一个作用到报文主体之上的
分块传输编码不能多重作用到一个报文主体上 - 随时间变化的实例
网站对象并不是静态的,同样的URL会随着时间变化而指向对象不同的版本。HTTP协议规定了称为实例操控的一系列请求和响应操作,用以操控对象的实例。![请添加图片描述](https://i-blog.csdnimg.cn/blog_migrate/3a04bee5bf9b660420f024e0de1943e1.png)
- 验证码和新鲜度
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/ddc01215abc1ae4313e7ac7c46b267c9.png)
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/f0d9957bcdd44e44a4a0a9cccaa5593f.png)
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/2dc2c923ac767d4693126b7a58f0f703.png)
这话题前面有说过,这里就不说了 - 范围请求
有了范围请求HTTP客户端可以同情请求曾获取失败的实体的一个范围,来恢复下载该实体。
GET /bigfile.html HTTP/1.1
Host: www.joes. com
Range: bytes=4000-
User-Agent: Mozilla/4.61 [en] (winNT;I)
在本例中,客户端请求的是文件开头的4000字节之后的部分。![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/28d2e7dbfda166a7f2f9230ebf699e4f.png)
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/9aad5c279290b54c0d14d9d6ab827005.png)
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/6983197539824c642d874229fa666eaf.png)