Http协议(3)—HTTP实体和编码

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.内容编码类型
            

        3.Accept-Encoding首部
            客户端会把自己能够识别的编码列表放在Accept-Encoding首部里发出去,如果http请求中
            没有包含首部,则表示客户端可以接受任何编码方式

六、传输编码和分块编码
        传输编码与内容编码的区别:
                经过内容编码的报文只是对报文的实体部分进行编码,而对于经过传输编码的报文,编码
                作用在整个报文上,报文自身的结构发生了变化

        使用传输编码(Transfer-encoding)是为了改变报文中的数据在网络上的传输方式
        
        1.可靠传输
            传输报文会引发的问题
                .未知的尺寸
                        有些网关应用程序或则内容编码器要想知道报文的大小,这时可以采用传输编码来发
                        送数据,并用特别的结束脚注表明数据结束
                 .安全性
                        可以用传输编码把报文内容扰乱,然后在共享的传输网络上发送
        
        2.Transfer-Encoding
            .Transfer-Encoding:
                    告知接收方为了可靠的传输报文,已经对其进行了何种编码
            .TE:
                用在请求首部,告知服务器可以使用哪些传输编码

        3.分块编码
            .把报文分割为若干大小已知的块,块之间是紧挨着发送的
            .分块编码是一种传输编码,是报文的属性,而不是主体的属性

            3.1.分块与持久连接
                    .若客户端与服务器不是持久连接,则服务端不需要知道它正在读取的主体的长度,只需
                     要读到服务器关闭主体连接为止
                    .服务器在写主体之前必须知道主体的大小,如果服务器动态创建内容,就无法知道长度,
                     分块编码只要服务器逐块发出并且说明每块大小即可,服务器可以用大小为0的块作为
                     主体结束的信号
            
            3.2.分块报文的拖挂
                
        4.内容编码与传输编码的结合
            
        
        5.传输编码规则
            .传输编码集合中必须包含分块,唯一的例外是使用关闭连接来结束报文
            .当使用分块传输编码时,它必须是最后一个作用在报文中主体之上的
            .分块传输编码不能多次作用到一个报文主体之上
             以上规则使得接收方能确定报文的长度

七、验证码与新鲜度
        1.新鲜度
            .服务器告知客户端能够将内容缓存多长时间,在这个时间之内是新鲜的
            .可以用Expires首部或者Cache-Control
    
        2.有条件的请求和验证码
            有条件的请求:
                    .当资源改变时才请求副本
                    .通过If-Modified-Since首部实现
            验证码:
                    .弱验证码
                    .强验证码
                    强验证码能唯一标识一个实例

八、范围请求
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值