1
2
3
4
5 package quic
6
7 import (
8 "time"
9 )
10
11 type rttState struct {
12 minRTT time.Duration
13 latestRTT time.Duration
14 smoothedRTT time.Duration
15 rttvar time.Duration
16 firstSampleTime time.Time
17 }
18
19 func (r *rttState) init() {
20 r.minRTT = -1
21
22
23
24 const initialRTT = 333 * time.Millisecond
25
26
27 r.smoothedRTT = initialRTT
28 r.rttvar = initialRTT / 2
29 }
30
31 func (r *rttState) establishPersistentCongestion() {
32
33
34
35 r.minRTT = r.latestRTT
36 }
37
38
39
40 func (r *rttState) updateSample(now time.Time, handshakeConfirmed bool, spaceID numberSpace, latestRTT, ackDelay, maxAckDelay time.Duration) {
41 r.latestRTT = latestRTT
42
43 if r.minRTT < 0 {
44
45
46
47 r.minRTT = latestRTT
48
49 r.smoothedRTT = latestRTT
50 r.rttvar = latestRTT / 2
51 r.firstSampleTime = now
52 return
53 }
54
55
56
57
58 r.minRTT = min(r.minRTT, latestRTT)
59
60
61 if handshakeConfirmed {
62 ackDelay = min(ackDelay, maxAckDelay)
63 }
64 adjustedRTT := latestRTT - ackDelay
65 if adjustedRTT < r.minRTT {
66 adjustedRTT = latestRTT
67 }
68 rttvarSample := abs(r.smoothedRTT - adjustedRTT)
69 r.rttvar = (3*r.rttvar + rttvarSample) / 4
70 r.smoothedRTT = ((7 * r.smoothedRTT) + adjustedRTT) / 8
71 }
72
View as plain text