WINDOW_UPDATE帧(type=0x8)用来实现流量控制
WINDOW_UPDATE用来通知对等端(数据发送端)加大流量控制窗口值。增量为 Window Size Increment,单位为字节数。
算法是这样的:
- 发送端保有一个流量控制窗口(window)初始值。初始值的设定请参考SETTING 帧的 SETTINGS_INITIAL_WINDOW_SIZE
- 发送端每发送一个DATA帧,就把window递减,递减量为这个帧的大小。如果当前window小于帧大小,那么这个帧就必须被拆分到不大于window,如果window等于0,就不能发送任何帧
- 接收端可以发送 WINDOW_UPDATE帧给发送端,发送端以帧内指定的Window Size Increment作为增量,加到window上
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|X| Window Size Increment (31) |
+-+-------------------------------------------------------------+
###字段
**X** :保留字段,1bit
**Window Size Increment** 31bits unsigned int
限定
流量控制只适用于数据帧。非数据帧是不受流量控制的,必须被接收和处理,除非接收端无法为帧分配资源。
可以针对整个连接或者某个具体的流。帧的流标识符为0 针对整个连接;否则指的是被影响的流;
可以由一个已经发送带有END_STREAM标记的帧的对等端来发送。这意味着接收端可以在“半关闭(远程)”或者“关闭”的流上接收WINDOW_UPDATE帧。接收端绝对不能作为错误处理
即使发生了帧错误,只要没有发生连接错误,接收端都必须以此帧来计算流控窗口(window)。因为发送端一发送就将这个帧计入了流量控制窗口,如果接收端没有这样做,发送端和接收端的流量控制
会出现差异。
所有类型的流量控制都是逐跳的(hop-by-hop);中介端不在依赖的连接上转发WINDOW_UPDATE帧。但是,接收端对数据的节流措施可以直接传播到原始发送端(而不是仅仅限于最近的中介)。
错误处理
接收端如果无法接收帧,可以响应一个流错误或者类型为流量控制错误的连接错误
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。