HTTP详解

2018-07-25  本文已影响0人  改名_f64e

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计算


上一篇下一篇

猜你喜欢

热点阅读