In line:

> On May 12, 2017, at 6:23 PM, Gorry Fairhurst <go...@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<go...@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

_______________________________________________
Taps mailing list
Taps@ietf.org
https://www.ietf.org/mailman/listinfo/taps

Reply via email to