SIP基础协议总结
SIP協議是一個用于建立,更改和終止多媒體會話的應用層控制協議,大量借鑒了成熟的HTTP協議(文本格式編碼,Request消息中的method等),采用基于文本的UTF-8編碼方式,可以承載與UDP或者TCP協議之上(首選UDP)。和Diameter協議類似,SIP也是有一個基礎協議和很多擴展協議,基礎協議在RFC3261中定義,本文主要概括SIP基礎協議的要點。
1.? 基本概念:
·???????? Session:Session簡單的說就是一次通話,從摘機撥號開始到最終的掛機之間所有的SIP消息都屬于一個Session,它們具有相同的Call-Id。
·???????? Dialog:基于Peer-to-Peer,描述了兩端的User Agents在一段時間內的關聯。Dialog用Dialog Id來表示,Dialog Id是由三部分組成的:Call-Id,from中的tag,to中的tag。只有對Invite消息響應的的2xx 和 101-199 消息才能建立一個Dialog。100 Trying相應無法建立Dialog,因為100 Trying中的To屬性沒有tag值。
·???????? Transaction:一個Transction是有一個Request消息和一個或者多個臨時或者最終應答消息構成的。如果對Invite的應答是200 OK,則接下來的ACK消息認為是另一個transaction。
?
2.? SIP網絡實體:
·???????? UA(User Agent):和用戶直接交互的SIP設備,可以是硬件的SIP電話也可以是電腦上具有SIP電話功能的軟件等;發送SIP Request消息的UA即UAC(User Agent Client), 接受SIP Request消息的UA即UAS(User Agent Server), 一個UA通常既是UAC又是UAS。
·???????? Proxy Server:進行消息轉發,負責把消息轉發給最終用戶或者另一個Proxy Server。
·???????? Redirect Server:和Diameter的Redirect Server類似,不進行消息轉發,而是給消息發送方回復一個或者多個地址,建議發送方把消息發往這些地址。Redirect Server返回的地址并不一定就是最終用戶的地址,也有可能是另一個Proxy Server的地址。
·???????? Registrars: 因為SIP需要支持用戶的移動性,所以當用戶改變位置后需要對新位置的終端進行注冊,Registrars接受SIP用戶注冊,從而得知可以從何處找打當前用戶。Registrars通常位于SIP Server(Proxy Server 或者Redirect Server)中。
·???????? Location Server:不是SIP實體,之所以說它不是SIP實體是因為Location Server上面不必運行SIP協議棧,SIP Server和 Location Server之間的通信方式也不是用SIP(比如用LDAP)。Location Server的作用是保存SIP用戶位置數據(IP 或者Hostname),比如當一個SIP用戶向SIP Server注冊之后,SIP Server將該SIP用戶位置信息上傳到Location Server中,當SIP Server收到需要發送給該SIP用戶的消息時,SIP Server再向Location Server詢問該用戶位置信息(IP 或者Hostname)。
?
3.? SIP消息分類:
SIP消息分為如下兩類:
·???????? 請求消息:UAC發給UAS的消息,包括INVITE、ACK、BYE、CANCEL、OPTION和REGISTER消息。
·???????? 響應消息:UAS回應給UAC的消息,包括1xx、2xx、3xx、4xx、5xx、6xx響應消息,每類消息的具體含義如下表:
|   1xx  |   進展相應  |   臨時相應  | 
|   2xx  |   成功  |   最終相應  | 
|   3xx  |   重定向錯誤  |   最終相應  | 
|   4xx  |   客戶端錯誤  |   最終相應  | 
|   5xx  |   服務端錯誤  |   最終相應  | 
|   6xx  |   全局錯誤  |   最終相應  | 
4.? SIP消息格式:
SIP由于是采用文本格式編碼,所以消息格式很簡單,是由Message Header加可選的Message body構成,Message Header 從第二行開始每一行都由“Tag :Valued”格式組成,每一行描述一個屬性。 頭部的屬性有很多,基本協議中定義了一部分,擴展協議也定義了相應的頭部屬性。如果消息中攜帶了Message body,則Message Header和Message body之間用一個空行分割開來;Message body通常有“Content-Type”和“Content-Length”屬性來對Message body進行解釋,例如: 
 Content-Type: application/sdp 
 Content-Length: 212
SIP消息也可以攜帶多個Message body,比如可以帶上SDP信息和主叫方的照片,這樣被叫就能看到主叫方的頭像了。
SIP消息在經過Proxy的時候,Proxy只關心Message Header,而不會檢查Message body,所以說Message body對Proxy是透明的。
5.? SDP(Session Description Protocol):
在SIP的Message body中最常見的就是SDP,這里概述一下SDP。Session Description Protocol (SDP) 在RFC 2327中被定義;SDP中攜帶了一些必要信息,以供用戶可以加入一個多媒體會話,比如IP地址,端口號,會話的日期時間等;這有點兒類似電視臺的節目單,有了節目單,我們就可以在指定的時間切換到指定的頻道收看到預期的節目。SDP是單獨定義的,和SIP沒有必然的聯系,SDP信息可以通過各種途徑傳輸比如Email,Webpage等,SIP只是眾多傳輸SDP方式中的一種而已。
1)? SDP語法:
SDP也是用文本格式描述的,一個SDP Description可以包含很多行,每一行的格式如下: 
 Type = Value 
 Type只用一個字母來表示;一個SDP Description通常有一個Session-level和多個Media-level信息組成;Session-level信息用來描述整個Session,每個Media-level信息用來描述一個特定的媒體流。Session-level總以”v=0”開頭,Media-level總已”m=<media type> <port number> <transport protocol> <media formats>”開頭,。下面是一個SDP Description的例子,該例子中包含了三個Media-level信息:
 v=0 
 o=Bob 2890844526 2890842807 IN IP4 131.160.1.112 
 s=SIP seminar 
 i=A Seminar on the Session Initiation Protocol 
 u=http://www.cs.columbia.edu/sip 
 e=bob@university.edu 
 c=IN IP4 224.2.17.12/127 
 t=2873397496 2873404696 
 a=recvonly 
 m=audio 49170 RTP/AVP 0 
 a=rtpmap:0 PCMU/8000 
 m=video 51372 RTP/AVP 31 
 a=rtpmap:31 H261/90000 
 m=video 53000 RTP/AVP 32 
 a=rtpmap:32 MPV/90000
該例中o描述該session的發起者是Bob以及他的IP地址;s描述該session的名字;i描述了該session的一般信息;u說明可以從這個URL中獲取和該session相關的更多信息;e描述了該session聯系人的email。C和t描述了什么時間從哪里可以接收到該Session的multicast。m描述了一個媒體流的端口號,傳輸協議,媒體格式等信息。a可以用來對SDP進行擴展,比如雙方如果協商音頻的音量,可以用下面的SDP描述:
 m=audio 49170 RTP/AVP 0 
 a=volume:8 
 前提是雙方都需要理解volume的含義,如果對方不理解volume,也不會出錯,只是將其忽略。
2)? SDP描述中常見屬性:
|   v  |   Protocol version  | 
|   b  |   Bandwidth information  | 
|   o  |   Owner of the session and session identifier  | 
|   z  |   Time zone adjustments  | 
|   s  |   Name of the session  | 
|   k  |   Encryption key  | 
|   i  |   Information about the session  | 
|   a  |   Attribute lines  | 
|   u  |   URL containing a description of the session  | 
|   t  |   Time when the session is active  | 
|   e  |   E-mail address to obtain information about the session  | 
|   r  |   Times when the session will be repeated  | 
|   p  |   Phone number to obtain information about the session  | 
|   m  |   Media line  | 
|   c  |   Connection information  | 
|   i  |   Information about a media line  | 
6.? SIP呼叫流程實例分析:
下圖是一個完整的SIP呼叫消息流示意圖,這里重點關注SIP消息流,下一篇文中將給出一個稍微復雜的例子,那個例子中將重點關注SIP消息的路由和SIP常見頭部字段的含義。
 
Laura要與Bob通話,Laura撥打Bob的的Public URI:sip:Bob.Johnson@company.com,給Bob一個Invite消息,在Invite消息中攜帶了SDP,表明Laura期望在UDP端口20002上收到包含PCM voice編碼的RTP數據包。Proxy收到這個Invite消息后轉發給Bob,同時給Laura回送一個100 Trying消息(Trying消息是Hop-to-Hop的,不會被轉發)。Bob收到Invite消息后開始振鈴,返回180 Ringing消息給Laura,Laura側會聽到回鈴音。
?
INVITE sip:Bob.Johnson@company.com SIP/2.0
Via: SIP/2.0/UDP workstation1000.university.com:5060
From: Laura Brown <sip:Laura.Brown@university.com>
To: Bob Johnson sip:Bob.Johnson@company.com
Call-ID: 12345678@workstation1000.university.com
CSeq: 1 INVITE
Contact: Laura Brown <sip:Laura@workstation1000.university.com>
Content-Type: application/sdp
Content-Length: 154
v=0
o=Laura 2891234526 2891234526 IN IP4 workstation1000.university.com
s=Let us talk for a while
c=IN IP4 138.85.27.10
t=0 0
m=audio 20002 RTP/AVP 0
?
當Bob摘機后,一個200 OK的最終應答消息會被返回給Laura,消息中攜帶了一個SDP,表明Bob可以在UDP端口41000上接受數據包。Laura收到200 OK后給Bob發送一個ACK消息,確認已經收到200 OK。此時雙方進入通話。
?
SIP/2.0 200 OK
Via: SIP/2.0/UDP 131.160.1.110
Via: SIP/2.0/UDP workstation1000.university.com:5060
From: Laura Brown <sip:Laura.Brown@university.com>
To: Bob Johnson <sip:Bob.Johnson@company.com>;tag=314159
Call-ID: 12345678@workstation1000.university.com
CSeq: 1 INVITE
Contact: Bob Johnson <sip:Bob@131.160.1.112>
Content-Type: application/sdp
Content-Length: 154
v=0
o=Bob 2891234321 2891234321 IN IP4 131.160.1.112
s=Let us talk for a while
c=IN IP4 131.160.1.112
t=0 0
m=audio 41000 RTP/AVP 0
?
當通話結束時,Bob發送一個Bye消息給Laura,Laura隨后回應200 OK給Bob,至此通話結束。
?
參考資料:
1.? “RFC 3261”- Section 4,Section 12,Section 17,Section 24;
2.? “SIP Demystified”- Chapter 4, Chapter 5;
總結
                            
                        - 上一篇: 数字人民币有风险吗?具有哪些优势?
 - 下一篇: 理财产品净值1是什么意思?根据净值怎么算