10.3 Processing REGISTER Requests
注冊(cè)服務(wù)是一個(gè)UAS端,UAS端對(duì)注冊(cè)請(qǐng)求進(jìn)行響應(yīng),并且維持一個(gè)綁定列表。在管理員域范圍內(nèi),這個(gè)綁定列表對(duì)代理服務(wù)器和重轉(zhuǎn)發(fā)服務(wù)器來(lái)說(shuō)是可訪問(wèn)的。根據(jù)Section 8.2 和 Section 17.2的規(guī)定,注冊(cè)服務(wù)處理請(qǐng)求,它也僅接受注冊(cè)請(qǐng)求。注冊(cè)服務(wù)一定不能生成6xx響應(yīng)消息。
注冊(cè)服務(wù)可以重新轉(zhuǎn)發(fā)注冊(cè)請(qǐng)求,這是可以接受的。一個(gè)比較常見(jiàn)的使用場(chǎng)景就是注冊(cè)服務(wù)監(jiān)聽(tīng)一個(gè)組播接口來(lái)轉(zhuǎn)發(fā)組播注冊(cè)請(qǐng)求,組播注冊(cè)請(qǐng)求攜帶一個(gè)302(Moved Temporarily)臨時(shí)響應(yīng)發(fā)送到自己的單播接口。
如果在注冊(cè)請(qǐng)求中攜帶了Record-Route頭的話,注冊(cè)服務(wù)必須忽略Record-Route 頭。注冊(cè)服務(wù)一定不能在針對(duì)注冊(cè)請(qǐng)求的任何響應(yīng)的消息中攜帶Record-Route 頭。
注冊(cè)服務(wù)可能會(huì)收到這樣的請(qǐng)求,這個(gè)請(qǐng)求經(jīng)過(guò)了一個(gè)代理服務(wù)器節(jié)點(diǎn),代理服務(wù)器把注冊(cè)視為一個(gè)未知請(qǐng)求,代理服務(wù)器添加了一個(gè)Record-Route頭域值。
一個(gè)注冊(cè)服務(wù)需要知道(通過(guò)配置文件)域的列表來(lái)維持綁定關(guān)系。注冊(cè)服務(wù)按照收到注冊(cè)請(qǐng)求的順序來(lái)處理注冊(cè)請(qǐng)求。注冊(cè)請(qǐng)求必須是通過(guò)完全自動(dòng)處理方式對(duì)請(qǐng)求進(jìn)行處理。每個(gè)注冊(cè)消息必須獨(dú)立處理或者獨(dú)立綁定修改。
當(dāng)收到一個(gè)注冊(cè)請(qǐng)求時(shí),注冊(cè)服務(wù)需要經(jīng)過(guò)以下幾個(gè)步驟:
5. 注冊(cè)服務(wù)從請(qǐng)求的To頭中提取address-of-record地址。如果針對(duì)在Request-URI 地址中的域來(lái)說(shuō),address-of-record不是有效地址的話,注冊(cè)服務(wù)必須發(fā)送一個(gè)
404 (Not Found)響應(yīng)碼,并且忽略其余步驟。這個(gè)URL必須被轉(zhuǎn)換成一個(gè)標(biāo)準(zhǔn)的格式。為了實(shí)現(xiàn)這個(gè)要求,所有的URI參數(shù)必須被移除(包括user-param),并且任何轉(zhuǎn)義字符必須轉(zhuǎn)換成非轉(zhuǎn)義格式。然后把結(jié)果設(shè)置為綁定列表的索引。
6. 注冊(cè)服務(wù)檢查是否請(qǐng)求中包含Contact頭。如果沒(méi)有的話,它會(huì)直接跳到最后步驟。如果包含一個(gè)Contact頭域值的話,注冊(cè)服務(wù)檢查這個(gè)頭域值包含一個(gè)特殊標(biāo)識(shí)符“*”和一個(gè) Expires 域值。如果這個(gè)請(qǐng)求還有其他Contact域值或一個(gè)非零的超時(shí)時(shí)間設(shè)置,那么這個(gè)請(qǐng)求是一個(gè)無(wú)效的請(qǐng)求,服務(wù)器端必須返回一個(gè)400 (Invalid Request)無(wú)效請(qǐng)求的響應(yīng)碼,并且忽略其余步驟。如果沒(méi)有其他的Contact地址的話,注冊(cè)服務(wù)檢查是否這個(gè)Call-ID 和存儲(chǔ)在綁定數(shù)據(jù)庫(kù)中的每個(gè)綁定中的值一致。如果兩個(gè)值不一致,注冊(cè)服務(wù)必須移除這個(gè)綁定。如果注冊(cè)服務(wù)同意的話,注冊(cè)服務(wù)必須移除這個(gè)綁定,僅保留請(qǐng)求中CSeg的值高于存儲(chǔ)的綁定值的部分綁定關(guān)系。否則,更新必須中斷,這個(gè)請(qǐng)求失敗。
7. 現(xiàn)在,注冊(cè)服務(wù)開(kāi)始依次處理Contact頭中的每個(gè)contact地址。對(duì)于每個(gè)地址來(lái)說(shuō),超時(shí)周期設(shè)置通過(guò)以下步驟來(lái)決定:
- 注冊(cè)服務(wù)會(huì)檢查這個(gè)Request-URI地址來(lái)決定是否它可以訪問(wèn)這個(gè)地址綁定在 Request-URI所定義的域。如果不能的話,如果這個(gè)服務(wù)器可以作為一個(gè)代理服務(wù)器的話,服務(wù)器應(yīng)該轉(zhuǎn)發(fā)此請(qǐng)求到已標(biāo)識(shí)地址的域,然后根據(jù)代理信息的一般流程來(lái)處理,具體的代理信息描述在Section 16。
- 為了保證注冊(cè)服務(wù)可以支持任何必要的拓展功能,注冊(cè)服務(wù)必須處理Require header 頭域值。具體對(duì)UASs的Require頭描述在Section 8.2.2。
- 注冊(cè)服務(wù)應(yīng)該UAC進(jìn)行簽權(quán)檢查。針對(duì)SIP用戶代理請(qǐng)求檢查機(jī)制在Section 22有介紹。注冊(cè)流程絕不能覆蓋SIP的基本請(qǐng)求架構(gòu)。如果沒(méi)有簽權(quán)機(jī)制支持的話,注冊(cè)服務(wù)可以提取From地址作為請(qǐng)求發(fā)起方已確認(rèn)的身份。
- 如果已簽權(quán)的用戶被授權(quán)修改注冊(cè)來(lái)支持address-of-record,注冊(cè)服務(wù)應(yīng)該可以決定此授權(quán)。例如,注冊(cè)服務(wù)可能會(huì)查詢授權(quán)數(shù)據(jù)庫(kù)來(lái)映射用戶名稱(chēng)和address-of-record列表匹配,注冊(cè)服務(wù)然后決定此用戶是否有權(quán)修改綁定關(guān)系。如果簽權(quán)用戶沒(méi)有被授權(quán)修改綁定關(guān)系的話,注冊(cè)服務(wù)必須返回一個(gè)403 (Forbidden)錯(cuò)誤協(xié)議碼,并且忽略其余的步驟。
5. 注冊(cè)服務(wù)從請(qǐng)求的To頭中提取address-of-record地址。如果針對(duì)在Request-URI 地址中的域來(lái)說(shuō),address-of-record不是有效地址的話,注冊(cè)服務(wù)必須發(fā)送一個(gè)
404 (Not Found)響應(yīng)碼,并且忽略其余步驟。這個(gè)URL必須被轉(zhuǎn)換成一個(gè)標(biāo)準(zhǔn)的格式。為了實(shí)現(xiàn)這個(gè)要求,所有的URI參數(shù)必須被移除(包括user-param),并且任何轉(zhuǎn)義字符必須轉(zhuǎn)換成非轉(zhuǎn)義格式。然后把結(jié)果設(shè)置為綁定列表的索引。
6. 注冊(cè)服務(wù)檢查是否請(qǐng)求中包含Contact頭。如果沒(méi)有的話,它會(huì)直接跳到最后步驟。如果包含一個(gè)Contact頭域值的話,注冊(cè)服務(wù)檢查這個(gè)頭域值包含一個(gè)特殊標(biāo)識(shí)符“*”和一個(gè) Expires 域值。如果這個(gè)請(qǐng)求還有其他Contact域值或一個(gè)非零的超時(shí)時(shí)間設(shè)置,那么這個(gè)請(qǐng)求是一個(gè)無(wú)效的請(qǐng)求,服務(wù)器端必須返回一個(gè)400 (Invalid Request)無(wú)效請(qǐng)求的響應(yīng)碼,并且忽略其余步驟。如果沒(méi)有其他的Contact地址的話,注冊(cè)服務(wù)檢查是否這個(gè)Call-ID 和存儲(chǔ)在綁定數(shù)據(jù)庫(kù)中的每個(gè)綁定中的值一致。如果兩個(gè)值不一致,注冊(cè)服務(wù)必須移除這個(gè)綁定。如果注冊(cè)服務(wù)同意的話,注冊(cè)服務(wù)必須移除這個(gè)綁定,僅保留請(qǐng)求中CSeg的值高于存儲(chǔ)的綁定值的部分綁定關(guān)系。否則,更新必須中斷,這個(gè)請(qǐng)求失敗。
7. 現(xiàn)在,注冊(cè)服務(wù)開(kāi)始依次處理Contact頭中的每個(gè)contact地址。對(duì)于每個(gè)地址來(lái)說(shuō),超時(shí)周期設(shè)置通過(guò)以下步驟來(lái)決定:
- 如果Contact頭中有一個(gè)“expires”參數(shù),此參數(shù)必須被視作請(qǐng)求超時(shí)參數(shù)。
- 如果頭中沒(méi)有這樣的參數(shù),但是請(qǐng)求中包含了一個(gè)Expires頭的話,此值必須被視為請(qǐng)求超時(shí)參數(shù)。
- 如果以上兩個(gè)參數(shù)都沒(méi)有,本地配置的默認(rèn)值必須被視為請(qǐng)求超時(shí)參數(shù)。
注冊(cè)服務(wù)可能選擇一個(gè)超時(shí)設(shè)置,這個(gè)設(shè)置小于請(qǐng)求中的超時(shí)周期設(shè)置。如果并且僅如果請(qǐng)求的超時(shí)周期大于零并且少于一小時(shí)而且小于注冊(cè)服務(wù)配置的最低設(shè)置,注冊(cè)服務(wù)可以拒絕這個(gè)注冊(cè)請(qǐng)求,并且返回423響應(yīng)碼(Interval Too Brief)。此響應(yīng)必須包含一個(gè)Min-Expires 頭,此值用來(lái)聲明注冊(cè)服務(wù)那個(gè)接受的最小超時(shí)周期。然后注冊(cè)服務(wù)忽略其余處理步驟。
允許注冊(cè)服務(wù)設(shè)置注冊(cè)周期保護(hù)來(lái)維持注冊(cè)服務(wù)的穩(wěn)定性,注冊(cè)周期保護(hù)可以應(yīng)對(duì)超負(fù)荷的注冊(cè)刷新同時(shí)能夠維持注冊(cè)狀態(tài),使得注冊(cè)狀態(tài)處于最新?tīng)顟B(tài)。注冊(cè)的超時(shí)周期經(jīng)常使用在服務(wù)創(chuàng)建中。分機(jī)隨行服務(wù)就是一個(gè)比較常用的例子,用戶在終端側(cè),終端狀態(tài)短時(shí)間有效。因此,注冊(cè)服務(wù)應(yīng)該接受比較短的注冊(cè);如果注冊(cè)周期過(guò)短的話,請(qǐng)求應(yīng)該被拒絕,太短周期設(shè)置導(dǎo)致刷新過(guò)于頻繁,最后降低了注冊(cè)服務(wù)的性能。
對(duì)每個(gè)地址來(lái)說(shuō),注冊(cè)服務(wù)使用URL對(duì)比規(guī)則來(lái)查詢當(dāng)前的綁定列表。如果綁定列表不存在的話,注冊(cè)服務(wù)會(huì)直接添加列表。如果綁定列表存在的話,注冊(cè)服務(wù)將檢查Call-ID值。如果在當(dāng)前的綁定中的Call-ID值不同于請(qǐng)求中的Call-ID值,超時(shí)時(shí)間為零并且更新后也為零,綁定必須被移除。如果兩個(gè)Call-ID相同,注冊(cè)服務(wù)就會(huì)對(duì)比CSeq值。如果此值大于當(dāng)前綁定的值,注冊(cè)服務(wù)必須更新或者移除以上綁定。如果不能更新的話,更新操作中斷,此請(qǐng)求失敗。
這個(gè)機(jī)制保證從同一UA發(fā)送的那些異常的請(qǐng)求可以被忽略。
每個(gè)綁定記錄記錄了從請(qǐng)求中獲得的all-ID和CSeq值。
如果并且僅如果所有綁定更新和其他的都是成功的,綁定更新才能記錄存儲(chǔ)(此更新對(duì)代理服務(wù)器或者轉(zhuǎn)發(fā)服務(wù)器是可見(jiàn)狀態(tài))。如果它們其中一個(gè)失。ɡ,后臺(tái)數(shù)據(jù)庫(kù)更新失。(qǐng)求一定是失敗的,并且返回一個(gè)500協(xié)議錯(cuò)誤碼(服務(wù)器錯(cuò)誤),并且所有直接綁定更新必須被移除。
8. 注冊(cè)服務(wù)返回一個(gè)200(OK)響應(yīng)。這個(gè)響應(yīng)必須包含Contact 頭域值,這些值枚舉所有當(dāng)前綁定。每個(gè)Contact值必須支持一個(gè)“expires”參數(shù)值,這個(gè)值用來(lái)表示注冊(cè)服務(wù)的超時(shí)周期。響應(yīng)消息中應(yīng)該包含一個(gè)Date頭域。
繼續(xù)發(fā)布……
關(guān)注微信公眾號(hào):asterisk-cn,獲得有價(jià)值的Asterisk行業(yè)分享
Asterisk freepbx FreeSBC技術(shù)文檔: www.freepbx.org.cn
融合通信/IPPBX商業(yè)解決方案:www.hiastar.com
如何使用FreeSBC,qq技術(shù)分享群:334023047