forked from quic-go/quic-go
drop duplicate packets
Duplicate detection uses the same data structure that is used to track received packets to generate ACK frames. That means that after an old ACK range has been pruned, a severly delayed packet might be incorrectly detected as a duplicate. As we wouldn't have acknowledged receipt of this packet, this situation would have resulted in a retransmission by the peer anyway, so dropping the packet won't cause a big regression.
This commit is contained in:
@@ -246,4 +246,55 @@ var _ = Describe("receivedPacketHistory", func() {
|
||||
Expect(hist.GetHighestAckRange()).To(Equal(wire.AckRange{Smallest: 6, Largest: 7}))
|
||||
})
|
||||
})
|
||||
|
||||
Context("duplicate detection", func() {
|
||||
It("doesn't declare the first packet a duplicate", func() {
|
||||
Expect(hist.IsPotentiallyDuplicate(5)).To(BeFalse())
|
||||
})
|
||||
|
||||
It("detects a duplicate in a range", func() {
|
||||
hist.ReceivedPacket(4)
|
||||
hist.ReceivedPacket(5)
|
||||
hist.ReceivedPacket(6)
|
||||
Expect(hist.IsPotentiallyDuplicate(3)).To(BeFalse())
|
||||
Expect(hist.IsPotentiallyDuplicate(4)).To(BeTrue())
|
||||
Expect(hist.IsPotentiallyDuplicate(5)).To(BeTrue())
|
||||
Expect(hist.IsPotentiallyDuplicate(6)).To(BeTrue())
|
||||
Expect(hist.IsPotentiallyDuplicate(7)).To(BeFalse())
|
||||
})
|
||||
|
||||
It("detects a duplicate in multiple ranges", func() {
|
||||
hist.ReceivedPacket(4)
|
||||
hist.ReceivedPacket(5)
|
||||
hist.ReceivedPacket(8)
|
||||
hist.ReceivedPacket(9)
|
||||
Expect(hist.IsPotentiallyDuplicate(3)).To(BeFalse())
|
||||
Expect(hist.IsPotentiallyDuplicate(4)).To(BeTrue())
|
||||
Expect(hist.IsPotentiallyDuplicate(5)).To(BeTrue())
|
||||
Expect(hist.IsPotentiallyDuplicate(6)).To(BeFalse())
|
||||
Expect(hist.IsPotentiallyDuplicate(7)).To(BeFalse())
|
||||
Expect(hist.IsPotentiallyDuplicate(8)).To(BeTrue())
|
||||
Expect(hist.IsPotentiallyDuplicate(9)).To(BeTrue())
|
||||
Expect(hist.IsPotentiallyDuplicate(10)).To(BeFalse())
|
||||
})
|
||||
|
||||
It("says a packet is a potentially duplicate if the ranges were already deleted", func() {
|
||||
hist.ReceivedPacket(4)
|
||||
hist.ReceivedPacket(5)
|
||||
hist.ReceivedPacket(8)
|
||||
hist.ReceivedPacket(9)
|
||||
hist.ReceivedPacket(11)
|
||||
hist.DeleteBelow(8)
|
||||
Expect(hist.IsPotentiallyDuplicate(3)).To(BeTrue())
|
||||
Expect(hist.IsPotentiallyDuplicate(4)).To(BeTrue())
|
||||
Expect(hist.IsPotentiallyDuplicate(5)).To(BeTrue())
|
||||
Expect(hist.IsPotentiallyDuplicate(6)).To(BeTrue())
|
||||
Expect(hist.IsPotentiallyDuplicate(7)).To(BeTrue())
|
||||
Expect(hist.IsPotentiallyDuplicate(8)).To(BeTrue())
|
||||
Expect(hist.IsPotentiallyDuplicate(9)).To(BeTrue())
|
||||
Expect(hist.IsPotentiallyDuplicate(10)).To(BeFalse())
|
||||
Expect(hist.IsPotentiallyDuplicate(11)).To(BeTrue())
|
||||
Expect(hist.IsPotentiallyDuplicate(12)).To(BeFalse())
|
||||
})
|
||||
})
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user