HTTP2流和多路复用

转载:http://www.blogjava.net/yongboy/archive/2015/03/19/423611.html

流(stream),一个完整的请求-响应数据交互过程,具有如下几个特点:

  1. 双向性:同一个流内,可同时发送和接受数据;
  2. 有序性:帧(frames)在流上的发送顺序很重要. 接收方将按照他们的接收顺序处理这些frame. 特别是HEADERS和DATA frame的顺序, 在协议的语义上显得尤为重要.

流的创建:流可以被客户端或服务器单方面建立, 使用或共享;
流的关闭:流也可以被任意一方关闭;

多路复用

  多路复用:一个连接同一时刻可以被多个流使用。
  流的并发性:某一时刻,连接上流的并发数。

多路复用的好处
  1. 减少服务端连接压力,减少占用内存,提升连接吞吐量;
  2. 连接数的减少改善了网络拥塞状况,慢启动时间减少,拥塞和丢包恢复速度更快;
  3. 避免连接频繁创建和关闭(三次连接、四次挥手);

逻辑上,各个流之间是相互独立的,没有影响,如下图所示:
这里写图片描述
实际上,由于各个流共享同一个连接,会收到流控等的影响,如下图所示:
这里写图片描述

连接、流和帧的关系

  1. 一个连接同时被多个流复用;
  2. 一个流代表一次完整的请求/响应过程,包含多个帧;
  3. 一个消息被拆分封装成多个帧进行传输;
    这里写图片描述

流的组成

这里写图片描述

流的状态图

            +--------+
                 send PP |        | recv PP
                ,--------|  idle  |--------.
               /         |        |         \
              v          +--------+          v
       +----------+          |           +----------+
       |          |          | send H /  |          |
,------| reserved |          | recv H    | reserved |------.
|      | (local)  |          |           | (remote) |      |
|      +----------+          v           +----------+      |
|          |             +--------+             |          |
|          |     recv ES |        | send ES     |          |
|   send H |     ,-------|  open  |-------.     | recv H   |
|          |    /        |        |        \    |          |
|          v   v         +--------+         v   v          |
|      +----------+          |           +----------+      |
|      |   half   |          |           |   half   |      |
|      |  closed  |          | send R /  |  closed  |      |
|      | (remote) |          | recv R    | (local)  |      |
|      +----------+          |           +----------+      |
|           |                |                 |           |
|           | send ES /      |       recv ES / |           |
|           | send R /       v        send R / |           |
|           | recv R     +--------+   recv R   |           |
| send R /  `----------->|        |<-----------'  send R / |
| recv R                 | closed |               recv R   |
`----------------------->|        |<----------------------'
                         +--------+

   send:   发送这个frame的终端
   recv:   接受这个frame的终端

   H:  HEADERS帧 (隐含CONTINUATION帧)
   PP: PUSH_PROMISE帧 (隐含CONTINUATION帧)
   ES: END_STREAM标记
   R:  RST_STREAM帧

参考:

  1. https://github.com/abbshr/rfc7540-translation-zh_cn/blob/master/5-zh-cn.md
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值