handle ACKs sent for a belated packet in legacy SentPacketHandler

ref #219
This commit is contained in:
Marten Seemann
2016-07-14 00:02:36 +08:00
parent 546ba27013
commit f03f9c9a1c
2 changed files with 60 additions and 11 deletions

View File

@@ -143,11 +143,16 @@ func (h *sentPacketHandler) SentPacket(packet *Packet) error {
}
func (h *sentPacketHandler) calculateExpectedEntropy(ackFrame *frames.AckFrameLegacy) (EntropyAccumulator, error) {
packet, ok := h.packetHistory[ackFrame.LargestObserved]
if !ok {
return 0, ErrMapAccess
var expectedEntropy EntropyAccumulator
if ackFrame.LargestObserved == h.LargestObserved {
expectedEntropy = h.LargestObservedEntropy
} else {
packet, ok := h.packetHistory[ackFrame.LargestObserved]
if !ok {
return 0, ErrMapAccess
}
expectedEntropy = packet.Entropy
}
expectedEntropy := packet.Entropy
if ackFrame.HasNACK() { // if the packet has NACKs, the entropy value has to be calculated
nackRangeIndex := 0
@@ -168,6 +173,7 @@ func (h *sentPacketHandler) calculateExpectedEntropy(ackFrame *frames.AckFrameLe
}
}
}
return expectedEntropy, nil
}
@@ -202,12 +208,17 @@ func (h *sentPacketHandler) ReceivedAck(ackFrame *frames.AckFrameLegacy, withPac
h.LargestObserved = ackFrame.LargestObserved
highestInOrderAckedPacketNumber := ackFrame.GetHighestInOrderPacketNumber()
// Update the RTT
timeDelta := time.Now().Sub(h.packetHistory[h.LargestObserved].sendTime)
// TODO: Don't always update RTT
h.rttStats.UpdateRTT(timeDelta, ackFrame.DelayTime, time.Now())
if utils.Debug() {
utils.Debugf("\tEstimated RTT: %dms", h.rttStats.SmoothedRTT()/time.Millisecond)
packet, ok := h.packetHistory[h.LargestObserved]
if ok {
h.LargestObservedEntropy = packet.Entropy
// Update the RTT
timeDelta := time.Now().Sub(packet.sendTime)
// TODO: Don't always update RTT
h.rttStats.UpdateRTT(timeDelta, ackFrame.DelayTime, time.Now())
if utils.Debug() {
utils.Debugf("\tEstimated RTT: %dms", h.rttStats.SmoothedRTT()/time.Millisecond)
}
}
var ackedPackets congestion.PacketVector

View File

@@ -294,15 +294,18 @@ var _ = Describe("SentPacketHandler", func() {
Expect(err).ToNot(HaveOccurred())
Expect(handler.BytesInFlight()).To(Equal(protocol.ByteCount(2)))
Expect(handler.LargestObserved).To(Equal(protocol.PacketNumber(largestObserved)))
Expect(handler.LargestObservedEntropy).To(Equal(entropy))
Expect(handler.highestInOrderAckedPacketNumber).To(Equal(protocol.PacketNumber(largestObserved)))
Expect(handler.packetHistory).ToNot(HaveKey(protocol.PacketNumber(largestObserved - 1)))
Expect(handler.packetHistory).To(HaveKey(protocol.PacketNumber(largestObserved + 1)))
})
It("completely processes an ACK with a NACK range", func() {
entropy := EntropyAccumulator(0)
var entropy EntropyAccumulator
var largestObservedEntropy EntropyAccumulator
largestObserved := 6
for i := 0; i < largestObserved; i++ {
largestObservedEntropy.Add(packets[i].PacketNumber, packets[i].EntropyBit)
if i == 2 || i == 4 { // Packet Number 3 and 5 missing
continue
}
@@ -320,6 +323,7 @@ var _ = Describe("SentPacketHandler", func() {
Expect(err).ToNot(HaveOccurred())
Expect(handler.BytesInFlight()).To(Equal(protocol.ByteCount(2)))
Expect(handler.LargestObserved).To(Equal(protocol.PacketNumber(largestObserved)))
Expect(handler.LargestObservedEntropy).To(Equal(largestObservedEntropy))
Expect(handler.highestInOrderAckedPacketNumber).To(Equal(protocol.PacketNumber(2)))
Expect(handler.packetHistory).ToNot(HaveKey(protocol.PacketNumber(2)))
Expect(handler.packetHistory).To(HaveKey(protocol.PacketNumber(3)))
@@ -327,6 +331,40 @@ var _ = Describe("SentPacketHandler", func() {
Expect(handler.packetHistory).To(HaveKey(protocol.PacketNumber(5)))
Expect(handler.packetHistory).ToNot(HaveKey(protocol.PacketNumber(6)))
})
It("processes an ACK frame that would be sent after a late arrival of a packet", func() {
entropy := EntropyAccumulator(0)
largestObserved := 6
for i := 0; i < largestObserved; i++ {
if i == 2 || i == 3 { // Packet Number 3 and 4
continue
}
entropy.Add(packets[i].PacketNumber, packets[i].EntropyBit)
}
ack1 := frames.AckFrameLegacy{
LargestObserved: protocol.PacketNumber(largestObserved),
Entropy: byte(entropy),
NackRanges: []frames.NackRange{
{FirstPacketNumber: 3, LastPacketNumber: 4},
},
}
err := handler.ReceivedAck(&ack1, 1)
Expect(err).ToNot(HaveOccurred())
Expect(handler.BytesInFlight()).To(Equal(protocol.ByteCount(2)))
entropy.Add(packets[2].PacketNumber, packets[2].EntropyBit)
Expect(handler.packetHistory).To(HaveKey(protocol.PacketNumber(3)))
ack2 := frames.AckFrameLegacy{
LargestObserved: protocol.PacketNumber(largestObserved),
Entropy: byte(entropy),
NackRanges: []frames.NackRange{
{FirstPacketNumber: 4, LastPacketNumber: 4},
},
}
err = handler.ReceivedAck(&ack2, 2)
Expect(err).ToNot(HaveOccurred())
Expect(handler.BytesInFlight()).To(Equal(protocol.ByteCount(1)))
Expect(handler.packetHistory).To(HaveKey(protocol.PacketNumber(4)))
})
})
Context("ACK processing", func() { // in all these tests, the EntropyBit of each Packet is set to false, so that the resulting EntropyByte will always be 0