WINDOW_UPDATE帧(type=0x8)用来实现流量控制

WINDOW_UPDATE用来通知对等端(数据发送端)加大流量控制窗口值。增量为 Window Size Increment,单位为字节数。

算法是这样的:

  1. 发送端保有一个流量控制窗口(window)初始值。初始值的设定请参考SETTING 帧的 SETTINGS_INITIAL_WINDOW_SIZE
  2. 发送端每发送一个DATA帧,就把window递减,递减量为这个帧的大小。如果当前window小于帧大小,那么这个帧就必须被拆分到不大于window,如果window等于0,就不能发送任何帧
  3. 接收端可以发送 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帧。但是,接收端对数据的节流措施可以直接传播到原始发送端(而不是仅仅限于最近的中介)。

错误处理

接收端如果无法接收帧,可以响应一个流错误或者类型为流量控制错误的连接错误


Reco
4.6k 声望541 粉丝

敢作敢为


引用和评论

0 条评论