INVITE
主叫方Tesla首先發(fā)起 INVITE 消息到被叫方Marconi。INVITE 消息包含會(huì)話類型和一些呼叫所必須的參數(shù)。會(huì)話類型可能是單純的語(yǔ)音,也可能是網(wǎng)絡(luò)會(huì)議所用的多媒體視頻,還可能是游戲會(huì)話。下面是消息體范例,我們來(lái)詳細(xì)分析各個(gè)字段的意義。
INVITE sip:marconi@radio.org SIP/2.0
<= 請(qǐng)求方法、請(qǐng)求地址(Request-URI)、SIP 版本號(hào)(目前都是 SIP/2.0)
<= 請(qǐng)求地址一般就是被叫方地址,跟 MSN 中好友 eMail 地址類似
Via: SIP/2.0/UDP lab.high-voltage.org:5060;branch=z9hG4bKfw19b
<=SIP 版本號(hào)(2.0)、傳輸類型(UDP)、呼叫地址、
<=branch是一隨機(jī)碼,它被看作傳輸標(biāo)識(shí)
<=Via 字段中地址是消息發(fā)送方或代理轉(zhuǎn)發(fā)方設(shè)備地址,一般由主機(jī)地址和端口號(hào)組成
<=傳輸類型可以為 UDP、TCP、TLS、SCTP
Max-Forwards: 70
<=最大跳躍數(shù),就是經(jīng)過(guò) SIP 服務(wù)器的跳躍次數(shù),主要是防止循環(huán)跳躍
<=每盡管一臺(tái)代理服務(wù)器,該整數(shù)減一
To: G. Marconi <sip:Marconi@radio.org>
From: Nikola Tesla <sip:n.tesla@high-voltage.org>;tag=76341
<=表示請(qǐng)求消息的發(fā)送方和目標(biāo)方
<=如果里面有用戶名標(biāo)簽,地址要求用尖括號(hào)包起來(lái)
<=對(duì)于 INVITE 消息,可以在 From 字段中包含 tag,它也是個(gè)隨機(jī)碼
Call-ID:
123456789@lab.high-voltage.org
<=呼叫ID是由本地設(shè)備生成的,全局唯一值。每次呼叫該值唯一不變
<=對(duì)于用戶代理發(fā)送 INVITE 消息,本地將生成 From tag 和 Call-ID 全局唯一碼,被叫方代理則生成 To tag 全局唯一碼。這三個(gè)隨機(jī)碼做為整個(gè)對(duì)話中
對(duì)話標(biāo)識(shí)(dialog indentifier)在通話雙方使用。
CSeq: 1 INVITE
<=CSeq,又叫命令隊(duì)列(Command Seqence),每發(fā)送一個(gè)新的請(qǐng)求,該數(shù)自動(dòng)加1
* 以上幾個(gè)字段是所有 SIP 消息體所必須的,其它頭字段有些是可選的,有些在特定請(qǐng)求也是必須
Subject: About That Power Outage...
Contact: <sip:n.tesla@lab.high-voltage.org>
<=Contact 是 INVITE 消息所必須的,它用來(lái)路由到被叫設(shè)備地址,也稱為用戶代理(UA)
Content-Type: application/sdp
Content-Length: 158
<=最后兩位附屬字段說(shuō)明消息體類型以及字段長(zhǎng)度
v=0 <=SDP版本號(hào),目前都是 0
o=Tesla 2890844526 2890844526 IN IP4 lab.high-voltage.org <=主叫源地址,類型等
s=Phone Call <=主題
c=IN IP4 100.101.102.103 <=連接
t=0 0 <= 時(shí)間戳
m=audio 49170 RTP/AVP 0 <=媒體
a=rtpmap:0 PCMU/8000 <=媒體屬性
<=從上面 SDP 消息體我們可以得出下面信息
<=連接 IP 地址:100.101.102.103
<=媒體格式:audio
<=端口號(hào):49170
<=媒體傳輸類型:RTP
<=媒體編碼:PCM u Law
<=采樣率:8000 Hz
180 Ringing
當(dāng)被叫方接收到 INVITE 請(qǐng)求消息后,將回復(fù) 180 Ringing。顧名思義,就是發(fā)回鈴音,提示主叫方電話已連接上了,正等待被叫應(yīng)答。被叫方接收到 INVITE 消息后也會(huì)發(fā)生響鈴或者其它有呼入提示,這由被叫方設(shè)定(我們可以把它想象成我們自己設(shè)定手機(jī)鈴聲)。對(duì)于 180 響應(yīng)又被稱為“消息及時(shí)響應(yīng)”,它是一種用來(lái)測(cè)試被叫狀態(tài)的一種響應(yīng)。因此它所包含的信息不多,具體 180 響應(yīng)消息如下:
SIP/2.0 180 Ringing
Via: SIP/2.0/UDP lab.high-voltage.org:5060;branch=z9hG4bKfw19b
;received=100.101.102.103 <=這里增加一個(gè) received 參數(shù),標(biāo)識(shí)接收方 IP 地址
To: G. Marconi <sip:marconi@radio.org>;tag=a53e42 <=上已提到,To tag 做為被叫方標(biāo)識(shí)
From: Nikola Tesla <sip:n.tesla@high-voltage.org>;tag=76341 <=要求很發(fā)送方 From tag 一致
Call-ID: 123456789@lab.high-voltage.org
CSeq: 1 INVITE
Contact: <sip:marconi@tower.radio.org>
Content-Length: 0
<=對(duì)于 180 Ringing 響應(yīng),基本上就是將 INVITE 的 Via、To、From、Call-ID 和 CSeq 內(nèi)容復(fù)制過(guò)來(lái),對(duì)于首行標(biāo)出 SIP 版本號(hào),響應(yīng)代碼(180)和動(dòng)作原因(reason phrase)
<=注意這里 From 和 To 地址,因?yàn)樗鼈冇脕?lái)指定呼叫方向,因此這里的 200 OK 響應(yīng)并沒(méi)有將地址對(duì)調(diào),仍然保持原樣。一點(diǎn)不同的是 To 頭字段添加了由被叫方 Marconi 生成的 tag 標(biāo)識(shí)
200 Ok
被叫響鈴后,如果被叫用戶 Marconi 接起電話,則發(fā)出 200 OK 響應(yīng)。這個(gè)響應(yīng)除了做為接通指示之外,還有一個(gè)功能是用來(lái)指定被叫允許的連接媒體格式,讓主叫方確認(rèn)是否可以接收該媒體。
消息體如下
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:marconi@radio.org>;tag=a53e42
From: Nikola Tesla <sip:n.tesla@high-voltage.org>;tag=76341
Call-ID: 123456789@lab.high-voltage.org
CSeq: 1 INVITE
Contact: <sip:marconi@tower.radio.org>
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
<=端口號(hào):60000
<=媒體傳輸類型:RTP
<=媒體編碼:PCM u Law
<=采樣率:8000 Hz
ACK
通話前最后一步是主叫方確認(rèn) 200 OK響應(yīng)。該項(xiàng)確認(rèn)證明連接被允許,即將使用另一種協(xié)議開(kāi)始媒體連接。這另一種協(xié)議是上面在 SDP 消息段中所協(xié)商好的 RTP 格式。該 ACK 響應(yīng)內(nèi)容如下:
ACK sip:marconi@tower.radio.org SIP/2.0
Via: SIP/2.0/UDP lab.high-voltage.org:5060;branch=z9hG4bK321g
Max-Forwards: 70
To: G. Marconi <sip:marconi@radio.org>;tag=a53e42
From: Nikola Tesla <sip:n.tesla@high-voltage.org>;tag=76341
Call-ID: 123456789@lab.high-voltage.org
CSeq: 1 ACK
Content-Length: 0
BYE
通話完畢后,由被叫方 Marconi 首先掛機(jī),發(fā)送 BYE 請(qǐng)求命令。注意這回由 Marconi 做為主叫方了,因此 Via 字段和 From、To 與 INVITE 字段有所不同。其實(shí)也就是倒置。
BYE sip:n.tesla@lab.high-voltage.org SIP/2.0
Via: SIP/2.0/UDP tower.radio.org:5060;branch=z9hG4bK392kf
Max-Forwards: 70
To: Nikola Tesla <sip:n.tesla@high-voltage.org>;tag=76341
From: G. Marconi <sip:marconi@radio.org>;tag=a53e42
Call-ID: 123456789@lab.high-voltage.org
CSeq: 1 BYE
Content-Length: 0
200 OK
BYE 之后,要求被叫方發(fā) 200 Ok 確認(rèn),也就是讓主叫知道被叫已經(jīng)知道你掛斷了。(注意這里所說(shuō)的主被叫角色已經(jīng)倒過(guò)來(lái)了)打個(gè)比方,通話之后,有一方要求掛機(jī),另一方需要知道它已經(jīng)掛機(jī)了。
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:n.tesla@high-voltage.org>;tag=76341
From: G. Marconi <sip:marconi@radio.org>;tag=a53e42
Call-ID: 123456789@lab.high-voltage.org
CSeq: 1 BYE
Content-Length: 0
到此,就是最簡(jiǎn)單的呼叫過(guò)程。該過(guò)程簡(jiǎn)單在于兩個(gè)終端之間沒(méi)有其它設(shè)備,完全的點(diǎn)對(duì)點(diǎn)連接,它們之間只需要知道對(duì)方 IP 地址即可。現(xiàn)實(shí)生活中這種呼叫形式是很少見(jiàn)的