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