| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 "net/quic/congestion_control/send_algorithm_simulator.h" | 5 #include "net/quic/congestion_control/send_algorithm_simulator.h" |
| 6 | 6 |
| 7 #include <stdint.h> | 7 #include <stdint.h> |
| 8 | 8 |
| 9 #include <limits> | 9 #include <limits> |
| 10 | 10 |
| (...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 91 pending_transfers_.back().sender->RecordStats(); | 91 pending_transfers_.back().sender->RecordStats(); |
| 92 } | 92 } |
| 93 | 93 |
| 94 void SendAlgorithmSimulator::TransferBytes() { | 94 void SendAlgorithmSimulator::TransferBytes() { |
| 95 TransferBytes(std::numeric_limits<uint64_t>::max(), | 95 TransferBytes(std::numeric_limits<uint64_t>::max(), |
| 96 QuicTime::Delta::Infinite()); | 96 QuicTime::Delta::Infinite()); |
| 97 } | 97 } |
| 98 | 98 |
| 99 void SendAlgorithmSimulator::TransferBytes(QuicByteCount max_bytes, | 99 void SendAlgorithmSimulator::TransferBytes(QuicByteCount max_bytes, |
| 100 QuicTime::Delta max_time) { | 100 QuicTime::Delta max_time) { |
| 101 const QuicTime end_time = | 101 const QuicTime end_time = max_time.IsInfinite() |
| 102 max_time.IsInfinite() ? QuicTime::Zero().Add(QuicTime::Delta::Infinite()) | 102 ? QuicTime::Zero() + QuicTime::Delta::Infinite() |
| 103 : clock_->Now().Add(max_time); | 103 : clock_->Now() + max_time; |
| 104 QuicByteCount bytes_sent = 0; | 104 QuicByteCount bytes_sent = 0; |
| 105 while (!pending_transfers_.empty() && clock_->Now() < end_time && | 105 while (!pending_transfers_.empty() && clock_->Now() < end_time && |
| 106 bytes_sent < max_bytes) { | 106 bytes_sent < max_bytes) { |
| 107 // Determine the times of next send and of the next ack arrival. | 107 // Determine the times of next send and of the next ack arrival. |
| 108 PacketEvent send_event = NextSendEvent(); | 108 PacketEvent send_event = NextSendEvent(); |
| 109 PacketEvent ack_event = NextAckEvent(); | 109 PacketEvent ack_event = NextAckEvent(); |
| 110 // If both times are infinite, fire a TLP. | 110 // If both times are infinite, fire a TLP. |
| 111 if (ack_event.time_delta.IsInfinite() && | 111 if (ack_event.time_delta.IsInfinite() && |
| 112 send_event.time_delta.IsInfinite()) { | 112 send_event.time_delta.IsInfinite()) { |
| 113 DVLOG(1) << "Both times are infinite, simulating a TLP."; | 113 DVLOG(1) << "Both times are infinite, simulating a TLP."; |
| (...skipping 24 matching lines...) Expand all Loading... |
| 138 SendAlgorithmSimulator::PacketEvent SendAlgorithmSimulator::NextSendEvent() { | 138 SendAlgorithmSimulator::PacketEvent SendAlgorithmSimulator::NextSendEvent() { |
| 139 QuicTime::Delta next_send_time = QuicTime::Delta::Infinite(); | 139 QuicTime::Delta next_send_time = QuicTime::Delta::Infinite(); |
| 140 Transfer* transfer = nullptr; | 140 Transfer* transfer = nullptr; |
| 141 for (vector<Transfer>::iterator it = pending_transfers_.begin(); | 141 for (vector<Transfer>::iterator it = pending_transfers_.begin(); |
| 142 it != pending_transfers_.end(); ++it) { | 142 it != pending_transfers_.end(); ++it) { |
| 143 // If we've already sent enough bytes, wait for them to be acked. | 143 // If we've already sent enough bytes, wait for them to be acked. |
| 144 if (it->bytes_acked + it->bytes_in_flight >= it->num_bytes) { | 144 if (it->bytes_acked + it->bytes_in_flight >= it->num_bytes) { |
| 145 continue; | 145 continue; |
| 146 } | 146 } |
| 147 // If the flow hasn't started, use the start time. | 147 // If the flow hasn't started, use the start time. |
| 148 QuicTime::Delta transfer_send_time = it->start_time.Subtract(clock_->Now()); | 148 QuicTime::Delta transfer_send_time = it->start_time - clock_->Now(); |
| 149 if (clock_->Now() >= it->start_time) { | 149 if (clock_->Now() >= it->start_time) { |
| 150 transfer_send_time = it->sender->send_algorithm->TimeUntilSend( | 150 transfer_send_time = it->sender->send_algorithm->TimeUntilSend( |
| 151 clock_->Now(), it->bytes_in_flight); | 151 clock_->Now(), it->bytes_in_flight); |
| 152 } | 152 } |
| 153 if (transfer_send_time < next_send_time) { | 153 if (transfer_send_time < next_send_time) { |
| 154 next_send_time = transfer_send_time; | 154 next_send_time = transfer_send_time; |
| 155 transfer = &(*it); | 155 transfer = &(*it); |
| 156 } | 156 } |
| 157 } | 157 } |
| 158 DVLOG(1) << "NextSendTime returning delta(ms):" | 158 DVLOG(1) << "NextSendTime returning delta(ms):" |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 218 // Skip over any packets less than or equal to last_acked. | 218 // Skip over any packets less than or equal to last_acked. |
| 219 if (it->packet_number <= last_acked) { | 219 if (it->packet_number <= last_acked) { |
| 220 continue; | 220 continue; |
| 221 } | 221 } |
| 222 // Lost packets don't trigger an ack. | 222 // Lost packets don't trigger an ack. |
| 223 if (it->lost) { | 223 if (it->lost) { |
| 224 continue; | 224 continue; |
| 225 } | 225 } |
| 226 DCHECK_LT(*next_acked, it->packet_number); | 226 DCHECK_LT(*next_acked, it->packet_number); |
| 227 // Consider a delayed ack for the current next_acked. | 227 // Consider a delayed ack for the current next_acked. |
| 228 if (ack_delay < it->ack_time.Subtract(clock_->Now())) { | 228 if (ack_delay < it->ack_time - clock_->Now()) { |
| 229 break; | 229 break; |
| 230 } | 230 } |
| 231 *next_acked = it->packet_number; | 231 *next_acked = it->packet_number; |
| 232 ack_delay = it->ack_time.Subtract(clock_->Now()); | 232 ack_delay = it->ack_time - clock_->Now(); |
| 233 if (HasRecentLostPackets(transfer, *next_acked) || | 233 if (HasRecentLostPackets(transfer, *next_acked) || |
| 234 (*next_acked - last_acked) >= 2) { | 234 (*next_acked - last_acked) >= 2) { |
| 235 break; | 235 break; |
| 236 } | 236 } |
| 237 ack_delay = ack_delay.Add(delayed_ack_timer_); | 237 ack_delay = ack_delay + delayed_ack_timer_; |
| 238 } | 238 } |
| 239 | 239 |
| 240 DVLOG(1) << "FindNextAck found next_acked_:" << transfer->sender->next_acked | 240 DVLOG(1) << "FindNextAck found next_acked_:" << transfer->sender->next_acked |
| 241 << " last_acked:" << transfer->sender->last_acked | 241 << " last_acked:" << transfer->sender->last_acked |
| 242 << " ack_time(ms):" << ack_delay.ToMilliseconds(); | 242 << " ack_time(ms):" << ack_delay.ToMilliseconds(); |
| 243 return ack_delay; | 243 return ack_delay; |
| 244 } | 244 } |
| 245 | 245 |
| 246 bool SendAlgorithmSimulator::HasRecentLostPackets( | 246 bool SendAlgorithmSimulator::HasRecentLostPackets( |
| 247 const Transfer* transfer, | 247 const Transfer* transfer, |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 301 // This packet has been acked or lost, remove it from sent_packets_. | 301 // This packet has been acked or lost, remove it from sent_packets_. |
| 302 largest_observed = *it; | 302 largest_observed = *it; |
| 303 sent_packets_.erase(it++); | 303 sent_packets_.erase(it++); |
| 304 } | 304 } |
| 305 | 305 |
| 306 DCHECK(!largest_observed.lost); | 306 DCHECK(!largest_observed.lost); |
| 307 DVLOG(1) << "Updating RTT from send_time:" | 307 DVLOG(1) << "Updating RTT from send_time:" |
| 308 << largest_observed.send_time.ToDebuggingValue() | 308 << largest_observed.send_time.ToDebuggingValue() |
| 309 << " to ack_time:" << largest_observed.ack_time.ToDebuggingValue(); | 309 << " to ack_time:" << largest_observed.ack_time.ToDebuggingValue(); |
| 310 QuicTime::Delta measured_rtt = | 310 QuicTime::Delta measured_rtt = |
| 311 largest_observed.ack_time.Subtract(largest_observed.send_time); | 311 largest_observed.ack_time - largest_observed.send_time; |
| 312 DCHECK_GE(measured_rtt.ToMicroseconds(), rtt_.ToMicroseconds()); | 312 DCHECK_GE(measured_rtt.ToMicroseconds(), rtt_.ToMicroseconds()); |
| 313 sender->rtt_stats->UpdateRtt(measured_rtt, QuicTime::Delta::Zero(), | 313 sender->rtt_stats->UpdateRtt(measured_rtt, QuicTime::Delta::Zero(), |
| 314 clock_->Now()); | 314 clock_->Now()); |
| 315 sender->send_algorithm->OnCongestionEvent(true, transfer->bytes_in_flight, | 315 sender->send_algorithm->OnCongestionEvent(true, transfer->bytes_in_flight, |
| 316 acked_packets, lost_packets); | 316 acked_packets, lost_packets); |
| 317 DCHECK_LE(kPacketSize * (acked_packets.size() + lost_packets.size()), | 317 DCHECK_LE(kPacketSize * (acked_packets.size() + lost_packets.size()), |
| 318 transfer->bytes_in_flight); | 318 transfer->bytes_in_flight); |
| 319 transfer->bytes_in_flight -= | 319 transfer->bytes_in_flight -= |
| 320 kPacketSize * (acked_packets.size() + lost_packets.size()); | 320 kPacketSize * (acked_packets.size() + lost_packets.size()); |
| 321 | 321 |
| 322 sender->RecordStats(); | 322 sender->RecordStats(); |
| 323 transfer->bytes_acked += acked_packets.size() * kPacketSize; | 323 transfer->bytes_acked += acked_packets.size() * kPacketSize; |
| 324 transfer->bytes_lost += lost_packets.size() * kPacketSize; | 324 transfer->bytes_lost += lost_packets.size() * kPacketSize; |
| 325 if (transfer->bytes_acked >= transfer->num_bytes) { | 325 if (transfer->bytes_acked >= transfer->num_bytes) { |
| 326 // Remove completed transfers and record transfer bandwidth. | 326 // Remove completed transfers and record transfer bandwidth. |
| 327 QuicTime::Delta transfer_time = | 327 QuicTime::Delta transfer_time = clock_->Now() - transfer->start_time; |
| 328 clock_->Now().Subtract(transfer->start_time); | |
| 329 sender->last_transfer_loss_rate = | 328 sender->last_transfer_loss_rate = |
| 330 static_cast<float>(transfer->bytes_lost) / | 329 static_cast<float>(transfer->bytes_lost) / |
| 331 (transfer->bytes_lost + transfer->bytes_acked); | 330 (transfer->bytes_lost + transfer->bytes_acked); |
| 332 sender->last_transfer_bandwidth = QuicBandwidth::FromBytesAndTimeDelta( | 331 sender->last_transfer_bandwidth = QuicBandwidth::FromBytesAndTimeDelta( |
| 333 transfer->num_bytes, transfer_time); | 332 transfer->num_bytes, transfer_time); |
| 334 DCHECK_GE(bandwidth_.ToBitsPerSecond(), | 333 DCHECK_GE(bandwidth_.ToBitsPerSecond(), |
| 335 sender->last_transfer_bandwidth.ToBitsPerSecond()); | 334 sender->last_transfer_bandwidth.ToBitsPerSecond()); |
| 336 for (vector<Transfer>::iterator it = pending_transfers_.begin(); | 335 for (vector<Transfer>::iterator it = pending_transfers_.begin(); |
| 337 it != pending_transfers_.end(); ++it) { | 336 it != pending_transfers_.end(); ++it) { |
| 338 if (transfer == &(*it)) { | 337 if (transfer == &(*it)) { |
| (...skipping 27 matching lines...) Expand all Loading... |
| 366 loss_correlation_ * std::numeric_limits<uint64_t>::max() > | 365 loss_correlation_ * std::numeric_limits<uint64_t>::max() > |
| 367 simple_random_.RandUint64()) { | 366 simple_random_.RandUint64()) { |
| 368 packet_lost = true; | 367 packet_lost = true; |
| 369 } | 368 } |
| 370 DVLOG(1) << "losing packet:" << sender->last_sent | 369 DVLOG(1) << "losing packet:" << sender->last_sent |
| 371 << " name:" << transfer->name << " due to random loss."; | 370 << " name:" << transfer->name << " due to random loss."; |
| 372 | 371 |
| 373 // If the number of bytes in flight are less than the bdp, there's | 372 // If the number of bytes in flight are less than the bdp, there's |
| 374 // no buffering delay. Bytes lost from the buffer are not counted. | 373 // no buffering delay. Bytes lost from the buffer are not counted. |
| 375 QuicByteCount bdp = bandwidth_.ToBytesPerPeriod(rtt_); | 374 QuicByteCount bdp = bandwidth_.ToBytesPerPeriod(rtt_); |
| 376 QuicTime ack_time = clock_->Now().Add(rtt_).Add(sender->additional_rtt); | 375 QuicTime ack_time = clock_->Now() + rtt_ + sender->additional_rtt; |
| 377 if (kPacketSize > bdp) { | 376 if (kPacketSize > bdp) { |
| 378 ack_time = ack_time.Add(bandwidth_.TransferTime(kPacketSize - bdp)); | 377 ack_time = ack_time + bandwidth_.TransferTime(kPacketSize - bdp); |
| 379 } | 378 } |
| 380 QuicTime queue_ack_time = sent_packets_.empty() | 379 QuicTime queue_ack_time = sent_packets_.empty() |
| 381 ? QuicTime::Zero() | 380 ? QuicTime::Zero() |
| 382 : sent_packets_.back().ack_time.Add( | 381 : sent_packets_.back().ack_time + |
| 383 bandwidth_.TransferTime(kPacketSize)); | 382 bandwidth_.TransferTime(kPacketSize); |
| 384 ack_time = QuicTime::Max(ack_time, queue_ack_time); | 383 ack_time = QuicTime::Max(ack_time, queue_ack_time); |
| 385 sent_packets_.push_back(SentPacket(sender->last_sent, clock_->Now(), | 384 sent_packets_.push_back(SentPacket(sender->last_sent, clock_->Now(), |
| 386 ack_time, packet_lost, transfer)); | 385 ack_time, packet_lost, transfer)); |
| 387 } else { | 386 } else { |
| 388 DVLOG(1) << "losing packet:" << sender->last_sent | 387 DVLOG(1) << "losing packet:" << sender->last_sent |
| 389 << " name:" << transfer->name << " because the buffer was full."; | 388 << " name:" << transfer->name << " because the buffer was full."; |
| 390 } | 389 } |
| 391 transfer->bytes_in_flight += kPacketSize; | 390 transfer->bytes_in_flight += kPacketSize; |
| 392 } | 391 } |
| 393 | 392 |
| 394 } // namespace net | 393 } // namespace net |
| OLD | NEW |