zoukankan      html  css  js  c++  java
  • HTTP2.0

    HTTP1.1不能解决的问题有:

    1. 队头堵塞的问题。

    2. 服务器推送;

    3.一个TCP连接上只能是6个http。

    4.发送总是有重复cookie, 浪费带宽。

    为了解决这些问题:http2.0做了什么了?对第3个问题:HTTP2.0的所有通信都是在一个TCP连接上完成的。

    对第1个问题,先弄懂信息传输术语:

    流:虚拟信道,可以承载双向消息,每个流都有一个唯一的整数标识符(1、2....N); 

    消息:逻辑上的HTTP消息,比如请求、响应,由一或多个帧组成。

    帧:最小的物理通信单位,承载特定类型的数据,比如HTTP首部、负荷等等, 在二进制分帧的结构中,头部有8个字节(64Bit),其中有一个字节(8Bit)来标志帧的类型,

    规定了如下帧类型:

    DATA: 用于传输HTTP消息体
    HEADERS:用户传输关于流的额外的首部字段
    PRIORITY:用户指定或者重新指定引用资源的优先级
    RST_STRING:用于通知流的非正常终止
    SETTINGS:用于通知两端通信方式的数据配置
    PUSH_PROMISE:用于发出创建流和服务器引用资源的要约
    PING:用于计算往返时间,执行“活性”检查
    GOAWAY:用于通知对端停止在当前连接的创建流
    WINDOW_UPDATE:用于针对个别流或个别连接实现流量控制
    CONTINUATION:用于继续一系列首部块片段

    客户端可以通过HEADERS帧来创建新流,它包含带有新流ID的公用首部、可选的31位优先级,以及一组HTTP键-值对首部;

    服务器通过发送PUSH_PROMISE帧来发起推送流,这个帧与HEADERS帧等效,但它包含“要约流ID”,没有优先级。

    注意:由于流的元数据与应用数据是单独发送的,因此客户端和服务器可以分别给它们设定不同的优先级。比如,“流量控制”的流优先级可以高一些,

     但只将其应用给DATA帧, 创建新流并发送HTTP首部之后,接下来就是利用DATA帧发送应用数据。应用数据可以分成多个DATA帧,最后一帧要翻转首部的END_STREAM字段。

    队头堵塞的问题HTTP2.0对发送的帧具有请求优先级:

    HTTP消息分解为多个独立帧之后,这些帧可以交错和传输顺序,进一步提升性能。为了做到这一点,每个流都可以带上31个比特位的优先级标示(二进制分层帧)

    服务器通过这些优先级的标志来分配资源(CPU、内存、带宽),而在响应数据准备好之后,优先将最高优先级的帧发送给客户端,然后在浏览器中最终拼接。

    不过HTTP2.0没有规定优先级的具体算法,那么这种策略就需要开发着自行来解决。

    对第2个问题:Comet、SSE 来解决:

       利用长时间保留的HTTP请求(‘挂起的GET’)来让服务器向浏览器推送数据的技术,经常被称为Comet。

        SSE让服务器可以向客户端流式发送文本消息,比如服务器上生成的实时通知或更新。

    对第3个问题,Http2.0对应的是一个域名对应一个TCP连接,这可以解决TCP慢启动的问题。

     

  • 相关阅读:
    软件工程师的属性与发展
    欢迎使用CSDN-markdown编辑器
    hdu 5446 lucas+crt+按位乘
    poj 2891 模数不互质的中国剩余定理
    3037 插板法+lucas
    poj 1006中国剩余定理模板
    codeforce E
    UVA10820 send a table
    UVA1635 Irrelevant Elements
    uva 10375 Choose and Divide
  • 原文地址:https://www.cnblogs.com/liuyinlei/p/5449005.html
Copyright © 2011-2022 走看看