1. 程式人生 > >Android----SIP 協議

Android----SIP 協議

轉載自:http://www.shuyangyang.com.cn/jishuliangongfang/qitajishu/2013-07-26/96.html

Android Sip學習(準備知識)SIP 協議完整的呼叫流程

Android Sip學習(一)Android 2.3 APIs SIP-based VoIP

Android Sip學習(二)Android VoIP系統實現原理

Android Sip學習(三)Android Voip實現

Android Sip學習(四)Android自帶SipDemo詳解

 學習 SIP 協議最快捷的方法是通過範例來學習,找到了一個完整的呼叫流程,let's go!

 QQ截圖20130726143547.jpg

INVITE

主叫方Tesla首先發起 INVITE 訊息到被叫方Marconi。INVITE 訊息包含會話型別和一些呼叫所必須的引數。會話型別可能是單純的語音,也可能是網路會議所用的多媒體視訊,還可能是遊戲會話。下面是訊息體範例,我們來詳細分析各個欄位的意義。

INVITE sip:[email protected] SIP/2.0
    <= 請求方法、請求地址(Request-URI)、SIP 版本號(目前都是 SIP/2.0)
       <= 請求地址一般就是被叫方地址,跟 MSN 中好友 eMail 地址類似

Via: SIP/2.0/UDP lab.high-voltage.org:5060;branch=z9hG4bKfw19b
    <=SIP 版本號(2.0)、傳輸型別(UDP)、呼叫地址、
        <=branch是一隨機碼,它被看作傳輸標識
        <=Via 欄位中地址是訊息傳送方或代理轉發方裝置地址,一般由主機地址和埠號組成
        <=傳輸型別可以為 UDP、TCP、TLS、SCTP

Max-Forwards: 70
    <=最大跳躍數,就是經過 SIP 伺服器的跳躍次數,主要是防止迴圈跳躍
    <=每經過一臺代理伺服器,該整數減一

To: G. Marconi <sip:[email protected]>
From: Nikola Tesla <sip:[email protected]>;tag=76341
    <=表示請求訊息的傳送方和目標方
        <=如果裡面有使用者名稱標籤,地址要求用尖括號包起來
        <=對於 INVITE 訊息,可以在 From 欄位中包含 tag,它也是個隨機碼

Call-ID: [email protected]
   <=呼叫ID是由本地裝置生成的,全域性唯一值。每次呼叫該值唯一不變
        <=對於使用者代理髮送 INVITE 訊息,本地將生成 From tag 和 Call-ID 全域性唯一碼,被叫方代理則生成 To tag 全域性唯一碼。這三個隨機碼做為整個對話中對話標識(dialog indentifier)在通話雙方使用。

CSeq: 1 INVITE
    <=CSeq,又叫命令佇列(Command Seqence),每傳送一個新的請求,該數自動加1
* 以上幾個欄位是所有 SIP 訊息體所必須的,其它頭欄位有些是可選的,有些在特定請求也是必須

Subject: About That Power Outage...
Contact: <sip:[email protected]>
   <=Contact 是 INVITE 訊息所必須的,它用來路由到被叫裝置地址,也稱為使用者代理(UA)
Content-Type: application/sdp
Content-Length: 158
    <=最後兩位附屬欄位說明訊息體型別以及欄位長度

v=0    <=SDP版本號,目前都是 0
o=Tesla 2890844526 2890844526 IN IP4 lab.high-voltage.org    <=主叫源地址,型別等
s=Phone Call   <=主題
c=IN IP4 100.101.102.103   <=連線
t=0 0   <= 時間戳
m=audio 49170 RTP/AVP 0   <=媒體
a=rtpmap:0 PCMU/8000    <=媒體屬性

    <=從上面 SDP 訊息體我們可以得出下面資訊
        <=連線 IP 地址:100.101.102.103
        <=媒體格式:audio
        <=埠號:49170
        <=媒體傳輸型別:RTP
        <=媒體編碼:PCM u Law
        <=取樣率:8000 Hz

180 Ringing

當 被叫方接收到 INVITE 請求訊息後,將回復 180 Ringing。顧名思義,就是發回鈴音,提示主叫方電話已連線上了,正等待被叫應答。被叫方接收到 INVITE 訊息後也會發生響鈴或者其它有呼入提示,這由被叫方設定(我們可以把它想象成我們自己設定手機鈴聲)。對於 180 響應又被稱為“訊息及時響應”,它是一種用來測試被叫狀態的一種響應。因此它所包含的資訊不多,具體 180 響應訊息如下:

SIP/2.0 180 Ringing
Via: SIP/2.0/UDP lab.high-voltage.org:5060;branch=z9hG4bKfw19b
;received=100.101.102.103    <=這裡增加一個 received 引數,標識接收方 IP 地址
To: G. Marconi <sip:[email protected]>;tag=a53e42   <=上已提到,To tag 做為被叫方標識
From: Nikola Tesla <sip:[email protected]>;tag=76341 <=要求很傳送方 From tag 一致
Call-ID: [email protected]
CSeq: 1 INVITE
Contact: <sip:[email protected]>
Content-Length: 0
    <=對於 180 Ringing 響應,基本上就是將 INVITE 的 Via、To、From、Call-ID 和 CSeq 內容複製過來,對於首行標出 SIP 版本號,響應程式碼(180)和動作原因(reason phrase)
    <=注意這裡 From 和 To 地址,因為它們用來指定呼叫方向,因此這裡的 200 OK 響應並沒有將地址對調,仍然保持原樣。一點不同的是 To 頭欄位添加了由被叫方 Marconi 生成的 tag 標識

200 Ok

被叫響鈴後,如果被叫使用者 Marconi 接起電話,則發出 200 OK 響應。這個響應除了做為接通指示之外,還有一個功能是用來指定被叫允許的連線媒體格式,讓主叫方確認是否可以接收該媒體。
訊息體如下

SIP/2.0 200 OK
Via: SIP/2.0/UDP lab.high-voltage.org:5060;branch=z9hG4bKfw19b
;received=100.101.102.103
To: G. Marconi <sip:[email protected]>;tag=a53e42
From: Nikola Tesla <sip:[email protected]>;tag=76341
Call-ID: [email protected]
CSeq: 1 INVITE
Contact: <sip:[email protected]>
Content-Type: application/sdp
Content-Length: 155
   <=頭欄位部分基本同上
v=0
o=Marconi 2890844528 2890844528 IN IP4 tower.radio.org
s=Phone Call
c=IN IP4 200.201.202.203
t=0 0
m=audio 60000 RTP/AVP 0
a=rtpmap:0 PCMU/8000

    <=從上面 SDP 訊息體我們可以得出下面資訊
        <=終端 IP 地址:200.201.202.203
        <=媒體格式:audio
        <=埠號:60000
        <=媒體傳輸型別:RTP
        <=媒體編碼:PCM u Law
        <=取樣率:8000 Hz

ACK

通話前最後一步是主叫方確認 200 OK響應。該項確認證明連線被允許,即將使用另一種協議開始媒體連線。這另一種協議是上面在 SDP 訊息段中所協商好的 RTP 格式。該 ACK 響應內容如下:

ACK sip:[email protected] SIP/2.0
Via: SIP/2.0/UDP lab.high-voltage.org:5060;branch=z9hG4bK321g
Max-Forwards: 70
To: G. Marconi <sip:[email protected]>;tag=a53e42
From: Nikola Tesla <sip:[email protected]>;tag=76341
Call-ID: [email protected]
CSeq: 1 ACK
Content-Length: 0

BYE

通話完畢後,由被叫方 Marconi 首先掛機,傳送 BYE 請求命令。注意這回由 Marconi 做為主叫方了,因此 Via 欄位和 From、To 與 INVITE 欄位有所不同。其實也就是倒置。

BYE sip:[email protected] SIP/2.0
Via: SIP/2.0/UDP tower.radio.org:5060;branch=z9hG4bK392kf
Max-Forwards: 70
To: Nikola Tesla <sip:[email protected]>;tag=76341
From: G. Marconi <sip:[email protected]>;tag=a53e42
Call-ID: [email protected]
CSeq: 1 BYE
Content-Length: 0

200 OK

BYE 之後,要求被叫方發 200 Ok 確認,也就是讓主叫知道被叫已經知道你結束通話了。(注意這裡所說的主被叫角色已經倒過來了)打個比方,通話之後,有一方要求掛機,另一方需要知道它已經掛機了。

SIP/2.0 200 OK
Via: SIP/2.0/UDP tower.radio.org:5060;branch=z9hG4bK392kf
;received=200.201.202.203
To: Nikola Tesla <sip:[email protected]>;tag=76341
From: G. Marconi <sip:[email protected]>;tag=a53e42
Call-ID: [email protected]
CSeq: 1 BYE
Content-Length: 0

到此,就是最簡單的呼叫過程。該過程簡單在於兩個終端之間沒有其它裝置,完全的點對點連線,它們之間只需要知道對方 IP 地址即可。現實生活中這種呼叫形式是很少見的。

 

本文整理自網路。