When the sender received segment 9, opening the window that was shut down by segment 8, it immediately started sending data. TCP must handle the case of this acknowledgment that opens the window (segment 9) being lost. Acknowledgments are not reliably transmitted-that is, TCP does not ACK acknowledgments, it only ACKs segments containing data.
If an acknowledgment is lost, we could end up with both sides waiting for the other: the receiver waiting to receive data (since it provided the sender with a nonzero window) and the sender waiting to receive the window update allowing it to send. To prevent this form of deadlock from occurring the sender uses a persist timer that causes it to query the receiver periodically, to find out if the window has been increased. These segments from the sender are called window probes.
The
window probes contain 1 byte of data. TCP is always allowed to send 1
byte of data beyond the end of a closed window. Notice, however, that
the acknowledgments returned with the window size of 0 do not ACK this
byte. Therefore this byte keeps being retransmitted.
The
characteristic of the persist state that is different from the
retransmission timeout is that TCP never gives up sending window probes.
These window probes continue to be sent at 60-second intervals until
the window opens up or either of the applications using the connection
is terminated.
Silly Window Syndrome
Window-based
flow control schemes, such as the one used by TCP, can fall victim to a
condition known as the silly window syndrome (SWS). When it occurs,
small amounts of data are exchanged across the connection, instead of
full-sized segments [dark 1982].
It can be caused by either end:
the receiver can advertise small windows (instead of waiting until a
larger window could be advertised) and the sender can transmit small
amounts of data (instead of waiting for additional data, to send a
larger segment). Correct avoidance of the silly window syndrome is
performed on both ends.
1. The receiver must not advertise
small windows. The normal algorithm is for the receiver not to advertise
a larger window than it is currently advertising (which can be 0) until
the window can be increased by either one full-sized segment (i.e„ the
MSS being received) or by one-half the receiver's buffer space,
whichever is smaller.
2. Sender avoidance of the silly window
syndrome is done by not transmitting unless one of the following
conditions is true: (a) a full-sized segment can be sent, (b) we can
send at least one-half of the maximum sized window that the other end
has ever advertised, or (c) we can send everything we have and either we
are not expecting an ACK (i.e., we have no outstanding unacknowledged
data) or the Nagle algorithm is disabled for this connection.
Condition (b) in step 2 requires that the sender keep track of the maximum window size advertised by the other end. This is an attempt by the sender to guess the size of the other end's receive buffer. Although the size of the receiver buffer could decrease while the connection is established, in practice this is rare.