Window Scale option

David Borman <dab@BSDI.COM> Mon, 04 May 1998 20:17 UTC

Delivery-Date: Mon, 04 May 1998 16:17:23 -0400
Return-Path: tcplw-relay@services.BSDI.COM
Received: from cnri.reston.va.us (ns.cnri.reston.va.us [132.151.1.1]) by ietf.org (8.8.5/8.8.7a) with ESMTP id QAA13125 for <ietf-archive@ietf.org>; Mon, 4 May 1998 16:17:22 -0400 (EDT)
Received: from services.BSDI.COM (services.BSDI.COM [205.230.225.19]) by cnri.reston.va.us (8.8.5/8.8.7a) with ESMTP id QAA05264 for <IETF-archive@cnri.reston.va.us>; Mon, 4 May 1998 16:19:50 -0400 (EDT)
Received: (from daemon@localhost) by services.BSDI.COM (8.8.7/8.8.8) id OAA07791 for tcplw-list@bsdi.com; Mon, 4 May 1998 14:16:01 -0600 (MDT)
Received: from mailfilter.bsdi.com (mailfilter.BSDI.COM [205.230.225.21]) by services.BSDI.COM (8.8.7/8.8.8) with ESMTP id OAA07786 for <tcplw@bsdi.com>; Mon, 4 May 1998 14:16:00 -0600 (MDT)
Received: from frantic.bsdi.com (frantic.BSDI.COM [205.230.227.254]) by mailfilter.bsdi.com (BSDI-MF 1.0) with ESMTP id OAA18297 for <tcplw@bsdi.com> env-from (dab@frantic.bsdi.com); Mon, 4 May 1998 14:14:58 -0600 (MDT)
Received: (from dab@localhost) by frantic.bsdi.com (8.8.8/8.8.8) id PAA27478 for tcplw@bsdi.com; Mon, 4 May 1998 15:15:58 -0500 (CDT)
Date: Mon, 04 May 1998 15:15:58 -0500
From: David Borman <dab@BSDI.COM>
Message-Id: <199805042015.PAA27478@frantic.bsdi.com>
To: tcplw@BSDI.COM
Subject: Window Scale option

There is a change that I would like to add to RFC 1323 about
the Window Scale Option.  The current text on page 10 has:

      *    The connection state is augmented by two window shift counts,
           Snd.Wind.Scale and Rcv.Wind.Scale, to be applied to the
           incoming and outgoing window fields, respectively.

      *    If a TCP receives a <SYN> segment containing a Window Scale
           option, it sends its own Window Scale option in the <SYN,ACK>
           segment.

      *    The Window Scale option is sent with shift.cnt = R, where R
           is the value that the TCP would like to use for its receive
           window.

      *    Upon receiving a SYN segment with a Window Scale option
           containing shift.cnt = S, a TCP sets Snd.Wind.Scale to S and
           sets Rcv.Wind.Scale to R; otherwise, it sets both
           Snd.Wind.Scale and Rcv.Wind.Scale to zero.

I'd like to change this to:

      *    The connection state is augmented by two window shift counts,
           Snd.Wind.Scale and Rcv.Wind.Scale, to be applied to the
           incoming and outgoing window fields, respectively.

!     *    When sending a <SYN> segment, the Window Scale option is
!          sent with shift.cnt = R, where R is the value that the TCP
!          would like to use for its receive window.

!     *    If a TCP receives a <SYN> segment with a Window Scale option
!          containing shift.cnt = S, it sends its own Window Scale option
!          with shift.cnt = R in the <SYN,ACK>.  If R has not been set by
!          the application, either explicitly or implicitly by changing
!          the receive buffer space from its default value, a TCP may set
!          R = S before generating the <SYN,ACK>.  The TCP then sets
!          Snd.Wind.Scale to S and sets Rcv.Wind.Scale to R.

!     *    Upon receiving a <SYN,ACK> segment with a Window Scale option
           containing shift.cnt = S, a TCP sets Snd.Wind.Scale to S and
           sets Rcv.Wind.Scale to R; otherwise, it sets both
           Snd.Wind.Scale and Rcv.Wind.Scale to zero.

I have implemented this in both UNICOS and BSD/OS, with no ill
effects.  The reason for wanting to recommend turning around the
scale value is that it can only be negotiated during the initial
3-way handshake, and on the passive side, the application that is
doing the listen()/accept() may not be the one that knows that the
receive buffer should be increased to get the a window scale value
sent as non-zero.  E.g, it is inetd that accepts the connection,
which then execs rshd, which in turn execs rcp, which is the
application that knows we're doing a bulk data transfer so the
buffers should be made larger, but by then its too late.  One way
to address this is to modify inetd to allow it to set the receive
buffers large for rshd.  However, rshd is used for other things
besides rcp.  If the receive buffers are made large in inetd, and
the application changes them back to the default values, then you
have an outstanding advertised window from the initial window when
the buffers were larger, which TCP can't retract.

		-David Borman, dab@bsdi.com