On 11/01/2017 07:16 AM, Bogdan-Andrei Iancu wrote:
Bogdan: thanks so much for your detailed info on what happens. I think
this will help me debug stuff. I have some further questions below if
you have time.
Suppose I have a phone that registers to opensips using TLS. This is
a TCP based socket. Suppose that the phone is ipv4, so it's behind a
NAT. Well, in truth, it's probably behind multiple layers of NAT,
potentially a carrier grade NAT somewhere deep in the bowels of an
ISP, then potentially a customer service ADSL modem or the like, and
then a router that I have control over. As I understand it after
setting TCP_PERSISTENT Opensips should leave this TLS connection open
and can then pass further reinvites, pings, and soforth down the same
socket. This is particularly true if the phone supports Sip Outbound
RFC 5626 (all ok so far?)
[bogdan]
The only thing required for the end point is not to close the
connection. On its side, OpenSIPS will keep the TCP Conn alive for the
whole duration of the registration, so the user is reachable.
My impression is that over WiFi if there are momentary lapses in
connectivity, Android may sometimes decide that it needs to reassociate
to a new network, scan, then reassociate to the same network (this is
different from a simple roaming between APs and very different from an
802.11r fast transition). Even though it's associated to the same
network, it still resets TCP connections. This means the TCP connection
to OpenSIPS drops. If this occurs in the middle of a call, it sounds
like I have to get lucky and hope that OpenSIPS reopens the connection
to my phone via its reachable IPv6 address. In the absence of that, my
call is probably going to drop. It also sounds like this might rarely
work due to ephemeral ports on my client.
Suppose further that after a while with Opensips in this reset state
with no open connection to my phone, my phone re-registers and a TLS
connection is available, will Opensips be able to pass reinvites and
pings for ongoing calls down this new socket? Does it understand that
this is the same phone and that this new registration+socket is
relevant to the ongoing dialog?
[bogdan]
jumping on new connection during a SIP session is not easy. As the TCP
connections uses ephemeral ports, there are some internal aliases kept
by OpenSIPS between SIP URIs and the actual TCP connections. A new
connection means a new TCP port -> the existing aliases will not work.
If the client sends some kind of unique ID, such as a standard
Sip_instance (for example used by OBI ATAs and in a UUID format) or an
rinstance attribute (used by Bria on Android and just in
;rinstance=.........; with a big hex number in there or whatever
(admittedly it seems like clients do a lot of different stuff here). Can
/ Does OpenSIPS try to reassociate its connection to the same instance?
[bogdan]
All the time you need to consider both layer - the transport and the
SIP layer. If the registration (at SIP layer) is not reachable anymore
(based on the transport layer), the registration must be invalidated.
You can do this based on registration SIP pinging in OpenSIPS.
With the end-to-end nature of Ipv6 it seems we have a definite
possibility to avoid a lot of hassle with opensips able to directly
open a new sip connection to the phone to continue ongoing dialogs.
Is this a possibility for why I'm experiencing fewer random dropped
calls?
[bogdan]
I wouldn't gamble on it.
This seems to be a major bottleneck for reliable calls over TLS via
WiFi. If the TLS connection can't be maintained because momentary WiFi
droppage causes reset packets to be sent by Android OS or other OS then
the registration is invalidated and the call will drop as soon as the
remote party tries to do anything (such as reINVITE or the like). This
will be true even though the RTP is traveling around just fine. Is that
more or less the sum of it?
Are there things I could do to improve this situation? Suppose far end
wants to reINVITE either as a kind of pinging, or for a hold or
something. It sends SIP message to OpenSIPS, now over the last few
minutes OpenSIPS lost the specific registration from my client, and then
regained it when my client re-opened the connection. Is there a way I
can make OpenSIPS know what happened and forward my phone the INVITE on
the new socket? What things need to be supported on the client? What
needs configuration in the server?
Thanks again.
Dan
_______________________________________________
Users mailing list
[email protected]
http://lists.opensips.org/cgi-bin/mailman/listinfo/users