Re: Window Scale option

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

Delivery-Date: Mon, 04 May 1998 18:12:30 -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 SAA14635 for <ietf-archive@ietf.org>; Mon, 4 May 1998 18:12:29 -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 SAA05825 for <IETF-archive@cnri.reston.va.us>; Mon, 4 May 1998 18:14:56 -0400 (EDT)
Received: (from daemon@localhost) by services.BSDI.COM (8.8.7/8.8.8) id QAA19056 for tcplw-list@bsdi.com; Mon, 4 May 1998 16:11:24 -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 QAA19053 for <tcplw@bsdi.com>; Mon, 4 May 1998 16:11:23 -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 QAA19709 for <tcplw@bsdi.com> env-from (dab@frantic.bsdi.com); Mon, 4 May 1998 16:10:20 -0600 (MDT)
Received: (from dab@localhost) by frantic.bsdi.com (8.8.8/8.8.8) id RAA27660; Mon, 4 May 1998 17:11:12 -0500 (CDT)
Date: Mon, 04 May 1998 17:11:12 -0500
From: David Borman <dab@BSDI.COM>
Message-Id: <199805042211.RAA27660@frantic.bsdi.com>
To: braden@isi.edu, kml@nas.nasa.gov
Subject: Re: Window Scale option
Cc: tcplw@BSDI.COM

> Subject: Re: Window Scale option 
> Date: Mon, 04 May 1998 14:34:50 -0700
> From: "Kevin M. Lahey" <kml@nas.nasa.gov>
>
> In message <199805042039.AA20137@gra.isi.edu>braden@isi.edu writes
> >Hmmmm.  It seems clear in retrospect that a host really wants to allow
> >its applications to dynamically adjust the amount of receive buffering
> >they can have, and thereby possibly adjust the window scaling.
>
> I'd certainly like to see this happen dynamically -- I often wind up
> with windows on my HIPPI LAN that are either way too small or way too
> large.  Just specifying a large value is problematic, as it will wind
> up, as Dave Borman points out, in burning buffer for small, slow

I don't think I quite said that, but that is true. :-)

> links.   In the BSD stack, it is possible to associate socket buffer
> sizes with routes, so this can take care of some of the problem.

A couple of points.  First, you don't have to have large buffers
to use the window scale option.  In reality, what the window scale
option does is change the granularity of the window updates.  As long
as that granularity is smaller than your threshhold for silly window
syndrom avoidance, things will work just fine.  A window shift of 4
allows a megabyte of window, with a window update granularity of 16
bytes, which is well below any SWS threshhold value.  So, using
typical 8K buffers, you can use window scale values of at least
5 or 6 without having any impact on performance.

So, if bulk-data transfer clients send a window shift option, and
the server automatically turns it around, it shouldn't cause any
problems on the server.  In BSD/OS I turn around the window scale,
but I limit it to no more than 4 (changable by sysctl) to keep us from
getting into trouble if we receive a window scale of 13 or 14 and our
receive buffer is only 8K...

I guess what I'm really saying is that if you have a user interface
to TCP to allow the application to specify the window scale value
without having to set the buffer size, and the server turns around
the window scale value, then you can make TCP connections that are
ready to use large buffers if the application wants them, without
having to pre-allocate any extra buffer space on either the client
or the server (and thus have an initial large window).  But typically
the client will know whether or not large buffers are wanted, so
having it set a large receive buffer, and having the server turn around
the scale option (without changing the buffer size) is usually sufficient.

The only reason you don't want to always send a window scale option
of at least 3 or 4 in the SYN is to avoid possible interoperability
problems with older TCPs that don't properly ignore unknown TCP
options, especially if there is no way that the application will ever
be able to take advantage of it (i.e, it doesn't have a lot of data
to transfer).

		-David Borman, dab@bsdi.com