Re: Timer for chunked messaging. Was [Re: Fwd: Re: Adrian Farrel's Discuss on draft-ietf-simple-chat-16: (with DISCUSS and COMMENT)]

"Miguel A. Garcia" <[email protected]> Thu, 6 Sep 2012 12:45:24 +0200
Newsgroups gmane.ietf.simple
Message-ID <[email protected]>
Hi Ben:

Some inline comments.

On 05/09/2012 20:54, Ben Campbell wrote:
>
> On Sep 5, 2012, at 8:32 AM, Miguel A. Garcia
> <[email protected]> wrote:
>
>> In relation with the issue of chunked messages, where the MSRP
>> switch does not receive a last chunk due to, e.g., the sender's
>> connection is dropped, I have a proposal and a doubt.
>>
>> Proposal:
>>
>> Once the MSRP switch receives the last chunk of a message, and that
>> chunk is successfully sent to each of the recipients, the MSRP
>> switch MUST discard the temporary storage of MSRP Message-ID and the
>> associated list of recipients.
>>
>>
>> In some occasions, a sender might suffer a transport error condition
>> (such as loss of connectivity) that makes the sending of a message
>> incomplete, e.g., some chunks were received by the MSRP switch, but
>> not all of them.
>
> It's not limited to transport failures. For example, the sender could
> lose power before completing the message.

True, that is another example of loss of connectivity. I will add it.

>
>> This is a behavior already considered in the core MSRP
>> specification (see <xref target="RFC4575"> RFC 4575 </xref> Section
>> 5.4). The problem in the context of a chat room lies with the usage
>> of temporary storage for fast forwarding.
>
> Seems like it would be even worse if you weren't doing fast
> forwarding. Then the switch would be saving the chunk contents for
> reassembly, wouldn't it?

Yeah, you hit a point that I was thinking yesterday when I was composing
the text. The need of a timer to detect incomplete messages (due to chunk
messaging) is not restricted to the fast forwarding mechanism, but it is
also applicable when the non-fast forwarding mechanism is used.

Let's keep this in mind. First I want to get the text correct and
complete focusing on the fast forwarding mechanism. Then we will need to
extrapolate it to the non-fast forwarding mechanism.


>
>> In order to prevent attacks related to the exhaustion of temporary
>> storage of chunked messages, on receiving a first chunk of a
>> message, where the MSRP switch is using the fast forward method, the
>> MSRP switch MUST set a timer for controlling the reception of the
>> remaining chunks. This timer can be re-set every time a new chunk of
>> the same message is received. When this timer fires, the MSRP switch
>> MUST considered that the sending of the message was aborted, and
>> MUST delete all the temporary storage pertaining to this message.
>>
>> Now the doubt. If the above condition happens, I would like to know
>> what is best to do with respect the recipients. These are in a
>> strange state, where they have received a number of chunks of a
>> message, but not all the chunks, and they will not receive any more.
>> What the MSRP switch can do:
>>
>> a) Nothing. The recipients have received a number of a chunks of a
>> message; the message is not complete. The MSRP switch will send
>> other messages (perhaps originated by other participants), but this
>> chunked message will remain in the endpoints until the endpoint
>> crashes^H^H^H^H^H^H^Hrecovers from that situation.
>>
>> b) A nice MSRP switch will create a new chunk, as it if were
>> received from the sender, where there won't be any content, but just
>> the abort flag "#". At least this one will have a bigger likelihood
>> of endpoint recovery.
>>
>> I propose to do b). I guess there are no security issues, even if
>> TLS is used, because the TLS connection is ending at the MSRP
>> switch.
>>
>> Can anyone think of other options? Is option b) reasonable?
>>
>
> Repeating a comment from a separate thread:
>
> On reflection, I'm not sure we need to be aggressive with the
> normative language here. The receiving endpoints already have to be
> able to deal with missing chunks. We are talking about optimizations
> here, not interop-critical behavior. I would lean towards making it
> clear that a switch doesn't have to keep the message-id and recipients
> around forever, and allow it to send a cancelation chunk if it wants
> to, but not require it. Specifically, something to the effect of the
> following:
>
> 1) The switch MAY discard the message state if it receives no chunks
> within some reasonable time. The specific timeout value is a matter of
> local policy, but SHOULD NOT be too short. For example, a time
> interval on the order of a normal TCP timeout (i.e. around 9 minutes)
> would be reasonable. A timeout on the order of a few seconds would
> not.
>
> 2) If a timeout occurs, or some other error occurs that prevents all
> chunks from arriving at the switch, the switch MAY choose to send a
> cancelation chunk. This is an optimization, since MSRP endpoints need
> to be able to handle incomplete messages anyway.

Totally agreed. I will work to reflect this in the draft.

/Miguel


>
>
>
>> /Miguel
>>
>>
>> On 05/09/2012 9:19, Miguel A. Garcia wrote:
>>> In my previous e-mail, please s/5.3/5.4
>>>
>>> To be explicit: the MSRP Connection Model is described in Section
>>> 5.4 of RFC 4975.
>>>
>>> /Miguel
>>>
>>> On 05/09/2012 9:15, Miguel A. Garcia wrote:
>>>> Hi Ben,
>>>>
>>>> Thanks for your comments
>>>>
>>>> On 04/09/2012 16:26, Ben Campbell wrote:
>>>>> (As individual)
>>>>>
>>>>> Hi,
>>>>>
>>>>> I agree with Miguel's responses except as noted inline
>>>>>
>>>>> Thanks!
>>>>>
>>>>> Ben.
>>>>>
>>>>> On Sep 4, 2012, at 8:35 AM, "Miguel A. Garcia"
>>>>> <[email protected]> wrote:
>>>>>>
>>>>>>>
>>>>>>> ---
>>>>>>>
>>>>>>> Section 6.1
>>>>>>>
>>>>>>> An MSRP switch that uses this fast forwarding procedure
>>>>>>> MUST temporarily store the Message-Id of the MSRP message
>>>>>>> to correlate the different chunks, as well as it MUST
>>>>>>> temporarily store the list of recipients to which the
>>>>>>> initial chunks were delivered.
>>>>>>>
>>>>>>> The motivaiton is clear. I think you could add that the
>>>>>>> storage can be released when the last chunk is seen. But
>>>>>>> what happens when the last chunk is not seen (or delayed)?
>>>>>>> How temporary is the storage, and how is it released?
>>>>>>
>>>>>> Yes, we can add that the temporary storage is released when
>>>>>> the last chunk is seen or after a reasonable time passes.
>>>>>
>>>>> The "how long to wait for a chunk" problem is no different
>>>>> than for any other endpoint, is it, other than possibly
>>>>> differences of scale? I suggest we refer back to 4975 for
>>>>> this, with the possible note to the effect of "This is no
>>>>> different than for any MSRP endpoint that receives a chunked
>>>>> message. However, since a conference switch will typically
>>>>> participate many sessions at one time, storage management may
>>>>> be more critical"
>>>>
>>>>
>>>> I would like to include a reference to the section in RFC 4975
>>>> that discusses this topic. I guess it is Section 5.3, when it
>>>> discusses what happens if a transport connection fails.
>>>>
>>>>>
>>>>>>>
>>>>>>> Or do we assume that because MSRP uses TCP (or similar)
>>>>>>> that loss will always be accompanied by connection failure
>>>>>>> and so that is the only trigger needed to abandon
>>>>>>> temporary storage?
>>>>>>
>>>>>> Yes, on one side, the assumption is that if a last chunk is
>>>>>> not seen is because there has been a transport failure.
>>>>>> Since TCP is used, then the TCP connection was broken, and
>>>>>> is in the process of being re-established. I am more
>>>>>> concerned about what happens if the last chunk is not seen
>>>>>> at all, I am not sure the state the MSRP session will be,
>>>>>> even if the connection is re-established.
>>>>>
>>>>> Keep in mind there could be an MSRP relay between the sender
>>>>> and the switch, so the transport connection may not be direct.
>>>>> But again, this is no different than for any other MSRP
>>>>> endpoint.
>>>>
>>>> Exactly. Here we clearly need to refer to Section 5.3 of RFC
>>>> 4975.
>>>>
>>>>>
>>>>>>
>>>>>>
>>>>>>> ---
>>>>>>>
>>>>>>> Section 6.1 (trivial nit)
>>>>>>>
>>>>>>> The SEND request MUST contain a top-level wrapper of type
>>>>>>> 'Message/ CPIM' according to RFC 3862 [RFC3862].  The
>>>>>>> actual instant message payload MUST be included as payload
>>>>>>> of the 'Message/CPIM' wrapper and MAY be of any type
>>>>>>> negotiated in the SDP 'accept-types' attribute according
>>>>>>> to the MSRP rules.
>>>>>>>
>>>>>>> I think s/MAY/may/. That is, a type must be set, and the
>>>>>>> type must be only one of those that has been negotiated.
>>>>>>>
>>>>>>>
>>>>>>
>>>>>> I think this MAY should actually be a MUST, because as you
>>>>>> said, a types must be said, and this type cannot be anyone,
>>>>>> but it MUST be one of those negotiated.
>>>>>
>>>>> This is already mandated in RFC4975 (as you go on to say...).
>>>>> The only thing new is the normative requirement for a
>>>>> particular wrapper type. It might be worth commenting that
>>>>> this is accomplished by putting only Message/CPIM in
>>>>> accept-types, and all allowed leaf types in
>>>>> accept-wrapped-types.
>>>>
>>>> Ok, we can clarify it. Actually, we do not mention what can go
>>>> in an accept-wrapped-types, because it was obvious that any type
>>>> can go in. But it might be worth adding some explicit mention to
>>>> it.
>>>>
>>>>>
>>>>>>
>>>>>> I like the "according to the MSRP rules", as a mechanism to
>>>>>> indicate that we are not mandating something new, but just
>>>>>> copying what MSRP mandates.
>>>>>>
>>>>>
>>>>> ... in which case it should be stated descriptively, not
>>>>> normatively.
>>>>
>>>> Hmmm, that is true. I suggest to move away from
>>>> MUST/MAY/must/may. I think the text ought to say: "According to
>>>> RFC 4975, the endpoint needs to  ...". This is makes it clear,
>>>> and we do not over-specify.
>>>>
>>>> /Miguel
>>>>
>>>
>>
>> -- Miguel A. Garcia +34-91-339-3608 Ericsson Spain
>> _______________________________________________ Simple mailing list
>> [email protected] https://www.ietf.org/mailman/listinfo/simple
>

-- 
Miguel A. Garcia
+34-91-339-3608
Ericsson Spain