| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include <algorithm> | 5 #include <algorithm> |
| 6 | 6 |
| 7 #include "base/logging.h" | 7 #include "base/logging.h" |
| 8 #include "base/memory/scoped_ptr.h" | 8 #include "base/memory/scoped_ptr.h" |
| 9 #include "net/quic/congestion_control/rtt_stats.h" | 9 #include "net/quic/congestion_control/rtt_stats.h" |
| 10 #include "net/quic/congestion_control/tcp_cubic_sender.h" | 10 #include "net/quic/congestion_control/tcp_cubic_sender.h" |
| (...skipping 183 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 194 // Send our full send window. | 194 // Send our full send window. |
| 195 SendAvailableSendWindow(); | 195 SendAvailableSendWindow(); |
| 196 AckNPackets(2); | 196 AckNPackets(2); |
| 197 } | 197 } |
| 198 QuicByteCount bytes_to_send = sender_->SendWindow(); | 198 QuicByteCount bytes_to_send = sender_->SendWindow(); |
| 199 EXPECT_EQ(kDefaultWindowTCP + kDefaultTCPMSS * 2 * kNumberOfAcks, | 199 EXPECT_EQ(kDefaultWindowTCP + kDefaultTCPMSS * 2 * kNumberOfAcks, |
| 200 bytes_to_send); | 200 bytes_to_send); |
| 201 } | 201 } |
| 202 | 202 |
| 203 TEST_F(TcpCubicSenderTest, SlowStartAckTrain) { | 203 TEST_F(TcpCubicSenderTest, SlowStartAckTrain) { |
| 204 sender_->SetNumEmulatedConnections(1); |
| 204 EXPECT_EQ(kDefaultMaxCongestionWindowTCP * kDefaultTCPMSS, | 205 EXPECT_EQ(kDefaultMaxCongestionWindowTCP * kDefaultTCPMSS, |
| 205 sender_->GetSlowStartThreshold()); | 206 sender_->GetSlowStartThreshold()); |
| 206 | 207 |
| 207 // Make sure that we fall out of slow start when we send ACK train longer | 208 // Make sure that we fall out of slow start when we send ACK train longer |
| 208 // than half the RTT, in this test case 30ms, which is more than 30 calls to | 209 // than half the RTT, in this test case 30ms, which is more than 30 calls to |
| 209 // Ack2Packets in one round. | 210 // Ack2Packets in one round. |
| 210 // Since we start at 10 packet first round will be 5 second round 10 etc | 211 // Since we start at 10 packet first round will be 5 second round 10 etc |
| 211 // Hence we should pass 30 at 65 = 5 + 10 + 20 + 30 | 212 // Hence we should pass 30 at 65 = 5 + 10 + 20 + 30 |
| 212 const int kNumberOfAcks = 65; | 213 const int kNumberOfAcks = 65; |
| 213 for (int i = 0; i < kNumberOfAcks; ++i) { | 214 for (int i = 0; i < kNumberOfAcks; ++i) { |
| (...skipping 30 matching lines...) Expand all Loading... |
| 244 EXPECT_EQ(expected_send_window / 2 / kDefaultTCPMSS, | 245 EXPECT_EQ(expected_send_window / 2 / kDefaultTCPMSS, |
| 245 sender_->slowstart_threshold()); | 246 sender_->slowstart_threshold()); |
| 246 | 247 |
| 247 // Now revert the RTO and ensure the CWND and slowstart threshold revert. | 248 // Now revert the RTO and ensure the CWND and slowstart threshold revert. |
| 248 sender_->RevertRetransmissionTimeout(); | 249 sender_->RevertRetransmissionTimeout(); |
| 249 EXPECT_EQ(expected_send_window, sender_->GetCongestionWindow()); | 250 EXPECT_EQ(expected_send_window, sender_->GetCongestionWindow()); |
| 250 EXPECT_EQ(140u, sender_->slowstart_threshold()); | 251 EXPECT_EQ(140u, sender_->slowstart_threshold()); |
| 251 } | 252 } |
| 252 | 253 |
| 253 TEST_F(TcpCubicSenderTest, SlowStartPacketLoss) { | 254 TEST_F(TcpCubicSenderTest, SlowStartPacketLoss) { |
| 255 sender_->SetNumEmulatedConnections(1); |
| 254 const int kNumberOfAcks = 10; | 256 const int kNumberOfAcks = 10; |
| 255 for (int i = 0; i < kNumberOfAcks; ++i) { | 257 for (int i = 0; i < kNumberOfAcks; ++i) { |
| 256 // Send our full send window. | 258 // Send our full send window. |
| 257 SendAvailableSendWindow(); | 259 SendAvailableSendWindow(); |
| 258 AckNPackets(2); | 260 AckNPackets(2); |
| 259 } | 261 } |
| 260 SendAvailableSendWindow(); | 262 SendAvailableSendWindow(); |
| 261 QuicByteCount expected_send_window = kDefaultWindowTCP + | 263 QuicByteCount expected_send_window = kDefaultWindowTCP + |
| 262 (kDefaultTCPMSS * 2 * kNumberOfAcks); | 264 (kDefaultTCPMSS * 2 * kNumberOfAcks); |
| 263 EXPECT_EQ(expected_send_window, sender_->GetCongestionWindow()); | 265 EXPECT_EQ(expected_send_window, sender_->GetCongestionWindow()); |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 307 // PRR will allow 2 packets for every ack during recovery. | 309 // PRR will allow 2 packets for every ack during recovery. |
| 308 EXPECT_EQ(2, SendAvailableSendWindow()); | 310 EXPECT_EQ(2, SendAvailableSendWindow()); |
| 309 // Simulate abandoning all packets by supplying a bytes_in_flight of 0. | 311 // Simulate abandoning all packets by supplying a bytes_in_flight of 0. |
| 310 // PRR should now allow a packet to be sent, even though prr's state | 312 // PRR should now allow a packet to be sent, even though prr's state |
| 311 // variables believe it has sent enough packets. | 313 // variables believe it has sent enough packets. |
| 312 EXPECT_EQ(QuicTime::Delta::Zero(), | 314 EXPECT_EQ(QuicTime::Delta::Zero(), |
| 313 sender_->TimeUntilSend(clock_.Now(), 0, HAS_RETRANSMITTABLE_DATA)); | 315 sender_->TimeUntilSend(clock_.Now(), 0, HAS_RETRANSMITTABLE_DATA)); |
| 314 } | 316 } |
| 315 | 317 |
| 316 TEST_F(TcpCubicSenderTest, SlowStartPacketLossPRR) { | 318 TEST_F(TcpCubicSenderTest, SlowStartPacketLossPRR) { |
| 319 sender_->SetNumEmulatedConnections(1); |
| 317 // Test based on the first example in RFC6937. | 320 // Test based on the first example in RFC6937. |
| 318 // Ack 10 packets in 5 acks to raise the CWND to 20, as in the example. | 321 // Ack 10 packets in 5 acks to raise the CWND to 20, as in the example. |
| 319 const int kNumberOfAcks = 5; | 322 const int kNumberOfAcks = 5; |
| 320 for (int i = 0; i < kNumberOfAcks; ++i) { | 323 for (int i = 0; i < kNumberOfAcks; ++i) { |
| 321 // Send our full send window. | 324 // Send our full send window. |
| 322 SendAvailableSendWindow(); | 325 SendAvailableSendWindow(); |
| 323 AckNPackets(2); | 326 AckNPackets(2); |
| 324 } | 327 } |
| 325 SendAvailableSendWindow(); | 328 SendAvailableSendWindow(); |
| 326 QuicByteCount expected_send_window = kDefaultWindowTCP + | 329 QuicByteCount expected_send_window = kDefaultWindowTCP + |
| (...skipping 28 matching lines...) Expand all Loading... |
| 355 EXPECT_EQ(1, SendAvailableSendWindow()); | 358 EXPECT_EQ(1, SendAvailableSendWindow()); |
| 356 EXPECT_EQ(expected_send_window, sender_->GetCongestionWindow()); | 359 EXPECT_EQ(expected_send_window, sender_->GetCongestionWindow()); |
| 357 } | 360 } |
| 358 | 361 |
| 359 AckNPackets(1); | 362 AckNPackets(1); |
| 360 expected_send_window += kDefaultTCPMSS; | 363 expected_send_window += kDefaultTCPMSS; |
| 361 EXPECT_EQ(expected_send_window, sender_->GetCongestionWindow()); | 364 EXPECT_EQ(expected_send_window, sender_->GetCongestionWindow()); |
| 362 } | 365 } |
| 363 | 366 |
| 364 TEST_F(TcpCubicSenderTest, SlowStartBurstPacketLossPRR) { | 367 TEST_F(TcpCubicSenderTest, SlowStartBurstPacketLossPRR) { |
| 368 sender_->SetNumEmulatedConnections(1); |
| 365 // Test based on the second example in RFC6937, though we also implement | 369 // Test based on the second example in RFC6937, though we also implement |
| 366 // forward acknowledgements, so the first two incoming acks will trigger | 370 // forward acknowledgements, so the first two incoming acks will trigger |
| 367 // PRR immediately. | 371 // PRR immediately. |
| 368 // Ack 10 packets in 5 acks to raise the CWND to 20, as in the example. | 372 // Ack 10 packets in 5 acks to raise the CWND to 20, as in the example. |
| 369 const int kNumberOfAcks = 5; | 373 const int kNumberOfAcks = 5; |
| 370 for (int i = 0; i < kNumberOfAcks; ++i) { | 374 for (int i = 0; i < kNumberOfAcks; ++i) { |
| 371 // Send our full send window. | 375 // Send our full send window. |
| 372 SendAvailableSendWindow(); | 376 SendAvailableSendWindow(); |
| 373 AckNPackets(2); | 377 AckNPackets(2); |
| 374 } | 378 } |
| (...skipping 209 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 584 | 588 |
| 585 // Verify that kCOPT: kIW10 forces the congestion window to the | 589 // Verify that kCOPT: kIW10 forces the congestion window to the |
| 586 // default of 10 regardless of ReceivedInitialWindow. | 590 // default of 10 regardless of ReceivedInitialWindow. |
| 587 QuicTagVector options; | 591 QuicTagVector options; |
| 588 options.push_back(kIW10); | 592 options.push_back(kIW10); |
| 589 QuicConfigPeer::SetReceivedConnectionOptions(&config, options); | 593 QuicConfigPeer::SetReceivedConnectionOptions(&config, options); |
| 590 sender_->SetFromConfig(config, true); | 594 sender_->SetFromConfig(config, true); |
| 591 EXPECT_EQ(congestion_window, sender_->congestion_window()); | 595 EXPECT_EQ(congestion_window, sender_->congestion_window()); |
| 592 } | 596 } |
| 593 | 597 |
| 594 TEST_F(TcpCubicSenderTest, CongestionAvoidanceAtEndOfRecovery) { | 598 TEST_F(TcpCubicSenderTest, 2ConnectionCongestionAvoidanceAtEndOfRecovery) { |
| 599 sender_->SetNumEmulatedConnections(2); |
| 595 // Ack 10 packets in 5 acks to raise the CWND to 20. | 600 // Ack 10 packets in 5 acks to raise the CWND to 20. |
| 596 const int kNumberOfAcks = 5; | 601 const int kNumberOfAcks = 5; |
| 597 for (int i = 0; i < kNumberOfAcks; ++i) { | 602 for (int i = 0; i < kNumberOfAcks; ++i) { |
| 603 // Send our full send window. |
| 604 SendAvailableSendWindow(); |
| 605 AckNPackets(2); |
| 606 } |
| 607 SendAvailableSendWindow(); |
| 608 QuicByteCount expected_send_window = kDefaultWindowTCP + |
| 609 (kDefaultTCPMSS * 2 * kNumberOfAcks); |
| 610 EXPECT_EQ(expected_send_window, sender_->GetCongestionWindow()); |
| 611 |
| 612 LoseNPackets(1); |
| 613 |
| 614 // We should now have fallen out of slow start, and window should be cut in |
| 615 // half by Reno. New cwnd should be 10. |
| 616 expected_send_window /= 2; |
| 617 EXPECT_EQ(expected_send_window, sender_->GetCongestionWindow()); |
| 618 |
| 619 // No congestion window growth should occur in recovery phase, i.e., until the |
| 620 // currently outstanding 20 packets are acked. |
| 621 for (int i = 0; i < 10; ++i) { |
| 622 // Send our full send window. |
| 623 SendAvailableSendWindow(); |
| 624 EXPECT_TRUE(sender_->InRecovery()); |
| 625 AckNPackets(2); |
| 626 EXPECT_EQ(expected_send_window, sender_->GetCongestionWindow()); |
| 627 } |
| 628 EXPECT_FALSE(sender_->InRecovery()); |
| 629 |
| 630 // Out of recovery now. Congestion window should not grow for half an RTT. |
| 631 SendAvailableSendWindow(); |
| 632 AckNPackets(2); |
| 633 EXPECT_EQ(expected_send_window, sender_->GetCongestionWindow()); |
| 634 |
| 635 // Next ack will be the 5th and should increase congestion window by 1MSS. |
| 636 AckNPackets(2); |
| 637 expected_send_window += kDefaultTCPMSS; |
| 638 EXPECT_EQ(expected_send_window, sender_->GetCongestionWindow()); |
| 639 |
| 640 for (int i = 0; i < 2; ++i) { |
| 641 SendAvailableSendWindow(); |
| 642 AckNPackets(2); |
| 643 EXPECT_EQ(expected_send_window, sender_->GetCongestionWindow()); |
| 644 } |
| 645 |
| 646 // Next ack should cause congestion window to grow by 1MSS. |
| 647 AckNPackets(2); |
| 648 expected_send_window += kDefaultTCPMSS; |
| 649 EXPECT_EQ(expected_send_window, sender_->GetCongestionWindow()); |
| 650 } |
| 651 |
| 652 TEST_F(TcpCubicSenderTest, 1ConnectionCongestionAvoidanceAtEndOfRecovery) { |
| 653 sender_->SetNumEmulatedConnections(1); |
| 654 // Ack 10 packets in 5 acks to raise the CWND to 20. |
| 655 const int kNumberOfAcks = 5; |
| 656 for (int i = 0; i < kNumberOfAcks; ++i) { |
| 598 // Send our full send window. | 657 // Send our full send window. |
| 599 SendAvailableSendWindow(); | 658 SendAvailableSendWindow(); |
| 600 AckNPackets(2); | 659 AckNPackets(2); |
| 601 } | 660 } |
| 602 SendAvailableSendWindow(); | 661 SendAvailableSendWindow(); |
| 603 QuicByteCount expected_send_window = kDefaultWindowTCP + | 662 QuicByteCount expected_send_window = kDefaultWindowTCP + |
| 604 (kDefaultTCPMSS * 2 * kNumberOfAcks); | 663 (kDefaultTCPMSS * 2 * kNumberOfAcks); |
| 605 EXPECT_EQ(expected_send_window, sender_->GetCongestionWindow()); | 664 EXPECT_EQ(expected_send_window, sender_->GetCongestionWindow()); |
| 606 | 665 |
| 607 LoseNPackets(1); | 666 LoseNPackets(1); |
| 608 | 667 |
| 609 // We should now have fallen out of slow start, and window should be cut in | 668 // We should now have fallen out of slow start, and window should be cut in |
| 610 // half by Reno. New cwnd should be 10. | 669 // half by Reno. New cwnd should be 10. |
| 611 expected_send_window /= 2; | 670 expected_send_window /= 2; |
| 612 EXPECT_EQ(expected_send_window, sender_->GetCongestionWindow()); | 671 EXPECT_EQ(expected_send_window, sender_->GetCongestionWindow()); |
| 613 | 672 |
| 614 // No congestion window growth should occur in recovery phase, i.e., | 673 // No congestion window growth should occur in recovery phase, i.e., |
| 615 // until the currently outstanding 20 packets are acked. | 674 // until the currently outstanding 20 packets are acked. |
| 616 for (int i = 0; i < 10; ++i) { | 675 for (int i = 0; i < 10; ++i) { |
| 617 // Send our full send window. | 676 // Send our full send window. |
| 618 SendAvailableSendWindow(); | 677 SendAvailableSendWindow(); |
| 678 EXPECT_TRUE(sender_->InRecovery()); |
| 619 AckNPackets(2); | 679 AckNPackets(2); |
| 620 EXPECT_EQ(expected_send_window, sender_->GetCongestionWindow()); | 680 EXPECT_EQ(expected_send_window, sender_->GetCongestionWindow()); |
| 621 } | 681 } |
| 682 EXPECT_FALSE(sender_->InRecovery()); |
| 622 | 683 |
| 623 // Out of recovery now. Congestion window should not grow during RTT. | 684 // Out of recovery now. Congestion window should not grow during RTT. |
| 624 for (int i = 0; i < 4; ++i) { | 685 for (int i = 0; i < 4; ++i) { |
| 625 // Send our full send window. | 686 // Send our full send window. |
| 626 SendAvailableSendWindow(); | 687 SendAvailableSendWindow(); |
| 627 AckNPackets(2); | 688 AckNPackets(2); |
| 628 EXPECT_EQ(expected_send_window, sender_->GetCongestionWindow()); | 689 EXPECT_EQ(expected_send_window, sender_->GetCongestionWindow()); |
| 629 } | 690 } |
| 630 | 691 |
| 631 // Next ack should cause congestion window to grow by 1MSS. | 692 // Next ack should cause congestion window to grow by 1MSS. |
| 632 AckNPackets(2); | 693 AckNPackets(2); |
| 633 expected_send_window += kDefaultTCPMSS; | 694 expected_send_window += kDefaultTCPMSS; |
| 634 EXPECT_EQ(expected_send_window, sender_->GetCongestionWindow()); | 695 EXPECT_EQ(expected_send_window, sender_->GetCongestionWindow()); |
| 635 } | 696 } |
| 636 | 697 |
| 637 } // namespace test | 698 } // namespace test |
| 638 } // namespace net | 699 } // namespace net |
| OLD | NEW |