Index: net/quic/congestion_control/tcp_cubic_sender_test.cc |
diff --git a/net/quic/congestion_control/tcp_cubic_sender_test.cc b/net/quic/congestion_control/tcp_cubic_sender_test.cc |
index 9193941052ff14e8672ff3d4c28323dd35e8aaf8..4fe8dbfb5014ddb89aa5b2a88a050b86b7253fa8 100644 |
--- a/net/quic/congestion_control/tcp_cubic_sender_test.cc |
+++ b/net/quic/congestion_control/tcp_cubic_sender_test.cc |
@@ -23,6 +23,7 @@ namespace test { |
const int64 kInitialCongestionWindow = 10; |
const uint32 kDefaultWindowTCP = kInitialCongestionWindow * kDefaultTCPMSS; |
+const float kRenoBeta = 0.7f; // Reno backoff factor. |
// TODO(ianswett): Remove 10000 once b/10075719 is fixed. |
const QuicPacketCount kDefaultMaxCongestionWindowTCP = 10000; |
@@ -48,6 +49,10 @@ class TcpCubicSenderPeer : public TcpCubicSender { |
return hybrid_slow_start_; |
} |
+ float GetRenoBeta() const { |
+ return RenoBeta(); |
+ } |
+ |
RttStats rtt_stats_; |
QuicConnectionStats stats_; |
}; |
@@ -264,32 +269,26 @@ TEST_F(TcpCubicSenderTest, SlowStartPacketLoss) { |
// Lose a packet to exit slow start. |
LoseNPackets(1); |
+ size_t packets_in_recovery_window = expected_send_window / kDefaultTCPMSS; |
- // We should now have fallen out of slow start. |
- // We expect window to be cut in half by Reno. |
- expected_send_window /= 2; |
+ // We should now have fallen out of slow start with a reduced window. |
+ expected_send_window *= kRenoBeta; |
EXPECT_EQ(expected_send_window, sender_->GetCongestionWindow()); |
- // Testing Reno phase. |
- // We need to ack half of the pending packet before we can send again. |
+ // Recovery phase. We need to ack every packet in the recovery window before |
+ // we exit recovery. |
size_t number_of_packets_in_window = expected_send_window / kDefaultTCPMSS; |
- AckNPackets(number_of_packets_in_window); |
+ DVLOG(1) << "number_packets: " << number_of_packets_in_window; |
+ AckNPackets(packets_in_recovery_window); |
+ SendAvailableSendWindow(); |
EXPECT_EQ(expected_send_window, sender_->GetCongestionWindow()); |
- // We need to ack every packet in the window before we exit recovery. |
- for (size_t i = 0; i < number_of_packets_in_window; ++i) { |
- AckNPackets(1); |
- SendAvailableSendWindow(); |
- EXPECT_EQ(expected_send_window, sender_->GetCongestionWindow()); |
- } |
- |
- // We need to ack another window before we increase CWND by 1. |
- for (size_t i = 0; i < number_of_packets_in_window - 2; ++i) { |
- AckNPackets(1); |
- SendAvailableSendWindow(); |
- EXPECT_EQ(expected_send_window, sender_->GetCongestionWindow()); |
- } |
+ // We need to ack an entire window before we increase CWND by 1. |
+ AckNPackets(number_of_packets_in_window - 2); |
+ SendAvailableSendWindow(); |
+ EXPECT_EQ(expected_send_window, sender_->GetCongestionWindow()); |
+ // Next ack should increase cwnd by 1. |
AckNPackets(1); |
expected_send_window += kDefaultTCPMSS; |
EXPECT_EQ(expected_send_window, sender_->GetCongestionWindow()); |
@@ -330,27 +329,27 @@ TEST_F(TcpCubicSenderTest, SlowStartPacketLossPRR) { |
LoseNPackets(1); |
- // We should now have fallen out of slow start. |
- // We expect window to be cut in half by Reno. |
- expected_send_window /= 2; |
+ // We should now have fallen out of slow start with a reduced window. |
+ size_t send_window_before_loss = expected_send_window; |
+ expected_send_window *= kRenoBeta; |
EXPECT_EQ(expected_send_window, sender_->GetCongestionWindow()); |
// Testing TCP proportional rate reduction. |
- // We should send one packet for every two received acks over the remaining |
- // 18 outstanding packets. |
- size_t number_of_packets_in_window = expected_send_window / kDefaultTCPMSS; |
- // The number of packets before we exit recovery is the original CWND minus |
- // the packet that has been lost and the one which triggered the loss. |
- size_t remaining_packets_in_recovery = number_of_packets_in_window * 2 - 1; |
- for (size_t i = 0; i < remaining_packets_in_recovery - 1; i += 2) { |
- AckNPackets(2); |
- EXPECT_TRUE(sender_->TimeUntilSend( |
- clock_.Now(), bytes_in_flight_, HAS_RETRANSMITTABLE_DATA).IsZero()); |
- EXPECT_EQ(1, SendAvailableSendWindow()); |
+ // We should send packets paced over the received acks for the remaining |
+ // outstanding packets. The number of packets before we exit recovery is the |
+ // original CWND minus the packet that has been lost and the one which |
+ // triggered the loss. |
+ size_t remaining_packets_in_recovery = |
+ send_window_before_loss / kDefaultTCPMSS - 2; |
+ |
+ for (size_t i = 0; i < remaining_packets_in_recovery; ++i) { |
+ AckNPackets(1); |
+ SendAvailableSendWindow(); |
EXPECT_EQ(expected_send_window, sender_->GetCongestionWindow()); |
} |
// We need to ack another window before we increase CWND by 1. |
+ size_t number_of_packets_in_window = expected_send_window / kDefaultTCPMSS; |
for (size_t i = 0; i < number_of_packets_in_window; ++i) { |
AckNPackets(1); |
EXPECT_EQ(1, SendAvailableSendWindow()); |
@@ -367,8 +366,8 @@ TEST_F(TcpCubicSenderTest, SlowStartBurstPacketLossPRR) { |
// Test based on the second example in RFC6937, though we also implement |
// forward acknowledgements, so the first two incoming acks will trigger |
// PRR immediately. |
- // Ack 10 packets in 5 acks to raise the CWND to 20, as in the example. |
- const int kNumberOfAcks = 5; |
+ // Ack 20 packets in 10 acks to raise the CWND to 30. |
+ const int kNumberOfAcks = 10; |
for (int i = 0; i < kNumberOfAcks; ++i) { |
// Send our full send window. |
SendAvailableSendWindow(); |
@@ -379,17 +378,20 @@ TEST_F(TcpCubicSenderTest, SlowStartBurstPacketLossPRR) { |
(kDefaultTCPMSS * 2 * kNumberOfAcks); |
EXPECT_EQ(expected_send_window, sender_->GetCongestionWindow()); |
- // Ack a packet with a 15 packet gap, losing 13 of them due to FACK. |
- LoseNPackets(13); |
+ // Lose one more than the congestion window reduction, so that after loss, |
+ // bytes_in_flight is lesser than the congestion window. |
+ size_t send_window_after_loss = kRenoBeta * expected_send_window; |
+ size_t num_packets_to_lose = |
+ (expected_send_window - send_window_after_loss) / kDefaultTCPMSS + 1; |
+ LoseNPackets(num_packets_to_lose); |
// Immediately after the loss, ensure at least one packet can be sent. |
// Losses without subsequent acks can occur with timer based loss detection. |
EXPECT_TRUE(sender_->TimeUntilSend( |
clock_.Now(), bytes_in_flight_, HAS_RETRANSMITTABLE_DATA).IsZero()); |
AckNPackets(1); |
- // We should now have fallen out of slow start. |
- // We expect window to be cut in half by Reno. |
- expected_send_window /= 2; |
+ // We should now have fallen out of slow start with a reduced window. |
+ expected_send_window *= kRenoBeta; |
EXPECT_EQ(expected_send_window, sender_->GetCongestionWindow()); |
// Only 2 packets should be allowed to be sent, per PRR-SSRB |
@@ -409,15 +411,6 @@ TEST_F(TcpCubicSenderTest, SlowStartBurstPacketLossPRR) { |
// Send 2 packets to simulate PRR-SSRB. |
EXPECT_EQ(2, SendAvailableSendWindow()); |
- AckNPackets(1); |
- EXPECT_EQ(2, SendAvailableSendWindow()); |
- |
- AckNPackets(1); |
- EXPECT_EQ(2, SendAvailableSendWindow()); |
- |
- // The window should not have changed. |
- EXPECT_EQ(expected_send_window, sender_->GetCongestionWindow()); |
- |
// Exit recovery and return to sending at the new rate. |
for (int i = 0; i < kNumberOfAcks; ++i) { |
AckNPackets(1); |
@@ -609,9 +602,8 @@ TEST_F(TcpCubicSenderTest, 2ConnectionCongestionAvoidanceAtEndOfRecovery) { |
LoseNPackets(1); |
- // We should now have fallen out of slow start, and window should be cut in |
- // half by Reno. New cwnd should be 10. |
- expected_send_window /= 2; |
+ // We should now have fallen out of slow start with a reduced window. |
+ expected_send_window = expected_send_window * sender_->GetRenoBeta(); |
EXPECT_EQ(expected_send_window, sender_->GetCongestionWindow()); |
// No congestion window growth should occur in recovery phase, i.e., until the |
@@ -626,22 +618,25 @@ TEST_F(TcpCubicSenderTest, 2ConnectionCongestionAvoidanceAtEndOfRecovery) { |
EXPECT_FALSE(sender_->InRecovery()); |
// Out of recovery now. Congestion window should not grow for half an RTT. |
+ size_t packets_in_send_window = expected_send_window / kDefaultTCPMSS; |
SendAvailableSendWindow(); |
- AckNPackets(2); |
+ AckNPackets(packets_in_send_window / 2 - 2); |
EXPECT_EQ(expected_send_window, sender_->GetCongestionWindow()); |
- // Next ack will be the 5th and should increase congestion window by 1MSS. |
+ // Next ack should increase congestion window by 1MSS. |
+ SendAvailableSendWindow(); |
AckNPackets(2); |
expected_send_window += kDefaultTCPMSS; |
+ packets_in_send_window += 1; |
EXPECT_EQ(expected_send_window, sender_->GetCongestionWindow()); |
- for (int i = 0; i < 2; ++i) { |
- SendAvailableSendWindow(); |
- AckNPackets(2); |
- EXPECT_EQ(expected_send_window, sender_->GetCongestionWindow()); |
- } |
+ // Congestion window should remain steady again for half an RTT. |
+ SendAvailableSendWindow(); |
+ AckNPackets(packets_in_send_window / 2 - 1); |
+ EXPECT_EQ(expected_send_window, sender_->GetCongestionWindow()); |
// Next ack should cause congestion window to grow by 1MSS. |
+ SendAvailableSendWindow(); |
AckNPackets(2); |
expected_send_window += kDefaultTCPMSS; |
EXPECT_EQ(expected_send_window, sender_->GetCongestionWindow()); |
@@ -663,9 +658,8 @@ TEST_F(TcpCubicSenderTest, 1ConnectionCongestionAvoidanceAtEndOfRecovery) { |
LoseNPackets(1); |
- // We should now have fallen out of slow start, and window should be cut in |
- // half by Reno. New cwnd should be 10. |
- expected_send_window /= 2; |
+ // We should now have fallen out of slow start with a reduced window. |
+ expected_send_window *= kRenoBeta; |
EXPECT_EQ(expected_send_window, sender_->GetCongestionWindow()); |
// No congestion window growth should occur in recovery phase, i.e., until the |
@@ -680,7 +674,7 @@ TEST_F(TcpCubicSenderTest, 1ConnectionCongestionAvoidanceAtEndOfRecovery) { |
EXPECT_FALSE(sender_->InRecovery()); |
// Out of recovery now. Congestion window should not grow during RTT. |
- for (int i = 0; i < 4; ++i) { |
+ for (uint64 i = 0; i < expected_send_window / kDefaultTCPMSS - 2; i += 2) { |
// Send our full send window. |
SendAvailableSendWindow(); |
AckNPackets(2); |
@@ -688,6 +682,7 @@ TEST_F(TcpCubicSenderTest, 1ConnectionCongestionAvoidanceAtEndOfRecovery) { |
} |
// Next ack should cause congestion window to grow by 1MSS. |
+ SendAvailableSendWindow(); |
AckNPackets(2); |
expected_send_window += kDefaultTCPMSS; |
EXPECT_EQ(expected_send_window, sender_->GetCongestionWindow()); |