Solved

Verbindungsabbrüche SIP Telefonie, ausgehend, wegen Session Expiry.

3 years ago

Hallo Kommune

 

habe bei mir konsistent Verbindungsabbrüche nach ca 50 Minuten festgestellt, nur ausgehend. Client ist Asterisk 18 direkt auf einem OpenWRT Router, kein NAT. Magenta Vertrag, 100MBit. Telefonie Server Situation:

 

$ nslookup -querytype=SRV _sip._udp.tel.t-online.de
_sip._udp.tel.t-online.de service = 10 0 5060 n-epp-110.edns.t-ipnet.de.
_sip._udp.tel.t-online.de service = 20 0 5060 d-epp-100.edns.t-ipnet.de.
_sip._udp.tel.t-online.de service = 30 0 5060 h2-epp-100.edns.t-ipnet.de.

 

Der erste, 217.0.25.97, wird genommen.

 

Was passiert ist Folgendes, laut Packet Logs genommen direkt vom WAN Interface. Ich sende den initialen INVITE raus, das übliche "unauthorized" etcetera folgt, dann kommt das Okay, wo der Server sagt dass er der Refresher sein will, bzgl. Session Expiry:

Session-Expires: 1800;refresher=uas

 

Er ist der UAS, weil ich den INVITE gesendet habe. Asterisk stimmt zu, und von nun an ist es Sache des Telekom Servers die Sitzung mit reINVITES am Leben zu halten. Expiry ist 30 Minuten, also sollte der erste reINVITE nach 15 kommen.

 

Dann kommt auch einer, aber erst nach 22 Minuten. Hier erklärt sich wiederum der Telekom Server für die Geschichte verantwortlich:

Session-Expires: 1800;refresher=uac

 

Klar, UAC diesmal weil der ja den INVITE geschickt hat. Asterisk stimmt zu, alles klar und sauber. Und dann hört man gar nix mehr vom Telekom Server. Außer 30 Minuten später, also nach den vollen 1800 Sekunden, wo er sein BYE schickt mit der Begündung

Reason: SIP;cause=408;text="Request Timeout (1:26)"

 

D.h. obgleich er sich für die reINVITES verantwortlich erklärt schickt er genau einen und das war's. Dann lässt er die Sitzung einfach auslaufen und kappt schließlich die Verbindung.

 

Wie gesagt, das passiert nur ausgehend. Eingehend erklärt er sich auch verantworlich, diesmal von Beginn an als UAC, da er ja den ersten INVITE schickt, und dann kommen schön pünktlich und sauber, wie zuhause gelernt, alle 15 Minuten seine reINVITES. Ich kann ihm sogar sagen, bei eingehenden Verbindungen, dass mein Asterisk die Sache übernehmen soll. Dann sagt Asterisk "refresher UAS",  der Telekom Server schluckt das und dann schickt Asterisk alle 15 Minuten reINVITES, diesmal natürlich annoncierend dass er als UAC die Sache in der Hand behält, und es gibt nullo Problemo, egal wer die reINVITES macht.

 

Wie gesagt, bei eingehenden Verbindungen. Bei ausgehenden scheint Telekom Server unter Gedächtnisschwund zu leiden und, nach dem ersten reINVITE, zuverlässig zu vergessen wofür er sich eigentlich verantwortlich erklärt hat. Wo wendet man sich mit sowas hin?

1130

9

    • 3 years ago

      direktorstellvertreter

      Bei ausgehenden scheint Telekom Server unter Gedächtnisschwund zu leiden und, nach dem ersten reINVITE, zuverlässig zu vergessen wofür er sich eigentlich verantwortlich erklärt hat.

      Bei ausgehenden scheint Telekom Server unter Gedächtnisschwund zu leiden und, nach dem ersten reINVITE, zuverlässig zu vergessen wofür er sich eigentlich verantwortlich erklärt hat.
      direktorstellvertreter
      Bei ausgehenden scheint Telekom Server unter Gedächtnisschwund zu leiden und, nach dem ersten reINVITE, zuverlässig zu vergessen wofür er sich eigentlich verantwortlich erklärt hat.

      Kann ich für "meinen" Telekomserver so nicht bestätigen.

      Da kommt das UPDATE alle 15min.

       

      Hast du schon mal mit einem Softphone, wie z.B. PhonerLite getestet?

       

      7

      Answer

      from

      3 years ago

      Hallo zusammen,

      der Fehler liegt hier beim Anrufer, im SDP Offer/Answer Prozess.

       

      Im initialen INVITE sendet der Anrufer folgenden SDP-Body:

       

      Protocol Version : v=0 
      Session Owner/Creator and session identi : o=root 936480392 936480393 IN IP4 xx.xxx.xxx.xx 
      Session Name : s=- 
      Session Connection Data : c=IN IP4 xx.xxx.xxx.xx 
      Time the session is active : t=0 0 
      Media Name : m=audio 30058 RTP/AVP 8 9 101 
      Media : audio 
      Port : 30058 
      Protocol type : RTP/AVP 
      Media Format : 8 = PCMA
      Media Format : 9 = G722
      Media Format : 101 = dynamic
      Media Attribute : a=rtpmap:8 PCMA/8000 
      Media Attribute : a=rtpmap:9 G722/8000 
      Media Attribute : a=rtpmap:101 telephone-event/8000 
      Media Attribute : a=fmtp:101 0-16 
      Media Attribute : a=ptime:20 
      Media Attribute : a=maxptime:150 
      Media Attribute : a=sendrecv

       

       

      Dann beim Session-Refresh mittels Re-INVITE wird im 200 OK folgendes geantwortet:

       

      Protocol Version : v=0 
      Session Owner/Creator and session identi : o=root 936480392 936480393 IN IP4 xx.xxx.xxx.xx 
      Session Name : s=- 
      Session Connection Data : c=IN IP4 xx.xxx.xxx.xx 
      Time the session is active : t=0 0 
      Media Name : m=audio 30058 RTP/AVP 8 101 
      Media : audio 
      Port : 30058 
      Protocol type : RTP/AVP 
      Media Format : 8 = PCMA
      Media Format : 101 = dynamic
      Media Attribute : a=rtpmap:8 PCMA/8000 
      Media Attribute : a=rtpmap:101 telephone-event/8000 
      Media Attribute : a=fmtp:101 0-16 
      Media Attribute : a=ptime:20 
      Media Attribute : a=maxptime:150 
      Media Attribute : a=sendrecv

       

       

      Interessant ist hier die o-line. Schaut man einmal in RFC8866 bezüglich Syntax, heißt es dort:

           o=<username> <sess-id> <sess-version> <nettype> <addrtype>
           <unicast-address>

      <sess-version> is a version number for this session description. Its usage is up to the creating tool, so long as <sess-version> is increased when a modification is made to the session description. Again, as with <sess-id> it is RECOMMENDED that a Timestamp be used. 

       

      In beiden SDP-Bodys ist die Session Version die selbe, aber es gab eine Änderung im SDP-Body (m-line ohne Payloadtype 9).

      Dies widerspricht Abschnitt 8 des RFC3264 (sess-version muss inkrementiert werden):

       

      When issuing an offer that modifies the session, the "o=" line of the new SDP MUST be identical to that in the previous SDP, except that the version in the origin field MUST increment by one from the previous SDP.  If the version in the origin line does not increment, the SDP MUST be identical to the SDP with that version number.

       

       Somit handelt es sich um eine harte RFC-Verletzung, die dann wiederum in der Folge zum fehlenden Session-Refresh führt...

      Answer

      from

      3 years ago

      Meister Proper, was soll ich sagen? Propere Arbeit erster Güte. Danke, wirklich. Klasse.

       

      Also, Asche auf mein Haupt, sei zu allererstmal festgestellt. Hatte ich nicht behauptet, dieselbe Konfiguration hätte zuvor viele Jahre getan? Gelogen! muss ich jetzt leider selber feststellen. Ich hatte nämlich früher ausschließlich den alaw Codec aktiviert, aber irgendwann kürzlich mal den g722 hinzugenommen. Und egal wo der Fehler - auf meiner Seite - jetzt wirklich begraben liegt, ob Bug oder Fehlkonfiguration oder was, das war natürlich hier der fatale Unterschied.

       

      Also, ich mach jetzt erst nochmal einen Test, wieder nur mit alaw - obgleich das Ergebnis jetzt ziemlich vorhersagbar ist - und dann werde ich mir nochmal anschauen was hier - auf meiner Seite, klar - wirklich das Problem ist.

       

      Aber nochmal, das war jetzt in der Tat ein echter Hochgenuss. Problem erkannt, sauber isoliert und kristallklar dargestellt, und dem Männle (mir) damit wirklich geholfen. Spitze. Echt.

       

      Edit:

       

      Tja, Freunde der Sonne, was sagt man dazu. Jetzt geht's, ganz genauso wie in den guten alten Zeiten. Also, was haben wir heute gelernt? Lügen, auch ungewollte, haben kurze Beine. Das schreiben wir uns jetzt auf'n Zettel und heften den an den Kühlschrank, damit wir diese wertvolle Lektion nicht so bald vergessen.

      Answer

      from

      3 years ago

      Um die Sache abzuschließen für andere chan_sip Nutzer die eventuell hierüber stolpern, dies ist tatsächlich ein Bug in chan_sip. Das Modul inkrementiert seine SDP Session Version (p->sessionversion in add_sdp()) rein reaktiv, nämlich nur wenn die Gegenstelle ihrerseits ihre Version inkrementiert hat. Das ist natürlich zuwenig.

       

      Wie gesagt, das Ganze fällt überhaupt nicht auf wenn man nur alaw verwendet (allow=!all,alaw). Wenn man aber einen zweiten Codec, namentlich g722, hinzunimmt (allow=!all,alaw,g722), und der Tkom Server antwortet "nehmen wir alaw", also im Rahmen des initialen Aushandlungsprozesses der Session, dann modifiziert chan_sip seine Session ohne seine Version intern hochzuzählen, was es eigentlich mit dem letzten ACK im Sessionaufbau tun müsste.

       

      Witzigerweise, und das ist wirklich lustig, haben die einen Hack implementiert mit dem Clients begegnet werden soll die ihrerseits ihre Version Nummer nicht korrekt hochzählen. Der entsprechende Konfigurationsparameter lautet "ignoresdpversion". Wenn man den auf yes setzt - nur für ausgehende Tkom Verbindungen natürlich - inkrementiert chan_sip seine Version Nummer *jedes Mal* wenn es seinen Session Zustand kommuniziert. Das heißt, es wird dem Server vorgegaukelt dass sich die Session geändert hat, und der Server muss dann checken was genau und ob Handlungsbedarf besteht, was in der Regel dann eben nicht der Fall ist.

       

      So mit einem Server umzuspringen ist natürlich nicht die reine Schule. Aber den Check, haben wir ja gerade gelernt, macht der Tkom Server sowieso, das heißt der rechentechnische Mehraufwand auf seiner Seite sollte sich in Grenzen halten. Und tatsächlich, mit diesem fiesen Trick funktioniert die ganze Sache. D.h. damit werden wieder Session Refreshes regelmäßig vom Tkom Server gesendet, auch wenn man g722 mit im Sortiment hat. Kann natürlich sein, dass es Seiteneffekte gibt die ich nicht überblicke. Aber ein kleiner Test ist anstandslos durchgelaufen, d.h. mit jedem Refresh hat der Server richtig erkannt dass es trotz des Inkrementes nichts zu tun gibt, also an der Session nicht rumgefummelt werden muss.

       

      Dies nur als Randbemerkung. Ob man HD Audio, wie es so schön heißt, wirklich braucht sei sowieso mal dahingestellt. Anscheinend gibt's da ja ohnehin jede Menge Probleme, etwa mit Mobilfunkteilnehmern. Und mit dieser Beobachtung, denke ich, können wir die Sache dann wirklich zu den Akten legen.

       

      Wie gesagt, ganz herzlichen Dank nochmal für die tolle Unterstützung. Ich hätt' das nie rausbekommen, auch nicht mit Ratsuche auf anderen einschlägigen Foren. Da bin ich mir ziemlich hundertprozentig sicher.

      Unlogged in user

      Answer

      from

    • Accepted Solution

      accepted by

      3 years ago

      Hallo zusammen,

      der Fehler liegt hier beim Anrufer, im SDP Offer/Answer Prozess.

       

      Im initialen INVITE sendet der Anrufer folgenden SDP-Body:

       

      Protocol Version : v=0 
      Session Owner/Creator and session identi : o=root 936480392 936480393 IN IP4 xx.xxx.xxx.xx 
      Session Name : s=- 
      Session Connection Data : c=IN IP4 xx.xxx.xxx.xx 
      Time the session is active : t=0 0 
      Media Name : m=audio 30058 RTP/AVP 8 9 101 
      Media : audio 
      Port : 30058 
      Protocol type : RTP/AVP 
      Media Format : 8 = PCMA
      Media Format : 9 = G722
      Media Format : 101 = dynamic
      Media Attribute : a=rtpmap:8 PCMA/8000 
      Media Attribute : a=rtpmap:9 G722/8000 
      Media Attribute : a=rtpmap:101 telephone-event/8000 
      Media Attribute : a=fmtp:101 0-16 
      Media Attribute : a=ptime:20 
      Media Attribute : a=maxptime:150 
      Media Attribute : a=sendrecv

       

       

      Dann beim Session-Refresh mittels Re-INVITE wird im 200 OK folgendes geantwortet:

       

      Protocol Version : v=0 
      Session Owner/Creator and session identi : o=root 936480392 936480393 IN IP4 xx.xxx.xxx.xx 
      Session Name : s=- 
      Session Connection Data : c=IN IP4 xx.xxx.xxx.xx 
      Time the session is active : t=0 0 
      Media Name : m=audio 30058 RTP/AVP 8 101 
      Media : audio 
      Port : 30058 
      Protocol type : RTP/AVP 
      Media Format : 8 = PCMA
      Media Format : 101 = dynamic
      Media Attribute : a=rtpmap:8 PCMA/8000 
      Media Attribute : a=rtpmap:101 telephone-event/8000 
      Media Attribute : a=fmtp:101 0-16 
      Media Attribute : a=ptime:20 
      Media Attribute : a=maxptime:150 
      Media Attribute : a=sendrecv

       

       

      Interessant ist hier die o-line. Schaut man einmal in RFC8866 bezüglich Syntax, heißt es dort:

           o=<username> <sess-id> <sess-version> <nettype> <addrtype>
           <unicast-address>

      <sess-version> is a version number for this session description. Its usage is up to the creating tool, so long as <sess-version> is increased when a modification is made to the session description. Again, as with <sess-id> it is RECOMMENDED that a Timestamp be used. 

       

      In beiden SDP-Bodys ist die Session Version die selbe, aber es gab eine Änderung im SDP-Body (m-line ohne Payloadtype 9).

      Dies widerspricht Abschnitt 8 des RFC3264 (sess-version muss inkrementiert werden):

       

      When issuing an offer that modifies the session, the "o=" line of the new SDP MUST be identical to that in the previous SDP, except that the version in the origin field MUST increment by one from the previous SDP.  If the version in the origin line does not increment, the SDP MUST be identical to the SDP with that version number.

       

       Somit handelt es sich um eine harte RFC-Verletzung, die dann wiederum in der Folge zum fehlenden Session-Refresh führt...

      0

      Unlogged in user

      Ask

      from