1、什麼是SIPphp
SIP(會話發起協議)屬於IP應用層協議,用於在IP網上爲用戶提供會話應用。會話(Session)指兩方或多方用戶之間的語音、視頻、及其餘媒體形式的通訊,具體多是IP電話、會議、即時消息等等。服務器
SIP是一個信令協議,它對應於傳統電話網絡中的呼叫信令協議(好比SS7 ISUP)。構建一個完整多媒體通訊架構還須要結合其餘一些協議,必要的有:RTP,用於媒體傳輸;RSVP,用於QOS保證等等。網絡
2、基本功能session
2.1 會話的發起與管理架構
SIP主要用於建立、修改和終止一個會話。app
一個建立會話的簡單的例子以下圖所示:ide
一個修改會話的簡單例子以下圖所示:ui
一個結束會話的簡單的例子以下圖所示:spa
2.2 用戶位置管理.net
SIP支持用戶(終端)的移動性。
SIP要求終端按期向網絡發送註冊請求(REGGISTER),報告本身的當前位置。這樣SIP服務器中始終存儲了用戶(終端)的當前地址。當用戶被呼叫時,SIP服務器可以將SIP請求發送到用戶的當前地址。
3、實體 & 網絡
SIP UA(User Agent,用戶代理)是最基本的SIP實體,它一般就是用戶終端。理想狀況下,經過SIP UA就能夠完成用戶之間會話的創建。(參見第2節 SIP基本功能中的會話發起與管理)。
可是爲了支持SIP的移動性,以及其餘高級功能,好比運營商對呼叫的控制等等,會話發起及管理的信令過程不能直接在兩個SIP UA之間完成,而是須要通過由若干SIP服務器構成的SIP信令網絡。
這些SIP服務器能夠分爲兩類:註冊服務器和路由服務器。
SIP註冊服務器(registrar)的主要功能是接受SIP UA的註冊請求,維護用戶名-地址映射。
路由服務器的主要功能是將SIP消息路由到目標SIP UA。路由服務器有SIP重定向服務器(redirect server)和SIP代理服務器(proxy)兩種。前者以重定向方式路由SIP請求消息,後者以代理方式路由SIP請求消息。
在重定向方式下(以下圖所示),SIP重定向服務器收到了SIP請求消息,查詢到目標SIP UA的當前地址後,經過SIP響應消息(302 Moved temporarily)返回給發起方SIP UA。以後的SIP消息交互與重定向服務器無關,發起方SIP UA直接向目標SIP UA的當前地址發送請求消息。
在代理方式下(以下圖所示),SIP代理服務器收到了SIP請求消息,查詢到目標SIP UA的當前地址後,將SIP請求消息轉發到目標SIP UA的當前地址。以後的SIP消息交互都要通過SIP代理服務器。這使得SIP代理服務器能夠對會話進行控制,好比結束會話等等。
4、SIP操做與SIP消息
SIP所提供的功能是經過一些原子性的基本功能(好比註冊(registration),發起會話(Initiation)、會話結束等)組合而成的。每一個原子性基本功能是經過一個SIP操做完成的。
SIP操做基於相似HTTP的請求/響應事務模型,每一個操做的調用過程體現爲一個所謂事務 – 包含一個SIP請求和一個或多個相應的SIP響應。其中SIP請求消息中的方法(Method)指示出調用的操做。
下表是在RFC 3261中定義的方法及其對應的SIP操做。
方法Method |
SIP操做 |
INVITE |
會話邀請 |
ACK |
確認會話邀請 |
CANCEL |
取消會話邀請 |
BYE |
結束會話 |
REGISTER |
註冊 |
OPTIONS |
查詢服務器能力 |
SIP是一個基於文本(text-based)的協議,使用 UTF-8 字符集。SIP消息與HTTP/1.1很是相似,一樣能夠包含消息體(message body),一般是會話描述(session descriptions),也多是其餘內容。
SIP 消息有兩類:從客戶機到服務器的請求消息(request),從服務器到客戶機的響應消息(response)。
除了第一行分別是請求行(Request-Line)和狀態行(Status-Line)之外,SIP請求消息和SIP響應消息的剩下部分的組成基本相似,包括消息頭域(message header)和消息體(message body)兩部分(以下圖所示)。
4.1 SIP請求消息
根據請求行中的方法(method)的不一樣,SIP請求消息有不少種,分別完成各類操做的調用,實現各類功能,下面進行簡單的介紹。
上面的4個請求用於會話創建與管理。
上面的3個請求構成SIP事件發佈-訂閱-通知機制
4.2 SIP響應消息
狀態碼 |
描述 |
例子 |
1xx |
Informational 請求收到,處理中 |
180 Ringing 181 Call is Being Forwarded |
2xx |
Success 操做已成功完成 |
200 OK |
3xx |
Redirection 請求被重定向 |
300 Multiple Choices 302 Moved Temporarily |
4xx |
Client Error 請求包含錯誤的文法,或者沒法在本服務器上完成 |
401 Unauthorized 408 Request Timeout |
5xx |
Server Error 請求有效,但服務器沒法完成 |
503 Service Unavailable 505 Version Not Supported |
6xx |
Global Failure 請求在任何服務器上都沒法完成 |
600 Busy Everywhere 603 Decline |
4.3 SIP消息頭域
根據請求行中的方法(method)的不一樣,SIP請求消息有不少種,分別完成各類操做的調用,實現各類功能,下面進行簡單的介紹。
上面6個頭域是全部SIP消息中的必需的頭域。
5、詳細的例子 (摘自IETF RFC 3261)
實際的例子能夠幫助你們進一步地認識和理解前面的內容。這裏的兩個例子分別是關於SIP的兩個最基本的功能:註冊和會話創建。每一個例子中給出了消息交互過程,以及必要的消息內容細節。
出於簡明性的考慮,這裏給出的消息的內容忽略了消息體及相應的頭域(Content-Length 和 Content-Type)。另外,還有一些頭域好比Allow 和 Supported 一般也會出現,但這裏並未給出。
5.1 註冊
Bob在開機時註冊。消息流以下圖所示。注意爲了簡化流程,這裏沒有給出在註冊時一般所必需的鑑權過程。
消息細節:
F1 REGISTER Bob -> Registrar
REGISTER sip:registrar.biloxi.com SIP/2.0
Via: SIP/2.0/UDP bobspc.biloxi.com:5060;branch=z9hG4bKnashds7
Max-Forwards: 70
To: Bob <sip:bob@biloxi.com>
From: Bob <sip:bob@biloxi.com>;tag=456248
Call-ID: 843817637684230@998sdasdh09
CSeq: 1826 REGISTER
Contact: <sip:bob@192.0.2.4>
Expires: 7200
Content-Length: 0
此次註冊的有效期爲2個小時(7200秒)
註冊服務器返回 200 OK 響應。
F2 200 OK Registrar -> Bob
SIP/2.0 200 OK
Via: SIP/2.0/UDP bobspc.biloxi.com:5060;branch=z9hG4bKnashds7;received=192.0.2.4
To: Bob <sip:bob@biloxi.com>;tag=2493k59kd
From: Bob <sip:bob@biloxi.com>;tag=456248
Call-ID: 843817637684230@998sdasdh09
CSeq: 1826 REGISTER
Contact: <sip:bob@192.0.2.4>
Expires: 7200
Content-Length: 0
5.2 會話創建與拆除
會話創建是SIP的最基本的功能。
消息流以下圖所示。
消息內容:(注意這裏並未給出會話媒體參數SDP的細節)
F1 INVITE Alice -> atlanta.com proxy
INVITE sip:bob@biloxi.com SIP/2.0
Via: SIP/2.0/UDP pc33.atlanta.com;branch=z9hG4bKnashds8
Max-Forwards: 70
To: Bob <sip:bob@biloxi.com>
From: Alice <sip:alice@atlanta.com>;tag=1928301774
Call-ID: a84b4c76e66710
CSeq: 314159 INVITE
Contact: <sip:alice@pc33.atlanta.com>
Content-Type: application/sdp
Content-Length: 142
(Alice的 SDP 未顯示)
F2 100 Trying atlanta.com proxy -> Alice
SIP/2.0 100 Trying
Via: SIP/2.0/UDP pc33.atlanta.com;branch=z9hG4bKnashds8
;received=192.0.2.1
To: Bob <sip:bob@biloxi.com>
From: Alice <sip:alice@atlanta.com>;tag=1928301774
Call-ID: a84b4c76e66710
CSeq: 314159 INVITE
Content-Length: 0
F3 INVITE atlanta.com proxy -> biloxi.com proxy
INVITE sip:bob@biloxi.com SIP/2.0
Via: SIP/2.0/UDP bigbox3.site3.atlanta.com;branch=z9hG4bK77ef4c2312983.1
Via: SIP/2.0/UDP pc33.atlanta.com;branch=z9hG4bKnashds8
;received=192.0.2.1
Max-Forwards: 69
To: Bob <sip:bob@biloxi.com>
From: Alice <sip:alice@atlanta.com>;tag=1928301774
Call-ID: a84b4c76e66710
CSeq: 314159 INVITE
Contact: <sip:alice@pc33.atlanta.com>
Content-Type: application/sdp
Content-Length: 142
(Alice的 SDP 未顯示)
F4 100 Trying biloxi.com proxy -> atlanta.com proxy
SIP/2.0 100 Trying
Via: SIP/2.0/UDP bigbox3.site3.atlanta.com;branch=z9hG4bK77ef4c2312983.1
;received=192.0.2.2
Via: SIP/2.0/UDP pc33.atlanta.com;branch=z9hG4bKnashds8
;received=192.0.2.1
To: Bob <sip:bob@biloxi.com>
From: Alice <sip:alice@atlanta.com>;tag=1928301774
Call-ID: a84b4c76e66710
CSeq: 314159 INVITE
Content-Length: 0
F5 INVITE biloxi.com proxy -> Bob
INVITE sip:bob@192.0.2.4 SIP/2.0
Via: SIP/2.0/UDP server10.biloxi.com;branch=z9hG4bK4b43c2ff8.1
Via: SIP/2.0/UDP bigbox3.site3.atlanta.com;branch=z9hG4bK77ef4c2312983.1
;received=192.0.2.2
Via: SIP/2.0/UDP pc33.atlanta.com;branch=z9hG4bKnashds8
;received=192.0.2.1
Max-Forwards: 68
To: Bob <sip:bob@biloxi.com>
From: Alice <sip:alice@atlanta.com>;tag=1928301774
Call-ID: a84b4c76e66710
CSeq: 314159 INVITE
Contact: <sip:alice@pc33.atlanta.com>
Content-Type: application/sdp
Content-Length: 142
(Alice的 SDP 未顯示)
F6 180 Ringing Bob -> biloxi.com proxy
SIP/2.0 180 Ringing
Via: SIP/2.0/UDP server10.biloxi.com;branch=z9hG4bK4b43c2ff8.1
;received=192.0.2.3
Via: SIP/2.0/UDP bigbox3.site3.atlanta.com;branch=z9hG4bK77ef4c2312983.1
;received=192.0.2.2
Via: SIP/2.0/UDP pc33.atlanta.com;branch=z9hG4bKnashds8
;received=192.0.2.1
To: Bob <sip:bob@biloxi.com>;tag=a6c85cf
From: Alice <sip:alice@atlanta.com>;tag=1928301774
Call-ID: a84b4c76e66710
Contact: <sip:bob@192.0.2.4>
CSeq: 314159 INVITE
Content-Length: 0
F7 180 Ringing biloxi.com proxy -> atlanta.com proxy
SIP/2.0 180 Ringing
Via: SIP/2.0/UDP bigbox3.site3.atlanta.com;branch=z9hG4bK77ef4c2312983.1
;received=192.0.2.2
Via: SIP/2.0/UDP pc33.atlanta.com;branch=z9hG4bKnashds8
;received=192.0.2.1
To: Bob <sip:bob@biloxi.com>;tag=a6c85cf
From: Alice <sip:alice@atlanta.com>;tag=1928301774
Call-ID: a84b4c76e66710
Contact: <sip:bob@192.0.2.4>
CSeq: 314159 INVITE
Content-Length: 0
F8 180 Ringing atlanta.com proxy -> Alice
SIP/2.0 180 Ringing
Via: SIP/2.0/UDP pc33.atlanta.com;branch=z9hG4bKnashds8
;received=192.0.2.1
To: Bob <sip:bob@biloxi.com>;tag=a6c85cf
From: Alice <sip:alice@atlanta.com>;tag=1928301774
Call-ID: a84b4c76e66710
Contact: <sip:bob@192.0.2.4>
CSeq: 314159 INVITE
Content-Length: 0
F9 200 OK Bob -> biloxi.com proxy
SIP/2.0 200 OK
Via: SIP/2.0/UDP server10.biloxi.com;branch=z9hG4bK4b43c2ff8.1
;received=192.0.2.3
Via: SIP/2.0/UDP bigbox3.site3.atlanta.com;branch=z9hG4bK77ef4c2312983.1
;received=192.0.2.2
Via: SIP/2.0/UDP pc33.atlanta.com;branch=z9hG4bKnashds8
;received=192.0.2.1
To: Bob <sip:bob@biloxi.com>;tag=a6c85cf
From: Alice <sip:alice@atlanta.com>;tag=1928301774
Call-ID: a84b4c76e66710
CSeq: 314159 INVITE
Contact: <sip:bob@192.0.2.4>
Content-Type: application/sdp
Content-Length: 131
(Bob的 SDP 未顯示)
F10 200 OK biloxi.com proxy -> atlanta.com proxy
SIP/2.0 200 OK
Via: SIP/2.0/UDP bigbox3.site3.atlanta.com;branch=z9hG4bK77ef4c2312983.1
;received=192.0.2.2
Via: SIP/2.0/UDP pc33.atlanta.com;branch=z9hG4bKnashds8
;received=192.0.2.1
To: Bob <sip:bob@biloxi.com>;tag=a6c85cf
From: Alice <sip:alice@atlanta.com>;tag=1928301774
Call-ID: a84b4c76e66710
CSeq: 314159 INVITE
Contact: <sip:bob@192.0.2.4>
Content-Type: application/sdp
Content-Length: 131
(Bob的 SDP 未顯示)
F11 200 OK atlanta.com proxy -> Alice
SIP/2.0 200 OK
Via: SIP/2.0/UDP pc33.atlanta.com;branch=z9hG4bKnashds8
;received=192.0.2.1
To: Bob <sip:bob@biloxi.com>;tag=a6c85cf
From: Alice <sip:alice@atlanta.com>;tag=1928301774
Call-ID: a84b4c76e66710
CSeq: 314159 INVITE
Contact: <sip:bob@192.0.2.4>
Content-Type: application/sdp
Content-Length: 131
(Bob的 SDP 未顯示)
F12 ACK Alice -> Bob
ACK sip:bob@192.0.2.4 SIP/2.0
Via: SIP/2.0/UDP pc33.atlanta.com;branch=z9hG4bKnashds9
Max-Forwards: 70
To: Bob <sip:bob@biloxi.com>;tag=a6c85cf
From: Alice <sip:alice@atlanta.com>;tag=1928301774
Call-ID: a84b4c76e66710
CSeq: 314159 ACK
Content-Length: 0
如今Alice和Bob之間的媒體會話被創建。
Bob首先掛機。注意Bob的SIP 話機維護本身的 CSeq 編號空間,在這裏是從231開始。由於是Bob 發送的請求,To 和 From 頭域的URIs和tags參數被掉換。
F13 BYE Bob -> Alice
BYE sip:alice@pc33.atlanta.com SIP/2.0
Via: SIP/2.0/UDP 192.0.2.4;branch=z9hG4bKnashds10
Max-Forwards: 70
From: Bob <sip:bob@biloxi.com>;tag=a6c85cf
To: Alice <sip:alice@atlanta.com>;tag=1928301774
Call-ID: a84b4c76e66710
CSeq: 231 BYE
Content-Length: 0
F14 200 OK Alice -> Bob
SIP/2.0 200 OK
Via: SIP/2.0/UDP 192.0.2.4;branch=z9hG4bKnashds10
From: Bob <sip:bob@biloxi.com>;tag=a6c85cf
To: Alice <sip:alice@atlanta.com>;tag=1928301774
Call-ID: a84b4c76e66710
CSeq: 231 BYE
Content-Length: 0