forked from quic-go/quic-go
use the receipt of a Retry packet to get a first RTT estimate
This commit is contained in:
@@ -772,7 +772,11 @@ func (h *sentPacketHandler) queueFramesForRetransmission(p *Packet) {
|
|||||||
|
|
||||||
func (h *sentPacketHandler) ResetForRetry() error {
|
func (h *sentPacketHandler) ResetForRetry() error {
|
||||||
h.bytesInFlight = 0
|
h.bytesInFlight = 0
|
||||||
|
var firstPacketSendTime time.Time
|
||||||
h.initialPackets.history.Iterate(func(p *Packet) (bool, error) {
|
h.initialPackets.history.Iterate(func(p *Packet) (bool, error) {
|
||||||
|
if firstPacketSendTime.IsZero() {
|
||||||
|
firstPacketSendTime = p.SendTime
|
||||||
|
}
|
||||||
h.queueFramesForRetransmission(p)
|
h.queueFramesForRetransmission(p)
|
||||||
return true, nil
|
return true, nil
|
||||||
})
|
})
|
||||||
@@ -783,6 +787,18 @@ func (h *sentPacketHandler) ResetForRetry() error {
|
|||||||
return true, nil
|
return true, nil
|
||||||
})
|
})
|
||||||
|
|
||||||
|
// Only use the Retry to estimate the RTT if we didn't send any retransmission for the Initial.
|
||||||
|
// Otherwise, we don't know which Initial the Retry was sent in response to.
|
||||||
|
if h.ptoCount == 0 {
|
||||||
|
now := time.Now()
|
||||||
|
h.rttStats.UpdateRTT(now.Sub(firstPacketSendTime), 0, now)
|
||||||
|
if h.logger.Debug() {
|
||||||
|
h.logger.Debugf("\tupdated RTT: %s (σ: %s)", h.rttStats.SmoothedRTT(), h.rttStats.MeanDeviation())
|
||||||
|
}
|
||||||
|
if h.qlogger != nil {
|
||||||
|
h.qlogger.UpdatedMetrics(h.rttStats, h.congestion.GetCongestionWindow(), h.bytesInFlight, h.packetsInFlight())
|
||||||
|
}
|
||||||
|
}
|
||||||
h.initialPackets = newPacketNumberSpace(h.initialPackets.pns.Pop())
|
h.initialPackets = newPacketNumberSpace(h.initialPackets.pns.Pop())
|
||||||
h.appDataPackets = newPacketNumberSpace(h.appDataPackets.pns.Pop())
|
h.appDataPackets = newPacketNumberSpace(h.appDataPackets.pns.Pop())
|
||||||
oldAlarm := h.alarm
|
oldAlarm := h.alarm
|
||||||
|
|||||||
@@ -1149,5 +1149,37 @@ var _ = Describe("SentPacketHandler", func() {
|
|||||||
// make sure we keep increasing the packet number for 0-RTT packets
|
// make sure we keep increasing the packet number for 0-RTT packets
|
||||||
Expect(handler.PopPacketNumber(protocol.Encryption0RTT)).To(BeNumerically(">", pn))
|
Expect(handler.PopPacketNumber(protocol.Encryption0RTT)).To(BeNumerically(">", pn))
|
||||||
})
|
})
|
||||||
|
|
||||||
|
It("uses a Retry for an RTT estimate, if it was not retransmitted", func() {
|
||||||
|
handler.SentPacket(ackElicitingPacket(&Packet{
|
||||||
|
PacketNumber: 42,
|
||||||
|
EncryptionLevel: protocol.EncryptionInitial,
|
||||||
|
SendTime: time.Now().Add(-500 * time.Millisecond),
|
||||||
|
}))
|
||||||
|
handler.SentPacket(ackElicitingPacket(&Packet{
|
||||||
|
PacketNumber: 43,
|
||||||
|
EncryptionLevel: protocol.EncryptionInitial,
|
||||||
|
SendTime: time.Now().Add(-10 * time.Millisecond),
|
||||||
|
}))
|
||||||
|
Expect(handler.ResetForRetry()).To(Succeed())
|
||||||
|
Expect(handler.rttStats.SmoothedRTT()).To(BeNumerically("~", 500*time.Millisecond, 100*time.Millisecond))
|
||||||
|
})
|
||||||
|
|
||||||
|
It("doesn't use a Retry for an RTT estimate, if it was not retransmitted", func() {
|
||||||
|
handler.SentPacket(ackElicitingPacket(&Packet{
|
||||||
|
PacketNumber: 42,
|
||||||
|
EncryptionLevel: protocol.EncryptionInitial,
|
||||||
|
SendTime: time.Now().Add(-800 * time.Millisecond),
|
||||||
|
}))
|
||||||
|
Expect(handler.OnLossDetectionTimeout()).To(Succeed())
|
||||||
|
Expect(handler.SendMode()).To(Equal(SendPTOInitial))
|
||||||
|
handler.SentPacket(ackElicitingPacket(&Packet{
|
||||||
|
PacketNumber: 43,
|
||||||
|
EncryptionLevel: protocol.EncryptionInitial,
|
||||||
|
SendTime: time.Now().Add(-100 * time.Millisecond),
|
||||||
|
}))
|
||||||
|
Expect(handler.ResetForRetry()).To(Succeed())
|
||||||
|
Expect(handler.rttStats.SmoothedRTT()).To(BeZero())
|
||||||
|
})
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|||||||
Reference in New Issue
Block a user