一、背景
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通信流程:
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