美文网首页
HTTP详解

HTTP详解

作者: 改名_f64e | 来源:发表于2018-07-25 13:39 被阅读0次

    OSI七层模型 :


    705728-20160424234827195-1493107425.png
    Socket : 
      套接字,传输层端到端的协议,本质是一套封装了TCP/UDP/IP的API接口
      不需要我们直接操作封装TCP/UDP/IP数据,通过调用Socket API ,自动把数据封装成TCP/UDP/IP数据
    
    HTTP : 
      超文本传输协议,无状态协议,明文传输,基于Socket协议封装的一套应用层协议,对Socket进行了封装
    
    HTTPS :
      超文本传输安全协议,基于HTTP协议,通过SSL/TLS等对数据进行加密,用于安全的HTTP数据传输
     
    HTTP版本:
      HTTP 1.0,HTTP 1.1,SPDY,HTTPS,HTTP 2.0
    
    HTTP版本区别:
    HTTP 1.0 和 HTTP 1.1 区别:
      1.缓存处理
          1.0:只有If-Modified-Since,Expires
          1.1:引入了Entity tag : If-None-Match(If-Match)
                If-Unmodified-Since,If-Modified-Since等更多字段
      2.断点续传
          1.0:不支持
          1.1:支持,header -> range:bytes=start-end
      3.错误通知
          1.1:增加了新的错误状态码:如409 , 410 
      4.Host头处理
          1.0:默认一个IP对应一个服务器,一个服务器只有一个WebServer
          1.1:增加 header -> Host: www.baidu.com
              由于技术发展,现在一台服务器可以配置多个WebServer,这些WebServer共享一个IP地址
              没有Host字段报400(bad request)
      5.长连接
          1.0:默认每次请求完毕后关闭连接(即每次都进行三次握手和四次挥手)
          1.1:增加 header (Connection: keep-alive)
              在规定的时间内保持连接状态,再次发送数据不用三次握手,四次挥手
              连接保持时间(不可靠) : Keep-Alive: timeout=5, max=1000
              关闭keep-alive : Connection: Close
              通过发送空数据包确认链路是否连接状态(探测报文服务端可以设置)
    
    SPDY :
      Google开发的协议,不是代替HTTP协议,而是增强HTTP协议
    SPDY 和 1.1 区别
      1.多路复用
        1.1: 每个不同的HTTP Request 都会建立一个TCP连接
        SPDY:一个TCP连接上可以同时存在多个HTTP Request
      2.优先级
        在多路复用的情况下,设置某些请求的优先级,提前处理(比如用户登录和请求普通网页)
      3.HTTP报头压缩:
        SPDY压缩请求和响应HTTP报头,从而减少传输的数据包数量和字节数
      4.HTTPS
        强制使用SSL,让SSL协议在现存的网络设施下有更好的安全性和兼容性
      5.服务端推送
        1.1:client -> 请求数据,server -> 返回数据,server -> 无法主动推送数据
        SPDY:允许服务器在需要时发起对客户端的连接并推送数据
    
    HTTP 2.0 和 SPDY区别:
      1.HTTP2.0 支持明文 HTTP 传输,而 SPDY 强制使用 HTTPS
      2.HTTP2.0 消息头的压缩算法采用 HPACK ,而非 SPDY 采用的 DEFLATE 
    
    HTTP 2.0 和 HTTP 1.1 区别:
      1.二进制分帧
        帧:HTTP2.0通信的最小单位,所有帧都共享一个8字节的首部
              其中包含帧的长度,类型,标志,还有一个保留位
        消息:比帧大的通讯单位,是指逻辑上的HTTP消息,比如请求,响应等
              由一个或多个帧组成
        流:比消息大的通讯单位.是TCP连接中的一个虚拟通道,可以承载双向的消息.
              每个流都有一个唯一的整数标识符
      2.Header 压缩
      3.多路复用和优先级(SPDY原理)
      4.服务器推送
    
    HTTP 三次握手
      client->
        SYN = 1(确认位,不携带数据)
        seq = x(序号,随机数)
        status = SYN-SEND(同步状态已发送)
      server->
        SYN = 1
        ACK = 1(应答报文,不携带数据)
        ack = x+1(client seq+1)
        seq = y(序号,随机数据)
        status = SYN-RCVD(同步收到状态)
      client->
        ACK = 1
        ack = y+1(server seq+1)
        seq = x+1
        status = ESTABLISHED(已建立连接状态)
      为什么不是两次:
        client发送请求到server,中间由于路由延迟等原因导致超时
        client重新发送请求,此时顺利与server建立连接
        中间路由网络恢复,请求到达server
        server如果不确认即建立连接会导致资源消耗(client永远不会发数据,因为已经超时)
    
    HTTP 四次挥手
      client->
        FIN = 1
        seq = u(等于前面已经传送过来的数据的最后一个字节的序号加1)
        status = FIN-WAIT-1
      server->
        ACK = 1
        ack = u+1
        seq = v
        server -> CLOSE-WAIT
          server端不再接受新的数据,但是如果存在没有传输完毕的数据,会继续传输
        client->(收到server的应答后)FIN-WAIT-2
      server->
        FIN = 1
        ack = w+1
        seq = u+1
        status = LAST-ACK
        (server最后的数据发送完毕,向client发送结束包)
      client->
        ACK = 1
        status = TIME-WAIT
        (此时并没有断开,而是等到2*MSL(最长报文段寿命)后,才close(),超时后也会close())
      
      为什么要等待2*MSL:
        1.防止client端发送的结束数据server没有收到,此时server会再次发送FIN报
        2.清理网络中旧的请求报文,防止新的请求中出现旧的报文
      
      为什么是四次:
        client发送断开连接信息,server收到后就判断当前数据是否已经传输完毕
        如果没有传输完毕,只是确认收到断开请求,此时不会断开,而是继续发送数据
        发送完毕后再发送断开请求,client确认后断开
    
    HTTPS 
      摘要算法(数字指纹)
        根据hash函数对数据生成128位(固定长度)的数字摘要
      数字签名
        摘要算法和非对称加密的应用
        使用摘要算法生成128位的数字摘要
        使用私钥对摘要信息进行加密
    
        传递后对方通过摘要算法对公开信息进行hash,获取摘要信息
        用传来的公钥对加密的信息进行解密,比较摘要信息
        相同,表示证书没有被修改
      数字证书
        保证证书的合法性,防止中间人攻击
        服务器把公钥和其他信息发给CA机构,机构对数据进行认证,并生成公钥和私钥
        CA机构通过私钥对信息进行加密,生成数字签名
        浏览器内置了各种顶级的CA证书,使用公钥解密并且解密后摘要相同,表示证书已被认证
    
      单向认证
        client->
          ssl协议版本(SSL/SSLv1/SSLv2/TLSv1...)
          加密算法(RSA)
          随机数,以及其他信息
        server->
          检查是否支持ssl协议版本,不支持直接断开
          支持则返回:SSL协议的版本号,加密算法,随机数,证书,其他信息
        client->
          检验证书
            客户端根据server发来的证书中的算法对公开的信息hash,获取摘要信息
            根据server证书内的公钥对证书的数字签名进行解密,获取摘要信息
            比较摘要信息是否相同:相同,证书没有被擅改
            通过浏览器内置的CA证书证明证书的合法性(对证书内的数字签名进行验证)
            验证证书是否在有效期内
            验证证书的域名是否正确
            生成随机数,用server中的公钥进行加密,发送加密后的数据
      server->
        获取到加密后的数据,用秘钥对数据进行解密
        通过对三个随机数进行操作获取对称加密的秘钥
        发送数据
      
      双向认证
        client 验证完server的证书后,对随机数进行加密,并把client自己的证书发送给server
        server收到加密数据后解密,并验证client的证书是否在自己的信任库中
        其他步骤不变
    
    HTTP 缓存机制
      强缓存
        Request:
          Expires->
            限定资源的过期时间(绝对值),超过后做网络请求(如果当前计算机时间不准确,会受到影响)
          Cache-control->(优先级高于Expires)
            max-age = 相对值(单位秒)
            max-age = 0 == Response no-cache || max-age = 0
              表示不管response怎么设置,在重新获取资源之前,先检验ETag/Last-Modified
            public (可以被任意对象缓存,客户端和代理服务器)
            private (不能被代理服务器缓存)
            no-cache 
              Request 中设置 no-cache,效果类似于no-store,无论如何都会重新请求资源
            no-store 不缓存资源
    
      协商缓存
        Response->
          last-Modify : 文件最后修改时间
        Request->
          if-Modified-Since:
            从字面上看,就是说:如果从某个时间点算起,如果文件被修改了....
              1. 如果真的被修改:那么就开始传输,服务器返回:200 OK
              2. 如果没有被修改:那么就无需传输,服务器返回:304 Not Modified.
            用途:
              客户端尝试下载最新版本的文件. 比如网页刷新, 加载大图的时候.
              很明显: 如果从图片下载以后都没有再被修改, 当然就没必要重新下载了!
          if-Unmodified-Since:
            从字面上看,意思是:如果从某个时间点算起,文件没有被修改.....
              1.如果没有被修改:则开始"继续"传送文件:服务器返回:200 OK
              2.如果文件被修改:则不传输, 服务器返回:412 Precondition failed (预处理错误)
          用途:
            断点续传(一般会指定Range参数)
    
        Response->
          eTag : 文件的字符串(优先级高)(last-Modify 改进版)
            1.文件需改的时间是按秒计算,请求太快,会造成错误
            2.文件虽然已经修改,但是内容没有发生改变,结果认为没有修改
        Request->
          if-None-Match : 服务器返回的ETag信息
            生成规则:
              文件编号
              文件大小
              文件最后修改时间
              最后做hash计算
    
    
    

    相关文章

      网友评论

          本文标题:HTTP详解

          本文链接:https://www.haomeiwen.com/subject/nwepmftx.html