天天看點

SIP協定詳解(以呼叫中心呼入呼出為例)

作者:外太空的金山

一、背景

Internet的許多應用都需要建立和管理一個會話,會話在這裡的含義是在參與者之間的資料的交換。由于考慮到參與者的實際情況,這些應用的實作往往是很複雜的:參與者可能是在代理間移動,他們可能可以有多個名字,他們中間的通訊可能是基于不同的媒介(比如文本,多媒體,視訊,音頻等)-有時候是多種媒介一起互動。人們創造了無數種通訊協定應用于實時的多媒體會話資料比如聲音,影像,或者文本。

SIP(會話初始協定)和這些協定一樣,同樣允許使用Internet端點(使用者代理)來尋找參與者并且允許建立一個可共享的會話描述。為了能夠定位精确的會話參與者,并且也為了其他的目的,SIP允許建立基礎的network hosts(叫做代理伺服器),并且允許終端使用者注冊上去,發出會話邀請,或者發出其他請求。SIP是一個輕形的,多用途的工具,可以用來建立,修改和終止會話,它獨立運作于通訊協定之下,并且不依賴建立的會話類型。

傳統撥打電話流程:

A呼叫B,邀請B建立通話(Invite)

電話B振鈴(Ring),同時電話A也可以聽見振鈴

電話B提起表示應答,是以通話建立

通話中。。。

任意方挂斷電話,通話結束

傳統電話使用電磁波傳輸通信信号,而現階段網絡幾乎擁有完整的覆寫率,是以SIP協定的意義是在IP網絡中實作網絡電話功能

二、協定内容

sip協定是應用層協定,與其他應用層協定協同工作,通過網絡控制多媒體通信會話

通話雙方需在IP網絡中擁有一個SIP賬号,差別于傳統數字号碼,SIP采用URL表示方法

sip:[email protected]:5060

解析:

sip:表示采用sip協定

​ jack:發起請求的使用者名,字母數字均可

​ google.com:賬号所屬伺服器域名,亦可以使用ip表示

​ 5060:連接配接的端口号

SIP協定詳解(以呼叫中心呼入呼出為例)

三、SIP通信流程:

1、軟電話 A 向 B 發送一個 SIP消息 INVITE, 邀請B通話

2、軟電話 B 振鈴,向A 回複一個SIP消息 RING, 通知 A 正在振鈴中,請A等待

3、軟電話 B 提機,向A發一個SIP消息 OK, 通知 A 可以通話了

4、軟電話 A 向 B 回複一個回應消息 ACK,正式啟動通話

5、接下來,雙方通話

6、軟電話 B 挂機,向 A 發一個SIP消息 BYE, 通知 A 通話結束

7、軟電話 A 向 B 回複一個消息 OK, 通話結束

總結:不難發現,SIP協定完整地實作了傳統電話通信流程,且以ip形式運作在網絡環境中

四、深入協定主體

幾個概念:

SIP協定的設計非常簡單,配置有限的指令。它也是基于文本的,是以任何人都可以讀取SIP會話中的端點之間傳遞的SIP消息。

有一些實體幫助SIP建立其網絡。在SIP中,每個網元由SIP URI(統一資源辨別符)來辨別,它像一個位址。以下是網絡元素

使用者代理

代理伺服器

注冊伺服器

重定向伺服器

位置伺服器

SIP基于客戶機 - 伺服器架構,其中呼叫者的電話充當發起呼叫的用戶端,被叫方的電話充當響應呼叫的伺服器

使用者代理

使用者代理用戶端(UAC) - 發送請求并接收響應的實體

使用者代理伺服器(UAS) - 接收請求并發送響應的實體

代理伺服器

網絡元素接收來自使用者代理的請求并将其轉發給另一個使用者,基本上代理伺服器的作用就像一個路由器,它有一些智慧來了解SIP請求,并在URI的幫助下發送它,代理伺服器位于兩個使用者代理之間,源和目的地之間最多可以有70個代理伺服器

有兩種類型的代理伺服器

無狀态代理伺服器 - 它隻是轉發收到的消息。這種類型的伺服器不存儲任何呼叫或交易的資訊

有狀态代理伺服器 - 這種類型的代理伺服器可以跟蹤收到的每個請求和響應,并且如果需要,可以将來使用它。如果對方沒有響應,它可以重新發送請求

INVITE消息執行個體:

INVITE sip:[email protected]:50027 SIP/2.0

Via: SIP/2.0/UDP 192.168.31.131:51971;rport;branch=z9hG4bKiYblddPPX

Max-Forwards: 70

To: <sip:[email protected]:50027>

From: <sip:null@null>;tag=Prf3c3Xc

Call-ID: cenXTa4i-1423587756904@appletekiAir

CSeq: 1 INVITE

Content-Length: 215

Content-Type: application/sdp

Contact: <sip:[email protected]:51971;transport=UDP>

v=0

o=user1 685988692 621323255 IN IP4 192.168.31.131

s=-

c=IN IP4 192.168.31.131

t=0 0

m=audio 49432 RTP/AVP 0 8 101

a=rtpmap:0 PCMU/8000

a=rtpmap:8 PCMA/8000

a=rtpmap:101 telephone-event/8000

a=sendrecv

請求消息分為以下幾部分,起始行、消息頭部、空行(表示消息結束)、消息體,下面将逐一解釋協定的具體内容

起始行 (start-line)

# ① ② ③ ④ ⑤

INVITE sip:[email protected]:50027 SIP/2.0

① 請求方法,本例是INVITE, SIP協定規定的Method有六種: INVITE, ACK, CANCEL用于建立對話,BYE用于結束對話, REGISTER用于登記,OPTIONS用于查詢伺服器能力

② 協定頭,表示使用sip協定

③ 連接配接使用者名

④ 連接配接URL+port

⑤ sip版本号,本例中使用sip 2.0協定版本

消息頭部 (header)

Via: SIP/2.0/UDP 192.168.31.131:51971;rport;branch=z9hG4bKiYblddPPX

Max-Forwards: 70

To: <sip:[email protected]:50027>

From: <sip:null@null>;tag=Prf3c3Xc

Call-ID: cenXTa4i-1423587756904@appletekiAir

CSeq: 1 INVITE

Content-Length: 215

Content-Type: application/sdp

Contact: <sip:[email protected]:51971;transport=UDP>

① via字段

Via: SIP/2.0/UDP 192.168.31.131:51971;rport;branch=z9hG4bKiYblddPPX Max-Forwards: 70

via頭字段:表示經過的sip網元的主機名和網絡位址

branch參數:用于辨別此請求建立的事務,且該字段必須存在

參數必須被分成兩部分:第一部分符合一般的原則(對于RFC3261,z9hG4bK),第二部分(此例為iYblddPPX)被用來實作loop detection以用來區分loop和spiral。loop和spiral均指Proxy收到一個請求後轉發,然後此轉發的請求又重新到達該Proxy,差別是loop中請求的Request-URI以及其他影響Proxy處理的頭字段均不變,而Spiral請求中這些部分必需有某個發生改變,spiral發生的典型情況是Request-URI發生改變

Proxy在插入Via字段前,其branch參數的loop. detection部分依據以下元素編碼:To Tag,From Tag,Call-ID字段,Request-URI,Topmost Via字段,Cseq的序号部分(即與request method無關),以及proxy-require字段,proxy authorization字段。注意:request method不能用于計算branch參數,比如CANCEL以及非2XX response的ACK與其所cancel的request或對應的INVITE屬于同一個事務,即其branch參數相同。見RFC3261 P22 P25 P39 P95 P105

Max-Forwards: 表示request到達UAS的跳數的限制

② To字段

To: <sip:[email protected]:50027>

UAC發起一個Dialog請求,即out-of-dialog,由于dialog尚未建立,不含to tag參數,當UAS

收到INVITE請求時,在其發出的2XX或101-199響應中設定to tag參數,與UAC設定的From Tag參數以及Call-ID(呼叫唯一辨別)一起作為一個Dialog ID(對話唯一辨別,包含To tag,From Tag,Call-ID)的一部分。 RFC3261規定隻有INVITE請求與2xx或101-199響應可以建立Dialog

③ From字段

From: <sip:null@null>;tag=Prf3c3Xc

From字段表示消息的發送者,字段必須包含tag參數作為ID的一部分

④ CALL-ID字段

Call-ID: cenXTa4i-1423587756904@appletekiAir

call-id表示同一個UAC使用者的所有請求後産生的一組響應的唯一辨別,CALL-ID在UAC送出請求中設定的From Tag字段以及To Tag字段組成一個Dialog-ID

⑤ CSeq字段

CSeq: 1 INVITE

CSeq用于在同一個Dialog中辨別及排序事務和區分新的請求以及請求的重發,内容包括順序号和方法,方法必須和對應的requests比對。針對dialog裡的每一個新的request(例如BYE,re-INVITE,OPTION),CSeq序号加1,但是CANCEL、ACK除外,它們的CSeq序号必須與所對應的requests相同

⑥ Content-Length字段

Content-Length: 215

Content-Length字段表示消息體的長度,用十進制數表示

⑦ Content-Type字段

Content-Type: application/sdp

Content-Type表示發給接收器的消息體的媒體類型。如果消息體不是空的,則Content-type header field一定要存在。如果Content-type header field存在,而消息體是空的,表明該

類型的媒體流長度是0

⑧ Contact字段

Contact: <sip:[email protected]:51971;transport=UDP>

該字段提供了UAC或UAS直接聯系的SIP的URL,UAC在會話建立時在Contact字段提供自己的SIP的URL,UAC收到請求會繞過PROXY把響應發送給直接聯系的SIP的URL。針對REGISTER事務,字段表示的是位址綁定的contact address

繼續閱讀