alibaba / xquic

XQUIC Library released by Alibaba is a cross-platform implementation of QUIC and HTTP/3 protocol.
Apache License 2.0
1.65k stars 326 forks source link

[Bug]: Cleaning recv_record[pns] exists problem #199

Closed adcen0107 closed 2 years ago

adcen0107 commented 2 years ago

What happened?

Position in functin: xqc_send_ctl_on_ack_received

if (packet_out->po_largest_ack > ctl->ctl_largest_ack_both[pns]) { ctl->ctl_largest_ack_both[pns] = packet_out->po_largest_ack; need_del_record = 1; } if (need_del_record) { xqc_recv_record_del(&ctl->ctl_conn->recv_record[pns], ctl->ctl_largest_ack_both[pns] + 1); xqc_log(ctl->ctl_conn->log, XQC_LOG_DEBUG, "|xqc_recv_record_del from %ui|pns:%d|", ctl->ctl_largest_ack_both[pns] + 1, pns); }

Steps To Reproduce

上面使用po_largest_recv来更新ctl_largest_ack_both[pns],然后用它来清理recv_record[pns],会导致在丢包场景下,将一些没有收到的包也清理了。从而导致那些丢包不能被ACK报告到发送端。

Relevant log output

1、添加代码如下:
    if (need_del_record) {
    xqc_recv_record_log(ctl->ctl_conn, &ctl->ctl_conn->recv_record[pns]);
        xqc_recv_record_del(&ctl->ctl_conn->recv_record[pns], ctl->ctl_largest_ack_both[pns] + 1);
        xqc_log(ctl->ctl_conn->log, XQC_LOG_DEBUG, "|acked:%ui|Local pns:%d recv xqc_recv_record_del, base=%ui|Local send [%ui, %ui, %ui]|peer recv largest:%ui|",
                packet_out->po_pkt.pkt_num, pns, ctl->ctl_largest_ack_both[pns] + 1,
                ctl->ctl_conn->conn_send_ctl->ctl_packet_number[0], ctl->ctl_conn->conn_send_ctl->ctl_packet_number[1],
                ctl->ctl_conn->conn_send_ctl->ctl_packet_number[2], largest_ack);
                xqc_recv_record_log(ctl->ctl_conn, &ctl->ctl_conn->recv_record[pns]);
    }
2、打印输出
[2022/06/30 17:22:50 891812] [debug] |scid:dd0b53d56a629656|xqc_recv_record_log|local recved pi, record[0]:(low:19146, high:23172)|
[2022/06/30 17:22:50 891820] [debug] |scid:dd0b53d56a629656|xqc_recv_record_log|local recved pi, record[1]:(low:19134, high:19144)|
[2022/06/30 17:22:50 891828] [debug] |scid:dd0b53d56a629656|xqc_recv_record_log|local recved pi, record[2]:(low:19115, high:19132)|
[2022/06/30 17:22:50 891836] [debug] |scid:dd0b53d56a629656|xqc_recv_record_log|local recved pi, record[3]:(low:19103, high:19113)|
[2022/06/30 17:22:50 891845] [debug] |scid:dd0b53d56a629656|xqc_recv_record_log|local recved pi, record[4]:(low:19093, high:19101)|
[2022/06/30 17:22:50 891853] [debug] |scid:dd0b53d56a629656|xqc_recv_record_log|local recved pi, record[5]:(low:19046, high:19091)|
[2022/06/30 17:22:50 891861] [debug] |scid:dd0b53d56a629656|xqc_recv_record_log|local recved pi, record[6]:(low:19029, high:19044)|
[2022/06/30 17:22:50 891873] [debug] |scid:dd0b53d56a629656|xqc_recv_record_log|local recved pi, record[7]:(low:18988, high:19027)|
[2022/06/30 17:22:50 891882] [debug] |scid:dd0b53d56a629656|xqc_recv_record_log|local recved pi, record[8]:(low:18983, high:18986)|
[2022/06/30 17:22:50 891890] [debug] |scid:dd0b53d56a629656|xqc_recv_record_log|local recved pi, record[9]:(low:18976, high:18981)|
[2022/06/30 17:22:50 891899] [debug] |scid:dd0b53d56a629656|xqc_recv_record_log|local recved pi, record[10]:(low:18941, high:18974)|
省略N行信息
[2022/06/30 17:22:50 904088] [debug] |scid:dd0b53d56a629656|xqc_recv_record_log|local recved pi, record[1430]:(low:36, high:36)|
[2022/06/30 17:22:50 904096] [debug] |scid:dd0b53d56a629656|xqc_recv_record_log|local recved pi, record[1431]:(low:31, high:34)|

[2022/06/30 17:22:50 904158] [debug] |scid:dd0b53d56a629656|xqc_send_ctl_on_ack_received|acked:6149|Local pns:2 recv xqc_recv_record_del, base=23162|Local send [2, 5, 6150]|peer recv largest:6148|
[2022/06/30 17:22:50 904168] [debug] |scid:dd0b53d56a629656|xqc_recv_record_log|local recved pi, record[0]:(low:23162, high:23172)|

3、明显观察到,recv_record[pns]表中1431项记录被清理了,只剩下一项了。但是记录中的包都是不连续的。