[QUIC] Receiving Stream States

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 状态时, 可以接收对方发送的 STREAMSTREAM_DATA_BLOCKED 帧。 接收到的数据可能是乱序的,接收方需要先将数据缓存起来,直到足以恢复出正确的数据顺序之后,再按循序递交给上层应用程序。

当数据被成功的递交给上层应用程序之后, 内部的缓存中便有了更多的空间以容纳更多的数据,此时可以发送 MAX_STREAM_DATA 给发送方,以允许它发送更多的数据。


Size Known


当接收到带有 FIN标志的 STREAM帧之后,接收方便知道了最终的数据大小,此时进入 Size Known`` 状态。

处于当前状态的接收方, 不需要再发送 MAX_STREAM_DATA, 它只需要继续接收对方重传的数据即可。


Data Recvd


当成功的从当前流上面接收到了所有数据时, 接收方进入 Data Recvd 状态。

处于这个状态之后, 可以忽略之后接收到的所有 STREAMSTREAM_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).

相关推荐
迎風吹頭髮2 小时前
UNIX下C语言编程与实践58-UNIX TCP 连接处理:accept 函数与新套接字创建
c语言·网络·unix
IT成长日记5 小时前
【Nginx开荒攻略】Nginx虚拟主机配置:从域名、端口到IP的完整指南
linux·运维·服务器·nginx·虚拟主机
迎風吹頭髮6 小时前
UNIX下C语言编程与实践53-UNIX 共享内存控制:shmctl 函数与共享内存管理
服务器·c语言·unix
猫头虎7 小时前
如何查看局域网内IP冲突问题?如何查看局域网IP环绕问题?arp -a命令如何使用?
网络·python·网络协议·tcp/ip·开源·pandas·pip
黑马金牌编程7 小时前
Linux 服务器常见的性能调优
linux·运维·服务器·性能优化
liuyao_xianhui8 小时前
Linux_基本指令1
linux·运维·服务器
liliangcsdn9 小时前
LLM时代基于unstructured解析非结构化pdf
linux·服务器·数据分析
hello_25010 小时前
动手模拟docker网络-bridge模式
网络·docker·桥接模式
武文斌7710 小时前
项目学习总结:LVGL图形参数动态变化、开发板的GDB调试、sqlite3移植、MQTT协议、心跳包
linux·开发语言·网络·arm开发·数据库·嵌入式硬件·学习
爱吃喵的鲤鱼10 小时前
仿mudou——Connection模块(连接管理)
linux·运维·服务器·开发语言·网络·c++