Robert,
I agree with most of what you say, but have a comment on one point:
On 8/1/17 12:23 PM, Robert Sparks wrote:
Be sure you are aware of (and implementing) the updates to RFC3261. You
really need RFC6026 to answer this question cleanly.
At the top level, this is far enough into "things are violating
protocol" that the specs aren't going to give algorithmic advice.
The closest they will get is that the transaction would pass the 200 to
the transaction user (and then it would sit in the Accepted state until
timer M fires so it can pass any _other_ 200s that show up with the same
transaction identifier up to the TU - See figure 3 and the text above it
in RFC6026).
Consider a case where the original INVITE was parallel forked. One of
the forks behaves in this broken way and is the first to respond. Now
the state machine is in the Accepted state. In that state 1xx and
3xx-6xx responses are (IIUC) ignored. All *may* turn out if one of those
other forks eventually returns a 2xx. Otherwise the call will just time
out. Proper handling of the non-2xx final responses from the other forks
won't occur. And if the 1xx was needed (e.g. for preconditions) then
that won't work either.
Just dropping the broken 2xx would give better results. But I don't find
any text that justifies doing that in this case.
Thanks,
Paul
Now, at the TU level, the 200 that shows up will not match any
outstanding potential dialog (in some code-bases, you'll see these
called proto-dialogs). The specs don't say this explicitly (as far as I
recall anyhow), but the logic would follow something like this: "This
doesn't match any INVITE _I've_ sent - it's an unsolicited response, I'm
dropping it".
You might be tempted to try to ack on the 200, to at least stop the
retransmissions (and maybe stop any media that might be flowing from the
other end). If you do that, you could do whatever you do for any other
unsolicited 200 that just shows up. But in this case, those attempts are
likely to fail, and may make recovering from the mess worse, rather than
better. Assuming you don't have a malicious actor, and what happened was
that some B2BUAish thing changed the call-id in the request, but not the
response, then the ACK you send (remember that 200-ACKs are sent with a
new transaction identifier because they may take a different path than
the INVITES) is likely to also get changed. If you send the ACK with the
dialog identifiers from the INVITE, you _might_ get lucky and get the
same transformation out of the thing in the middle, but given the
different transaction ID, I suspect not. If you send the ACK with the
dialog identifiers from the 200, they're almost certainly going to be
changed before they get to the other side and the ACK won't be
recognized. So letting the TU just drop the 200 is the safest thing to
do in general.
Now, if you're in cohoots with the thing that's breaking the protocol,
you know enough about its behavior to work around its brokenness, but
then you're inventing some other protocol for a specific deployment and
the specs can't help you.
RjS
On 8/1/17 11:03 AM, Paul Kyzivat wrote:
On 7/31/17 11:49 PM, Prakash K wrote:
Hi Paul,
Thanks a lot, You have put it in a nice way , I understood the
use-case for Forking
But I have the following question
*This all assumes that the 2xx matches an INVITE transaction you have
pending, and that the from-tag and call-id match what was in the
corresponding INVITE.Otherwise this is a stray message or an attack
and ought to be ignored.*
*So if the 200 OK received having different "Call-ID" *not matching
with the Call-ID which is sent in INVITE by UA, it should be ignored.
( even if Cseq/From-tag/branch parameter is same as INVITE which is
sent out) ?*
What would be the UA behaviour in above case ?
This is an interesting case. 3261 doesn't provide a lot of explicit
guidance - the proper action needs to be teased out of the text.
My first reaction was that you should just drop this message. But I
couldn't find a good justification for that.
My next thought was that if it qualifies as a valid response to the
*transaction* then the transaction should be run to completion.
Following the revised state machine in rfc6026 that means moving to
the Accepted state (if not already in that state), and passing the 2xx
to the TU for further processing. Then the TU would discover that this
response is messed up because it doesn't match an existing dialog, and
also doesn't match a pending dialog (same from-tag and callid). As a
result, it probably shouldn't send an ACK.
But this troubles me because it moves the state machine to the
Accepted state. Thus is prevents subsequently received 1xx,3xx-6xx
responses from being properly handled.
I think just dropping this response would lead to a better result, but
I can't quite see how to justify that action from 3261 and 6026.
I'd like to hear from others who are knowledgeable about such things.
Thanks,
Paul
On 31 Jul 2017 10:21 p.m., "Paul Kyzivat" <pkyzi...@alum.mit.edu
<mailto:pkyzi...@alum.mit.edu>> wrote:
On 7/31/17 11:26 AM, Prakash K wrote:
What would be the behavior of UA when 200 OK received which is
not matching
the dialog
"200OK received by UA with different Call-id which is not in
context"
I see the following snippet in RFC 3261 which says UA should
create
dialog. Wont this end up in acknowledging the hacking?
If the dialog identifier in the 2xx response matches the
dialog
identifier of an existing dialog, the dialog MUST be
transitioned to
the "confirmed" state, and the route set for the dialog
MUST be
recomputed based on the 2xx response using the procedures
of Section
12.2.1.2. *Otherwise, a new dialog in the "confirmed"
state MUST be
constructed using the procedures of Section 12.1.2.*
does this mean UA should generate ACK & immediately followed by
BYE should
be triggered?
As is mentioned in the prior paragraph, this is primarily about
forking. If the initial INVITE is forked, then two or more UASs may
respond. Each will choose a unique to-tag, and since the to-tag is
part of the dialog-id each will be associated with a distinct
dialog.
The dialogs for various forks may be discovered via 1xx responses,
in which case the corresponding 2xx may match an existing dialog.
OTOH sometimes a UAS will send a 2xx without first sending a 1xx. In
that case the mentioned situation will occur.
Also note that this can happen without forking if the single UAS
immediately responds with a 2xx.
The forking case where you actually get multiple 2xx reponses,
establishing multiple dialogs, is pretty rare. Usually the forking
proxy ceases forking when it sees a 2xx response and attempts to
cancel any other outstanding legs. But it *can* happen and the UAC
needs to be prepared to cope when it does. *What* you do is
unspecified. Immediately sending a BYE is a popular solution because
it is easy. But it isn't especially friendly to the callee. Other
possibilities:
- form a conference call within your UAC, mixing the audio from
the multiple legs
- play some prerecorded audio explaining why you are hanging up,
then BYE.
This all assumes that the 2xx matches an INVITE transaction you have
pending, and that the from-tag and call-id match what was in the
corresponding INVITE. Otherwise this is a stray message or an attack
and ought to be ignored.
Thanks,
Paul
_______________________________________________
Sip-implementors mailing list
Sip-implementors@lists.cs.columbia.edu
<mailto:Sip-implementors@lists.cs.columbia.edu>
https://lists.cs.columbia.edu/mailman/listinfo/sip-implementors
<https://lists.cs.columbia.edu/mailman/listinfo/sip-implementors>
_______________________________________________
Sip-implementors mailing list
Sip-implementors@lists.cs.columbia.edu
https://lists.cs.columbia.edu/mailman/listinfo/sip-implementors
_______________________________________________
Sip-implementors mailing list
Sip-implementors@lists.cs.columbia.edu
https://lists.cs.columbia.edu/mailman/listinfo/sip-implementors
_______________________________________________
Sip-implementors mailing list
Sip-implementors@lists.cs.columbia.edu
https://lists.cs.columbia.edu/mailman/listinfo/sip-implementors