Re: [tcpm] On the implementation of TCP urgent data (IETF Internet Draft)

Jerry Leichter <leichter@lrw.com> Tue, 03 March 2009 13:24 UTC

Return-Path: <leichter@lrw.com>
X-Original-To: tcpm@core3.amsl.com
Delivered-To: tcpm@core3.amsl.com
Received: from localhost (localhost [127.0.0.1]) by core3.amsl.com (Postfix) with ESMTP id E88903A69BF for <tcpm@core3.amsl.com>; Tue, 3 Mar 2009 05:24:12 -0800 (PST)
X-Virus-Scanned: amavisd-new at amsl.com
X-Spam-Flag: NO
X-Spam-Score: -2.308
X-Spam-Level:
X-Spam-Status: No, score=-2.308 tagged_above=-999 required=5 tests=[AWL=0.291, BAYES_00=-2.599]
Received: from mail.ietf.org ([64.170.98.32]) by localhost (core3.amsl.com [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id JkyqEaUNwMLq for <tcpm@core3.amsl.com>; Tue, 3 Mar 2009 05:24:12 -0800 (PST)
Received: from smtp1.bestweb.net (smtp1.bestweb.net [209.94.103.41]) by core3.amsl.com (Postfix) with ESMTP id 186943A69E7 for <tcpm@ietf.org>; Tue, 3 Mar 2009 05:24:11 -0800 (PST)
Received: from [10.0.1.3] (unknown [69.177.11.241]) (using TLSv1 with cipher AES128-SHA (128/128 bits)) (No client certificate requested) by smtp1.bestweb.net (Postfix) with ESMTPSA id 8E5951254F5; Tue, 3 Mar 2009 08:24:37 -0500 (EST)
Message-Id: <5D3A745D-9B59-4B31-87DB-23B29666A21D@lrw.com>
From: Jerry Leichter <leichter@lrw.com>
To: James Chacon <jmc@netbsd.org>
In-Reply-To: <2059A6D8-4BDA-44FF-827D-655814042138@netbsd.org>
Content-Type: text/plain; charset="US-ASCII"; format="flowed"; delsp="yes"
Content-Transfer-Encoding: 7bit
Mime-Version: 1.0 (Apple Message framework v930.3)
Date: Tue, 03 Mar 2009 08:24:36 -0500
References: <20090227222910.4AAF55654E@rebar.astron.com> <F2BD5C91-4566-487A-8CC0-D180C30B0058@old-ones.com> <2059A6D8-4BDA-44FF-827D-655814042138@netbsd.org>
X-Mailer: Apple Mail (2.930.3)
X-Mailman-Approved-At: Tue, 03 Mar 2009 08:08:09 -0800
Cc: groo@netbsd.org, tcpm@ietf.org, Christos Zoulas <christos@zoulas.com>, Bill Squier <groo@old-ones.com>, Fernando Gont <fernando@gont.com.ar>
Subject: Re: [tcpm] On the implementation of TCP urgent data (IETF Internet Draft)
X-BeenThere: tcpm@ietf.org
X-Mailman-Version: 2.1.9
Precedence: list
List-Id: TCP Maintenance and Minor Extensions Working Group <tcpm.ietf.org>
List-Unsubscribe: <https://www.ietf.org/mailman/listinfo/tcpm>, <mailto:tcpm-request@ietf.org?subject=unsubscribe>
List-Archive: <http://www.ietf.org/mail-archive/web/tcpm>
List-Post: <mailto:tcpm@ietf.org>
List-Help: <mailto:tcpm-request@ietf.org?subject=help>
List-Subscribe: <https://www.ietf.org/mailman/listinfo/tcpm>, <mailto:tcpm-request@ietf.org?subject=subscribe>
X-List-Received-Date: Tue, 03 Mar 2009 13:24:13 -0000

On Mar 2, 2009, at 11:19 PM, James Chacon wrote:
> Actually we have seen leaks in-band when simply sending one byte at  
> a time of OOB. It appears if the distance between 2 bytes exceeds  
> the available OOB marker (which from memory was 16 bits) and nothing  
> reads on the receiving end then on some impls the bytes leak in-band.
>
> We've seen that on linux and on Solaris to my recollection.
I don't dispute the observations, but the explanation makes no sense  
to me.  Yes, the Urgent Pointer is a 16-bit offset from the beginning  
of the segment in which it appears (or something very much like  
that).  It would make no sense to store the UP position as just the 16- 
bit offset inside the implementation, since that's impossible to  
interpret without the segment starting point.  The received segment  
itself already has the (32 bit) position in the stream of the segment,  
and the pair is unambiguous.  An implementation could store the pair,  
but why?  The 32-bit sum of the UP and the segment starting position  
is 2 bytes smaller and contains exactly the same information.

With bugs anything is possible, of course, but it's hard to see why  
having the distance between successive OOB bytes being > 2^16 should  
be significant in and of itself.  How was this tested?  Are you sure  
it's really "gap > 2^16" or could it be "gap large enough" or "enough  
data buffered"?  I can see this leading to the failure mode that I  
described earlier:  User receiver hasn't read data for a long time;  
receiving TCP lets its receive window close as it's running out of  
buffer space; data piles up in sender's TCP stack buffers; eventually  
we have two OOB bytes within the data to be sent; sender doesn't keep  
track of this, or tries to send a segment with two OOB bytes and can  
only encode one.
                                                         -- Jerry