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

關注微信公眾號:asterisk-cn,獲得有價值的Asterisk行業(yè)分享
Asterisk freepbx FreeSBC技術文檔: www.freepbx.org.cn
融合通信/IPPBX商業(yè)解決方案:www.hiastar.com
如何使用FreeSBC,qq技術分享群:334023047