On 11/17/05 17:14, Dale R. Worley wrote:
On Thu, 2005-11-17 at 09:37 -0500, Paul Kyzivat wrote:
I guess people can implement as they wish, but that sounds like a bad implementation to me. There is nothing illegal, according to 3261, if two UAs (using different callids of course) keep doing registrations that overwrite the same contact address. In that case there is no reason to retain a record of the older registration.

Yes, it was a weakness of the implementation, enhanced by a strange
operating environment that made the situation much worse.  And in the
interval after the re-registration had been made, but before the first
one expired, there were two registrations for the same AOR (and both
gave the same contact).  Which isn't too troublesome, but is messy.

The whole point of the Call-Id for registrations is so that the
registrar can tell if a REGISTER is entirely new or just updating a
previous registration, and things work better if it can tell that.
There is another registration situation that gets troubles: when the UACs are behind NAT and have same private IP address, in the case when the UACs serve same AoR. The Contact headers might have the same addresses (private_ip:5060) and each registration/refresh will overwrite the other bindings.

From the RFC, sec. 10.3, step 7 of REGISTER processing:

        For each address, the registrar then searches the list of
        current bindings using the URI comparison rules.  If the
        binding does not exist, it is tentatively added.  If the
        binding does exist, the registrar checks the Call-ID value.  If
        the Call-ID value in the existing binding differs from the
        Call-ID value in the request, the binding MUST be removed if
        the expiration time is zero and updated otherwise.  If they are
        the same, the registrar compares the CSeq value.  If the value
        is higher than that of the existing binding, it MUST update or
        remove the binding as above.  If not, the update MUST be
        aborted and the request fails.

All these troubles occur when server-side solutions are used for NAT traversal. Different contacts are indexed by same key (aor, private_ip:port) and processing according to RFC is troublesome. In my opinion, in this case the source ip should be taken in consideration, too, to avoid contact overlapping. But the problem persists when the UACs are behind multiple levels of NAT, here you cannot rely on source IP, maybe Call-ID would help to distinguish between different contacts. SIP Instance extension should solve the problem, but is still a draft and not many UA implements it (as far as I know, snom does it).

Daniel

Dale


_______________________________________________
Sip-implementors mailing list
[email protected]
http://lists.cs.columbia.edu/mailman/listinfo/sip-implementors

_______________________________________________
Sip-implementors mailing list
[email protected]
http://lists.cs.columbia.edu/mailman/listinfo/sip-implementors

Reply via email to