Re: [Taps] New rev of udp-usage (01) and review comments on taps-transport-usage-04

Michael Welzl <michawe@ifi.uio.no> Fri, 12 May 2017 20:41 UTC

Return-Path: <michawe@ifi.uio.no>
X-Original-To: taps@ietfa.amsl.com
Delivered-To: taps@ietfa.amsl.com
Received: from localhost (localhost [127.0.0.1]) by ietfa.amsl.com (Postfix) with ESMTP id 80FDF1314B5 for <taps@ietfa.amsl.com>; Fri, 12 May 2017 13:41:56 -0700 (PDT)
X-Virus-Scanned: amavisd-new at amsl.com
X-Spam-Flag: NO
X-Spam-Score: -4.201
X-Spam-Level:
X-Spam-Status: No, score=-4.201 tagged_above=-999 required=5 tests=[BAYES_00=-1.9, RCVD_IN_DNSWL_MED=-2.3, RP_MATCHES_RCVD=-0.001, SPF_PASS=-0.001, URIBL_BLOCKED=0.001] autolearn=ham autolearn_force=no
Received: from mail.ietf.org ([4.31.198.44]) by localhost (ietfa.amsl.com [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id dZC1-7jEkMJ6 for <taps@ietfa.amsl.com>; Fri, 12 May 2017 13:41:53 -0700 (PDT)
Received: from mail-out02.uio.no (mail-out02.uio.no [IPv6:2001:700:100:8210::71]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ietfa.amsl.com (Postfix) with ESMTPS id 0B8E21270A7 for <taps@ietf.org>; Fri, 12 May 2017 13:37:48 -0700 (PDT)
Received: from mail-mx06.uio.no ([129.240.10.40]) by mail-out02.uio.no with esmtp (Exim 4.82_1-5b7a7c0-XX) (envelope-from <michawe@ifi.uio.no>) id 1d9HJq-000Etg-U7 for taps@ietf.org; Fri, 12 May 2017 22:37:46 +0200
Received: from 234.133.189.109.customer.cdi.no ([109.189.133.234] helo=[192.168.1.8]) by mail-mx06.uio.no with esmtpsa (TLSv1.2:DHE-RSA-AES256-GCM-SHA384:256) user michawe (Exim 4.82_1-5b7a7c0-XX) (envelope-from <michawe@ifi.uio.no>) id 1d9HJp-0008Nz-GC; Fri, 12 May 2017 22:37:46 +0200
Content-Type: text/plain; charset="utf-8"
Mime-Version: 1.0 (Mac OS X Mail 10.3 \(3273\))
From: Michael Welzl <michawe@ifi.uio.no>
In-Reply-To: <5915E180.2050106@erg.abdn.ac.uk>
Date: Fri, 12 May 2017 22:37:43 +0200
Cc: "taps@ietf.org" <taps@ietf.org>
Content-Transfer-Encoding: quoted-printable
Message-Id: <41460979-E1A4-480B-BEFC-CF64B5B72442@ifi.uio.no>
References: <15106817-a81c-d247-5fad-a67c5faa93f3@erg.abdn.ac.uk> <8A063CAE-55DF-4C38-8631-DC854564DE22@ifi.uio.no> <5915B787.4000307@erg.abdn.ac.uk> <C3B22635-ABDC-4E39-A028-A9B7D479ADA2@ifi.uio.no> <5915E180.2050106@erg.abdn.ac.uk>
To: "<gorry@erg.abdn.ac.uk> Fairhurst" <gorry@erg.abdn.ac.uk>
X-Mailer: Apple Mail (2.3273)
X-UiO-SPF-Received: Received-SPF: neutral (mail-mx06.uio.no: 109.189.133.234 is neither permitted nor denied by domain of ifi.uio.no) client-ip=109.189.133.234; envelope-from=michawe@ifi.uio.no; helo=[192.168.1.8];
X-UiO-Ratelimit-Test: rcpts/h 2 msgs/h 1 sum rcpts/h 4 sum msgs/h 2 total rcpts 54627 max rcpts/h 54 ratelimit 0
X-UiO-Spam-info: not spam, SpamAssassin (score=-5.0, required=5.0, autolearn=disabled, AWL=0.000, TVD_RCVD_IP=0.001, UIO_MAIL_IS_INTERNAL=-5, uiobl=NO, uiouri=NO)
X-UiO-Scanned: 763A32DF71B37328F3B982016C6AE9296B6AF177
X-UiO-SPAM-Test: remote_host: 109.189.133.234 spam_score: -49 maxlevel 80 minaction 2 bait 0 mail/h: 1 total 1392 max/h 13 blacklist 0 greylist 0 ratelimit 0
Archived-At: <https://mailarchive.ietf.org/arch/msg/taps/b1hV3Ti9cGDJ5jt9W24gwkM--_M>
Subject: Re: [Taps] New rev of udp-usage (01) and review comments on taps-transport-usage-04
X-BeenThere: taps@ietf.org
X-Mailman-Version: 2.1.22
Precedence: list
List-Id: Discussions on Transport Services <taps.ietf.org>
List-Unsubscribe: <https://www.ietf.org/mailman/options/taps>, <mailto:taps-request@ietf.org?subject=unsubscribe>
List-Archive: <https://mailarchive.ietf.org/arch/browse/taps/>
List-Post: <mailto:taps@ietf.org>
List-Help: <mailto:taps-request@ietf.org?subject=help>
List-Subscribe: <https://www.ietf.org/mailman/listinfo/taps>, <mailto:taps-request@ietf.org?subject=subscribe>
X-List-Received-Date: Fri, 12 May 2017 20:41:57 -0000

In line:


> On May 12, 2017, at 6:23 PM, Gorry Fairhurst <gorry@erg.abdn.ac.uk> wrote:
> 
> More below.
> 
> On 12/05/2017, 16:27, Michael Welzl wrote:
>>> On May 12, 2017, at 3:24 PM, Gorry Fairhurst<gorry@erg.abdn.ac.uk>  wrote:
>>> 
>>> See below.
>>> 
>>> On 12/05/2017, 13:31, Michael Welzl wrote:
>>>> Hi,
>>>> 
>>>> Thanks a lot for all your comments (plus the nits we authors of the other -usage draft received offline).
>>>> 
>>>> I’ll try to address them all - but there are a two technical questions in this email that made me stop, so I’ll cut all the editorial stuff away and discuss them here - in line below:
>>>> 
>>>> 
>>>>> - Why do this??? - Isn't it better to set flow labels per interface or for the whole stack, how can any specific transport or application pick unique labels?
>>>>> TEXT:
>>>>>>   o  Specify IPv6 flow label field
>>>>>>      Protocols: SCTP
>>>>> (i.e., Is this automatable by the host and a host wide
>>>>> configuration?)
>>>> Somehow the question seems irrelevant in the context of this draft, which is a list of transport features of protocols. These features are defined in the RFCs spec’ing the protocols - for SCTP, this is defined, and that’s why it’s here.
>>>> 
>>>> We can discuss this for the proposed services that a system should offer, which we try to write up in the minset draft:
>>>> I do think that an application should be allowed to assign a label to a TAPS flow (as we call them), which could then map to this function. I mean, isn’t a flow label supposed to identify a transport flow? Then a system-wide configuration wouldn't seem right to me.
>>> I think we may disagree. Flow ids identify flows to the network layer, they have no role at the transport layer, and need to be unique (as best they can) for a source address.
>> We disagree indeed - in particular about the “unique (as best they can)..” bit. Where is this written??
> I'm taking the position of using this as input to an ECMP or LAG hash algorithm.
>> 
>>> I much prefer the idea that the Flow id is generated by the IP system, by using a hash - possibly utilising transport data as a part of this hash, and including the protocol number.
>> RFC 6437 introduces the flow label as a replacement for the 5-tuple - “possibly utilising transport data as a part of this hash” seems to me to be a very weak requirement here!
> OK, which I think is the idea in RFC6438.
>> Anyway classifiers in the network wouldn’t work on the flow label alone, but, from RFC 6437, section 2 which is called “specification”:
>>   "Packet classifiers can
>>    use the triplet of Flow Label, Source Address, and Destination
>>    Address fields to identify the flow to which a particular packet
>>    belongs."
> Yes.
>> Then what is the flow label good for, if it’s unique per source address? It doesn’t add any information to this 3-tuple in this case!
> Aha - I mean each "microflow" sent from a specific source address should be identified by a different and unique flow ID.

Ah! Then we agree - for most normal cases (to support ECMP). The flow grouping case described below would be an exception.


>>> That seems to be what ECMP is expecting and I suspect ECMP is an improtant use-case.
>>> 
>>> The alternative (if I understand) could be: I could imagine each application could (in theory) be provided with an API to find out what flow-ids are currently being used for each interface it cares about and to then reserve one of the unused IDs for the specific interface(s) that it wishes to use. Then we need to ensure all upper layer entities coordinate on this. To me, this seems over-kill, and the approach taken with ephemeral port assignment is much simpler - the application simply doesn't get involved with choosing the number.
>>> 
>>> Now if what you are saying is that you want the App to somehow signal that it can use an existing flow ID that is in use, and combine data with that flow to get the same network treeatment, I can understand the case. However, that's not exactly the same thing.
>> I understand that it would be nice to avoid upper-layer coordination here. However, I see at least two use cases for the application being more in control:
>> 1) avoiding fate sharing (encouraging ECMP), e.g. for increased resilience
> Yes. Part of the idea here is that microflows (say with the same IPsec ESP) can now be separately forwarded if that is what is desired by the sending endpoint.
>> 2) the opposite: grouping flows, to be able to apply priorities on them, using a mechanism such as the Congestion Manager or https://tools.ietf.org/html/draft-welzl-tcp-ccc
> That's the converse of the IPsec ESP example above, and also ok if the endpoint wishes this.
>> So this is not about giving the application control of the specific flow label number, but allowing it to say “use the same number for these flows” or not.
> That's fine with me. Providing it is *NOT* the flow-id, but an input to the function that determines the flow-id.
>> I think this could nicely be done by letting it number flows, and grouping them via equal numbering - without guaranteeing that these numbers map onto the exact same numbers as a flow label.
> OK.

Great!  So we agree!


>>>>> -------------------
>>>>> Get Interface MTU is missing from pass 2 and 3:
>>>>> 
>>>>> ADD to pass 2:
>>>>> 
>>>>> 	GET_INTERFACE_MTU.UDP:
>>>>> 		Pass 1 primitive: GET_INTERFACE_MTU
>>>>> 		Returns: Maximum datagram size (bytes)
>>>> But this doesn’t exist!
>>> I think I don't understand your comment ... and interpretting low-numbered RFCs is never easy -  I'll use RFC1122 as my basis:
>>> 
>>> RFC 1122 says:
>>>       " A host MUST implement a mechanism to allow the transport layer
>>>         to learn MMS_S, the maximum transport-layer message size that
>>>         may be sent for a given {source, destination, TOS} triplet..."
>>>       " and EMTU_S must be less than or equal to the MTU of the network
>>>         interface corresponding to the source address of the datagram."
>>> 
>>> TCP handles this for the app.
>> … and UDP is another such transport layer. If you try to send a message that’s too large, it throws an error, based on the information it gets via the paragraph you quote above.
>> But that’s UDP, not the application on top.
> I don't expect each UDP app to have to start by trying to send 64,000B and reducing to see what works. Apps need to be able to find this out.
> 
> (If you happened to implement host fragementation, any size of send upto your fragmentation limit would always return true when writing).
> 
>>>>  It’s strictly an IP function and I couldn’t find it described for UDP anywhere. I think we agreed on how a TAPS system should handle this, and this is reflected in
>>>> https://tools.ietf.org/html/draft-gjessing-taps-minset-04#section-6.4.1
>>>> … which may require a system to implement new local functionality, maybe based on this MTU function - but to my understanding it’s just not something that UDP offers.
>>> It's something that a UDP App really needs to pay attention to as per RFC8085 - we may differ on whether you call that "offers" or needs to function. Either way, an app that plans to use any form of PMTUD needs to use this number.
>> I agree; and we have put related functions into the minset draft.
> Yes we do agree. If you want to redefine that to bytes permitted in the UDP payload, I would also be really happy.

Good - because that’s how it’s currently written in draft-gjessing-taps-minset-04


>> But here we’re describing what it is that UDP itself (not a full-fleged TAPS system) currently offers…
>> 
> And for that, the UDP app must assume either the network-wide default, or base this on maths from the MTU info at the network-layer (section 3.2 of RFC8085). That's part of using UDP.
>>> As put in RFC1122:
>>>       " A host that does not implement local fragmentation MUST ensure
>>>         that the transport layer (for TCP) or the application layer
>>>         (for UDP) obtains MMS_S from the IP layer and does not send a
>>>         datagram exceeding MMS_S in size.”
>> Okaaay, you found an instance of  “ _ or the application layer (for UDP) _ “.    I agree this should be included!  But, this is not the interface MTU.
> Maybe it's better to read PMTU, and I'd be fine with a socket (or whatever API) retrieving that in place of the Interface-MTU).

… but it’s not the PMTU either - as we agree below:


>> From RFC 1122:
>> 
>> ***
>>          If no local fragmentation
>>          is performed, the value of MMS_S will be:
>> 
>>             MMS_S = EMTU_S -<IP header size>
>> 
>>          and EMTU_S must be less than or equal to the MTU of the network
>>          interface corresponding to the source address of the datagram. paragraph further above defines MMS_S as the maximum transport-layer m
>> ***
>> 
>> So first of all, there’s the “if” - this would only be the value without local fragmentation. Can we assume that there won’t be local fragmentation?
> We put the discussion text of host fragmentation in the "DF" discussion of our draft.
> 
> You could argue that we separate these because "DF" can be set on host fragments. (IPv6
>> Then, EMTU_S<= interface MTU,
> OK
>> and MMS_S is even smaller: very reasonably, the IP header size is subtracted.
> OK, I'd also be happy to say retrieves MMS_S. (I'm not sure though this in practice is implemented ?) -- but does this primitive exist in the real world? or do we need to explain both?

Let’s stick with what the spec says - both of these drafts are just an overview of the spec and may differ quite a bit from implementations (I know mine does).

Cheers,
Michael