Connected: An Internet Encyclopedia When to Send a Window Update

Up: Connected: An Internet Encyclopedia
Up: Requests For Comments
Up: RFC 1122
Prev: When to Send an ACK Segment
Next: When to Send Data When to Send a Window Update When to Send a Window Update

A TCP MUST include a SWS avoidance algorithm in the receiver [TCP:5].


The receiver's SWS avoidance algorithm determines when the right window edge may be advanced; this is customarily known as "updating the window". This algorithm combines with the delayed ACK algorithm (see Section to determine when an ACK segment containing the current window will really be sent to the receiver. We use the notation of RFC-793; see Figures 4 and 5 in that document.

The solution to receiver SWS is to avoid advancing the right window edge RCV.NXT+RCV.WND in small increments, even if data is received from the network in small segments.

Suppose the total receive buffer space is RCV.BUFF. At any given moment, RCV.USER octets of this total may be tied up with data that has been received and acknowledged but which the user process has not yet consumed. When the connection is quiescent, RCV.WND = RCV.BUFF and RCV.USER = 0.

Keeping the right window edge fixed as data arrives and is acknowledged requires that the receiver offer less than its full buffer space, i.e., the receiver must specify a RCV.WND that keeps RCV.NXT+RCV.WND constant as RCV.NXT increases. Thus, the total buffer space RCV.BUFF is generally divided into three parts:

       |<------- RCV.BUFF ---------------->|
             1             2            3
              RCV.NXT               ^

   1 - RCV.USER =  data received but not yet consumed;
   2 - RCV.WND =   space advertised to sender;
   3 - Reduction = space available but not yet

The suggested SWS avoidance algorithm for the receiver is to keep RCV.NXT+RCV.WND fixed until the reduction satisfies:

       RCV.BUFF - RCV.USER - RCV.WND  >=

               min( Fr * RCV.BUFF, Eff.snd.MSS )

where Fr is a fraction whose recommended value is 1/2, and Eff.snd.MSS is the effective send MSS for the connection (see Section When the inequality is satisfied, RCV.WND is set to RCV.BUFF-RCV.USER.

Note that the general effect of this algorithm is to advance RCV.WND in increments of Eff.snd.MSS (for realistic receive buffers: Eff.snd.MSS < RCV.BUFF/2). Note also that the receiver must use its own Eff.snd.MSS, assuming it is the same as the sender's.

Next: When to Send Data

Connected: An Internet Encyclopedia When to Send a Window Update