Hi Derek,

I think I have addressed all your comments except the CRLF backward compatibility, which I have fixed in my working copy. See below for specifics.


On Aug 6, 2007, at 3:46 PM, Derek MacDonald wrote:

I've finished my review of outbound-10, mainly thinking about things
from a client implementation & NAT traversal perspective.

Major issues:

The following issues are all one part of what I think is the core
issue w/ outbound; the draft does not require normative behavior that
will result in successful NAT traversal, although it does contain the
necessary mechanisms for NAT traversal
In 4.2 and 4.3 it is stated that route-set creation is outside the
scope of outbound.  The behavior that is would work for NAT traversal
in a simple deployment is described as an example in 4.2.

I think this is greatly improved in -11 by the following changes:

outbound-11 now states that the edge proxy is expected to record- route with a flow-token if the client includes an 'ob' parameter in its Contact. If the client is using gruu, it uses the gruu instead in its contact. The UA now also uses rport in all requests.

I think this should be sufficient to insure responses (rport), incoming requests (from Path flow token in REGISTER), and in-dialog requests (from Record-Route flow token, or from a GRUU) all get back to the UA.

From 4.2:

"Forming the route set for the request is outside the scope of
 this document, but typically results in sending the REGISTER such
 that the topmost Route header field contains a loose route to the
 outbound proxy URI."

Are we really anticipating that an element will be inserted between
the UA and the outbound proxy(s).  Do we want to allow this?

no and no. The "typically results in sending the REGISTER..." text is there to allow the traditional usage of an outbound proxy, which is to resolve the IP address, port, and transport and send it there without including a Route header at all.

If there
is such an element in the route set, it will either have to:

Support outbound, which causes a single point of failure if there
isn't a 1-1 correspondence with the edge proxies. If there is a 1-1
correspondence with the edge proxies, it is an edge proxy, so is
should have just been configured as the outbound proxy.

 OR

Transparently relay outbound, which seems like a very bad idea.

I think we should change the text to something like:

"While forming the route set for the request is outside the scope of
this specification, the first element in the route set for a
registration MUST be from the outbound-proxy-set in order to use this
specification."

I think the current text already require that the first element visited (whether in the route set or not) is in the outbound-proxy-set.

Section 4.3 Discusses how a UA would send a request, but does not
describe the basic behavior that would establish a dialog through a
NAT.

" When a UA is about to send a request, it first performs normal
   processing to select the next hop URI.  The UA can use a variety of
techniques to compute the route set and accordingly the next hop URI. Discussion of these techniques is outside the scope of this document
   but could include mechanisms specified in RFC 3608 [22] (Service
   Route) and [21]."

If the next hop does not support outbound, and isn't an existing flow,
a dialog establishing request will likely result in a route set which
does not work through a NAT.  The rport mechanism only provides NAT
traversal for a single SIP response.

correct.  there is now text setting the responsibility clearly:
If the registrar did not support outbound, the UA may have unintentionally registered an unroutable contact. It is the responsiblity of the UA to remove any inappropriate Contacts.


"The UA performs normal DNS resolution on the next hop URI (as
described in RFC 3263 [4]) to find a protocol, IP address, and port."

As there is no mechanism to determine outbound support in other
administrative domains, this lookup is only relevant to outbound if
the UA knows next hop supports outbound.

yes.

Later in the same paragraph:

"If the UA cannot use one of the existing flows,then it SHOULD form a new flow by sending a datagram or opening a new connection to the next hop, as
   appropriate for the transport protocol."

I was under the impression that flows are only created with REGISTER
requests...is this incorrect?

this has been changed in -11 to allow flows to be formed for dialog- creating requests.

The crux of the issue is that to accomplish NAT traversal using
outbound w/out extensions, the UA MUST send dialog creating requests
using an existing flow(selected by round-robin for appropriate
transport/etc).  Furthermore, in 5.3, edge proxies MUST record route
dialog creating requests.  We need to change the base-level behaviour
of outbound so NAT traversal just works, is this is a core requirement
of outbound.

Also:

      Note that if the UA wants its flow to work through NATs or
firewalls it still needs to put the 'rport' parameter [10] in its
      Via header field value, and send from the port it is prepared to
      receive on.  More general information about NAT traversal in SIP
      is described in [23].

should be removed.  [23] is very out of date, and references
outbound-01, and I believe some of the text is out of date.  Rport is
not relevant when flows are used, although it doesn't cause any harm.

rport is still relevant when flows are used, because outbound does not change the rules in 3261 for forwarding responses.

Questions/minor issues:

4.1:

"The value of this parameter MUST be a URN [8].  One case
   where a UA may not want to include the URN in the sip.instance
media feature tag..."

Does this mean that a sip.instance feature tag is still included? If
so, what does it contain?

no, the whole parameter should be omitted. i think i reworded this to make it more clear.

"As a result, the UA instance SHOULD provide lexically equivalent URNs
in each registration it
generates. "

Why not MUST instead of SHOULD?
fixed

Nits

Explain why the CRLFCRLF & CRLF messages used for the PING/PONG don't
break existing SIP implementations.  I spent a lot of time looking
through the grammar before I gave up and asked Rohan and pointed me to
section 7.5 of 3261.  I would reference this section in 3.5.1 and/or
4.4.2.

bummer. I forgot to include this in -11. I have added this in my working copy to section 3.5.1 as follows:
Sending a CRLF over a connection-oriented transport is
backwards safe (because of requirements in Section 7.5 of RFC 3261), but only implementations which support the 'keep' parameter will
          respond to a "ping" with a "pong".


2.1

"reg-id:  This refers to the value of a new header field parameter
value for the Contact header field. When a UA registers multiple times, each simultaneous registration gets a unique reg-id value."

change simultaneous to concurrent:

"reg-id:  This refers to the value of a new header field parameter
value for the Contact header field. When a UA registers multiple
      times, each concurrent registration gets a unique reg-id value."
fixed

3.3

"If a UA has multiple flows, and one of the servers fails, the UA
   delays the specified time before trying to form a new connection to
   replace the flow to the server that failed."

This implies that if the UA only has one flow, it retries immediately
which doesn't match the behaviour described in 4.5. Maybe:

"When a server fails the UA will delay before attempting to
re-establish a flow, using the delays specified in section 4.5."

fixed

3.5

Change(awkward):

"In this case, the server provides an indicator (the
'timed-keepalives' parameter) that the server requires the client to
   use the suggested timer values."

to

"In this case, the server indicates that the client must use the
suggested timer values by including the timed-keepalives parameter."

i think the original text (while uglier) is more clear.

4.1

"This means the value of the time component of the UUID can be
      arbitrarily selected to be any time less than the time when the
device was manufactured. A time of 0 (as shown in the example in
      Section 3.2) is perfectly legal as long as the device knows no
      other UUIDs were generated at this time."

I found this extremely confusing; I think it is saying that the time
component isn't necessary(but can't be in the future) if the device
already has a unique mac address it includes in the UUID. Why not just
say that a time of 0 can be used if the device is guaranteed to have a
unique MAC address at construction time?

The UA can't use time zero, if the UA generates multiple instance-ids and uses time zero for all of them.
In the absence of better text, I left it as is.

thanks,
-rohan





_______________________________________________
Sip mailing list  https://www1.ietf.org/mailman/listinfo/sip
This list is for NEW development of the core SIP Protocol
Use [EMAIL PROTECTED] for questions on current sip
Use [EMAIL PROTECTED] for new developments on the application of sip

Reply via email to