Re: [MMUSIC] Trickle ICE for SIP Questions

Emil Ivov <> Fri, 05 July 2013 14:12 UTC

Return-Path: <>
Received: from localhost (localhost []) by (Postfix) with ESMTP id C083F11E80F4 for <>; Fri, 5 Jul 2013 07:12:46 -0700 (PDT)
X-Virus-Scanned: amavisd-new at
X-Spam-Flag: NO
X-Spam-Score: -3.299
X-Spam-Status: No, score=-3.299 tagged_above=-999 required=5 tests=[AWL=-0.300, BAYES_00=-2.599, J_CHICKENPOX_19=0.6, RCVD_IN_DNSWL_LOW=-1]
Received: from ([]) by localhost ( []) (amavisd-new, port 10024) with ESMTP id WSe9L02TAQSK for <>; Fri, 5 Jul 2013 07:12:42 -0700 (PDT)
Received: from ( []) by (Postfix) with ESMTP id 597AC21F9A57 for <>; Fri, 5 Jul 2013 07:12:42 -0700 (PDT)
Received: by with SMTP id j13so2021598wgh.0 for <>; Fri, 05 Jul 2013 07:12:41 -0700 (PDT)
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;; s=20120113; h=message-id:date:from:organization:user-agent:mime-version:to:cc :subject:references:in-reply-to:content-type :content-transfer-encoding:x-gm-message-state; bh=xdcXLTq9fD20hAJUPtFZLnsGloH5Ep0/dwr+E+7OuV8=; b=V14XO9JZTl6nDwPOK6AKI0EEM1mZwnI2b1SFCQcPgYFAOD8KYnQPwsxE163akmYTWt XRYxFRfJ9o7UZmaI60JB2BYwFL9Et2D5nKIExecjuxU0Ebw+BmP+lZOPTMABx8bLg7yz Mn28YScN4/F+1wZbXEpnDBc3C7ExKsGnvSGql5XHSI6wbiAgGSv12PqSI+oaehTTLMsX OZ3ZD04nXttLfHZVTqmYFwesexUmEoTAc0w89W5syjCVkHjclTUQmMc/+P6Ol6mHSxDu 51RoHVtg8RzFM702u3M5tzNTcB4GTdYflarJYLE/4xyLnMUOQwXhlER9jNa8xmO1ELz6 RmLg==
X-Received: by with SMTP id an8mr6168721wjc.72.1373033561380; Fri, 05 Jul 2013 07:12:41 -0700 (PDT)
Received: from ([2001:660:4701:1001:cde3:166e:a5b2:5687]) by with ESMTPSA id fs8sm41152831wib.0.2013. for <multiple recipients> (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Fri, 05 Jul 2013 07:12:40 -0700 (PDT)
Message-ID: <>
Date: Fri, 05 Jul 2013 16:12:38 +0200
From: Emil Ivov <>
Organization: Jitsi
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:17.0) Gecko/20130620 Thunderbird/17.0.7
MIME-Version: 1.0
To: "Stach, Thomas" <>
References: <> <>
In-Reply-To: <>
Content-Type: text/plain; charset="ISO-8859-1"; format="flowed"
Content-Transfer-Encoding: 7bit
X-Gm-Message-State: ALoCoQnG8mECXowkB1DBz5Iv+JttP/oOJMKbLyvZc7nN8fhgF/V+22hT9u384uXp19GC4rHJYuxp
Subject: Re: [MMUSIC] Trickle ICE for SIP Questions
X-Mailman-Version: 2.1.12
Precedence: list
List-Id: Multiparty Multimedia Session Control Working Group <>
List-Unsubscribe: <>, <>
List-Archive: <>
List-Post: <>
List-Help: <>
List-Subscribe: <>, <>
X-List-Received-Date: Fri, 05 Jul 2013 14:12:46 -0000

Hey Thomas

On 04.07.13, 15:15, Stach, Thomas wrote:
> Emil,
> inline
>> -----Original Message-----
>> From: [] On
>> Behalf Of Emil Ivov
>> Sent: Wednesday, 03 July, 2013 16:13
>> Subject: [MMUSIC] Trickle ICE for SIP Questions
>> Hey all,
>> Christer, Enrico and I are preparing the next version of Trickle ICE
>> for
>> SIP. Now that discussions on BUNDLE and the plans seem to be winding
>> down, we wanted to run a few questions by the working group.
>> Q1: Making reliable provisional responses and PRACK mandatory.
>> Obviously
>> this would be nice to avoid, so the question is: is there a reasonable
>> mechanism to achieve this (and by reasonable, we mean something that
>> wouldn't be harder than implementing support for PRACK).
>> There was some discussion about this back in April and there was a
>> suggestion for implementing a 5245-style hack where the answerer
>> basically resends the 180 until it knows that it has been received.
>> 5245 uses connectivity checks for this (i.e. it stops 180
>> retransmissions when the first connectivity check is received) but we
>> don't have that option here since the 180 may contain either none or
>> only host candidates so there are strong chances that no binding
>> request
>> would be received on them.
>> Thomas also suggested a second option which would be to also use INFO
>> requests with trickled candidates as an indication that 180 was
>> received. This however wouldn't work with half trickle so we are
>> basically back to vanilla ICE for all (non-re) INVITEs.
>> Another option would be to mandate an INFO request with
>> "end-of-candidates" in response to the 180, but that would be just the
>> same as mandating PRACK support.
>> Thomas also suggested that the answerer can start sending INFOs right
>> after it sends its answer in the 180 and then it can just resend the
>> 180
>> if the INFOs result in a 481 response.
>> Personally I think this could potentially be made to work, but it would
>> imply a level of complexity that considerably exceeds PRACK support.
> [TS] I'm not convinced about the different level of complexity.
> If you use PRACK you have SIP timer T1 running and would re-transmit the 180 in case that the PRACK is not received.


> Assuming that you want to wait with sending of the INFO until you saw the PRACK, would lead to delay in that case.

True. Is this the only problem that we are trying to optimize? Save half 
an RTT? (This is a really a question. I am not trying to make a point. I 
am simply trying to understand why PRACK is an issue.)

> If you don't wait you would also have to treat a 481 response to the INFO.

I am always a bit nervous when it comes to interpreting error responses. 
We are indeed likely to get a 481 when sending INFOs and the 180 hasn't 
yet made it to the remote side. However 481 might also imply that our 
dialog is simply dead for some reason and in this case 3261 says:

   If the response for a request within a dialog is a 481
   (Call/Transaction Does Not Exist) or a 408 (Request Timeout), the UAC
   SHOULD terminate the dialog.

> ... and you would detect quicker that the 180 was lost than by waiting for the PRACK.

As said above: a lost 180 is not the only possible cause for a 408 in 
this case.

> BTW: 5245 recommends to use PRACK. However it does not mandate it, but gives the alternative procedures as an option.
> You could do the same here.

Of course. I should have made that clearer: all alternative approaches 
were meant as something we could have in addition to the PRACK one.

Also, keep in mind that the 180 carries an entire SDP answer. If INFOs 
are competing with 180s then they may potentially need to carry that too 
(or at least the ICE parts) and it would be good if we don't have to 
open that can of worms.

>> Opinions?
>> Q2: How do we send INFOs? Are they blocking or do we just send them in
>> parallel? If the latter, then what happens when an INFO fails because
>> it
>> is received out of order? Do we just tell the application to resend the
>> candidates asap?
> [TS] I would go with the proposal below and send cumulatively. You also have the CSeq: header field to detect late arrivals.
>> This also leads to the following question:
>> Q3: What exactly do we send in INFOs? Just the latest batch of freshly
>> learned candidates or all candidates we've learned so far? Dale
>> suggested that if we do this cumulatively we wouldn't need to worry
>> about the case with the out-of-order INFOs from Q2 since the
>> information
>> gets resent anyway. A drawback here would obviously be that this adds
>> more complexity for trickle ICE users (WebRTC applications
>> specifically)
> [TS] Again I'm not convinced about the complexity. Both peer know their candidates, what is the issue in putting all of them into the INFO?

I am not sure how current WebRTC stacks handle provisioning of repeating 
candidates. If they don't then it would be up to the receiving JS app, 
to sort our which are the new candidates and which were already there.

The sending side would be similarly tricky for a JS app: it would need 
to construct SDP so that the a=candidate attributes appear under the 
right "a=mid" line.

>> A third option would be to allow both and leave it to the application.
> [TS] This now adds complexity. ;-)

Likely yes.


> I would just always send all candidates.

> Regards
> Thomas
>> Comments are most welcome!
>> Emil
>> --
>> _______________________________________________
>> mmusic mailing list