packets through that point have been ACKed, throwing an
InterruptedIOException if there was a writeTimeout or an IOException
if the con failed
* revamped the ack/nack field settings to ack as much as possible
* handle some strange timeout/resend errors on connection
* pass 1/2rtt as the packet 'optional delay' field, and use that to
schedule the ack time (the 'last' messages in a window set the
optional delay to 0, asking for immediate ack of all received)
* increase the optional delay to 2 bytes (#ms to delay)
* inject random failures and delays if configured to do so in
PacketHandler.choke
* fix up the window size adjustment (increment on ack, /= 2 on resend)
* use the highest RTT in the new RTT calculation so that we fit more
in (via SACK)
* fix up the SACK handling (duh)
* revise the resend time calculation
* properly close the source file in StreamSinkSend
* always adjust the rtt on ack, not just for packets with 1 send
* handle dup SYN gracefully
* revamp the default connection options
* logging
* immediately send an ack on receiving a duplicate payload message
(unless we've sent one within the last RTT)
* only adjust the RTT when there have been no resends
* added some (disabled) throttles - randomly injecting delays on
received packets, as well as randomly dropping them
* logging
has session tags within it, send an additional ping to the peer,
bundling those tags a second time, ACKing those tags on the pong.
* handle packets transferred during a race after the receiver ACKs the
connection but before the establisher receives the ACK.
* notify the messageInputStream reader on close (duh)
* new stream sink test, shoving lots and lots of data down a stream
with the existing StreamSinkServer and StreamSinkClient apps
* logging