| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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/quic_sent_packet_manager.h" | 5 #include "net/quic/quic_sent_packet_manager.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 | 8 |
| 9 #include "base/logging.h" | 9 #include "base/logging.h" |
| 10 #include "base/stl_util.h" | 10 #include "base/stl_util.h" |
| (...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 119 new_sequence_number); | 119 new_sequence_number); |
| 120 } | 120 } |
| 121 | 121 |
| 122 void QuicSentPacketManager::OnIncomingAck( | 122 void QuicSentPacketManager::OnIncomingAck( |
| 123 const ReceivedPacketInfo& received_info, | 123 const ReceivedPacketInfo& received_info, |
| 124 QuicTime ack_receive_time) { | 124 QuicTime ack_receive_time) { |
| 125 QuicByteCount bytes_in_flight = unacked_packets_.bytes_in_flight(); | 125 QuicByteCount bytes_in_flight = unacked_packets_.bytes_in_flight(); |
| 126 | 126 |
| 127 // We rely on delta_time_largest_observed to compute an RTT estimate, so | 127 // We rely on delta_time_largest_observed to compute an RTT estimate, so |
| 128 // we only update rtt when the largest observed gets acked. | 128 // we only update rtt when the largest observed gets acked. |
| 129 largest_observed_ = received_info.largest_observed; | |
| 130 bool largest_observed_acked = MaybeUpdateRTT(received_info, ack_receive_time); | 129 bool largest_observed_acked = MaybeUpdateRTT(received_info, ack_receive_time); |
| 130 if (largest_observed_ < received_info.largest_observed) { |
| 131 largest_observed_ = received_info.largest_observed; |
| 132 unacked_packets_.IncreaseLargestObserved(largest_observed_); |
| 133 } |
| 131 HandleAckForSentPackets(received_info); | 134 HandleAckForSentPackets(received_info); |
| 132 InvokeLossDetection(ack_receive_time); | 135 InvokeLossDetection(ack_receive_time); |
| 133 MaybeInvokeCongestionEvent(largest_observed_acked, bytes_in_flight); | 136 MaybeInvokeCongestionEvent(largest_observed_acked, bytes_in_flight); |
| 134 | 137 |
| 135 // If we have received a truncated ack, then we need to clear out some | 138 // If we have received a truncated ack, then we need to clear out some |
| 136 // previous transmissions to allow the peer to actually ACK new packets. | 139 // previous transmissions to allow the peer to actually ACK new packets. |
| 137 if (received_info.is_truncated) { | 140 if (received_info.is_truncated) { |
| 138 unacked_packets_.ClearPreviousRetransmissions( | 141 unacked_packets_.ClearPreviousRetransmissions( |
| 139 received_info.missing_packets.size() / 2); | 142 received_info.missing_packets.size() / 2); |
| 140 } | 143 } |
| (...skipping 27 matching lines...) Expand all Loading... |
| 168 received_info.delta_time_largest_observed; | 171 received_info.delta_time_largest_observed; |
| 169 QuicUnackedPacketMap::const_iterator it = unacked_packets_.begin(); | 172 QuicUnackedPacketMap::const_iterator it = unacked_packets_.begin(); |
| 170 while (it != unacked_packets_.end()) { | 173 while (it != unacked_packets_.end()) { |
| 171 QuicPacketSequenceNumber sequence_number = it->first; | 174 QuicPacketSequenceNumber sequence_number = it->first; |
| 172 if (sequence_number > received_info.largest_observed) { | 175 if (sequence_number > received_info.largest_observed) { |
| 173 // These packets are still in flight. | 176 // These packets are still in flight. |
| 174 break; | 177 break; |
| 175 } | 178 } |
| 176 | 179 |
| 177 if (IsAwaitingPacket(received_info, sequence_number)) { | 180 if (IsAwaitingPacket(received_info, sequence_number)) { |
| 178 // Remove any rtt only packets less than or equal to the largest observed, | 181 // Consider it multiple nacks when there is a gap between the missing |
| 179 // since they will not produce an RTT measurement. | 182 // packet and the largest observed, since the purpose of a nack |
| 180 if (QuicUnackedPacketMap::IsForRttOnly(it->second)) { | 183 // threshold is to tolerate re-ordering. This handles both StretchAcks |
| 181 ++it; | 184 // and Forward Acks. |
| 182 unacked_packets_.RemoveRttOnlyPacket(sequence_number); | 185 // The nack count only increases when the largest observed increases. |
| 183 } else { | 186 size_t min_nacks = received_info.largest_observed - sequence_number; |
| 184 // Consider it multiple nacks when there is a gap between the missing | 187 // Truncated acks can nack the largest observed, so use a min of 1. |
| 185 // packet and the largest observed, since the purpose of a nack | 188 if (min_nacks == 0) { |
| 186 // threshold is to tolerate re-ordering. This handles both StretchAcks | 189 min_nacks = 1; |
| 187 // and Forward Acks. | |
| 188 // The nack count only increases when the largest observed increases. | |
| 189 size_t min_nacks = received_info.largest_observed - sequence_number; | |
| 190 // Truncated acks can nack the largest observed, so use a min of 1. | |
| 191 if (min_nacks == 0) { | |
| 192 min_nacks = 1; | |
| 193 } | |
| 194 unacked_packets_.NackPacket(sequence_number, min_nacks); | |
| 195 ++it; | |
| 196 } | 190 } |
| 191 unacked_packets_.NackPacket(sequence_number, min_nacks); |
| 192 ++it; |
| 197 continue; | 193 continue; |
| 198 } | 194 } |
| 199 | |
| 200 // Packet was acked, so remove it from our unacked packet list. | 195 // Packet was acked, so remove it from our unacked packet list. |
| 201 DVLOG(1) << ENDPOINT << "Got an ack for packet " << sequence_number; | 196 DVLOG(1) << ENDPOINT << "Got an ack for packet " << sequence_number; |
| 202 // If data is associated with the most recent transmission of this | 197 // If data is associated with the most recent transmission of this |
| 203 // packet, then inform the caller. | 198 // packet, then inform the caller. |
| 204 if (it->second.pending) { | 199 if (it->second.in_flight) { |
| 205 packets_acked_[sequence_number] = it->second; | 200 packets_acked_[sequence_number] = it->second; |
| 206 } | 201 } |
| 207 it = MarkPacketHandled(sequence_number, delta_largest_observed); | 202 it = MarkPacketHandled(it, delta_largest_observed); |
| 208 } | 203 } |
| 209 | 204 |
| 210 // Discard any retransmittable frames associated with revived packets. | 205 // Discard any retransmittable frames associated with revived packets. |
| 211 for (SequenceNumberSet::const_iterator revived_it = | 206 for (SequenceNumberSet::const_iterator revived_it = |
| 212 received_info.revived_packets.begin(); | 207 received_info.revived_packets.begin(); |
| 213 revived_it != received_info.revived_packets.end(); ++revived_it) { | 208 revived_it != received_info.revived_packets.end(); ++revived_it) { |
| 214 MarkPacketRevived(*revived_it, delta_largest_observed); | 209 MarkPacketRevived(*revived_it, delta_largest_observed); |
| 215 } | 210 } |
| 216 } | 211 } |
| 217 | 212 |
| 218 bool QuicSentPacketManager::HasRetransmittableFrames( | 213 bool QuicSentPacketManager::HasRetransmittableFrames( |
| 219 QuicPacketSequenceNumber sequence_number) const { | 214 QuicPacketSequenceNumber sequence_number) const { |
| 220 return unacked_packets_.HasRetransmittableFrames(sequence_number); | 215 return unacked_packets_.HasRetransmittableFrames(sequence_number); |
| 221 } | 216 } |
| 222 | 217 |
| 223 void QuicSentPacketManager::RetransmitUnackedPackets( | 218 void QuicSentPacketManager::RetransmitUnackedPackets( |
| 224 RetransmissionType retransmission_type) { | 219 RetransmissionType retransmission_type) { |
| 225 QuicUnackedPacketMap::const_iterator unacked_it = unacked_packets_.begin(); | 220 QuicUnackedPacketMap::const_iterator it = unacked_packets_.begin(); |
| 226 while (unacked_it != unacked_packets_.end()) { | 221 while (it != unacked_packets_.end()) { |
| 227 const RetransmittableFrames* frames = | 222 const RetransmittableFrames* frames = it->second.retransmittable_frames; |
| 228 unacked_it->second.retransmittable_frames; | |
| 229 // Only mark it as handled if it can't be retransmitted and there are no | |
| 230 // pending retransmissions which would be cleared. | |
| 231 if (frames == NULL && unacked_it->second.all_transmissions->size() == 1 && | |
| 232 retransmission_type == ALL_PACKETS) { | |
| 233 unacked_it = MarkPacketHandled(unacked_it->first, | |
| 234 QuicTime::Delta::Zero()); | |
| 235 continue; | |
| 236 } | |
| 237 // If it had no other transmissions, we handle it above. If it has | |
| 238 // other transmissions, one of them must have retransmittable frames, | |
| 239 // so that gets resolved the same way as other retransmissions. | |
| 240 // TODO(ianswett): Consider adding a new retransmission type which removes | 223 // TODO(ianswett): Consider adding a new retransmission type which removes |
| 241 // all these old packets from unacked and retransmits them as new sequence | 224 // all these old packets from unacked and retransmits them as new sequence |
| 242 // numbers with no connection to the previous ones. | 225 // numbers with no connection to the previous ones. |
| 243 if (frames != NULL && (retransmission_type == ALL_PACKETS || | 226 if (frames != NULL && (retransmission_type == ALL_PACKETS || |
| 244 frames->encryption_level() == ENCRYPTION_INITIAL)) { | 227 frames->encryption_level() == ENCRYPTION_INITIAL)) { |
| 245 MarkForRetransmission(unacked_it->first, ALL_UNACKED_RETRANSMISSION); | 228 MarkForRetransmission(it->first, ALL_UNACKED_RETRANSMISSION); |
| 246 } | 229 } |
| 247 ++unacked_it; | 230 ++it; |
| 248 } | 231 } |
| 249 } | 232 } |
| 250 | 233 |
| 251 void QuicSentPacketManager::NeuterUnencryptedPackets() { | 234 void QuicSentPacketManager::NeuterUnencryptedPackets() { |
| 252 for (QuicUnackedPacketMap::const_iterator it = unacked_packets_.begin(); | 235 QuicUnackedPacketMap::const_iterator it = unacked_packets_.begin(); |
| 253 it != unacked_packets_.end(); ++it) { | 236 while (it != unacked_packets_.end()) { |
| 254 const RetransmittableFrames* frames = | 237 const RetransmittableFrames* frames = it->second.retransmittable_frames; |
| 255 it->second.retransmittable_frames; | 238 QuicPacketSequenceNumber sequence_number = it->first; |
| 239 ++it; |
| 256 if (frames != NULL && frames->encryption_level() == ENCRYPTION_NONE) { | 240 if (frames != NULL && frames->encryption_level() == ENCRYPTION_NONE) { |
| 257 // Once you're forward secure, no unencrypted packets will be sent, crypto | 241 // Once you're forward secure, no unencrypted packets will be sent, crypto |
| 258 // or otherwise. Unencrypted packets are neutered and abandoned, to ensure | 242 // or otherwise. Unencrypted packets are neutered and abandoned, to ensure |
| 259 // they are not retransmitted or considered lost from a congestion control | 243 // they are not retransmitted or considered lost from a congestion control |
| 260 // perspective. | 244 // perspective. |
| 261 pending_retransmissions_.erase(it->first); | 245 pending_retransmissions_.erase(sequence_number); |
| 262 unacked_packets_.RemoveRetransmittability(it->first, largest_observed_); | 246 unacked_packets_.RemoveFromInFlight(sequence_number); |
| 263 unacked_packets_.SetNotPending(it->first); | 247 // RemoveRetransmittibility is safe because only the newest sequence |
| 248 // number can have frames. |
| 249 unacked_packets_.RemoveRetransmittability(sequence_number); |
| 264 } | 250 } |
| 265 } | 251 } |
| 266 } | 252 } |
| 267 | 253 |
| 268 void QuicSentPacketManager::MarkForRetransmission( | 254 void QuicSentPacketManager::MarkForRetransmission( |
| 269 QuicPacketSequenceNumber sequence_number, | 255 QuicPacketSequenceNumber sequence_number, |
| 270 TransmissionType transmission_type) { | 256 TransmissionType transmission_type) { |
| 271 const TransmissionInfo& transmission_info = | 257 const TransmissionInfo& transmission_info = |
| 272 unacked_packets_.GetTransmissionInfo(sequence_number); | 258 unacked_packets_.GetTransmissionInfo(sequence_number); |
| 273 LOG_IF(DFATAL, transmission_info.retransmittable_frames == NULL); | 259 LOG_IF(DFATAL, transmission_info.retransmittable_frames == NULL); |
| 274 if (transmission_type != TLP_RETRANSMISSION) { | 260 if (transmission_type != TLP_RETRANSMISSION) { |
| 275 unacked_packets_.SetNotPending(sequence_number); | 261 unacked_packets_.RemoveFromInFlight(sequence_number); |
| 276 } | 262 } |
| 277 // TODO(ianswett): Currently the RTO can fire while there are pending NACK | 263 // TODO(ianswett): Currently the RTO can fire while there are pending NACK |
| 278 // retransmissions for the same data, which is not ideal. | 264 // retransmissions for the same data, which is not ideal. |
| 279 if (ContainsKey(pending_retransmissions_, sequence_number)) { | 265 if (ContainsKey(pending_retransmissions_, sequence_number)) { |
| 280 return; | 266 return; |
| 281 } | 267 } |
| 282 | 268 |
| 283 pending_retransmissions_[sequence_number] = transmission_type; | 269 pending_retransmissions_[sequence_number] = transmission_type; |
| 284 } | 270 } |
| 285 | 271 |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 332 // retransmit it, do not retransmit it anymore. | 318 // retransmit it, do not retransmit it anymore. |
| 333 pending_retransmissions_.erase(newest_transmission); | 319 pending_retransmissions_.erase(newest_transmission); |
| 334 | 320 |
| 335 // The AckNotifierManager needs to be notified for revived packets, | 321 // The AckNotifierManager needs to be notified for revived packets, |
| 336 // since it indicates the packet arrived from the appliction's perspective. | 322 // since it indicates the packet arrived from the appliction's perspective. |
| 337 if (transmission_info.retransmittable_frames) { | 323 if (transmission_info.retransmittable_frames) { |
| 338 ack_notifier_manager_.OnPacketAcked( | 324 ack_notifier_manager_.OnPacketAcked( |
| 339 newest_transmission, delta_largest_observed); | 325 newest_transmission, delta_largest_observed); |
| 340 } | 326 } |
| 341 | 327 |
| 342 unacked_packets_.RemoveRetransmittability(sequence_number, largest_observed_); | 328 unacked_packets_.RemoveRetransmittability(sequence_number); |
| 343 } | 329 } |
| 344 | 330 |
| 345 QuicUnackedPacketMap::const_iterator QuicSentPacketManager::MarkPacketHandled( | 331 QuicUnackedPacketMap::const_iterator QuicSentPacketManager::MarkPacketHandled( |
| 346 QuicPacketSequenceNumber sequence_number, | 332 QuicUnackedPacketMap::const_iterator it, |
| 347 QuicTime::Delta delta_largest_observed) { | 333 QuicTime::Delta delta_largest_observed) { |
| 348 if (!unacked_packets_.IsUnacked(sequence_number)) { | 334 LOG_IF(DFATAL, it == unacked_packets_.end()) |
| 349 LOG(DFATAL) << "Packet is not unacked: " << sequence_number; | 335 << "MarkPacketHandled must be passed a valid iterator entry."; |
| 350 return unacked_packets_.end(); | 336 const QuicPacketSequenceNumber sequence_number = it->first; |
| 351 } | 337 const TransmissionInfo& transmission_info = it->second; |
| 352 const TransmissionInfo& transmission_info = | |
| 353 unacked_packets_.GetTransmissionInfo(sequence_number); | |
| 354 | 338 |
| 355 QuicPacketSequenceNumber newest_transmission = | 339 QuicPacketSequenceNumber newest_transmission = |
| 356 *transmission_info.all_transmissions->rbegin(); | 340 *transmission_info.all_transmissions->rbegin(); |
| 357 // Remove the most recent packet, if it is pending retransmission. | 341 // Remove the most recent packet, if it is pending retransmission. |
| 358 pending_retransmissions_.erase(newest_transmission); | 342 pending_retransmissions_.erase(newest_transmission); |
| 359 | 343 |
| 360 // Two cases for MarkPacketHandled: | 344 // Two cases for MarkPacketHandled: |
| 361 // 1) Handle the most recent or a crypto packet, so remove all transmissions. | 345 // 1) Handle the most recent or a crypto packet, so remove all transmissions. |
| 362 // 2) Handle old transmission, keep all other pending transmissions, | 346 // 2) Handle old transmission, keep all other pending transmissions, |
| 363 // but disassociate them from one another. | 347 // but disassociate them from one another. |
| 364 if (newest_transmission != sequence_number) { | 348 if (newest_transmission != sequence_number) { |
| 365 stats_->bytes_spuriously_retransmitted += transmission_info.bytes_sent; | 349 stats_->bytes_spuriously_retransmitted += transmission_info.bytes_sent; |
| 366 ++stats_->packets_spuriously_retransmitted; | 350 ++stats_->packets_spuriously_retransmitted; |
| 367 } | 351 } |
| 368 | 352 |
| 369 // The AckNotifierManager needs to be notified about the most recent | 353 // The AckNotifierManager needs to be notified about the most recent |
| 370 // transmission, since that's the one only one it tracks. | 354 // transmission, since that's the one only one it tracks. |
| 371 ack_notifier_manager_.OnPacketAcked(newest_transmission, | 355 ack_notifier_manager_.OnPacketAcked(newest_transmission, |
| 372 delta_largest_observed); | 356 delta_largest_observed); |
| 373 | 357 |
| 374 // If it's a crypto handshake packet, discard it and all retransmissions, | 358 // If it's a crypto handshake packet, discard it and all retransmissions, |
| 375 // since they won't be acked now that one has been processed. | 359 // since they won't be acked now that one has been processed. |
| 376 // TODO(ianswett): Instead of handling all crypto packets in a special way, | 360 // TODO(ianswett): Instead of handling all crypto packets in a special way, |
| 377 // only handle NULL encrypted packets in a special way. | 361 // only handle NULL encrypted packets in a special way. |
| 378 if (HasCryptoHandshake( | 362 if (HasCryptoHandshake( |
| 379 unacked_packets_.GetTransmissionInfo(newest_transmission))) { | 363 unacked_packets_.GetTransmissionInfo(newest_transmission))) { |
| 380 unacked_packets_.SetNotPending(newest_transmission); | 364 unacked_packets_.RemoveFromInFlight(newest_transmission); |
| 381 } | 365 } |
| 382 unacked_packets_.SetNotPending(sequence_number); | 366 unacked_packets_.RemoveFromInFlight(sequence_number); |
| 383 unacked_packets_.RemoveRetransmittability(sequence_number, largest_observed_); | 367 unacked_packets_.RemoveRetransmittability(sequence_number); |
| 384 | 368 |
| 385 QuicUnackedPacketMap::const_iterator next_unacked = unacked_packets_.begin(); | 369 QuicUnackedPacketMap::const_iterator next_unacked = unacked_packets_.begin(); |
| 386 while (next_unacked != unacked_packets_.end() && | 370 while (next_unacked != unacked_packets_.end() && |
| 387 next_unacked->first <= sequence_number) { | 371 next_unacked->first <= sequence_number) { |
| 388 ++next_unacked; | 372 ++next_unacked; |
| 389 } | 373 } |
| 390 return next_unacked; | 374 return next_unacked; |
| 391 } | 375 } |
| 392 | 376 |
| 393 bool QuicSentPacketManager::IsUnacked( | 377 bool QuicSentPacketManager::IsUnacked( |
| (...skipping 25 matching lines...) Expand all Loading... |
| 419 } | 403 } |
| 420 | 404 |
| 421 if (unacked_packets_.bytes_in_flight() == 0) { | 405 if (unacked_packets_.bytes_in_flight() == 0) { |
| 422 // TODO(ianswett): Consider being less aggressive to force a new | 406 // TODO(ianswett): Consider being less aggressive to force a new |
| 423 // recent_min_rtt, likely by not discarding a relatively new sample. | 407 // recent_min_rtt, likely by not discarding a relatively new sample. |
| 424 DVLOG(1) << "Sampling a new recent min rtt within 2 samples. currently:" | 408 DVLOG(1) << "Sampling a new recent min rtt within 2 samples. currently:" |
| 425 << rtt_stats_.recent_min_rtt().ToMilliseconds() << "ms"; | 409 << rtt_stats_.recent_min_rtt().ToMilliseconds() << "ms"; |
| 426 rtt_stats_.SampleNewRecentMinRtt(kNumMinRttSamplesAfterQuiescence); | 410 rtt_stats_.SampleNewRecentMinRtt(kNumMinRttSamplesAfterQuiescence); |
| 427 } | 411 } |
| 428 | 412 |
| 429 // Only track packets as pending that the send algorithm wants us to track. | 413 // Only track packets as in flight that the send algorithm wants us to track. |
| 430 const bool pending = | 414 const bool in_flight = |
| 431 send_algorithm_->OnPacketSent(sent_time, | 415 send_algorithm_->OnPacketSent(sent_time, |
| 432 unacked_packets_.bytes_in_flight(), | 416 unacked_packets_.bytes_in_flight(), |
| 433 sequence_number, | 417 sequence_number, |
| 434 bytes, | 418 bytes, |
| 435 has_retransmittable_data); | 419 has_retransmittable_data); |
| 436 unacked_packets_.SetSent(sequence_number, sent_time, bytes, pending); | 420 unacked_packets_.SetSent(sequence_number, sent_time, bytes, in_flight); |
| 437 | 421 |
| 438 // Reset the retransmission timer anytime a pending packet is sent. | 422 // Reset the retransmission timer anytime a pending packet is sent. |
| 439 return pending; | 423 return in_flight; |
| 440 } | 424 } |
| 441 | 425 |
| 442 void QuicSentPacketManager::OnRetransmissionTimeout() { | 426 void QuicSentPacketManager::OnRetransmissionTimeout() { |
| 443 DCHECK(unacked_packets_.HasPendingPackets()); | 427 DCHECK(unacked_packets_.HasInFlightPackets()); |
| 444 // Handshake retransmission, timer based loss detection, TLP, and RTO are | 428 // Handshake retransmission, timer based loss detection, TLP, and RTO are |
| 445 // implemented with a single alarm. The handshake alarm is set when the | 429 // implemented with a single alarm. The handshake alarm is set when the |
| 446 // handshake has not completed, the loss alarm is set when the loss detection | 430 // handshake has not completed, the loss alarm is set when the loss detection |
| 447 // algorithm says to, and the TLP and RTO alarms are set after that. | 431 // algorithm says to, and the TLP and RTO alarms are set after that. |
| 448 // The TLP alarm is always set to run for under an RTO. | 432 // The TLP alarm is always set to run for under an RTO. |
| 449 switch (GetRetransmissionMode()) { | 433 switch (GetRetransmissionMode()) { |
| 450 case HANDSHAKE_MODE: | 434 case HANDSHAKE_MODE: |
| 451 ++stats_->crypto_retransmit_count; | 435 ++stats_->crypto_retransmit_count; |
| 452 RetransmitCryptoPackets(); | 436 RetransmitCryptoPackets(); |
| 453 return; | 437 return; |
| (...skipping 21 matching lines...) Expand all Loading... |
| 475 DCHECK_EQ(HANDSHAKE_MODE, GetRetransmissionMode()); | 459 DCHECK_EQ(HANDSHAKE_MODE, GetRetransmissionMode()); |
| 476 // TODO(ianswett): Typical TCP implementations only retransmit 5 times. | 460 // TODO(ianswett): Typical TCP implementations only retransmit 5 times. |
| 477 consecutive_crypto_retransmission_count_ = | 461 consecutive_crypto_retransmission_count_ = |
| 478 min(kMaxHandshakeRetransmissionBackoffs, | 462 min(kMaxHandshakeRetransmissionBackoffs, |
| 479 consecutive_crypto_retransmission_count_ + 1); | 463 consecutive_crypto_retransmission_count_ + 1); |
| 480 bool packet_retransmitted = false; | 464 bool packet_retransmitted = false; |
| 481 for (QuicUnackedPacketMap::const_iterator it = unacked_packets_.begin(); | 465 for (QuicUnackedPacketMap::const_iterator it = unacked_packets_.begin(); |
| 482 it != unacked_packets_.end(); ++it) { | 466 it != unacked_packets_.end(); ++it) { |
| 483 QuicPacketSequenceNumber sequence_number = it->first; | 467 QuicPacketSequenceNumber sequence_number = it->first; |
| 484 const RetransmittableFrames* frames = it->second.retransmittable_frames; | 468 const RetransmittableFrames* frames = it->second.retransmittable_frames; |
| 485 // Only retransmit frames which are pending, and therefore have been sent. | 469 // Only retransmit frames which are in flight, and therefore have been sent. |
| 486 if (!it->second.pending || frames == NULL || | 470 if (!it->second.in_flight || frames == NULL || |
| 487 frames->HasCryptoHandshake() != IS_HANDSHAKE) { | 471 frames->HasCryptoHandshake() != IS_HANDSHAKE) { |
| 488 continue; | 472 continue; |
| 489 } | 473 } |
| 490 packet_retransmitted = true; | 474 packet_retransmitted = true; |
| 491 MarkForRetransmission(sequence_number, HANDSHAKE_RETRANSMISSION); | 475 MarkForRetransmission(sequence_number, HANDSHAKE_RETRANSMISSION); |
| 492 } | 476 } |
| 493 DCHECK(packet_retransmitted) << "No crypto packets found to retransmit."; | 477 DCHECK(packet_retransmitted) << "No crypto packets found to retransmit."; |
| 494 } | 478 } |
| 495 | 479 |
| 496 void QuicSentPacketManager::RetransmitOldestPacket() { | 480 void QuicSentPacketManager::RetransmitOldestPacket() { |
| 497 DCHECK_EQ(TLP_MODE, GetRetransmissionMode()); | 481 DCHECK_EQ(TLP_MODE, GetRetransmissionMode()); |
| 498 ++consecutive_tlp_count_; | 482 ++consecutive_tlp_count_; |
| 499 for (QuicUnackedPacketMap::const_iterator it = unacked_packets_.begin(); | 483 for (QuicUnackedPacketMap::const_iterator it = unacked_packets_.begin(); |
| 500 it != unacked_packets_.end(); ++it) { | 484 it != unacked_packets_.end(); ++it) { |
| 501 QuicPacketSequenceNumber sequence_number = it->first; | 485 QuicPacketSequenceNumber sequence_number = it->first; |
| 502 const RetransmittableFrames* frames = it->second.retransmittable_frames; | 486 const RetransmittableFrames* frames = it->second.retransmittable_frames; |
| 503 // Only retransmit frames which are pending, and therefore have been sent. | 487 // Only retransmit frames which are in flight, and therefore have been sent. |
| 504 if (!it->second.pending || frames == NULL) { | 488 if (!it->second.in_flight || frames == NULL) { |
| 505 continue; | 489 continue; |
| 506 } | 490 } |
| 507 DCHECK_NE(IS_HANDSHAKE, frames->HasCryptoHandshake()); | 491 DCHECK_NE(IS_HANDSHAKE, frames->HasCryptoHandshake()); |
| 508 MarkForRetransmission(sequence_number, TLP_RETRANSMISSION); | 492 MarkForRetransmission(sequence_number, TLP_RETRANSMISSION); |
| 509 return; | 493 return; |
| 510 } | 494 } |
| 511 DLOG(FATAL) | 495 DLOG(FATAL) |
| 512 << "No retransmittable packets, so RetransmitOldestPacket failed."; | 496 << "No retransmittable packets, so RetransmitOldestPacket failed."; |
| 513 } | 497 } |
| 514 | 498 |
| 515 void QuicSentPacketManager::RetransmitAllPackets() { | 499 void QuicSentPacketManager::RetransmitAllPackets() { |
| 516 // Abandon all retransmittable packets and packets older than the | 500 // Abandon all retransmittable packets and packets older than the |
| 517 // retransmission delay. | 501 // retransmission delay. |
| 518 | 502 |
| 519 DVLOG(1) << "OnRetransmissionTimeout() fired with " | 503 DVLOG(1) << "OnRetransmissionTimeout() fired with " |
| 520 << unacked_packets_.GetNumUnackedPackets() << " unacked packets."; | 504 << unacked_packets_.GetNumUnackedPackets() << " unacked packets."; |
| 521 | 505 |
| 522 // Request retransmission of all retransmittable packets when the RTO | 506 // Request retransmission of all retransmittable packets when the RTO |
| 523 // fires, and let the congestion manager decide how many to send | 507 // fires, and let the congestion manager decide how many to send |
| 524 // immediately and the remaining packets will be queued. | 508 // immediately and the remaining packets will be queued. |
| 525 // Abandon any non-retransmittable packets that are sufficiently old. | 509 // Abandon any non-retransmittable packets that are sufficiently old. |
| 526 bool packets_retransmitted = false; | 510 bool packets_retransmitted = false; |
| 527 for (QuicUnackedPacketMap::const_iterator it = unacked_packets_.begin(); | 511 QuicUnackedPacketMap::const_iterator it = unacked_packets_.begin(); |
| 528 it != unacked_packets_.end(); ++it) { | 512 while (it != unacked_packets_.end()) { |
| 529 if (it->second.retransmittable_frames != NULL) { | 513 const RetransmittableFrames* frames = it->second.retransmittable_frames; |
| 514 QuicPacketSequenceNumber sequence_number = it->first; |
| 515 ++it; |
| 516 if (frames != NULL) { |
| 530 packets_retransmitted = true; | 517 packets_retransmitted = true; |
| 531 MarkForRetransmission(it->first, RTO_RETRANSMISSION); | 518 MarkForRetransmission(sequence_number, RTO_RETRANSMISSION); |
| 532 } else { | 519 } else { |
| 533 unacked_packets_.SetNotPending(it->first); | 520 unacked_packets_.RemoveFromInFlight(sequence_number); |
| 534 } | 521 } |
| 535 } | 522 } |
| 536 | 523 |
| 537 send_algorithm_->OnRetransmissionTimeout(packets_retransmitted); | 524 send_algorithm_->OnRetransmissionTimeout(packets_retransmitted); |
| 538 if (packets_retransmitted) { | 525 if (packets_retransmitted) { |
| 539 ++consecutive_rto_count_; | 526 ++consecutive_rto_count_; |
| 540 } | 527 } |
| 541 } | 528 } |
| 542 | 529 |
| 543 QuicSentPacketManager::RetransmissionTimeoutMode | 530 QuicSentPacketManager::RetransmissionTimeoutMode |
| 544 QuicSentPacketManager::GetRetransmissionMode() const { | 531 QuicSentPacketManager::GetRetransmissionMode() const { |
| 545 DCHECK(unacked_packets_.HasPendingPackets()); | 532 DCHECK(unacked_packets_.HasInFlightPackets()); |
| 546 if (unacked_packets_.HasPendingCryptoPackets()) { | 533 if (unacked_packets_.HasPendingCryptoPackets()) { |
| 547 return HANDSHAKE_MODE; | 534 return HANDSHAKE_MODE; |
| 548 } | 535 } |
| 549 if (loss_algorithm_->GetLossTimeout() != QuicTime::Zero()) { | 536 if (loss_algorithm_->GetLossTimeout() != QuicTime::Zero()) { |
| 550 return LOSS_MODE; | 537 return LOSS_MODE; |
| 551 } | 538 } |
| 552 if (consecutive_tlp_count_ < max_tail_loss_probes_) { | 539 if (consecutive_tlp_count_ < max_tail_loss_probes_) { |
| 553 if (unacked_packets_.HasUnackedRetransmittableFrames()) { | 540 if (unacked_packets_.HasUnackedRetransmittableFrames()) { |
| 554 return TLP_MODE; | 541 return TLP_MODE; |
| 555 } | 542 } |
| (...skipping 26 matching lines...) Expand all Loading... |
| 582 packets_lost_[sequence_number] = transmission_info; | 569 packets_lost_[sequence_number] = transmission_info; |
| 583 DVLOG(1) << ENDPOINT << "Lost packet " << sequence_number; | 570 DVLOG(1) << ENDPOINT << "Lost packet " << sequence_number; |
| 584 | 571 |
| 585 if (transmission_info.retransmittable_frames != NULL) { | 572 if (transmission_info.retransmittable_frames != NULL) { |
| 586 MarkForRetransmission(sequence_number, LOSS_RETRANSMISSION); | 573 MarkForRetransmission(sequence_number, LOSS_RETRANSMISSION); |
| 587 } else { | 574 } else { |
| 588 // Since we will not retransmit this, we need to remove it from | 575 // Since we will not retransmit this, we need to remove it from |
| 589 // unacked_packets_. This is either the current transmission of | 576 // unacked_packets_. This is either the current transmission of |
| 590 // a packet whose previous transmission has been acked, a packet that has | 577 // a packet whose previous transmission has been acked, a packet that has |
| 591 // been TLP retransmitted, or an FEC packet. | 578 // been TLP retransmitted, or an FEC packet. |
| 592 unacked_packets_.SetNotPending(sequence_number); | 579 unacked_packets_.RemoveFromInFlight(sequence_number); |
| 593 if (QuicUnackedPacketMap::IsForRttOnly(transmission_info)) { | |
| 594 unacked_packets_.RemoveRttOnlyPacket(sequence_number); | |
| 595 } | |
| 596 } | 580 } |
| 597 } | 581 } |
| 598 } | 582 } |
| 599 | 583 |
| 600 bool QuicSentPacketManager::MaybeUpdateRTT( | 584 bool QuicSentPacketManager::MaybeUpdateRTT( |
| 601 const ReceivedPacketInfo& received_info, | 585 const ReceivedPacketInfo& received_info, |
| 602 const QuicTime& ack_receive_time) { | 586 const QuicTime& ack_receive_time) { |
| 603 if (!unacked_packets_.IsUnacked(received_info.largest_observed)) { | 587 if (!unacked_packets_.IsUnacked(received_info.largest_observed)) { |
| 604 return false; | 588 return false; |
| 605 } | 589 } |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 642 // There may be a value in making this delay adaptive with the help of | 626 // There may be a value in making this delay adaptive with the help of |
| 643 // the sender and a signaling mechanism -- if the sender uses a | 627 // the sender and a signaling mechanism -- if the sender uses a |
| 644 // different MinRTO, we may get spurious retransmissions. May not have | 628 // different MinRTO, we may get spurious retransmissions. May not have |
| 645 // any benefits, but if the delayed ack becomes a significant source | 629 // any benefits, but if the delayed ack becomes a significant source |
| 646 // of (likely, tail) latency, then consider such a mechanism. | 630 // of (likely, tail) latency, then consider such a mechanism. |
| 647 const QuicTime::Delta QuicSentPacketManager::DelayedAckTime() const { | 631 const QuicTime::Delta QuicSentPacketManager::DelayedAckTime() const { |
| 648 return QuicTime::Delta::FromMilliseconds(kMinRetransmissionTimeMs/2); | 632 return QuicTime::Delta::FromMilliseconds(kMinRetransmissionTimeMs/2); |
| 649 } | 633 } |
| 650 | 634 |
| 651 const QuicTime QuicSentPacketManager::GetRetransmissionTime() const { | 635 const QuicTime QuicSentPacketManager::GetRetransmissionTime() const { |
| 652 // Don't set the timer if there are no pending packets. | 636 // Don't set the timer if there are no packets in flight. |
| 653 if (!unacked_packets_.HasPendingPackets()) { | 637 if (!unacked_packets_.HasInFlightPackets()) { |
| 654 return QuicTime::Zero(); | 638 return QuicTime::Zero(); |
| 655 } | 639 } |
| 656 switch (GetRetransmissionMode()) { | 640 switch (GetRetransmissionMode()) { |
| 657 case HANDSHAKE_MODE: | 641 case HANDSHAKE_MODE: |
| 658 return clock_->ApproximateNow().Add(GetCryptoRetransmissionDelay()); | 642 return clock_->ApproximateNow().Add(GetCryptoRetransmissionDelay()); |
| 659 case LOSS_MODE: | 643 case LOSS_MODE: |
| 660 return loss_algorithm_->GetLossTimeout(); | 644 return loss_algorithm_->GetLossTimeout(); |
| 661 case TLP_MODE: { | 645 case TLP_MODE: { |
| 662 // TODO(ianswett): When CWND is available, it would be preferable to | 646 // TODO(ianswett): When CWND is available, it would be preferable to |
| 663 // set the timer based on the earliest retransmittable packet. | 647 // set the timer based on the earliest retransmittable packet. |
| 664 // Base the updated timer on the send time of the last packet. | 648 // Base the updated timer on the send time of the last packet. |
| 665 const QuicTime sent_time = unacked_packets_.GetLastPacketSentTime(); | 649 const QuicTime sent_time = unacked_packets_.GetLastPacketSentTime(); |
| 666 const QuicTime tlp_time = sent_time.Add(GetTailLossProbeDelay()); | 650 const QuicTime tlp_time = sent_time.Add(GetTailLossProbeDelay()); |
| 667 // Ensure the TLP timer never gets set to a time in the past. | 651 // Ensure the TLP timer never gets set to a time in the past. |
| 668 return QuicTime::Max(clock_->ApproximateNow(), tlp_time); | 652 return QuicTime::Max(clock_->ApproximateNow(), tlp_time); |
| 669 } | 653 } |
| 670 case RTO_MODE: { | 654 case RTO_MODE: { |
| 671 // The RTO is based on the first pending packet. | 655 // The RTO is based on the first outstanding packet. |
| 672 const QuicTime sent_time = | 656 const QuicTime sent_time = |
| 673 unacked_packets_.GetFirstPendingPacketSentTime(); | 657 unacked_packets_.GetFirstInFlightPacketSentTime(); |
| 674 QuicTime rto_timeout = sent_time.Add(GetRetransmissionDelay()); | 658 QuicTime rto_timeout = sent_time.Add(GetRetransmissionDelay()); |
| 675 // Always wait at least 1.5 * RTT from now. | 659 // Always wait at least 1.5 * RTT from now. |
| 676 QuicTime min_timeout = clock_->ApproximateNow().Add( | 660 QuicTime min_timeout = clock_->ApproximateNow().Add( |
| 677 rtt_stats_.SmoothedRtt().Multiply(1.5)); | 661 rtt_stats_.SmoothedRtt().Multiply(1.5)); |
| 678 | 662 |
| 679 return QuicTime::Max(min_timeout, rto_timeout); | 663 return QuicTime::Max(min_timeout, rto_timeout); |
| 680 } | 664 } |
| 681 } | 665 } |
| 682 DCHECK(false); | 666 DCHECK(false); |
| 683 return QuicTime::Zero(); | 667 return QuicTime::Zero(); |
| 684 } | 668 } |
| 685 | 669 |
| 686 const QuicTime::Delta QuicSentPacketManager::GetCryptoRetransmissionDelay() | 670 const QuicTime::Delta QuicSentPacketManager::GetCryptoRetransmissionDelay() |
| 687 const { | 671 const { |
| 688 // This is equivalent to the TailLossProbeDelay, but slightly more aggressive | 672 // This is equivalent to the TailLossProbeDelay, but slightly more aggressive |
| 689 // because crypto handshake messages don't incur a delayed ack time. | 673 // because crypto handshake messages don't incur a delayed ack time. |
| 690 int64 delay_ms = max<int64>(kMinHandshakeTimeoutMs, | 674 int64 delay_ms = max<int64>(kMinHandshakeTimeoutMs, |
| 691 1.5 * rtt_stats_.SmoothedRtt().ToMilliseconds()); | 675 1.5 * rtt_stats_.SmoothedRtt().ToMilliseconds()); |
| 692 return QuicTime::Delta::FromMilliseconds( | 676 return QuicTime::Delta::FromMilliseconds( |
| 693 delay_ms << consecutive_crypto_retransmission_count_); | 677 delay_ms << consecutive_crypto_retransmission_count_); |
| 694 } | 678 } |
| 695 | 679 |
| 696 const QuicTime::Delta QuicSentPacketManager::GetTailLossProbeDelay() const { | 680 const QuicTime::Delta QuicSentPacketManager::GetTailLossProbeDelay() const { |
| 697 QuicTime::Delta srtt = rtt_stats_.SmoothedRtt(); | 681 QuicTime::Delta srtt = rtt_stats_.SmoothedRtt(); |
| 698 if (!unacked_packets_.HasMultiplePendingPackets()) { | 682 if (!unacked_packets_.HasMultipleInFlightPackets()) { |
| 699 return QuicTime::Delta::Max( | 683 return QuicTime::Delta::Max( |
| 700 srtt.Multiply(1.5).Add(DelayedAckTime()), srtt.Multiply(2)); | 684 srtt.Multiply(1.5).Add(DelayedAckTime()), srtt.Multiply(2)); |
| 701 } | 685 } |
| 702 return QuicTime::Delta::FromMilliseconds( | 686 return QuicTime::Delta::FromMilliseconds( |
| 703 max(kMinTailLossProbeTimeoutMs, | 687 max(kMinTailLossProbeTimeoutMs, |
| 704 static_cast<int64>(2 * srtt.ToMilliseconds()))); | 688 static_cast<int64>(2 * srtt.ToMilliseconds()))); |
| 705 } | 689 } |
| 706 | 690 |
| 707 const QuicTime::Delta QuicSentPacketManager::GetRetransmissionDelay() const { | 691 const QuicTime::Delta QuicSentPacketManager::GetRetransmissionDelay() const { |
| 708 QuicTime::Delta retransmission_delay = send_algorithm_->RetransmissionDelay(); | 692 QuicTime::Delta retransmission_delay = send_algorithm_->RetransmissionDelay(); |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 747 return; | 731 return; |
| 748 } | 732 } |
| 749 | 733 |
| 750 using_pacing_ = true; | 734 using_pacing_ = true; |
| 751 send_algorithm_.reset( | 735 send_algorithm_.reset( |
| 752 new PacingSender(send_algorithm_.release(), | 736 new PacingSender(send_algorithm_.release(), |
| 753 QuicTime::Delta::FromMicroseconds(1))); | 737 QuicTime::Delta::FromMicroseconds(1))); |
| 754 } | 738 } |
| 755 | 739 |
| 756 } // namespace net | 740 } // namespace net |
| OLD | NEW |