[reSIProcate] Why resiprocate just use the branch parameter in via header to distinguish transaction

Scott Godin sgodin at sipspectrum.com
Mon Jul 31 09:31:50 CDT 2017


Cancel processing is a fairly fundamental feature of the stack.  I'm
certain if it was broken a large number of users would be reporting it.

In fact the comment from the code you included in your email explains
exactly why the stack is adding a CANCEL token to the TID:

            // Note:  For cancel requests the tid member passed in will
have the token "cancel" appended
            // to it, so that the cancel request can be treated as it's own
transaction.  sip->getTransactionId()
            // will be the original tid from the wire and should match the
tid of the INVITE request being
            // cancelled.
            TransactionState* matchingInvite =

 controller.mServerTransactionMap.find(sip->getTransactionId());

The find method above, is doing the find with the raw transactionid and not
the one with "cancel" appended to it.

Perhaps if you shared a STACK level log and a wireshark pcap (if the
messages aren't logging) we might be able to help you determine what's
going on.

Scott


On Sun, Jul 30, 2017 at 10:36 AM, 海滨 <lhb8859138 at 163.com> wrote:

> Hi Scott,
>
> Just one correction:
> If the server receive the invite msg then receive the cancel msg with the
> same branchId, it seems that the server can't find the correlate invite
> transaction for the cancel request if implement below solution.
>
> Maybe we need append "INVITE" instead for both "ACK" and "CANCEL" methods
> for server transaction in getTransactionId().
>
> Thanks.
>
>
> At 2017-07-30 11:31:16, "海滨" <lhb8859138 at 163.com> wrote:
>
>
> Hi Scott,
>
> you can check the code:TransactionState.cxx[line:246] in 1.10.2 .
> Thanks
>
>          else if (method == CANCEL)
>          {
>             // Note:  For cancel requests the tid member passed in will
> have the token "cancel" appended
>             // to it, so that the cancel request can be treated as it's
> own transaction.  sip->getTransactionId()
>             // will be the original tid from the wire and should match the
> tid of the INVITE request being
>             // cancelled.
>             TransactionState* matchingInvite =
>                controller.mServerTransactionMap.find(
> sip->getTransactionId());
>             if (matchingInvite == 0)
>             {
>                InfoLog (<< "No matching INVITE for incoming (from wire)
> CANCEL to uas");
>                //was TransactionState::sendToTU(tu, controller,
> Helper::makeResponse(*sip, 481));
>                SipMessage* response = Helper::makeResponse(*sip, 481);
>                Tuple target(sip->getSource());
>                controller.mTransportSelector.transmit(response, target);
>
>
>
> At 2017-07-29 16:37:02, "海滨" <lhb8859138 at 163.com> wrote:
>
> Hi Scott,
>
> After re-check the code change here(http://list.resiprocate.
> org/archive/resiprocate-devel/msg08981.html), I find something confused.
> Why add the "method" after send-by when get the transaction id of server
> side?
> If the server receive the invite msg then receive the cancel msg with the
> same branchId, it seems that the server can't find the correlate
> transaction for the cancel request.
> Thanks.
>
> +         s << header(h_Vias).front().param(p_branch).getTransactionId();
> +         s << header(h_Vias).front().sentHost();
> +         s << header(h_Vias).front().sentPort();
> +         if (method() != ACK)
> +         {
> +            s << method();
> +         }
> +         else
> +         {
> +            s << INVITE;
> +         }
>
>
>
>
>
>
> At 2017-06-19 23:02:42, "Scott Godin" <sgodin at sipspectrum.com> wrote:
>
> I think it should be implemented.  We just need someone with the time to
> implement it and test it out.  :)
>
> Scott
>
> On Mon, Jun 19, 2017 at 11:00 AM, 163 <lhb8859138 at 163.com> wrote:
>
>> Hi Scott,
>>
>> do you mean  there is no plan to address the sent-by enhancement?
>> I think it is better to implement this proposed solution, then the resip
>> can comply with the transaction matching rules defined in the sip standard.
>> right?
>> Thanks
>>
>> ------------------------------------------
>>
>> Hello,
>>
>> " First and foremost, the Server should be using *Call-ID* to
>> distinguish between SIP dialogues.  Before it ever get to looking at Via
>> header Branch-IDs, they should 1st be looking at Call-ID to establish
>> unique SIP dialogue contexts."
>>
>> I disagree with your client.  Dialog Id's are higher level than
>> transaction Id's.  There should never be a need to examine the DialogId
>> components (Call Id, To tag, or From tag) to differentiate SIP
>> transactions.  In fact the branch parameter in the Via header is intended
>> to be unique (RFC3261 - Section 8.1.1.7):
>> "   The branch parameter value MUST be unique across space and time for
>>    all requests sent by the UA.  The exceptions to this rule are CANCEL
>>    and ACK for non-2xx responses.  As discussed below, a CANCEL request
>>    will have the same value of the branch parameter as the request it
>>    cancels.  As discussed in Section 17.1.1.3, an ACK for a non-2xx
>>    response will also have the same branch ID as the INVITE whose
>>    response it acknowledges.
>>
>>       The uniqueness property of the branch ID parameter, to facilitate
>>       its use as a transaction ID, was not part of RFC 2543.
>>
>>    The branch ID inserted by an element compliant with this
>>    specification MUST always begin with the characters "z9hG4bK".  These
>>    7 characters are used as a magic cookie (7 is deemed sufficient to
>>    ensure that an older RFC 2543 implementation would not pick such a
>>    value), so that servers receiving the request can determine that the
>>    branch ID was constructed in the fashion described by this
>>    specification (that is, globally unique).  Beyond this requirement,
>>    the precise format of the branch token is implementation-defined. "
>>
>> That being said - resip should be including the sent-by in it's
>> transaction indexing.
>>
>> 17.2.3 Matching Requests to Server Transactions
>>
>>    When a request is received from the network by the server, it has to
>>    be matched to an existing transaction.  This is accomplished in the
>>    following manner.
>>
>>    The branch parameter in the topmost Via header field of the request
>>    is examined.  If it is present and begins with the magic cookie
>>    "z9hG4bK", the request was generated by a client transaction
>>    compliant to this specification.  Therefore, the branch parameter
>>    will be unique across all transactions sent by that client.  The
>>    request matches a transaction if:
>>
>>       1. the branch parameter in the request is equal to the one in the
>>          top Via header field of the request that created the
>>          transaction, and
>>
>>       2. the sent-by value in the top Via of the request is equal to the
>>          one in the request that created the transaction, and
>>
>>       3. the method of the request matches the one that created the
>>          transaction, except for ACK, where the method of the request
>>          that created the transaction is INVITE.
>>
>>    This matching rule applies to both INVITE and non-INVITE transactions
>>    alike.
>>
>>       The sent-by value is used as part of the matching process because
>>       there could be accidental or malicious duplication of branch
>>       parameters from different clients."
>>
>>
>> Note:  This has been brought up in the past, but it never did get
>> addressed:
>> http://list.resiprocate.org/archive/resiprocate-devel/msg08981.html
>> http://list.resiprocate.org/archive/resiprocate-devel/msg08982.html
>>
>> Despite the fact that resip really should be including the "sent-by"
>> value in the matching, in practice this has not hindered resip
>> compatibility, since almost all other stack generate the branch parameter
>> using some form of random number generation.
>>
>>
>> Scott
>>
>> On Fri, Jun 16, 2017 at 10:23 PM, 海滨 <lhb8859138 at 163.com> wrote:
>>
>>> Hi All,
>>>
>>> Here is the issue I meet in our product:
>>> 1. Client A send the option request to Server with the branch parameter
>>> = XXX, sent-by=A
>>> 2. Server send the 200 response to the Client A immediatly
>>> 3. within 64*T1,Client B send the option request to Server with the
>>> same branch parameter =XXX , but sent-by=B.
>>> 4. The Server send the last 200 response to Client  A, instead of Client
>>> B. So Client B can't receive any response for this option request.
>>> It seems that the resiprocate handle the second option request from
>>> Client B with the old transaction and consider this request as
>>> retransmission.
>>> Here are my question:
>>> 1. In sip standard, the sent-by in via header is also the key value to
>>> distinguish transaction. so whether the resiprocate need enhancement for
>>> that?
>>> 2. The call-ids are different between these two option request, so the
>>> designer of clients explain that as below. is he right for the dialog and
>>> transaction explanation? in his opinion, the second option request
>>> shouldn't handled by the old transaction,because the call-id is different
>>> from the first one.
>>>  First and foremost, the Server should be using *Call-ID* to
>>> distinguish between SIP dialogues.  Before it ever get to looking at Via
>>> header Branch-IDs, they should 1st be looking at Call-ID to establish
>>> unique SIP dialogue contexts.  From the RFC:
>>>
>>>    Call-ID contains a globally unique identifier for this call,
>>>
>>>    generated by the combination of a random string and the softphone's
>>>
>>>    host name or IP address.  The combination of the To tag, From tag,
>>>
>>>    and Call-ID completely defines a peer-to-peer SIP relationship
>>>
>>>    between Alice and Bob and is referred to as a dialog.
>>>
>>>
>>> You are appreciated if can provide help.
>>> Thanks very much.
>>>
>>>
>>>
>>>
>>> _______________________________________________
>>> resiprocate-devel mailing list
>>> resiprocate-devel at resiprocate.org
>>> https://list.resiprocate.org/mailman/listinfo/resiprocate-devel
>>>
>>
>>
>
>
>
>
>
>
> 【网易自营|30天无忧退货】不到同款1折价!Tory Burch制造商美式休闲人字拖限时仅29.9元>>
> <http://you.163.com/item/detail?id=1185012&from=web_gg_mail_jiaobiao_9>
>
>
>
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://list.resiprocate.org/pipermail/resiprocate-devel/attachments/20170731/9edaa2e9/attachment.htm>


More information about the resiprocate-devel mailing list