转载:http://www.blogjava.net/yongboy/archive/2015/03/19/423611.html
流
流(stream),一个完整的请求-响应数据交互过程,具有如下几个特点:
- 双向性:同一个流内,可同时发送和接受数据;
- 有序性:帧(frames)在流上的发送顺序很重要. 接收方将按照他们的接收顺序处理这些frame. 特别是HEADERS和DATA frame的顺序, 在协议的语义上显得尤为重要.
流的创建:流可以被客户端或服务器单方面建立, 使用或共享;
流的关闭:流也可以被任意一方关闭;
多路复用
多路复用:一个连接同一时刻可以被多个流使用。
流的并发性:某一时刻,连接上流的并发数。
多路复用的好处
- 减少服务端连接压力,减少占用内存,提升连接吞吐量;
- 连接数的减少改善了网络拥塞状况,慢启动时间减少,拥塞和丢包恢复速度更快;
- 避免连接频繁创建和关闭(三次连接、四次挥手);
逻辑上,各个流之间是相互独立的,没有影响,如下图所示:
实际上,由于各个流共享同一个连接,会收到流控等的影响,如下图所示:
连接、流和帧的关系
- 一个连接同时被多个流复用;
- 一个流代表一次完整的请求/响应过程,包含多个帧;
- 一个消息被拆分封装成多个帧进行传输;
流的组成
流的状态图
+--------+
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帧
参考: