target = "https://www.rfc-editor.org/rfc/rfc9002#section-6.2.4" # 6.2.4. Sending Probe Packets # # When a PTO timer expires, a sender MUST send at least one ack- # eliciting packet in the packet number space as a probe. An endpoint # MAY send up to two full-sized datagrams containing ack-eliciting # packets to avoid an expensive consecutive PTO expiration due to a # single lost datagram or to transmit data from multiple packet number # spaces. All probe packets sent on a PTO MUST be ack-eliciting. # # In addition to sending data in the packet number space for which the # timer expired, the sender SHOULD send ack-eliciting packets from # other packet number spaces with in-flight data, coalescing packets if # possible. This is particularly valuable when the server has both # Initial and Handshake data in flight or when the client has both # Handshake and Application Data in flight because the peer might only # have receive keys for one of the two packet number spaces. # # If the sender wants to elicit a faster acknowledgment on PTO, it can # skip a packet number to eliminate the acknowledgment delay. # # An endpoint SHOULD include new data in packets that are sent on PTO # expiration. Previously sent data MAY be sent if no new data can be # sent. Implementations MAY use alternative strategies for determining # the content of probe packets, including sending new or retransmitted # data based on the application's priorities. # # It is possible the sender has no new or previously sent data to send. # As an example, consider the following sequence of events: new # application data is sent in a STREAM frame, deemed lost, then # retransmitted in a new packet, and then the original transmission is # acknowledged. When there is no data to send, the sender SHOULD send # a PING or other ack-eliciting frame in a single packet, rearming the # PTO timer. # # Alternatively, instead of sending an ack-eliciting packet, the sender # MAY mark any packets still in flight as lost. Doing so avoids # sending an additional packet but increases the risk that loss is # declared too aggressively, resulting in an unnecessary rate reduction # by the congestion controller. # # Consecutive PTO periods increase exponentially, and as a result, # connection recovery latency increases exponentially as packets # continue to be dropped in the network. Sending two packets on PTO # expiration increases resilience to packet drops, thus reducing the # probability of consecutive PTO events. # # When the PTO timer expires multiple times and new data cannot be # sent, implementations must choose between sending the same payload # every time or sending different payloads. Sending the same payload # may be simpler and ensures the highest priority frames arrive first. # Sending different payloads each time reduces the chances of spurious # retransmission. [[spec]] level = "MUST" quote = ''' When a PTO timer expires, a sender MUST send at least one ack- eliciting packet in the packet number space as a probe. ''' [[spec]] level = "MAY" quote = ''' An endpoint MAY send up to two full-sized datagrams containing ack-eliciting packets to avoid an expensive consecutive PTO expiration due to a single lost datagram or to transmit data from multiple packet number spaces. ''' [[spec]] level = "MUST" quote = ''' All probe packets sent on a PTO MUST be ack-eliciting. ''' [[spec]] level = "SHOULD" quote = ''' In addition to sending data in the packet number space for which the timer expired, the sender SHOULD send ack-eliciting packets from other packet number spaces with in-flight data, coalescing packets if possible. ''' [[spec]] level = "SHOULD" quote = ''' An endpoint SHOULD include new data in packets that are sent on PTO expiration. ''' [[spec]] level = "MAY" quote = ''' Previously sent data MAY be sent if no new data can be sent. ''' [[spec]] level = "MAY" quote = ''' Implementations MAY use alternative strategies for determining the content of probe packets, including sending new or retransmitted data based on the application's priorities. ''' [[spec]] level = "SHOULD" quote = ''' When there is no data to send, the sender SHOULD send a PING or other ack-eliciting frame in a single packet, rearming the PTO timer. ''' [[spec]] level = "MAY" quote = ''' Alternatively, instead of sending an ack-eliciting packet, the sender MAY mark any packets still in flight as lost. '''