SIP注册
SIP注冊(cè)
?
注冊(cè)服務(wù)為特定地區(qū)的位置服務(wù)創(chuàng)建綁定關(guān)系,這個(gè)綁定關(guān)系是用來(lái)建立包含一個(gè)或者多個(gè)聯(lián)系地址的address-of-record URI。因而,當(dāng)那個(gè)地區(qū)的proxy接收到一個(gè)請(qǐng)求,這個(gè)請(qǐng)求的Request-URI和address-of-record的記錄匹配,那么這個(gè)proxy會(huì)轉(zhuǎn)發(fā)請(qǐng)求到這個(gè)address-of-record中登記的聯(lián)系地址中去。
Address-of-Record: 記錄地址。一個(gè)address-of-record(AOR)是一個(gè)SIP或者SIPS URI它指向了一個(gè)具有定位服務(wù)的主機(jī),這個(gè)主機(jī)可以把URI映射成為用戶真正物理位置的URI。通常情況下,定位服務(wù)器是通過(guò)登記服務(wù)來(lái)建立的。一個(gè)AOR經(jīng)常被認(rèn)為是一個(gè)用戶的”公共地址” 。
?
需要注意的是,登記服務(wù)器(registrar)和proxy服務(wù)器都是邏輯上的角色,可以在網(wǎng)絡(luò)中用一個(gè)設(shè)備來(lái)部屬.還需要注意的是如果他們(登記服務(wù)器和proxy)本身是分開(kāi)的,那么UA可以通過(guò)proxy服務(wù)器發(fā)送注冊(cè)請(qǐng)求。?
?
1 構(gòu)造一個(gè)REGISTER請(qǐng)求
REGISTER請(qǐng)求用來(lái)增加、刪除、查詢綁定資料。
?
下面這些頭域,除了Contact,必須在REGISTER頭域中包含。Contact頭域可選。
Request-URI: 這個(gè)頭域指明了登記服務(wù)所指明的位置服務(wù)所在的區(qū)域(比如sip:chicago.com)。”userinfo”和”@”元素在SIP URI中不能出現(xiàn)。
To:這個(gè)頭域包含了被查詢、增加、修改的address-of-record。to頭域和Request-URI頭域通常是不同的,因?yàn)檫@個(gè)由用戶名組成。這個(gè)address-of-record必須是一個(gè)SIP URI或者SIPS URI.
From: 這個(gè)頭域包含了提交這個(gè)注冊(cè)信息的用戶的address-of-record資料。這個(gè)值和To頭域的值相同,除非這個(gè)請(qǐng)求是第三方發(fā)起的注冊(cè)請(qǐng)求。
Call-ID: UAC發(fā)出的給某個(gè)注冊(cè)服務(wù)器(registrar)的所有注冊(cè)請(qǐng)求都應(yīng)該有相同的Call-ID頭域值。如果相同的客戶端用了不同的Call-ID值,注冊(cè)服務(wù)器(registrar)就不能檢測(cè)是否一個(gè)REGISTER請(qǐng)求由于延時(shí)的關(guān)系導(dǎo)致了故障。
Cseq: Cseq值保證了REGISTER請(qǐng)求的正確順序。一個(gè)UA為每一個(gè)具備相同的Call-ID的REGISTER請(qǐng)求順序遞增這個(gè)Cseq字段。
Contact: REGISTER請(qǐng)求可以有一個(gè)Contact頭域。這個(gè)頭域可以有0個(gè)或者多個(gè)包含綁定地址信息的值。 “expires”參數(shù)表明UA的綁定的有效時(shí)間。以秒為單位的整數(shù)。如果本參數(shù)沒(méi)有制定,那么這個(gè)參數(shù)的值就是Expires頭域的值。實(shí)現(xiàn)中,可以把超過(guò)2**32-1的值(4294967295秒或者136年)認(rèn)為是2**32-1。非法的值應(yīng)當(dāng)視同3600。
UA在沒(méi)有收到上一個(gè)注冊(cè)請(qǐng)求的應(yīng)答或者上一個(gè)REGISTER請(qǐng)求超時(shí)之前,禁止發(fā)送新的注冊(cè)請(qǐng)求(就是說(shuō),包含一個(gè)新的Contact頭域值,而不是重發(fā))。?
?
1.1 增加綁定
1.1.1 設(shè)置Contact地址的過(guò)期參數(shù)
當(dāng)一個(gè)客戶端發(fā)出一個(gè)REGISTER請(qǐng)求,它可能包含一個(gè)過(guò)期參數(shù)用來(lái)表示這個(gè)注冊(cè)的地址的有效期。
客戶端設(shè)置有效期的方法有兩種:一個(gè)是通過(guò)設(shè)置Expires頭域,一個(gè)是通過(guò)設(shè)置”expires”contact頭域的參數(shù)來(lái)設(shè)置。后一種允許針對(duì)同一個(gè)REGISTER請(qǐng)求中的多個(gè)綁定聯(lián)系地址中的每一個(gè)聯(lián)系地址單獨(dú)設(shè)定有效期,然后所有沒(méi)有帶”expires”參數(shù)的Contact頭域的值都使用Expires的設(shè)置。
如果REGISTER中沒(méi)有兩種有效期都沒(méi)有設(shè)置,這就表明這個(gè)有效期由服務(wù)器來(lái)決定。
1.1.2 Contact Adress的參數(shù)選擇
如果在一個(gè)REGISTER請(qǐng)求中包含多個(gè)Contact,這說(shuō)明UA想要把這些Contact頭域的內(nèi)容都和To頭域中制定的address-of-record地址綁定起來(lái)。這個(gè)列表可以用”q”參數(shù)來(lái)區(qū)分Contact頭域的優(yōu)先級(jí)。”q”參數(shù)用來(lái)標(biāo)志特定Contact頭域值和其他綁定的address-of-record的聯(lián)系地址之間的優(yōu)先級(jí)。
?
1.2 刪除綁定
注冊(cè)信息是一個(gè)純粹軟件的狀態(tài),并且如果不刷新會(huì)過(guò)期。如果需要,也可以被刪除。一個(gè)客戶端可以設(shè)置注冊(cè)服務(wù)器(registar)的有效期(10.2.1)。一個(gè)UA可以通過(guò)發(fā)出有效期為”0”的REGISTER請(qǐng)求,使某一個(gè)聯(lián)系地址立刻失效。UAS都需要實(shí)現(xiàn)這個(gè)機(jī)制使得在聯(lián)系地址過(guò)期前能夠被刪除。
REGISTER規(guī)范中的Contact頭域如果設(shè)置成為”*”則表示需要操作所有的注冊(cè)項(xiàng)。但是也只能在具有一個(gè)Expires頭域并且這個(gè)頭域?yàn)椤?’的情況下能夠使用。(這就是說(shuō),只能夠在要?jiǎng)h除所有的注冊(cè)項(xiàng)的時(shí)候使用”*”)。
用”*”來(lái)刪除所有的注冊(cè)項(xiàng)有一個(gè)好處,就是使得UA不需要知道每一個(gè)注冊(cè)項(xiàng)的精確值。
?
1.3 訪問(wèn)綁定
無(wú)論請(qǐng)求是否包含了Contact頭域,給任何REGISTER請(qǐng)求的成功應(yīng)答都包含了一個(gè)完整的綁定列表。如果REGISTER請(qǐng)求頭域中不包含Contact頭域,那么注冊(cè)服務(wù)器的綁定列表將不會(huì)改變。
?
1.4 刷新綁定
每一個(gè)UA都對(duì)先前它建立的綁定信息由刷新的義務(wù)。禁止對(duì)其他UA建立的綁定信息進(jìn)行刷新。于是在這些綁定信息過(guò)期前,UA為每個(gè)綁定發(fā)出REGISTER請(qǐng)求來(lái)刷新綁定。也可以通過(guò)一個(gè)REGISTER請(qǐng)求來(lái)刷新數(shù)個(gè)綁定請(qǐng)求。
UA在一個(gè)刷新周期中,應(yīng)該使用相同的Call-ID來(lái)進(jìn)行注冊(cè)調(diào)用。
?
1.6 尋找注冊(cè)服務(wù)器
UA有3種方法來(lái)決定向哪里發(fā)出注冊(cè)請(qǐng)求:通過(guò)配置,使用address-of-record,廣播方式。
1)一個(gè)UA可以用非本文檔規(guī)定的方式,配置一個(gè)注冊(cè)服務(wù)器的地址。
2)用請(qǐng)求的Request-URI部分種的address-of-record的服務(wù)器部分(host part),用普通的SIP服務(wù)器定位機(jī)制。比如,用戶”sip:carol@chicago.com”地址的注冊(cè)服務(wù)應(yīng)該是”sip:chicago.com”。
3)UA可以通過(guò)監(jiān)聽(tīng)廣播的形式來(lái)獲得注冊(cè)服務(wù)器地址。
?
1.8 錯(cuò)誤響應(yīng)
如果UA接收到一個(gè)423(間隔太簡(jiǎn)略)應(yīng)答,它可能需要更改REGISTER請(qǐng)求中的所有有效期,使得這些有效期必須大于等于423應(yīng)答頭中的Min-Expires頭域中的有效期,并且重新嘗試發(fā)送這個(gè)REGISTER請(qǐng)求。?
?
2 處理REGISTER請(qǐng)求
一個(gè)注冊(cè)服務(wù)器(registrar)就是一個(gè)UAS,這個(gè)UAS用來(lái)響應(yīng)REGISTER的請(qǐng)求,并且維持一個(gè)綁定表,這個(gè)綁定表用來(lái)提供給它所管理的區(qū)域中的proxy服務(wù)器和重定向服務(wù)器的。
一個(gè)注冊(cè)服務(wù)器禁止產(chǎn)生6xx應(yīng)答。
一個(gè)注冊(cè)服務(wù)器可以適當(dāng)?shù)霓D(zhuǎn)發(fā)REGISTER請(qǐng)求。通常用于一個(gè)注冊(cè)服務(wù)器(registar)監(jiān)聽(tīng)一個(gè)多點(diǎn)廣播,并且通過(guò)302應(yīng)答(臨時(shí)轉(zhuǎn)移)轉(zhuǎn)發(fā)這個(gè)多點(diǎn)廣播的REGISTER請(qǐng)求到它正確的處理位置。
一個(gè)注冊(cè)服務(wù)器必須知道(例如,通過(guò)配置)它所管理的區(qū)域。注冊(cè)服務(wù)器一定需要按照接收到的REGISTER請(qǐng)求順序進(jìn)行處理。
當(dāng)接收到一個(gè)REGISTER請(qǐng)求,注冊(cè)服務(wù)器(registrar)按照如下步驟處理:
1、注冊(cè)服務(wù)器(registrar)檢查Request-URI來(lái)決定是否它屬于本注冊(cè)服務(wù)器所管理的區(qū)域的Request-URI。如果不是,并且如果這個(gè)服務(wù)器同時(shí)也作為一個(gè)proxy服務(wù)器,那么這個(gè)服務(wù)器應(yīng)當(dāng)轉(zhuǎn)發(fā)這個(gè)請(qǐng)求到指定的區(qū)域。
2、為了保證注冊(cè)服務(wù)器能夠支持所需要的擴(kuò)展,注冊(cè)服務(wù)器必須處理Require頭域。
3、 一個(gè)注冊(cè)服務(wù)器應(yīng)當(dāng)對(duì)UAC進(jìn)行身份認(rèn)證。
4、注冊(cè)服務(wù)器應(yīng)當(dāng)檢查認(rèn)證的用戶是否通過(guò)認(rèn)證來(lái)更改這個(gè)address-of-record的登記權(quán)限。
5、注冊(cè)服務(wù)器(registrar)從REGISTER請(qǐng)求的To頭域中解出address-of-record。如果這個(gè)address-of-record并非在這個(gè)Request-URI指明的區(qū)域中合法,那么注冊(cè)服務(wù)器必須發(fā)出一個(gè)404(沒(méi)有找到)的應(yīng)答,并且跳過(guò)后續(xù)步驟。接著URI必須轉(zhuǎn)換成為標(biāo)準(zhǔn)的格式。所有的URI參數(shù)都必須刪去(包括用戶參數(shù)user-param),并且任何非法(escaped)字符必須轉(zhuǎn)換成為合法字符(unescaped)格式。最后形成一個(gè)可以用于綁定的列表。
6、注冊(cè)服務(wù)器(registrar)檢查是否請(qǐng)求包含了一個(gè)Contact頭域。如果沒(méi)有包含,它跳過(guò)到最后一步。如果Contact頭域包含了,注冊(cè)服務(wù)器檢查是否有一個(gè)Contact頭域值是”*”,并且包含了一個(gè)Expires頭域。如果請(qǐng)求有其他的Contact頭域或者任何有效期的值是非0的,這個(gè)請(qǐng)求就是非法請(qǐng)求,并且服務(wù)器必須送回一個(gè)400(非法請(qǐng)求)的應(yīng)答,跳過(guò)后續(xù)步驟。如果沒(méi)有,那么注冊(cè)服務(wù)器檢查是否Call-ID復(fù)核每一個(gè)綁定的值。如果不符合,它必須刪除綁定。如果符合,它必須僅僅刪除保存的綁定表中CSeq值小于請(qǐng)求中的Cseq值的記錄。否則,更新必須終止,請(qǐng)求失敗。
7、現(xiàn)在注冊(cè)服務(wù)器(registrar)可以依次處理Contact頭域中的聯(lián)系地址了。
8、注冊(cè)服務(wù)器(registrar)返回一個(gè)200(OK)應(yīng)答。這個(gè)應(yīng)答必須包含Contact頭域,并且這個(gè)頭域的值中列舉了所有當(dāng)前綁定的注冊(cè)信息。每一個(gè)Contact值都必須包含一個(gè)”expires”參數(shù),用來(lái)標(biāo)志還有多久這個(gè)綁定信息就過(guò)期了。應(yīng)答也必須包含一個(gè)Date頭域。
?
總結(jié)
- 上一篇: 语音信号的分帧加窗的matlab实现
- 下一篇: STUN协议简析