From 4806807caaa9da92485de856dd8e03f5e3e33a7e Mon Sep 17 00:00:00 2001 From: Lucas Clemente Date: Sun, 24 Apr 2016 12:24:13 +0200 Subject: [PATCH] initial hybrid slow start implementation --- congestion/cubic_test.go | 2 +- congestion/hybrid_slow_start.go | 25 +++++++++++++++ congestion/hybrid_slow_start_test.go | 47 ++++++++++++++++++++++++++++ 3 files changed, 73 insertions(+), 1 deletion(-) create mode 100644 congestion/hybrid_slow_start.go create mode 100644 congestion/hybrid_slow_start_test.go diff --git a/congestion/cubic_test.go b/congestion/cubic_test.go index 4533f4434..0f4531252 100644 --- a/congestion/cubic_test.go +++ b/congestion/cubic_test.go @@ -70,7 +70,7 @@ var _ = Describe("Cubic", func() { Expect(current_cwnd).To(Equal(expected_cwnd)) }) - // TODO: Test copied form Chromium has no assertions + // TODO: Test copied from Chromium has no assertions It("has increasing cwnd stats during convex region", func() { rtt_min := 100 * time.Millisecond current_cwnd := uint64(10) diff --git a/congestion/hybrid_slow_start.go b/congestion/hybrid_slow_start.go new file mode 100644 index 000000000..0d31b8fb8 --- /dev/null +++ b/congestion/hybrid_slow_start.go @@ -0,0 +1,25 @@ +package congestion + +import "time" + +// HybridSlowStart implements the TCP hybrid slow start algorithm +type HybridSlowStart struct { + endPacketNumber uint64 + lastSentPacketNumber uint64 + started bool + currentMinRTT time.Duration + rttSampleCount uint32 +} + +// StartReceiveRound is called for the start of each receive round (burst) in the slow start phase. +func (s *HybridSlowStart) StartReceiveRound(last_sent uint64) { + s.endPacketNumber = last_sent + s.currentMinRTT = 0 + s.rttSampleCount = 0 + s.started = true +} + +// IsEndOfRound returns true if this ack is the last packet number of our current slow start round. +func (s *HybridSlowStart) IsEndOfRound(ack uint64) bool { + return s.endPacketNumber < ack +} diff --git a/congestion/hybrid_slow_start_test.go b/congestion/hybrid_slow_start_test.go new file mode 100644 index 000000000..f45686832 --- /dev/null +++ b/congestion/hybrid_slow_start_test.go @@ -0,0 +1,47 @@ +package congestion_test + +import ( + "github.com/lucas-clemente/quic-go/congestion" + . "github.com/onsi/ginkgo" + . "github.com/onsi/gomega" +) + +var _ = Describe("Hybrid slow start", func() { + var ( + slowStart congestion.HybridSlowStart + ) + + BeforeEach(func() { + slowStart = congestion.HybridSlowStart{} + }) + + It("works in a simple case", func() { + packet_number := uint64(1) + end_packet_number := uint64(3) + slowStart.StartReceiveRound(end_packet_number) + + packet_number++ + Expect(slowStart.IsEndOfRound(packet_number)).To(BeFalse()) + + // Test duplicates. + Expect(slowStart.IsEndOfRound(packet_number)).To(BeFalse()) + + packet_number++ + Expect(slowStart.IsEndOfRound(packet_number)).To(BeFalse()) + packet_number++ + Expect(slowStart.IsEndOfRound(packet_number)).To(BeTrue()) + + // Test without a new registered end_packet_number; + packet_number++ + Expect(slowStart.IsEndOfRound(packet_number)).To(BeTrue()) + + end_packet_number = 20 + slowStart.StartReceiveRound(end_packet_number) + for packet_number < end_packet_number { + packet_number++ + Expect(slowStart.IsEndOfRound(packet_number)).To(BeFalse()) + } + packet_number++ + Expect(slowStart.IsEndOfRound(packet_number)).To(BeTrue()) + }) +})