Re: [tcpm] Is this a problem?

John Heffner <> Wed, 14 November 2007 15:46 UTC

Return-path: <>
Received: from [] ( by with esmtp (Exim 4.43) id 1IsKRj-0001bu-UE; Wed, 14 Nov 2007 10:46:31 -0500
Received: from tcpm by with local (Exim 4.43) id 1IsKRi-0001WY-Ah for; Wed, 14 Nov 2007 10:46:30 -0500
Received: from [] ( by with esmtp (Exim 4.43) id 1IsKRh-0001WE-VU for; Wed, 14 Nov 2007 10:46:29 -0500
Received: from ([2001:5e8:1:3a::64]) by with esmtp (Exim 4.43) id 1IsKRh-0007Uj-Ft for; Wed, 14 Nov 2007 10:46:29 -0500
Received: from [] ( []) (authenticated bits=0) by (8.14.1/8.13.3) with ESMTP id lAEFkPMx029311 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Wed, 14 Nov 2007 10:46:26 -0500 (EST)
Message-ID: <>
Date: Wed, 14 Nov 2007 10:46:25 -0500
From: John Heffner <>
User-Agent: Thunderbird (Macintosh/20070728)
MIME-Version: 1.0
To: Mahesh Jethanandani <>
Subject: Re: [tcpm] Is this a problem?
References: <> <> <> <> <> <> <> <> <>
In-Reply-To: <>
Content-Type: text/plain; charset="ISO-8859-1"; format="flowed"
Content-Transfer-Encoding: 7bit
X-Spam-Score: -1.4 (-)
X-Scan-Signature: e8a67952aa972b528dd04570d58ad8fe
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: TCP Maintenance and Minor Extensions Working Group <>
List-Unsubscribe: <>, <>
List-Post: <>
List-Help: <>
List-Subscribe: <>, <>

Mahesh Jethanandani wrote:
> Ethan Blanton wrote:
>> Yes; however, I agree with Joe (and others) that in the situation you
>> are *actually* trying to solve, this is not particularly relevant.  If
>> you are short on resources, the distinction between "not making
>> progress due to zero window" and "not making progress for some other
>> reason" does not seem important.  As previously mentioned, zero window
>> does _not_ indicate a malicious host in any way.
> Where is the fairness argument in knocking connections off without 
> making distinctions? A connection that is not making progress because of 
> congestion in the network is a transient behavior and is very different 
> from a connection that continues to advertise a zero window. The former 
> is much harder to do and requires TCP stack changes. Zero window 
> connection can be made to happen on a whim (as we successfully did) on a 
> large number of connections from a user level program with little or no 
> privileges.

It's actually an easy and generally more effective attack to just drop 
all the packets on the floor rather than continue ACKing with zero 
window.  The connection will eventually time out, but it takes so long, 
it's easy to initiate another one in this time to take its place.  Once 
again, please look carefully at Stas's netkill: 
<>.  It's a simple short perl script.  The 
defense you are proposing does nothing for this attack.

I don't think it's critical to determine whether a connection is stalled 
while limited by cwnd or rwin.  This *may* be useful information, but 
it's not the most important.  In my view, the more important thing to 
know is (1) whether the connection is making progress, and (2) how much 
memory (the contended resource) it is using.   Using this information, 
you can implement a policy that resets connections that are consuming 
resources with no benefit (progress).  This solves the more general 
problem -- both the netkill attack and a persist attack.

Also, I have a quibble with some of the language in the draft that I 
think reflects a view of where the solution must go:

    In most implementations, TCP runs in kernel mode as part of the
    operating system.  In this mode the operating system may share the
    same address space as TCP.  For the purposes of discussion, this
    draft considers TCP protocol implementation to be a separate module
    responsible for all resources such as buffers and connection control
    blocks that it borrows from the operating system.  The operating
    system can enforce the maximum number of buffers it is willing to
    give to TCP but beyond that it lets TCP decide how to manage them.

Even if you view TCP as running with an inaccessible address space, it 
can still export all sorts of information, in both standard (see RFC 
4022 and RFC 4898) and non-standard ways.  From a standards point of 
view, I think RFC 4898 exports all the necessary information.

And even if the solution must be implemented in an independent TCP 
module, this does not mean the solution should be defined and 
standardized as a transport layer mechanism.  A TCP module could 
implement a memory-based fairness policy if it's controlling its own 
memory pool as you describe.  This does not mean you need to change the 
definition of how the TCP protocol behaves in the persist state.


tcpm mailing list