SIP信令協議初識
1、什麼是SIP
SIP(會話發起協議)屬於IP應用層協議,用於在IP網上為使用者提供會話應用。會話(Session)指兩方或多方使用者之間的語音、視訊、及其他媒體形式的通訊,具體可能是IP電話、會議、即時訊息等等。
SIP是一個信令協議,它對應於傳統電話網路中的呼叫信令協議(比如SS7 ISUP)。構建一個完整多媒體通訊架構還需要結合其他一些協議,必要的有:RTP,用於媒體傳輸;RSVP,用於QOS保證等等。
2、基本功能
2.1 會話的發起與管理
SIP主要用於建立、修改和終止一個會話。
一個建立會話的簡單的例子如下圖所示:
- 發起方向目的方傳送一個SIP請求訊息(INVITE),其中包含提議的會話引數的描述,請求在二者之間建立一個會話;
- 目的方返回一個SIP響應訊息(200 OK),其中包含接受的會話引數的描述,接受會話建立請求
- 發起方傳送一個SIP請求訊息(ACK)確認會話的建立。
一個修改會話的簡單例子如下圖所示:
- 會話中的任意一方可以傳送一個SIP請求訊息(reINVITE),其中包含提議的新的會話引數,請求修改二者之間的會話;
- 另一方返回一個SIP響應訊息(200 OK),其中包含接受的新的會話引數,接受會話修改請求
一個結束會話的簡單的例子如下圖所示:
- 會話中的任意一方可以傳送一個SIP請求訊息(BYE),請求結束會話;
- 另一方返回一個SIP響應訊息(200 OK),接受會話結束請求
2.2 使用者位置管理
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請求訊息有很多種,分別完成各種操作的呼叫,實現各種功能,下面進行簡單的介紹。
- INVITE/reINVITE:INVITE 發起會話邀請。reINVITE(在一個已存在的對話中傳送的INVITE稱為reINVITE)修改已建立會話的引數。
- ACK:完成會話建立的3次握手 [INVITE-200-ACK],僅僅用於INVITE
- BYE :結束會話。
- CANCEL:取消正在建立中會話(INVITE已傳送,但尚未收到最終響應(final response))。
- UPDATE:更新會話引數。它被建議用於替代 re-INVITE,與 re-INVITE不同在於:它可以在初始INVITE未完成時傳送,能用於在早對話(early dialog)中更新會話引數。
上面的4個請求用於會話建立與管理。
- REGISTER:登記UA當前的聯絡地址(contact)
- OPTIONS:查詢伺服器或對端UA的能力,具體包括支援的方法(method),擴充套件(extensions)、編解碼(codecs)等。
- PRACK:臨時響應(Provisional Response)確認。用於確認收到了臨時響應,例如 “183 Session Progress”,以支援臨時響應的可靠傳送。它不能應用於“100 Trying ”,只有101~199 臨時響應需要可靠傳送。如果沒有收到 PRACK,響應訊息將被重傳。
- NOTIFY:事件通知,具體的事件包括、業務狀態的改變(MWI,...),使用者狀態的改變等等。
- SUBSCRIBE:訂閱/取消(Expires=0)事件通知。
- PUBLISH:釋出事件狀態。PUBLISH 與 REGISTER 的相似之處在於:允許使用者在另一個實體(狀態管理實體/registrar)中建立、修改和移除自己的狀態。對PUBLISH 請求的定址與對於SUBSCRIBE 請求的定址是一樣的,PUBLISH 請求的Request-URI 中填入的是使用者希望釋出其事件狀態的資源地址。
上面的3個請求構成SIP事件釋出-訂閱-通知機制
- INFO:用於傳送 mid-call 信令資訊,同一時刻只能有一個 INFO 事務存在。通常用於攜帶 PSTN 信令訊息(作為 MIME 附件),例如,ISDN UUI (使用者到使用者資訊)。
- MESSAGE:針對即時訊息 (IM)的擴充套件,用於傳送即時訊息。MESSAGE請求通過MIME附件中攜帶內容。MESSAGE 請求自身不發起 SIP 對話,在正常的用法中,每個即時訊息都是單獨存在的,非常類似 pager 訊息。MESSAGE 請求可以在其他SIP請求發起的對話上下文中傳送。
- REFER:指示接收者 (Request-URI所標識的) 應該使用請求中提供的資訊聯絡第三方。典型應用:Call Transfer features 。Allowed outside an established dialogue。
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請求訊息有很多種,分別完成各種操作的呼叫,實現各種功能,下面進行簡單的介紹。
- Call-ID:用於唯一標識一個特定的會話或註冊訊息。應該具有隨機性,保證全球唯一。 例子:Call-ID:[email protected]
- From:源端SIP URL,標識請求傳送方;UAC本地標籤。 例子:From: sip:+1-314-342-7360 @gateway.wcom.com; tag=1234567
- To:目標SIP URL,標識請求接受方;UAS本地標籤。 例子:To: sip:[email protected]; tag=314
- Via:用於記錄請求經由的路徑 例子:Via: SIP/2.0/TCP uunet.com
- Max-Forwards:訊息最大轉發次數。服務每次轉發訊息時將此域值減1,當變成0時,伺服器傳送 483響應(Too Many Hops response)。 例子:Max-Forwards: 10
- Cseq:請求序列號,用於區分同一個會話中的不同請求。 例如:CSeq: 1 INVITE CSeq: 4325 BYE CSeq: 1 REGISTER
上面6個頭域是所有SIP訊息中的必需的頭域。
- Contact 另一個SIP URL用於直接訊息路由。 例如:Contact: W. Riker, Acting Captain [email protected] Record-Route 需要自己處在後繼訊息的路徑上時,proxy將自己的地址加插在請求訊息中 例子:Record Route: sip.mci.com
- Route 確定訊息的選路 例子:Route: orinoco.brooks.net
- Content-Length:訊息體中的 Octet 數 例子:Content-Length: 285
- Content-Type:訊息體內容型別 例子:Content-Type: application/sdp
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:[email protected]>
From: Bob <sip:[email protected]>;tag=456248
Call-ID: [email protected]
CSeq: 1826 REGISTER
Contact: <sip:[email protected]>
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:[email protected]>;tag=2493k59kd
From: Bob <sip:[email protected]>;tag=456248
Call-ID: [email protected]
CSeq: 1826 REGISTER
Contact: <sip:[email protected]>
Expires: 7200
Content-Length: 0
5.2 會話建立與拆除
會話建立是SIP的最基本的功能。
訊息流如下圖所示。
訊息內容:(注意這裡並未給出會話媒體引數SDP的細節)
F1 INVITE Alice -> atlanta.com proxy
INVITE sip:[email protected] SIP/2.0
Via: SIP/2.0/UDP pc33.atlanta.com;branch=z9hG4bKnashds8
Max-Forwards: 70
To: Bob <sip:[email protected]>
From: Alice <sip:[email protected]>;tag=1928301774
Call-ID: a84b4c76e66710
CSeq: 314159 INVITE
Contact: <sip:[email protected]>
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:[email protected]>
From: Alice <sip:[email protected]>;tag=1928301774
Call-ID: a84b4c76e66710
CSeq: 314159 INVITE
Content-Length: 0
F3 INVITE atlanta.com proxy -> biloxi.com proxy
INVITE sip:[email protected] 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:[email protected]>
From: Alice <sip:[email protected]>;tag=1928301774
Call-ID: a84b4c76e66710
CSeq: 314159 INVITE
Contact: <sip:[email protected]>
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:[email protected]>
From: Alice <sip:[email protected]>;tag=1928301774
Call-ID: a84b4c76e66710
CSeq: 314159 INVITE
Content-Length: 0
F5 INVITE biloxi.com proxy -> Bob
INVITE sip:[email protected] 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:[email protected]>
From: Alice <sip:[email protected]>;tag=1928301774
Call-ID: a84b4c76e66710
CSeq: 314159 INVITE
Contact: <sip:[email protected]>
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:[email protected]>;tag=a6c85cf
From: Alice <sip:[email protected]>;tag=1928301774
Call-ID: a84b4c76e66710
Contact: <sip:[email protected]>
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:[email protected]>;tag=a6c85cf
From: Alice <sip:[email protected]>;tag=1928301774
Call-ID: a84b4c76e66710
Contact: <sip:[email protected]>
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:[email protected]>;tag=a6c85cf
From: Alice <sip:[email protected]>;tag=1928301774
Call-ID: a84b4c76e66710
Contact: <sip:[email protected]>
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:[email protected]>;tag=a6c85cf
From: Alice <sip:[email protected]>;tag=1928301774
Call-ID: a84b4c76e66710
CSeq: 314159 INVITE
Contact: <sip:[email protected]>
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:[email protected]>;tag=a6c85cf
From: Alice <sip:[email protected]>;tag=1928301774
Call-ID: a84b4c76e66710
CSeq: 314159 INVITE
Contact: <sip:[email protected]>
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:[email protected]>;tag=a6c85cf
From: Alice <sip:[email protected]>;tag=1928301774
Call-ID: a84b4c76e66710
CSeq: 314159 INVITE
Contact: <sip:[email protected]>
Content-Type: application/sdp
Content-Length: 131
(Bob的 SDP 未顯示)
F12 ACK Alice -> Bob
ACK sip:[email protected] SIP/2.0
Via: SIP/2.0/UDP pc33.atlanta.com;branch=z9hG4bKnashds9
Max-Forwards: 70
To: Bob <sip:[email protected]>;tag=a6c85cf
From: Alice <sip:[email protected]>;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:[email protected] SIP/2.0
Via: SIP/2.0/UDP 192.0.2.4;branch=z9hG4bKnashds10
Max-Forwards: 70
From: Bob <sip:[email protected]>;tag=a6c85cf
To: Alice <sip:[email protected]>;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:[email protected]>;tag=a6c85cf
To: Alice <sip:[email protected]>;tag=1928301774
Call-ID: a84b4c76e66710
CSeq: 231 BYE
Content-Length: 0