>From what I've been told, Jacobson's original 1988 SIGCOMM paper talked
about ACKed packets; rfc2001 counts ACKs but assumes that typically
every other segment is ACKed. For practical reasons, Linux counts ACKs
instead of ACKed packets. However, there is *some* kind of ACK-related
bug in Linux (see http://www.icase.edu/coral/LinuxTCP.html) which goes
away when immediate ACKs are forced. Therefore, *something* is not
being done correctly, particularly since people have *not* had a similar
problem with other implementations of Unix.
Sincerely,
Josip
P.S. Linux also keeps cwnd in segments while rfc2001 keeps cwnd in bytes
(in multiples of MSS). Perhaps this messes things up with small
packets. If my interpretation is correct, we should be able to send 36
small TCP packets (1-byte payload each) when cwnd=1; instead, Linux
kernel 2.2.2 allows only 1 packet to be sent. Here is a calculation:
cwnd=1 (measured in segments)
1-byte payload => 41 byte TCP packet
36*41=1476 bytes < MSS=1500 bytes (the initial congestion window)
So rfc2001 would allow 36 tiny packets to be sent when cwnd=1, but Linux
2.2.2 test reads
if(tcp_packets_in_flight(tp) >= tp->snd_cwnd)
and since 36 >= 1, Linux would not allow this. In fact, Linux would
allow at most a single packet to be in flight when cwnd=1.
-- Dr. Josip Loncaric, Senior Staff Scientist mailto:josip@icase.edu ICASE, Mail Stop 132C http://www.icase.edu/~josip/ NASA Langley Research Center mailto:j.loncaric@larc.nasa.gov Hampton, VA 23681-2199, USA Tel. +1 757 864-2192 Fax +1 757 864-6134- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.rutgers.edu Please read the FAQ at http://www.tux.org/lkml/