TCP connections experiencing high error rates on their paths interact badly with Slow Start and with Congestion Avoidance, because high error rates make the interpretation of losses ambiguous - the sender cannot know whether detected losses are due to congestion or to data corruption. TCP makes the "safe" choice and assumes that the losses are due to congestion.
TCP Vegas (see [3]) makes a slight change by only deciding that congestion has occurred (point 3) if the segment referred to was transmitted after the last time congestion was detected. Otherwise it is possible for one over-estimate of the sending rate to generate multiple decreases.
The ``fast recovery'' algorithm mentioned in the book, and the variant mentioned above, is fine if only one packet is ever lost at a time (meaning during an RTT). However, we note that a full RTT (plus the arrival times of the packets to generate the duplicate ACKs) is required to get an ACK back acknowledging data beyond the lost segment. If there is more than one lost segment per RTT, the process has to start again immediately (the receiver knows that there is another gap, but can't signal it until all the data up to the gap has been received, since an ACK acknowledges all data up to that point). In practice, what happens is that the original re-transmit algorithm kicks in, and we re-transmit a lot of unnecessary data. RFC 2582 proposes what to do in these circumstances (see steps 1A and 6 in its procedures). RFC 2582 implementations are, according to [8], the commonest kind of webserver, with 40%, or more if one includes Windows implementations with a bug in the handling of small pages.
``Selective acknowledgements'', originally proposed in RFC 1072, and revised to a proposed standard in RFC 201850, solves this problem by adding a new TCP option, which says that ``in addition to all the bytes up to the ACK value, I also acknowledge that I have the following blocks of bytes''. Once this has been received, the sender know precisely which blocks to re-transmit. Since this is a TCP option, it has to fit in the space allowed by the TCP header length, whose maximum value is 15 (= 60 bytes). This leaves room in principle for selective acknowledgement of four blocks. However, if we are using this option, it is because we have a large fat network, so we probably also have the timestamp option (pp. 349-351) enabled, which cuts down the available space to leave room for three blocks. A block may be more than one segment, of course, and it is likely on a large fat network that losses are bursty: a router has a momentary overload and drops several packets in quick succession. According to [8], 40% of webservers claim to support selective acknowledgements, but in fact only 40% of these actually make use of the information. RFC 2757 recommends selective acknowledgements in the wireless setting.
RFC 2883 extends the proposal for selective acknowledgements in an upwards-compatible way to allow the receiver to specify that duplicate segments have been received. This may help performance in the presence of re-ordering (which otherwise is hard to distinguish from duplication). This extension works by transmitting block numbers before the main TCP ACK field, whereas SACK was originally used to report holes in received data transmits block numbers after the main TCP ACK field.
Emil Naepflein (Emil.Naepflein@philosys.de) also observes the following.
In the early days the windows were often so small that only about 4 packets were in transit most of the time. If you go much higher [than three duplicate ACKs before invoking fast retransmit] with the fast-retransmit trigger you will probably never get any benefit from it. I very often noticed that even 3 duplicate ACKs was too high in case of transmitting packets over a lossy link with high delay and large MTUs.
The fast-retransmit can only achieve good performance if there are a lot of packets in transit so that you get enough duplicate ACKs before you are running out of the congestion window. Otherwise you will get some stop-and-go behaviour with bad performance.