We've
seen that TCP has the receiver perform flow control by specifying the
amount of data it is willing to accept from the sender: the window size.
What happens when the window size goes to 0? This effectively stops the
sender from transmitting data, until the window becomes nonzero.
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) deals with hosts that always advertise tiny windows, perhaps
smaller than the segment size. Condition (c) prevents us from sending
small segments when we have unacknowledged data that is waiting to be
ACKed and the Nagle algorithm is enabled. If the application is doing
small writes (e.g., smaller than the segment size), it is condition (c)
that avoids the silly window syndrome. These three conditions also let
us answer the question: if the Nagle algorithm prevents us from sending
small segments while there is outstanding unacknowledged data, how small
is small? From condition (a) we see that "small" means the number of
bytes is less than the segment size. Condition (b) only comes into play
with older, primitive hosts.
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.
阅读(1001) | 评论(0) | 转发(0) |