Network System 0.1.1
High-performance modular networking library for scalable client-server applications
Loading...
Searching...
No Matches
rtt_estimator.h
Go to the documentation of this file.
1// BSD 3-Clause License
2// Copyright (c) 2024, 🍀☀🌕🌥 🌊
3// See the LICENSE file in the project root for full license information.
4
5#pragma once
6
7#include <chrono>
8#include <cstdint>
9
11{
12
22{
23public:
32
38 explicit rtt_estimator(std::chrono::microseconds initial_rtt,
39 std::chrono::microseconds max_ack_delay =
40 std::chrono::microseconds{25000});
41
51 auto update(std::chrono::microseconds latest_rtt,
52 std::chrono::microseconds ack_delay,
53 bool is_handshake_confirmed = true) -> void;
54
59 [[nodiscard]] auto smoothed_rtt() const noexcept -> std::chrono::microseconds
60 {
61 return smoothed_rtt_;
62 }
63
68 [[nodiscard]] auto rttvar() const noexcept -> std::chrono::microseconds
69 {
70 return rttvar_;
71 }
72
77 [[nodiscard]] auto min_rtt() const noexcept -> std::chrono::microseconds
78 {
79 return min_rtt_;
80 }
81
86 [[nodiscard]] auto latest_rtt() const noexcept -> std::chrono::microseconds
87 {
88 return latest_rtt_;
89 }
90
97 [[nodiscard]] auto pto() const noexcept -> std::chrono::microseconds;
98
103 auto set_max_ack_delay(std::chrono::microseconds delay) noexcept -> void
104 {
105 max_ack_delay_ = delay;
106 }
107
112 [[nodiscard]] auto max_ack_delay() const noexcept -> std::chrono::microseconds
113 {
114 return max_ack_delay_;
115 }
116
121 [[nodiscard]] auto has_sample() const noexcept -> bool
122 {
123 return !first_sample_;
124 }
125
129 auto reset() -> void;
130
131private:
133 std::chrono::microseconds smoothed_rtt_;
134
136 std::chrono::microseconds rttvar_;
137
139 std::chrono::microseconds min_rtt_;
140
142 std::chrono::microseconds latest_rtt_;
143
145 std::chrono::microseconds max_ack_delay_;
146
148 std::chrono::microseconds initial_rtt_;
149
152
154 static constexpr auto kGranularity = std::chrono::milliseconds{1};
155
157 static constexpr auto kInitialRtt = std::chrono::microseconds{333000};
158
160 static constexpr auto kDefaultMaxAckDelay = std::chrono::microseconds{25000};
161};
162
163} // namespace kcenon::network::protocols::quic
RTT estimation for QUIC (RFC 9002 Section 5)
auto min_rtt() const noexcept -> std::chrono::microseconds
Get minimum observed RTT.
std::chrono::microseconds min_rtt_
Minimum observed RTT (RFC 9002 Section 5.2)
std::chrono::microseconds rttvar_
RTT variance (RFC 9002 Section 5.3)
auto update(std::chrono::microseconds latest_rtt, std::chrono::microseconds ack_delay, bool is_handshake_confirmed=true) -> void
Update RTT estimate from an ACK (RFC 9002 Section 5.3)
auto latest_rtt() const noexcept -> std::chrono::microseconds
Get latest RTT sample.
auto pto() const noexcept -> std::chrono::microseconds
Calculate probe timeout duration (RFC 9002 Section 6.2.1)
std::chrono::microseconds smoothed_rtt_
Smoothed RTT (RFC 9002 Section 5.3)
std::chrono::microseconds max_ack_delay_
Maximum ACK delay (from transport parameters)
static constexpr auto kInitialRtt
Default initial RTT (RFC 9002 Section 6.2.2)
std::chrono::microseconds initial_rtt_
Initial RTT value (used for reset)
auto set_max_ack_delay(std::chrono::microseconds delay) noexcept -> void
Set maximum ACK delay.
bool first_sample_
True if no RTT sample has been received yet.
auto reset() -> void
Reset RTT estimator to initial state.
auto smoothed_rtt() const noexcept -> std::chrono::microseconds
Get smoothed RTT.
auto has_sample() const noexcept -> bool
Check if any RTT sample has been received.
static constexpr auto kGranularity
Timer granularity (RFC 9002 Section 6.1.2)
auto max_ack_delay() const noexcept -> std::chrono::microseconds
Get maximum ACK delay.
auto rttvar() const noexcept -> std::chrono::microseconds
Get RTT variance.
static constexpr auto kDefaultMaxAckDelay
Default max ACK delay.
std::chrono::microseconds latest_rtt_
Most recent RTT sample.