SIP Basics
Hallo zusammen,
Ich habe mich mal ein bisschen mit dem SIP Protokoll auseinandergesetzt. Hier eine Zusammenfassung meiner Erkenntnisse.
SIP Steht für Session Initiation Protokoll und ist im RFC2161 definiert.
SIP Adressen sind ähnlich wie Emailadressen aufgebaut:
- sip:user@domain.tld
- sips:user@domain.tld
- tel:+41xxxxxxxxx oder sip:+41xxxxxxxxx@domain.tld
Bei SIP gibt es verschiedene Komponenten
Komponente | Beschreibung |
Client | Der Client besteht eigentlich aus zwei Komponenten, dem User Agent Client (UAC) und dem User Agent Server (UAS) |
Registrar Server | Der Registrar Server akzeptiert REGISTER Requests von Clients und speichert diese Informationen. Er bietet einen Location und Translation Service an. |
Location Server | Speichert die Adressen welche im Registrar Server registriert werden. |
Proxy Server | Funktioniert ähnlich wie ein HTTP Proxy. Es gibt zwei Typen dieser Proxys und zwar Stateful Proxy oder Stateless Proxy. |
Redirect Server | Dieser Server übergibt dem Client Redirect Messages oder Routet den Request an einen anderen Server weiter. |
Kommunikation zwischen zwei Clients
Client und Registrar Server
Client und Proxy
Client und Redirect Server
SIP Methoden http://en.wikipedia.org/wiki/List_of_SIP_request_methods
Methode | Beschreibung | RFC |
INVITE | Einladung zu einer Call Session | RFC 3261 |
ACK | Bestätigung | RFC 3261 |
BYE | Beendet eine Call Session | RFC 3261 |
CANCEL | Abrechen aller bestehenden Requests | RFC 3261 |
OPTIONS | Abfrage der Möglichkeiten des Servers | RFC 3261 |
REGISTER | Registriert einen Client bei einem SIP Server (Registrar) | RFC 3261 |
PRACK | Provisorische Bestätigung | RFC 3262 |
SUBSCRIBE | Abonnieren eines Events | RFC 3265 |
NOTIFY | Mitteilen eines Events an einen Subscriber | RFC 3265 |
PUBLISH | Publiziert ein Event an den Server | RFC 3903 |
INFO | Informationen an den Server senden ohne den Session State zu verändern | RFC 6086 |
REFER | Vermittlungsanfrage (Call Transfer) | RFC 3515 |
MESSAGE | Instant Message (Chat) | RFC 3428 |
UPDATE | Verändert den Session State ohne den Dialog State zu verändern | RFC 3311 |
SIP Status codes http://de.wikipedia.org/wiki/SIP-Status-Codes
Status Code | Beschreibung |
1xx | Provisorisch - Request erhalten, verarbeiten des Requests |
2xx | Erfolg - Die Aktion war erfolgreich |
3xx | Redirection - Weitere Aktion des Client nötig |
4xx | Client Error - Der Request enthält eine falsche Syntax oder kann nicht erfüllt werden |
5xx | Server Error - Der Server kann die Anfrage nicht ausführen |
6xx | Global Failure - Der Request kann nicht ausgeführt werden |
Lync REGISTER
Auf dem Lync Server mache ich ein SIP Trace. Wie man bei Lync den Snooper einsetzt habe ich schon im folgenden Blog Artikel http://blog.icewolf.ch/archive/2011/04/23/troubleshoot-lync-server.aspx erklärt
Schauen wir und das doch mal was passiert wenn sich ein Lync Client beim Lync Server Registriert.
Man sieht die vier "REGISTER sip:icewolf.ch" anfragen. Erst bei der vierten Anfrage wird ein "200 OK" zurückgegeben.
1. Register Anfrage ohne Authorisation
TL_INFO(TF_PROTOCOL) [0]139C.1770::11/15/2012-23:47:22.467.00003925 (SIPStack,SIPAdminLog::TraceProtocolRecord:SIPAdminLog.cpp(125))$$begin_record
Trace-Correlation-Id: 4027926292
Instance-Id: 00000AAC
Direction: incoming
Peer: 172.21.175.204:49745
Message-Type: request
Start-Line: REGISTER sip:icewolf.ch SIP/2.0
From: <sip:a.bohren@icewolf.ch>;tag=c14ce80077;epid=4ce2daba48
To: <sip:a.bohren@icewolf.ch>
CSeq: 1 REGISTER
Call-ID: 389ddeb47b394f849198c5be12306bb9
Via: SIP/2.0/TLS 172.21.175.204:49745
Max-Forwards: 70
Contact: <sip:172.21.175.204:49745;transport=tls;ms-opaque=83634d618b>;methods="INVITE, MESSAGE, INFO, OPTIONS, BYE, CANCEL, NOTIFY, ACK, REFER, BENOTIFY";proxy=replace;+sip.instance="<urn:uuid:598BDDAF-2296-5223-8EC1-65FC63DDAB36>"
User-Agent: UCCAPI/4.0.7577.4356 OC/4.0.7577.4356 (Microsoft Lync 2010)
Supported: gruu-10, adhoclist, msrtc-event-categories
Supported: ms-forking
Supported: ms-cluster-failover
Supported: ms-userservices-state-notification
ms-keep-alive: UAC;hop-hop=yes
Event: registration
Content-Length: 0
Message-Body: –
$$end_record
3. Register Anfrage mit Authorisation
Authorization: TLS-DSK qop="auth", realm="SIP Communications Service", targetname="ICESRV06.corp.icewolf.ch", gssapi-data="" opaque="6911BC37", version=4
4. Register Anfrage mit Authorisation
Proxy-Authorization: TLS-DSK qop="auth", realm="SIP Communications Service", opaque="6911BC37", targetname="ICESRV06.corp.icewolf.ch", crand="9dccf9c2", cnum="1", response="9c55c281538a997a84cb3f886b6d1fa46d35d5e2"
LYNC INVITE
Nun schauen wir uns mal einen INVITE Request an. Der Benutzer "sip:a.bohren@icewolf.ch" lädt den Benutzer "sip:boa@icewolf.ch" zu einem Instant Message Chat ein.
Man sieht den den Invite Request und die Status Codes (100 Trying) bis der Anruf entgegengenommen wurde.
TL_INFO(TF_PROTOCOL) [0]139C.1770::11/15/2012-23:47:34.339.0001e2b3 (SIPStack,SIPAdminLog::TraceProtocolRecord:SIPAdminLog.cpp(125))$$begin_record
Trace-Correlation-Id: 1130765770
Instance-Id: 00000AF4
Direction: incoming
Peer: 172.21.175.204:49745
Message-Type: request
Start-Line: INVITE sip:boa@icewolf.ch SIP/2.0
From: <sip:a.bohren@icewolf.ch>;tag=b648746a90;epid=4ce2daba48
To: <sip:boa@icewolf.ch>
CSeq: 1 INVITE
Call-ID: 0c978a3fe8214c9a90013d9eda123847
Via: SIP/2.0/TLS 172.21.175.204:49745
Max-Forwards: 70
Contact: <sip:a.bohren@icewolf.ch;opaque=user:epid:r92LWZYiI1KOwWX8Y92rNgAA;gruu>
User-Agent: UCCAPI/4.0.7577.4356 OC/4.0.7577.4356 (Microsoft Lync 2010)
Supported: ms-dialog-route-set-update
Ms-Text-Format: text/plain; charset=UTF-8;msgr=WAAtAE0ATQBTAC0ASQBNAC0ARgBvAHIAbQBhAHQAOgAgAEYATgA9AFMAZQBnAG8AZQAlADIAMABVAEkAOwAgAEUARgA9ADsAIABDAE8APQAwADsAIABDAFMAPQAwADsAIABQAEYAPQAwAAoADQAKAA0A;
Ms-IM-Format: text/html; charset=UTF-8; ms-body=PERJViBzdHlsZT0iZm9udC1zaXplOiAxMHB0O2ZvbnQtZmFtaWx5OiAnU2Vnb2UgVUknO2NvbG9yOiAjMDAwMDAwO2RpcmVjdGlvbjogbHRyO2ZvbnQtd2VpZ2h0OiBub3JtYWw7Zm9udC1zdHlsZTogbm9ybWFsO3RleHQtZGVjb3JhdGlvbjogbm9uZSI+SGkgQm9hPC9ESVY+
Ms-IM-Format: text/rtf; charset=UTF-8; ms-body=e1xydGYxXGFuc2lcYW5zaWNwZzEyNTJcZnJvbWh0bWwxIFxmYmlkaXMgXGRlZmYwe1xmb250dGJsDQp7XGYwXGZzd2lzcyBBcmlhbDt9DQp7XGYxXGZtb2Rlcm4gQ291cmllciBOZXc7fQ0Ke1xmMlxmbmlsXGZjaGFyc2V0MiBTeW1ib2w7fQ0Ke1xmM1xmbW9kZXJuXGZjaGFyc2V0MCBDb3VyaWVyIE5ldzt9DQp7XGY0XGZzd2lzcyBTZWdvZSBVSTt9fQ0Ke1xjb2xvcnRibFxyZWQwXGdyZWVuMFxibHVlMDtccmVkMFxncmVlbjBcYmx1ZTI1NTtccmVkMFxncmVlbjBcYmx1ZTA7fQ0KXHVjMVxwYXJkXHBsYWluXGRlZnRhYjM2MCBcZjBcZnMyNCANCntcKlxodG1sdGFnMCBccGFyIH0NCntcKlxodG1sdGFnNDggPEJPRFk+fXtcKlxodG1sdGFnNjR9XGh0bWxydGYge1xodG1scnRmMCANCntcKlxodG1sdGFnMTQ4IDxGT05UIGNvbG9yPSMwMDAwMDAgc2l6ZT0yIGZhY2U9IlNlZ29lIFVJIj59XGh0bWxydGYge1xjZjIgXGZzMjAgXGY0IFxodG1scnRmMCANCntcKlxodG1sdGFnNCBccGFyIH1caHRtbHJ0ZiB9XGh0bWxydGYwIHtcKlxodG1sdGFnNzJ9XGh0bWxydGZ9XGh0bWxydGYwDQoNCntcKlxodG1sdGFnOTYgPERJViBkaXI9bHRyPn1caHRtbHJ0ZiB7XGx0cnBhclxsdHJjaFxxbCBcaHRtbHJ0ZjAge1wqXGh0bWx0YWc2NH1caHRtbHJ0ZiB7XGh0bWxydGYwIFxodG1scnRmIHtcY2YyIFxmczIwIFxmNCBcaHRtbHJ0ZjAgSGkgQm9hXGh0bWxydGYgfVxodG1scnRmMCB7XCpcaHRtbHRhZzcyfVxodG1scnRmXHBhcn1caHRtbHJ0ZjANCg0Ke1wqXGh0bWx0YWcxMDQgPC9ESVY+fVxodG1scnRmIH1caHRtbHJ0ZjAgDQp7XCpcaHRtbHRhZzI0OCA8L0ZPTlQ+fQ0Ke1wqXGh0bWx0YWc1OCA8L0JPRFk+fX0=
Supported: ms-embedded-first-message
Supported: ms-delayed-accept
Supported: ms-renders-isf
Supported: ms-renders-gif
Supported: ms-renders-mime-alternative
Ms-Conversation-ID: Ac3Di5ZjJUQaEDMSTZOTniKMVM+wQA==
Supported: timer
Supported: histinfo
Supported: ms-safe-transfer
Supported: ms-sender
Supported: ms-early-media
Roster-Manager: sip:a.bohren@icewolf.ch
EndPoints: <sip:a.bohren@icewolf.ch>, <sip:boa@icewolf.ch>
Supported: com.microsoft.rtc-multiparty
ms-keep-alive: UAC;hop-hop=yes
Allow: INVITE, BYE, ACK, CANCEL, INFO, MESSAGE, UPDATE, REFER, NOTIFY, BENOTIFY
ms-subnet: 172.21.175.0
Supported: ms-conf-invite
Proxy-Authorization: TLS-DSK qop="auth", realm="SIP Communications Service", opaque="6911BC37", targetname="ICESRV06.corp.icewolf.ch", crand="d5dee643", cnum="17", response="49c658ae036e12899ce3b672cc22d624fda1ceef"
Content-Type: application/sdp
Content-Length: 248
Message-Body: v=0
o=- 0 0 IN IP4 172.21.175.204
s=session
c=IN IP4 172.21.175.204
t=0 0
m=message 5060 sip null
a=accept-types:text/plain multipart/alternative image/gif text/rtf text/html application/x-ms-ink application/ms-imdn+xml text/x-msmsgsinvite
$$end_record
Session Description Protocol (SDP)
Spannend im obigen Request ist der Message Body, der enthält nämlich das Session Description Protocol (SDP, RFC 4566, RFC 2327)
v = Protokoll-Version
o = Ersteller der Session und Session-Identifizierung
s = Name der Session
i = zusätzliche Session-Informationen (optional)
u = URI mit der weiterführender Beschreibung (optional)
e = E-Mail-Adresse (optional)
p = Telefon-Nummer (optional)
c = Verbindungs-Information (wird nicht benötigt, wenn bei allen Medien angegeben, optional)
b = Information über die Bandbreite (optional)
z = Zeitzonen-Anpassungen (optional)
k = Verschlüsselungs-Schlüssel (encryption key) (optional)
a = keine oder mehr Session-Attribute (optional)
t = Zeit, in der die Session aktiv ist
r = keine oder mehr Wiederholungen (optional)
m = Medientyp, Port und Protokoll für den Medientransport sowie die Medienformate
i = Titel des Mediums (optional)
c = Verbindungs-Informationen, optional wenn diese nicht in der Session definiert sind (s. o, optional)
b = keine oder mehr Bandbreiteninformationen (optional)
k = Verschlüsselungs-Schlüssel ("encryption key", optional)
a = keine oder mehr Media-Attribute (optional)
Lync Message (Instant Messaging)
Nun schauen wir uns noch die übertragung einer Nachricht von sip:boa@icewolf.ch an sip:a.bohren@icewolf.ch in Lync an. Den Nachrichteninhalt (also der übermittelte Text) wird nicht angezeigt. Das würde aber auch die Privatsphäre verletzen.
TL_INFO(TF_PROTOCOL) [0]139C.1770::11/15/2012-23:47:47.052.00025416 (SIPStack,SIPAdminLog::TraceProtocolRecord:SIPAdminLog.cpp(125))$$begin_record
Trace-Correlation-Id: 1130765770
Instance-Id: 00000B04
Direction: incoming
Peer: 172.21.175.200:49278
Message-Type: request
Start-Line: MESSAGE sip:a.bohren@icewolf.ch;opaque=user:epid:r92LWZYiI1KOwWX8Y92rNgAA;gruu SIP/2.0
From: "" <sip:boa@icewolf.ch>;epid=e4cf75d760;tag=1034c68cc9
To: "Bohren, Andres"<sip:a.bohren@icewolf.ch>;tag=b648746a90;epid=4ce2daba48
CSeq: 3 MESSAGE
Call-ID: 0c978a3fe8214c9a90013d9eda123847
Via: SIP/2.0/TLS 172.21.175.200:49278
Max-Forwards: 70
Route: <sip:ICESRV06.corp.icewolf.ch:5061;transport=tls;opaque=state:T:F:Ci.R1cf00;lr;ms-route-sig=gamDndL3afTRL-A0_3Medy7vemBO2F8Nwkvv_KtXlp7JeL3PofbL-f2wAA>;tag=1188DEEFDBAF6743B5671B77817EF014
User-Agent: UCCAPI/4.0.7577.4356 OC/4.0.7577.4356 (Microsoft Lync 2010)
Supported: ms-dialog-route-set-update
Supported: timer
Proxy-Authorization: TLS-DSK qop="auth", realm="SIP Communications Service", opaque="10ED3377", targetname="ICESRV06.corp.icewolf.ch", crand="c71159db", cnum="17", response="47f50faaf6d36232ef7d0a92f07f8e42ae97aa21"
Content-Type: text/html
Content-Length: 159
Message-Body: ----****MESSAGE BODY DELETED****----
$$end_record
Lync BYE
Nun wird die Konversation von sip:a.bohren@icewolf.ch mit einem BYE Request an sip:boa@icewolf.ch beendet
TL_INFO(TF_PROTOCOL) [0]139C.1770::11/15/2012-23:48:03.638.0002cad3 (SIPStack,SIPAdminLog::TraceProtocolRecord:SIPAdminLog.cpp(125))$$begin_record
Trace-Correlation-Id: 1130765770
Instance-Id: 00000B19
Direction: incoming
Peer: 172.21.175.204:49745
Message-Type: request
Start-Line: BYE sip:boa@icewolf.ch;opaque=user:epid:oTOfiTmWJV-ZaVTfQzrj7AAA;gruu SIP/2.0
From: <sip:a.bohren@icewolf.ch>;tag=b648746a90;epid=4ce2daba48
To: <sip:boa@icewolf.ch>;epid=e4cf75d760;tag=1034c68cc9
CSeq: 5 BYE
Call-ID: 0c978a3fe8214c9a90013d9eda123847
Via: SIP/2.0/TLS 172.21.175.204:49745
Max-Forwards: 70
Route: <sip:ICESRV06.corp.icewolf.ch:5061;transport=tls;opaque=state:T:F:Eu:Ci.R1ce00;lr;ms-route-sig=ga-EGtqFm9xrteJDIqkulw6h_9j-cv9LQS54t8cpyk9kGL3PofbL-f2wAA>
User-Agent: UCCAPI/4.0.7577.4356 OC/4.0.7577.4356 (Microsoft Lync 2010)
Ms-client-diagnostics: 51004; reason="Action initiated by user"
Proxy-Authorization: TLS-DSK qop="auth", realm="SIP Communications Service", opaque="6911BC37", targetname="ICESRV06.corp.icewolf.ch", crand="192830be", cnum="28", response="d79cde4006e6daf06a12078b391c88d65d39d7b5"
Content-Length: 0
Message-Body: –
$$end_record
Weitere Informationen
- SIP Introduction
http://ftp.iptel.org/pub/ser/0.8.14/doc/html/sip_introduction.html - SIP: Protocol Overview
http://www.radvision.com/NR/rdonlyres/51855E82-BD7C-4D9D-AA8A-E822E3F4A81F/0/RADVISIONSIPProtocolOverview.pdf - Overview of the Session Initiation Protocol
http://www.cisco.com/univercd/cc/td/doc/product/voice/sipsols/biggulp/bgsipov.htm - SIP Transactions / SIP Dialog
http://ftp.iptel.org/pub/ser/0.8.14/doc/html/sip_introduction.html
Weitere Protokolle welche bei SIP benutzt werden.
- Realtime Transport Protocol (RTP, deutsch Echtzeit-Transportprotokoll, RFC 3550)
http://de.wikipedia.org/wiki/Real-Time_Transport_Protocol - Secure Real-Time Transport Protocol (SRTP)
http://de.wikipedia.org/wiki/Secure_Real-Time_Transport_Protocol - Session Traversal Utilities for NAT (STUN)
http://de.wikipedia.org/wiki/STUN - Interactive Connectivity Establishment (ICE)
http://de.wikipedia.org/wiki/Interactive_Connectivity_Establishment - Datagram Transport Layer Security (DTLS)
http://de.wikipedia.org/wiki/Datagram_Transport_Layer_Security