This allows for more accurate packet number difference calculations,
which is especially important once we attempt to detect spurious loss
detection events.
* 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
* 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
Especially the sentPacketHistory linked list shows up in allocation
profiles, since a new list element is allocated for every single packet
we send.
Using a pool for the receiving path, as well as for the frame sorter, is
less critical, since we're tracking ranges there instead of individual
packets / frames, but it doesn't hurt either.
The other occurrences where we use a linked list (connection ID tracking
and the token store) are used so rarely (a few times over the lifetime
of the connection) that using a pool doesn't make any sense there.
* optimize FirstOutstanding
* fix variable naming
* bug fix
* minor code improvements
* add a test to make sure that `Iterate` iterates in the right order
* add comment
Packet numbers now start at 0 for every packet number spaces.
Furthermore, an ACK frame now only acknowledges packets in the packet
number space it was sent in.