1. 程式人生 > >SIP信令協議初識

SIP信令協議初識

1、什麼是SIP

SIP(會話發起協議)屬於IP應用層協議,用於在IP網上為使用者提供會話應用。會話(Session)指兩方或多方使用者之間的語音、視訊、及其他媒體形式的通訊,具體可能是IP電話、會議、即時訊息等等。

clip_image002

SIP是一個信令協議,它對應於傳統電話網路中的呼叫信令協議(比如SS7 ISUP)。構建一個完整多媒體通訊架構還需要結合其他一些協議,必要的有:RTP,用於媒體傳輸;RSVP,用於QOS保證等等。

clip_image004

2、基本功能

2.1 會話的發起與管理

SIP主要用於建立、修改和終止一個會話。

一個建立會話的簡單的例子如下圖所示:

clip_image006

  • 發起方向目的方傳送一個SIP請求訊息(INVITE),其中包含提議的會話引數的描述,請求在二者之間建立一個會話;
  • 目的方返回一個SIP響應訊息(200 OK),其中包含接受的會話引數的描述,接受會話建立請求
  • 發起方傳送一個SIP請求訊息(ACK)確認會話的建立。

一個修改會話的簡單例子如下圖所示:

clip_image008

  • 會話中的任意一方可以傳送一個SIP請求訊息(reINVITE),其中包含提議的新的會話引數,請求修改二者之間的會話;
  • 另一方返回一個SIP響應訊息(200 OK),其中包含接受的新的會話引數,接受會話修改請求

一個結束會話的簡單的例子如下圖所示:

clip_image010

  • 會話中的任意一方可以傳送一個SIP請求訊息(BYE),請求結束會話;
  • 另一方返回一個SIP響應訊息(200 OK),接受會話結束請求

2.2 使用者位置管理

SIP支援使用者(終端)的移動性。

SIP要求終端定期向網路傳送註冊請求(REGGISTER),報告自己的當前位置。這樣SIP伺服器中始終儲存了使用者(終端)的當前地址。當用戶被呼叫時,SIP伺服器能夠將SIP請求傳送到使用者的當前地址。

clip_image012

3、實體 & 網路

SIP UA(User Agent,使用者代理)是最基本的SIP實體,它通常就是使用者終端。理想情況下,通過SIP UA就可以完成使用者之間會話的建立。(參見第2節 SIP基本功能中的會話發起與管理)。

但是為了支援SIP的移動性,以及其他高階功能,比如運營商對呼叫的控制等等,會話發起及管理的信令過程不能直接在兩個SIP UA之間完成,而是需要經過由若干SIP伺服器構成的SIP信令網路。

clip_image014

這些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的當前地址傳送請求訊息。

clip_image016

在代理方式下(如下圖所示),SIP代理伺服器收到了SIP請求訊息,查詢到目標SIP UA的當前地址後,將SIP請求訊息轉發到目標SIP UA的當前地址。之後的SIP訊息互動都要經過SIP代理伺服器。這使得SIP代理伺服器可以對會話進行控制,比如結束會話等等。

clip_image018

4、SIP操作與SIP訊息

SIP所提供的功能是通過一些原子性的基本功能(比如註冊(registration),發起會話(Initiation)、會話結束等)組合而成的。每個原子性基本功能是通過一個SIP操作完成的。

SIP操作基於類似HTTP的請求/響應事務模型,每個操作的呼叫過程體現為一個所謂事務 – 包含一個SIP請求和一個或多個相應的SIP響應。其中SIP請求訊息中的方法(Method)指示出調用的操作。

clip_image020

下表是在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)兩部分(如下圖所示)。

clip_image022

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在開機時註冊。訊息流如下圖所示。注意為了簡化流程,這裡沒有給出在註冊時通常所必需的鑑權過程。

clip_image024

訊息細節:

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的最基本的功能。

訊息流如下圖所示。

clip_image026

訊息內容:(注意這裡並未給出會話媒體引數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