Recover DATA RTT sampling after path delay increases
This commit is contained in:
1 parent
dbda8a24d7
commit
ef404da44c
3 files changed
+29
-6
No files matched your search
@@ -16,7 +16,8 @@ static struct INFLIGHT_PACKET* logical_find(struct ETCP_CONN* conn, uint32_t seq
|
||||
}
|
||||
|
||||
uint32_t etcp_tx_rto_us(const struct ETCP_LINK* link) {
|
||||
uint64_t rtt = link->data_rtt_us ? link->data_rtt_us : (uint64_t)link->rtt_last * 100;
|
||||
uint64_t rtt = link->data_rtt_us;
|
||||
if ((uint64_t)link->rtt_last * 100 > rtt) rtt = (uint64_t)link->rtt_last * 100;
|
||||
uint64_t rto = rtt ? (12 * rtt + 15ULL * link->data_jitter_us + 9) / 10 + 3000 : 1000000;
|
||||
if (rto < 10000) rto = 10000;
|
||||
if (rto > 1000000) rto = 1000000;
|
||||
@@ -101,9 +102,9 @@ static void retransmit_cb(void* arg) {
|
||||
while (link->attempts->head) {
|
||||
struct ETCP_TX_ATTEMPT* attempt = (struct ETCP_TX_ATTEMPT*)link->attempts->head;
|
||||
if (!attempt->sent_at_us || now - attempt->sent_at_us < rto) break;
|
||||
DEBUG_DEBUG(DEBUG_CATEGORY_ETCP, "[%s] RTO link=%u attempt=%u seq=%u age_us=%llu RTO_us=%u RTT_us=%u jitter_us=%u",
|
||||
DEBUG_DEBUG(DEBUG_CATEGORY_ETCP, "[%s] RTO link=%u attempt=%u seq=%u age_us=%llu RTO_us=%u DATA_RTT_us=%u KA_RTT_us=%u jitter_us=%u",
|
||||
link->etcp->log_name, link->local_link_id, (unsigned)(uint16_t)attempt->attempt_id, attempt->seq,
|
||||
(unsigned long long)(now - attempt->sent_at_us), rto, link->data_rtt_us, link->data_jitter_us);
|
||||
(unsigned long long)(now - attempt->sent_at_us), rto, link->data_rtt_us, link->rtt_last * 100, link->data_jitter_us);
|
||||
attempt_retire(link, attempt, 1, 1);
|
||||
}
|
||||
retransmit_arm(link);
|
||||
|
||||
@@ -43,7 +43,9 @@ int etcp_tx_link_init(struct ETCP_LINK* link);
|
||||
void etcp_tx_link_reset(struct ETCP_LINK* link, int retry);
|
||||
void etcp_tx_link_destroy(struct ETCP_LINK* link);
|
||||
/* RTO = clamp(ceil(1.2*RTT + 1.5*jitter + 3000), 10000, 1000000), все величины в мкс.
|
||||
* RTT/jitter — собственные DATA-измерения линка; до DATA ACK использует KA RTT, без RTT — 1с. */
|
||||
* RTT=max(DATA EWMA, последний RTT timestamp/keepalive) своего линка; jitter — только DATA, без RTT — 1с.
|
||||
* Timestamp-RTT задаёт нижнюю границу, чтобы рост задержки не удалял все попытки до их ACK и не замораживал DATA-измерения.
|
||||
* Это граница RTO; RTT/min_rtt и BW модели BBR по-прежнему обновляет только ACK действующей DATA-попытки. */
|
||||
uint32_t etcp_tx_rto_us(const struct ETCP_LINK* link);
|
||||
/* Резервировать окно для packet; NULL — отказ с логом. OOM/бюджет сохраняют packet в очереди,
|
||||
* исчерпание номера меняет эпоху и удаляет прежний поток, включая packet.
|
||||
|
||||
Reference in new issue
Block a user