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慢启动的问题。

 

原文地址:https://www.cnblogs.com/liuyinlei/p/5449005.html