nginx 在http3中发送重置帧时如何设置最终大小

nhhxz33t  于 2022-12-22  发布在  Nginx
关注(0)|答案(1)|浏览(130)

以下场景:
1.发送方已连续发送10000字节
1.接收器ACK 0 - 8000(发送器已收到这些ACK)
1.现在,Sender将发送一个重置帧,问题是如何设置“最终大小”
a.最终尺寸为10000
B.最终尺寸为8000
查看RFC 9000(https://datracker.ietf.org/doc/html/rfc9000#section-4.5),其中描述了:
4.5.流最终大小
最终大小是指流使用的流控制信用量。假定流上的每个连续字节都发送了一次,则最终大小是发送的字节数。更一般地说,它比流上发送的偏移量最大的字节的偏移量大1,如果没有发送字节,则为零。
我认为最终的大小应该是10000,并且发送方不能在已识别的流上再发送(传输和重传),对吗?https://datatracker.ietf.org/doc/html/rfc9000#section-19.4
在发送RESET_STREAM之后,端点停止传输并且
在已标识的流上重新传输STREAM帧。RESET_STREAM的接收方可以丢弃它已经在该流上接收到的任何数据。
并且nginx的iquic可能存在一些问题,当nginx发送了重置帧时,nginx将重新发送帧(例如:nginx http 3已将所有数据发送到ctx-〉帧,则qs将被删除)

void
    ngx_quic_resend_frames(ngx_connection_t *c, ngx_quic_send_ctx_t *ctx)
    {
    case NGX_QUIC_FT_STREAM:
        qs = ngx_quic_find_stream(&qc->streams.tree, f->u.stream.stream_id);

        if (qs) {
            if (qs->send_state == NGX_QUIC_STREAM_SEND_RESET_SENT
                || qs->send_state == NGX_QUIC_STREAM_SEND_RESET_RECVD)
            {
                ngx_quic_free_frame(c, f);
                break;
            }
        }
}
s2j5cfk0

s2j5cfk01#

最终大小肯定是10000,因为流控制信用通过在流上发送数据而被消耗;它是否被承认并不重要。
实际上,在发送重置流帧之后:

  • 不应发送新数据(这将违反最终大小,导致致命错误,如第4.5节所述
  • 不应执行重传

第三个问题我不太清楚,我不是ngx-quic的Maven,但是从它发布的代码来看,我猜它不会重发,因为帧被释放了;- )

相关问题