初識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: 843817637684230@998sdasdh09

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: 843817637684230@998sdasdh09

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

發佈了19 篇原創文章 · 獲贊 35 · 訪問量 23萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章