8.2.4 Applying Extensions
當生成響應消息時(shí),UAS不能直接期望使用拓展功能,除非在請求中的頭Supported頭中已經(jīng)表示支持了這個(gè)拓展。如果所希望的拓展不能被支持的話(huà),服務(wù)器應該僅依賴(lài)基本的SIP和其他客戶(hù)端所支持的拓展來(lái)處理。在極少情況下,服務(wù)器沒(méi)有拓展的話(huà)就不能處理請求,這個(gè)服務(wù)器可以發(fā)送一個(gè)421(Extension Required)響應消息。這個(gè)響應消息表示,如果沒(méi)有具體的拓展功能,服務(wù)器端不能生成一個(gè)規范的響應。這些服務(wù)器端所需要支持的拓展必須包括在響應消息中的Require頭中。規范不推薦這種操作方式,因為,一般情況下,因為它會(huì )破壞流程的兼容性處理。
任何在non-421響應中列出的拓展功能必須包含在響應消息的Require頭列表中。
當然,服務(wù)器端也不能使用沒(méi)有在請求的Supported頭中列出的拓展。因此,響應消息中的 Require 頭就會(huì )只能包含在標準RFCs中多定義的可選標簽。
8.2.5 Processing the Request
假設前面討論的所有子章節都通過(guò)的話(huà),UAS的處理就會(huì )進(jìn)入到和method相關(guān)的處理流程。Section 10 涵蓋REGISTER 請求,Section 11 涵蓋OPTIONS 請求,Section 13 涵蓋INVITE 請求,最后,Section 15 涵蓋BYE請求。
8.2.6 Generating the Response
當UAS希望對請求構建一個(gè)響應時(shí),UAS必須遵守一般的處理流程。這些處理流程會(huì )在下面的子章節中進(jìn)行說(shuō)明。另外,對于一些非常具體的響應碼的處理問(wèn)題,這里沒(méi)有規范具體的細節,也可不做要求。
一旦所有和創(chuàng )建響應消息所關(guān)聯(lián)的流程完成以后,UAS負責返回到服務(wù)器事務(wù)層,這里是它收到請求的地址。
8.2.6.1 Sending a Provisional Response
對生成響應來(lái)說(shuō),一個(gè)主要的不具體到某個(gè)method的原則是,UASs對非INVITE不應該發(fā)送臨時(shí)響應消息。相反,UASs應該盡快對非INVITE請求生成一個(gè)最終響應消息。
當生成100 (Trying)響應時(shí),重新在在請求中的任何Timestamp頭必須拷貝到這個(gè) 100 (Trying)響應中。如果在生成響應時(shí)有延遲,UAS應該在Timestamp頭中添加一個(gè)延遲數值。這個(gè)延遲數值必須包含響應發(fā)送時(shí)間值和接收請求時(shí)間值,此值以秒為單位。
8.2.6.2 Headers and Tags
響應消息中的From必須和請求中的From頭相同。響應中的Call-ID頭必須和請求中的Call-ID相同。響應中的CSeq必須和請求中的CSeq相同。響應中的Via頭必須和請求中的Via頭相同,而且保持相同的順序。
如果在請求中包含了一個(gè)To tag標簽,響應中的To必須和請求中的To頭相同。但是,如果在請求中沒(méi)有包含To頭值,在響應中回復中,To頭中的URL必須和請求中To頭的URL相同;另外,在響應回復中,UAS必須在To標簽中增加一個(gè)標簽(支持100(trying)異常響應)。這樣處理的目的是確認UAS正在響應處理,也可能因為這個(gè)異常響應會(huì )生成一個(gè)dialog ID組件。同樣的標簽使用在此請求的所有響應中,包括最終響應和臨時(shí)響應(除了100(trying以外))。對此標簽生成的流程在中Section 19.3定義。
8.2.7 Stateless UAS Behavior
無(wú)狀態(tài)UAS是一種不保存事務(wù)狀態(tài)的UAS。它通常會(huì )轉發(fā)請求,而且協(xié)議發(fā)送后會(huì )丟棄UAS的狀態(tài)消息。 如果一個(gè)無(wú)狀態(tài)UAS收到請求重發(fā),此UAS會(huì )重新生成響應,重新發(fā)送響應,就像它對第一個(gè)請求回復一樣。一個(gè)UAS不能是無(wú)狀態(tài)模式,除非這個(gè)method的請求處理總導致同樣的響應(如果請求是確認的)。無(wú)狀態(tài)注冊不遵守此規則。無(wú)狀態(tài)UASs不涉及事務(wù)層;UASs直接收到傳輸層請求后,直接對傳輸層返回響應。
無(wú)狀態(tài)UAS的基本功能是處理無(wú)需驗證的請求,這些請求面對響應問(wèn)題。如果無(wú)驗證請求是通過(guò)有狀態(tài)UAS來(lái)處理的話(huà),那么就會(huì )導致這些無(wú)驗證請求產(chǎn)生大量的事務(wù)狀態(tài),這些事務(wù)狀態(tài)數據會(huì )導致在UAS端呼叫處理速度放慢,影響UAS處理性能,可能立刻生成了拒絕攻擊服務(wù)的條件。更多關(guān)于拒絕攻擊服務(wù)的內容,查閱Section 26.1.5。
無(wú)狀態(tài)UAS的最重要處理方式包括以下幾個(gè)方面:
- 無(wú)狀態(tài)UAS一定不能發(fā)送臨時(shí)響應(1xx)。
- 無(wú)狀態(tài)UAS一定不能重回響應消息。
- 無(wú)狀態(tài)UAS必須忽略ACK請求。
- 無(wú)狀態(tài)UAS必須忽略CANCEL請求。
- 響應中的To頭域值必須以一種無(wú)狀態(tài)的方式生成,這種生成方式對同樣的請求生成同樣的標簽,此方式的目的是保持標簽的一致性。更多關(guān)于標簽構成,參考Section 19.3。
關(guān)于其他方面的處理規范,無(wú)狀態(tài)UAS和有狀態(tài)UAS是一樣的。對每個(gè)新請求來(lái)說(shuō),UAS可以以有狀態(tài)方式或無(wú)狀態(tài)方式操作。
8.3 Redirect Servers
在一些技術(shù)架構中,代理服務(wù)器的目的是為了降低處理負載,這些代理服務(wù)器可能是負責處理路由請求和優(yōu)化信令路徑的強健性,都是通過(guò)重定向方式進(jìn)行轉發(fā)處理。
重定向處理允許服務(wù)器端對請求在響應中推送路由消息,返回給客戶(hù)端,因此,重定向會(huì )把自己踢出此環(huán)路的事務(wù)處理中,定位到請求的目標地址。當請求發(fā)起方收到了重新定位響應以后,發(fā)起方會(huì )基于收到的URL地址重新發(fā)送一個(gè)新的請求。通過(guò)從網(wǎng)絡(luò )核心傳輸URLs到其網(wǎng)絡(luò )邊界,重定向允許相關(guān)網(wǎng)絡(luò )拓展性。
重定向服務(wù)器邏輯上由一個(gè)服務(wù)器事務(wù)層和一個(gè)事務(wù)用戶(hù)構成。事務(wù)用戶(hù)可以訪(fǎng)問(wèn)某些定位服務(wù)(參考Section 10 獲得更多注冊和定位服務(wù)詳情)。定位服務(wù)實(shí)際上是一個(gè)數據庫,數據庫映射單個(gè)URL地址和一個(gè)或多個(gè)可選地址,這些地址是URL的目標地址。
重定向服務(wù)器自己不能發(fā)起任何屬于自己的SIP請求。收到了一個(gè)請求以后(除了CANCEL請求以外),服務(wù)器可以拒絕此請求或從定位服務(wù)收集可選地址,然后返回一個(gè)最終響應3xx。
對于格式非常規范的CANCEL請求,重定位服務(wù)器應該返回一個(gè)2xx響應。這個(gè)響應表示結束SIP事務(wù)處理。重定位服務(wù)器保持一個(gè)完整SIP事務(wù)的狀態(tài)。這是客戶(hù)端的責任,用來(lái)檢測介于重定向服務(wù)器之間的前轉環(huán)路。
當重定向服務(wù)器對請求返回一個(gè)3xx響應時(shí),定向服務(wù)器會(huì )在Contact頭中插入查詢(xún)到的定位地址列表。 同時(shí),在Contact頭中增加一個(gè)“expires”參數值,此值表示Contact數據中地址的生命周期。
Contact頭中包含URLs,并且提供新的地址和用戶(hù)名來(lái)嘗試,或者簡(jiǎn)單提供指定的額外傳輸參數。301 (Moved Permanently)或302 (Moved Temporarily)響應可能也提供同樣地址和用戶(hù)名,這個(gè)用戶(hù)名是初始請求的目標地址,但是設定了額外的傳輸參數值,例如嘗試不同的服務(wù)器或組播地址,或者傳輸方式的相關(guān),例如從UDP傳輸修改為T(mén)CP傳輸,或者相反處理。
不管怎樣,重定位服務(wù)器一定不能重定位一個(gè)請求到一個(gè)URL,這個(gè)URL和一個(gè)在Request-URI 的URL相同;相反,服務(wù)器可以代理轉發(fā)這個(gè)請求到目的地URL,或者拒絕此請求,返回一個(gè)404響應。
如果客戶(hù)端正在使用一個(gè)outbound proxy,并且重新定位此請求,這里可能產(chǎn)生一個(gè)潛在的無(wú)限重定位環(huán)路。
注意,一個(gè) Contact頭可能涉及不同的源地址,而不是初始呼叫的源地址。例如,一個(gè)SIP呼叫連接到PSTN網(wǎng)關(guān),網(wǎng)關(guān)可能需要提供一個(gè)特別的語(yǔ)音說(shuō)明(例如,您撥打的號碼已經(jīng)被修改)。
一個(gè)Contact響應消息頭可以包含任何恰當的URL值,這個(gè)值表示被呼叫方已經(jīng)被連接,也不僅局限于SIP URLs地址。例如,它可以包含電話(huà)的URLs地址,傳真或irc(如果有定義的話(huà))或一個(gè)mailto: (RFC 2368 [32]) 郵件地址。Section 26.4.4 討論了 重定位處理中SIPs URL到一個(gè)non-SIPS URI的影響和局限性。
Contact頭中的“expires”參數表示URL的生命周期。此值以秒為單位計算。如果沒(méi)有提供此參數的話(huà),以Expires頭中的數值決定URL的生命周期。如果出現異常值的話(huà),此值應該視為等同于3600。
這種方式提供了一種最大程度的可能,保證了和RFC2534向后兼容,這也支持了一個(gè)在這個(gè)頭中的絕對時(shí)間值。如果收到了一個(gè)絕對時(shí)間的話(huà),它將會(huì )被視為異常值,默認的時(shí)間為3600。
重定位服務(wù)器一定要忽略某些功能(包括無(wú)法識別的頭域格式,任何在Require中的未知可選標簽,甚至于未知的method名稱(chēng)),和某些存在問(wèn)題的重定位請求。
未完繼續……


關(guān)注微信公眾號:asterisk-cn,獲得有價(jià)值的Asterisk行業(yè)分享
Asterisk freepbx,FreeSBC技術(shù)文檔:www.freepbx.org.cn
融合通信商業(yè)解決方案,協(xié)同解決方案首選產(chǎn)品:www.hiastar.com
Asterisk / FreePBX / FreeSBC中國合作伙伴,官方qq技術(shù)分享群(3000人):589995817