|
1、SIP的基本概念和相關(guān)元素 SIP是一個(gè)對(duì)等的協(xié)議,類(lèi)似P2P。例如:Bob給Alice發(fā)送一個(gè)INVITE請(qǐng)求,說(shuō)“Hi,一起吃飯吧”,Alice說(shuō)“好的”,電話就接通了。 在SIP網(wǎng)絡(luò)中,Alice和Bob都稱(chēng)為用戶(hù)代理(UA)。UA是在SIP網(wǎng)絡(luò)中發(fā)起或者響應(yīng)SIP處理的邏輯實(shí)體。UA是由狀態(tài)的。UA有兩種:一種是UAC,它是發(fā)起SIP請(qǐng)求的一方,如Bob;另一種是UAS,它是接受請(qǐng)求并發(fā)送響應(yīng)的一方,如Alice。 若Bob和Alice是經(jīng)人介紹認(rèn)識(shí)的,Bob想請(qǐng)Alice吃飯就需要中間人M傳話,而中間這個(gè)人就叫代理服務(wù)器(Proxy Server)。還有另一種中間人稱(chēng)為重定向服務(wù)器(Rediret Server),它類(lèi)似于M告訴Bob,我不知道Alice在哪,但W知道,我把W的電話號(hào)碼告訴你,你直接問(wèn)她。這樣的M叫重定向服務(wù)器,W叫代理服務(wù)器。這兩種服務(wù)器都是UAS,它們主要是提供一對(duì)欲通話的UA之間路由選擇功能。 若Alice的位置會(huì)不停發(fā)生變化,但它又希望Bob能隨時(shí)找到他,只要Alice每換一個(gè)位置就告訴M,它就向M重新“注冊(cè)”,這樣M就叫注冊(cè)服務(wù)器。 為了理解B2BUA,我們來(lái)看一個(gè)故事。M認(rèn)識(shí)Bob而W認(rèn)識(shí)Alice,M和W有意撮合兩個(gè)年輕人,但兩人沒(méi)有互留電話。Bob想知道Alice對(duì)他的感覺(jué),于是打電話問(wèn)M,M不認(rèn)識(shí)Alice,就問(wèn)W,W就打電話問(wèn)Alice,Alice說(shuō)印象還不錯(cuò),W就把這句話告訴M,M就告訴Bob。M面向Bob,W面向Alice,他們兩個(gè)合在一起,就稱(chēng)為B2BUA。 ![]() 其實(shí)四個(gè)人全是UA,在SIP世界中,所有UA都是平等的。M和W組成了實(shí)現(xiàn)軟交換功能的交換機(jī),它們對(duì)外說(shuō)的語(yǔ)言是SIP,在內(nèi)部使用自己的語(yǔ)言溝通。Bob和Alice就分別成為軟電話或者SIP電話機(jī)。 2、SIP協(xié)議的基本方法和頭域簡(jiǎn)介 SIP定義了6中基本方法: 基本方法 說(shuō)明 REGISTER 注冊(cè)聯(lián)系信息 INVITE 發(fā)起一個(gè)呼叫 ACK 對(duì)INVITE消息的最終響應(yīng) CANCEL 取消一個(gè)等待處理或者正在處理的請(qǐng)求 BYE 終止一個(gè)會(huì)話 OPTIONS 查詢(xún)服務(wù)器和能力,也可用作ping測(cè)試 所有SIP消息必須包含以下6個(gè)頭域: 名稱(chēng) 描述 Call-ID 用于區(qū)分不同會(huì)話的唯一標(biāo)志 CSeq 順序號(hào),用于在同一會(huì)話中區(qū)分事務(wù) From 說(shuō)明請(qǐng)求來(lái)源 To 說(shuō)明請(qǐng)求接受方 Max-Forword 限制跳躍點(diǎn)數(shù)和最大轉(zhuǎn)發(fā)次數(shù) Via 描述請(qǐng)求消息經(jīng)過(guò)的路徑 3、SIP注冊(cè) ![]() Alice發(fā)起注冊(cè): REGISTER sip:191.169.150.30 SIP/2.0 From: sip:6540012@191.169.150.30;tag=16838c16838 To: sip:6540012@191.169.150.30;tag=946e6f96 Call-Id: 1-reg@191.169.150.251 Cseq: 2762 REGISTER Contact: sip:6540012@191.169.150.251 Expires: 100 Content-Length: 0 Accept-Language: en Supported: sip-cc, sip-cc-01, timer User-Agent: Pingtel/1.2.7 (VxWorks) Via: SIP/2.0/UDP 191.169.150.251 第一行:請(qǐng)求起始行。REGISTER請(qǐng)求消息。表示終端向IP地址為191.169.150.30的SoftX3000發(fā)起登記。SIP版本號(hào)為2.0。 第二行:From字段。指明該REGISTER請(qǐng)求消息由SoftX3000(IP地址:191.169.150.30)控制的Alice發(fā)起的。 第三行:To字段。指明REGISTER請(qǐng)求接收方的地址。此時(shí)REGISTER請(qǐng)求的接收方為IP地址為191.169.150.30的SoftX3000。 第四行:Call-ID字段。該字段唯一標(biāo)識(shí)一個(gè)特定的邀請(qǐng),全局唯一。Call-ID為“1-reg@191.169.150.251”,191.169.150.251為發(fā)起REGISTER請(qǐng)求的Alice的IP地址,1-reg為本地標(biāo)識(shí)。 第五行:Cseq字段。此時(shí)用于將REGISTER請(qǐng)求和其觸發(fā)的響應(yīng)相關(guān)聯(lián)。 第六行:Contact字段。在REGISTER請(qǐng)求中的Contact字段指明用戶(hù)可達(dá)位置。表示Alice當(dāng)前的IP地址為“191.169.150.251”,電話號(hào)碼為“6540012”。 第七行:表示該登記生存期為100s。 第八行:表明此請(qǐng)求消息消息體的長(zhǎng)度為空,即此消息不帶會(huì)話描述。 第九行:表示原因短語(yǔ)、會(huì)話描述或應(yīng)答消息中攜帶的狀態(tài)應(yīng)答內(nèi)容的首選語(yǔ)言為英語(yǔ)。 第十行:表示發(fā)送該消息的UA實(shí)體支持sip-cc, sip-cc01以及timer擴(kuò)展協(xié)議。timer表示終端支持session-timer擴(kuò)展協(xié)議。 第十一行:發(fā)起請(qǐng)求的用戶(hù)終端的信息。此時(shí)為UA的型號(hào)和版本。 第十二行:Via字段。該字段用于指示該請(qǐng)求歷經(jīng)的路徑?!癝IP/2.0/UDP”表示發(fā)送的協(xié)議,協(xié)議名為“SIP”,協(xié)議版本為2.0,傳輸層為UDP;“191.169.150.251”表示該請(qǐng)求消息發(fā)送方SIP終端IP地址為191.169.150.251。 Freeswitch返回401響應(yīng): SIP/2.0 401 Unauthorized From:;tag=16838c16838 To:;tag=946e6f96 CSeq: 2762 REGISTER Call-ID: 1-reg@191.169.150.251 Via: SIP/2.0/UDP 191.169.150.251 WWW-Authenticate: Digest realm="huawei.com",nonce="200361722310491179922" Content-Length: 0 Alice重新發(fā)起注冊(cè)請(qǐng)求: REGISTER sip:191.169.150.30 SIP/2.0 From: sip:6540012@191.169.150.30;tag=16838c16838 To: sip:6540012@191.169.150.30;tag=946e6f96 Call-Id: 1-reg@191.169.150.251 Cseq: 2763 REGISTER Contact: sip:6540012@191.169.150.251 Expires: 100 Content-Length: 0 Accept-Language: en Supported: sip-cc, sip-cc-01, timer User-Agent: Pingtel/1.2.7 (VxWorks) Authorization: DIGEST USERNAME="6540012", REALM="huawei.com", NONCE="200361722310491179922", RESPONSE="b7c848831dc489f8dc663112b21ad3b6", URI="sip:191.169.150.30" Via: SIP/2.0/UDP 191.169.150.251 用戶(hù)認(rèn)證成功: SIP/2.0 200 OK From:;tag=16838c16838 To:;tag=946e6f96 CSeq: 2763 REGISTER Call-ID: 1-reg@191.169.150.251 Via: SIP/2.0/UDP 191.169.150.251 Contact:;expires=3600 4、SIP呼叫流程 UA間直接呼叫 ![]() 首先Bob向Alice發(fā)送INVITE消息請(qǐng)求建立SIP會(huì)話。Alice的UA回100 Trying消息,意思是說(shuō)我收到你的請(qǐng)求了,先等一會(huì)。接著Alice電話開(kāi)始振鈴,并給對(duì)方回復(fù)180 Ringing。Bob的 UA收到該消息后即可以播放回鈴音,以提示Bob對(duì)方的話機(jī)正在振鈴。接著Alice接了電話,她發(fā)送200 OK消息給Bob,該消息是對(duì)INVITE消息的最終響應(yīng),而先前的100和180消息都是臨時(shí)狀態(tài)。Bob收到200后向Alice回復(fù)ACK證實(shí)消息。INVITE-200-ACK完成三次握手的操作,保證呼叫可以正常進(jìn)行。其中INVITE-1xx-200等消息合在一起成為一個(gè)事務(wù)。最后Alice掛斷電話,向Bob發(fā)送BYE消息,Bob收到BYE后回復(fù)200 OK,通話完畢。 SIP狀態(tài)碼由三位數(shù)字組成: 1xx:響應(yīng)為臨時(shí)狀態(tài),表明呼叫進(jìn)展的情況; 2xx:表明請(qǐng)求已被成功收到、理解和接受; 3xx:表明SIP請(qǐng)求需要轉(zhuǎn)向到另一個(gè)UAS處理; 4xx:由客戶(hù)端或網(wǎng)絡(luò)引起的請(qǐng)求失敗,客戶(hù)端應(yīng)該重新修改請(qǐng)求,然后重發(fā); 5xx:服務(wù)器內(nèi)部錯(cuò)誤; 6xx:全局性錯(cuò)。 通過(guò)B2BUA呼叫 ![]() 呼叫流程略。 注意:Bob呼叫Alice,由于Bob是主叫方,他已經(jīng)知道服務(wù)器的地址了,因此可以直接給服務(wù)器發(fā)送INVITE消息,因而它是不需要注冊(cè)的。而Alice不同,它是作為被叫的一方,為了讓服務(wù)器能夠找到它,必須事先通過(guò)REGISTER消息注冊(cè)到服務(wù)器上。 5、SDP SIP負(fù)責(zé)建立會(huì)話和釋放會(huì)話,一般來(lái)說(shuō),會(huì)話會(huì)包含相關(guān)的媒體,如視頻和音頻。媒體數(shù)據(jù)是由SDP描述的,它被放在SIP協(xié)議的正文中。 一個(gè)空行把SIP頭與SIP正文隔開(kāi),下面我們主要討論SDP部分: v=0 o=HuaweiSoftX3000 1073741831 1073741831 IN IP4 191.169.200.61 s=Sip Call c=IN IP4 191.169.200.61 b=AS:2064 t=0 0 m=audio 30014 RTP/AVP 8 0 98 101 a=rtpmap:98 ILBC/8000 a=rtpmap:101 telephone-event/8000 a=fmtp:101 0-15 a=sendrecv m=video 32914 RTP/AVP 123 b=TIAS:2000000 a=rtpmap:123 H264/90000 a=fmtp:123 profile-level-id=428014;packetization-mode=0 a=rtcp-fb:* nack pli a=sendrecv v=:表示協(xié)議的版本號(hào); o=:表示源。值域中各項(xiàng)含義依次是 用戶(hù)名、會(huì)話ID、會(huì)話版本號(hào)、網(wǎng)絡(luò)類(lèi)型、地址類(lèi)型、單播地址; s=:表示SDP所描述的Session的名稱(chēng); c=:連接數(shù)據(jù),值域中以空格分配的兩個(gè)字段分別是網(wǎng)絡(luò)類(lèi)型和網(wǎng)絡(luò)地址,以后的RTP流就會(huì)發(fā)到該地址上; b=:帶寬類(lèi)型; t=:起止時(shí)間。0表示無(wú)限; m=:媒體類(lèi)型。audio表示音頻,30014表示音頻端口號(hào),RTP/AVP是傳輸協(xié)議,后面是支持的Codec類(lèi)型,8和0分別代表PCMA和PCMU,它們屬于靜態(tài)編碼,98和101屬于動(dòng)態(tài)編碼; a=:屬性。用于描述音頻的屬性。上面98代表8000Hz的ILBC編碼,101代表RFC2833DTMF事件。a=sendrecv表示該媒體流可用于收和發(fā),還有sendonly(僅收)、recvonly(僅發(fā))和inactive(不收不發(fā))。 |
|
|
來(lái)自: 草莓加冰 > 《Freeswitch》