Closed adcen0107 closed 2 years ago
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); }
上面使用po_largest_recv来更新ctl_largest_ack_both[pns],然后用它来清理recv_record[pns],会导致在丢包场景下,将一些没有收到的包也清理了。从而导致那些丢包不能被ACK报告到发送端。
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项记录被清理了,只剩下一项了。但是记录中的包都是不连续的。
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