sip是一種端到端的語音通話建立過程協議,有點類似於網絡連接的三次握手,其流程圖如下:
下面對它的呼叫流程進行詳細介紹:
1、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
From: Nikola Tesla ;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:
<=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
2、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 ;tag=a53e42
<=上已提到,To tag
做爲被叫方標識
From: Nikola Tesla ;tag=76341 <=要求很發送方 From tag
一致
Call-ID: [email protected]
CSeq: 1 INVITE
Contact:
Content-Length: 0
<=對於 180 Ringing
響應,基本上就是將 INVITE
的 Via、To、From、Call-ID
和 CSeq
內容複製過來,對於首行標出 SIP
版本號,響應代碼(180)和動作原因(reason phrase)
<=注意這裏 From
和 To
地址,因爲它們用來指定呼叫方向,因此這裏的 200 OK
響應並沒有將地址對調,仍然保持原樣。一點不同的是 To
頭字段添加了由被叫方 Marconi
生成的 tag
標識
3、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 ;tag=a53e42
From: Nikola Tesla ;tag=76341
Call-ID:
[email protected]
CSeq: 1 INVITE
Contact:
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
4、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 ;tag=a53e42
From: Nikola Tesla ;tag=76341
Call-ID: [email protected]
CSeq: 1 ACK
Content-Length: 0
5、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 ;tag=76341
From: G. Marconi ;tag=a53e42
Call-ID: [email protected]
CSeq: 1 BYE
Content-Length: 0
6、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 ;tag=76341
From: G. Marconi ;tag=a53e42
Call-ID:
[email protected]
CSeq: 1 BYE
Content-Length: 0
到此,就是最簡單的呼叫過程。該過程簡單在於兩個終端之間沒有其它設備,完全的點對點連接,它們之間只需要知道對方 IP 地址即可。現實生活中這種呼叫形式是很少見的。