* utils: initialize the {Smoothed, Latest, Min}RTT to 100ms
* utils: use time.Duration.Nanoseconds instead of uint64
No functional change expected.
* congestion: better check to avoid division by zero
* qlog: implement a Trace and a Writer struct
* qlog: rename Trace to FileSeq
* split qlog trace writer and QUIC qlog events into separate packages
* use the new qlog.Recorder instead of the logging.ConnectionTracer
* ackhandler: implement a lost packet tracker
* logging: add ConnectionTracer.DetectedSpuriousLoss event
* ackhandler: detect spurious losses
* qlog: add support for logging spurious packet loss
* ackhandler: delete lost packets after detecting spurios loss
* guard against slice index underflow
* implement a memory-optimized time.Time replacement
* monotime: properly handle systems with bad timer resolution (Windows)
* monotime: simplify Since
* ackhandler: optimize memory layout of packet struct
The packet number can be derived from the position that this packet is
stored at in the packets slice in the sent packet history. There is no
need to store the packet number, saving 8 bytes per packet.
* ackhandler: avoid copying the packet struct
* remove unused bool return value from sentPacketHandler.getPTOTimeAndSpace
* ackhandler: implement timer logic for path probing packets
Path probe packets are treated differently from regular packets: The new
path might have a vastly different RTT than the original path.
Path probe packets are declared lost 1s after they are sent. This value
can be reduced, once implement proper retransmission logic for lost path
probes.
* ackhandler: declare path probes lost on OnLossDetectionTimeout
The packet number generator for the application data packet number
space randomly skips packet numbers. We need to be careful to not
acknowledge a skipped packet when acknowledging a range of packets in
the sent packet handler tests.
* ackhandler: simplify deletion of old packets in packet history
* ackhandler: use a slice to keep track of sent packets
This is a vastly simpler data structure than the combination of map
and linked list used before. It avoids using a linked list (bad cache
locality) and a sync.Pool (for list elements), as well as having to do
hash table lookups.
In the future, this can be easily replaces with a ring buffer, avoiding
all allocations.
* ackhandler: don't store packets that were declared lost
... on the client side. Both the receipt of HANDSHAKE_DONE and the
receipt of an ACK for a 1-RTT packet are sufficient for declaring
confirmation of the handshake.