Receiving Stream States
bash
o
| Recv STREAM / STREAM_DATA_BLOCKED / RESET_STREAM
| Create Bidirectional Stream (Sending)
| Recv MAX_STREAM_DATA / STOP_SENDING (Bidirectional)
| Create Higher-Numbered Stream
v
+-------+
| Recv | Recv RESET_STREAM
| |-----------------------.
+-------+ |
| |
| Recv STREAM + FIN |
v |
+-------+ |
| Size | Recv RESET_STREAM |
| Known |---------------------->|
+-------+ |
| |
| Recv All Data |
v v
+-------+ Recv RESET_STREAM +-------+
| Data |--- (optional) --->| Reset |
| Recvd | Recv All Data | Recvd |
+-------+<-- (optional) ----+-------+
| |
| App Read All Data | App Read Reset
v v
+-------+ +-------+
| Data | | Reset |
| Read | | Read |
+-------+ +-------+
States for Receiving Parts of Streams
Recv
这是流接收端的初始状态。
当我们从一个对方作为创建者的流上接收到 STREAM
, STREAM_DATA_BLOCKED
, 或者 RESET_STREAM
时, 我们便处于 Recv
状态了。
对于一个对方作为创建者的双向流(bidirectional streams ), 在接收到 MAX_STREAM_DATA
或者 STOP_SENDING
之后, 便进入 Recv
状态.
当处于 Recv
状态时, 可以接收对方发送的 STREAM
和 STREAM_DATA_BLOCKED
帧。 接收到的数据可能是乱序的,接收方需要先将数据缓存起来,直到足以恢复出正确的数据顺序之后,再按循序递交给上层应用程序。
当数据被成功的递交给上层应用程序之后, 内部的缓存中便有了更多的空间以容纳更多的数据,此时可以发送 MAX_STREAM_DATA
给发送方,以允许它发送更多的数据。
Size Known
当接收到带有 FIN
标志的 STREAM
帧之后,接收方便知道了最终的数据大小,此时进入 Size Known`` 状态。
处于当前状态的接收方, 不需要再发送 MAX_STREAM_DATA
, 它只需要继续接收对方重传的数据即可。
Data Recvd
当成功的从当前流上面接收到了所有数据时, 接收方进入 Data Recvd
状态。
处于这个状态之后, 可以忽略之后接收到的所有 STREAM
和 STREAM_DATA_BLOCKED
帧。
Data Read
当进入 Data Recvd
状态,流会一直在这个状态直到将所有缓存的数据递交给了上层应用程序。之后, 它的状态变为 Data Read
状态。
这是一个最终状态(a terminal state).
Reset Recvd
当流处于 Recv
, Size Known
或者 Data Recvd
状态时, 收到来自对方的 RESET_STREAM
帧时, 它就进入了 Reset Recvd
状态.
当收到 RESET_STREAM
之后, 接收方可以自由选择如何处理已经接收到的数据和后续到达的数据。
Reset Read
当接收方将收到RESET_STREAM
帧这一事件通知给上层应用程序之后, 这个流便进入 Reset Read
状态。
这是一个最终状态(a terminal state).