開発者用 SIP 透過性および正規化ガイド Cisco Unified Communications Manager Release 9.1(1)
SIP の透過性
SIP の透過性
発行日;2013/04/10 | 英語版ドキュメント(2012/12/20 版) | ドキュメントご利用ガイド | ダウンロード ; この章pdf , ドキュメント全体pdf (PDF - 2MB) | フィードバック

目次

SIP の透過性

サポートされる機能

181 透過性の例

INFO 透過性の例

SIP の透過性

Cisco Unified Communications Manager(Unified CM)は Back to Back User Agent(B2BUA)です。このため、SIP 間の任意のコールは 2 つの SIP ダイアログで構成されます。これは、多くの場合、ダイアログの継続中にダイアログ間で情報を渡すときに役立ちます。これには、コール セットアップ メッセージング、ミッド コール メッセージング、およびコール終了メッセージングがあります。前述のパススルー オブジェクトを使用して、1 つの SIP ダイアログ(1 つのコール レッグを表す)から別の SIP ダイアログへと情報の透過的なパススルーをトリガーできます。

現在のところ、透過性は、SIP トランクまたは SIP 回線の INVITE ダイアログに制限されています。SUBSCRIBE ダイアログ、PUBLISH、アウト オブ ダイアログ REFER、アウト オブ ダイアログ Unsolicited NOTIFY はサポートされず、MESSAGE もサポートされません。

サポートされる機能

次のメッセージで、透過性がサポートされます。

初期 INVITE および関連応答

INVITE 応答

180 応答

183 応答

200 応答

4XX、5XX、6XX 応答

reINVITE および関連応答

UPDATE メッセージ(UPDATE への応答に対して透過性はサポートされていません)

INFO メッセージ(INFO への応答に対して透過性はサポートされていません)

BYE メッセージ(BYE への応答に対する透過性はサポートされていません)

次のメッセージでは、透過性はサポートされません。

ACK

PRACK および関連応答

Replaces を持つ INVITE および関連応答

REFER と関連応答

通常、Cisco Unified CM は、次の情報(パラメータ、ヘッダー、およびコンテンツ本文)をローカルで処理します。これは、特定のコール レッグと関連しています。したがって、理解された SIP 情報はそこで使用され、他のコール レッグ(いずれにしても SIP でない場合もある)に渡されることはありません。これにより、Cisco Unified CM が、SIP と H.323、SIP と MGCP などのさまざまなプロトコル インターワーキングをサポートできます。Cisco Unified CM によって理解されていない SIP 情報は通常無視されます。

次の項では、Cisco Unified CM によって理解され使用された情報のことを、 既知 であると、Cisco Unified CM によって理解されず、使用されない情報のことを、 不明 であると表現します。

次の情報は透過的に通過できます。

パラメータ

不明なヘッダー

不明なコンテンツ本文

既知のヘッダー

次に、既知のヘッダーのリストを示します。

Accept

Accept-Contact

Accept-Resource-Priority

Alert-Info

Allow

Allow-Events

Also

Authorization

Bridge-Participant-ID

Call-ID

Call-Info

CC-Diversion

CC-Redirect

Contact

Content-Disposition

Content-ID

Content-Length

Content-Type

CSeq

Date

Diversion

Event

Expires

From

Geolocation

Geolocation-Error

Join

Max-Forwards

Min-Expires

Min-SE

MIME-Version

P-Asserted-Identity

P-Preferred-Identity

Privacy

Proxy-Authenticate

Proxy-Authorization

Proxy-Require

RAck

Reason

Recv-Info

Refer-To

Referred-By

Reject-Contact

Remote-Party-ID

Replaces

Request-Disposition

Requested-By

Require

Resource-Priority

Retry-After

RSeq

RTP-RxStat

RTP-TxStat

Server

Session

Session-Expires

SIP-ETag

SIP-If-Match

Subject

Subscription-State

Supported

Target-Dialog

To

Unsupported

User-Agent

Via

Warning

WWW-Authenticate

X-Cisco-EMCCInfo

X-Cisco-FallbackID

X-Cisco-ViPR-Ticket

既知のコンテンツ本文

application/sdp

スクリプトで既知のヘッダーまたはコンテンツ本文を受け渡そうとすると、実行エラーがトリガーされます。

スクリプト作成者であれば、既知のデータが Cisco Unified CM の処理にかけられたり、Cisco Unified CM の処理と干渉したりすることなく受け渡される方法があることをすぐに理解することができます。実際、スクリプトは、既知のヘッダーの値を取得し、不明なヘッダーに格納することができます。コンテンツ本文についても、同じことが行えます。下に示す 181 透過性の例では、Reason ヘッダーでこれを行っています。この例は、Reason ヘッダーの値を取得し、それを X-Reason ヘッダーとして受け渡します。当然のことながら、相手側に X-Reason ヘッダーを使用して削除するスクリプトがなければ、このヘッダーはネットワークに送信されます。

いずれの場合も、既知のヘッダーまたはコンテンツ本文の透過性はサポートされておらず、SIP の透過性と正規化はこの目的のためのものではありません。SIP の透過性を使用して、既知のヘッダーまたはコンテンツ本文を受け渡す場合、その結果は保証されません。

特に、SDP の透過性はサポートされていません。Cisco Unified CM は、この場合、リージョン帯域幅ポリシーまたはコール アドミッション制御を適用できません。また必要となる可能性のあるメディア リソースを挿入することもできません。多数のコール フローにより、SDP の更新が発生するため、Cisco Unified CM を正しく実行できません。SDP で宣言した要素を正常に操作できる可能性はありますが、ネゴシエートされた要素の操作は初期コール セットアップよりも成功する可能性が低くなります。

181 透過性の例

透過性がない場合、Cisco Unified CM が発信トランク レッグで 181 を受信すると、Cisco Unified CM のネイティブ動作は、着信トランク レッグ上で 180 を送り返すことです。181 透過性を達成するには、着信 181(B サイドで受信)と予定発信 180(A サイドで送信)の両方にスクリプトが必要です。

181 は最初に PBX-B から受信されるので、まず次のことを行うことを検討します。

Reason ヘッダーの値の取得

Reason ヘッダーの値のパススルー:Reason ヘッダーは既知のヘッダーなので、スクリプトは、ヘッダー名 X-Reason を使用して値を受け渡すことにより、既知のヘッダーのチェックをバイパスします。

このパススルー データは、Cisco Unified CM によって自動的に、これから送信される発信メッセージとマージされます。前述のとおり、Cisco Unified CM は 180 をネイティブに送信します。このため、自動マージ機能により、X-Reason ヘッダーが発信 180 内に置かれます。

次に、次の内容を A サイドで行う必要があるかどうかを検討する必要があります。

X-Reason ヘッダーの値の取得と、181 に関して何かを含んでいるかどうかの確認

X-Reason ヘッダーの値を持つ Reason ヘッダーの追加

X-Reason ヘッダーの削除

応答コードとフレーズの 181 Call is Being Forwarded への変換

これらの手順を、次のコールフロー図に示します。

B サイドと A サイドのスクリプトを次に示します。

B サイドのスクリプト

B = {}
function B.inbound_181_INVITE(msg)
local pt = msg:getPassThrough()
local reason = msg:getHeader("Reason")
if pt and reason
then
pt:addHeader("X-Reason", reason)
end
end
return B

A サイドのスクリプト

A = {}
function A.outbound_180_INVITE(msg)
local reason = msg:getHeader("X-Reason")
if reason
then
if string.find(reason, "cause=181")
then
msg:setResponseCode(181,"Call is being forwarded")
msg:addHeader("Reason", reason)
end
 
msg:removeHeader("X-Reason")
end
end
return A
 

INFO 透過性の例

透過性がない場合、Cisco Unified CM は着信 INFO メッセージとコンテンツ本文を無視します。透過性を使用して、Cisco Unified CM は Nortel PBX によって送信された独自のコンテンツ本文を抽出します。そのコンテンツ本文から DTMF ディジットを抽出し、新しい dtmf-relay コンテンツ本文を作成して、それを相手側のコール レッグへと受け渡します。

スクリプト

M = {}
function M.inbound_INFO(msg)
local body = msg:getContentBody("application/vnd.nortelnetworks.digits")
if body
then
local digits = string.match(body, "d=(%d+)")
if digits
then
pt = msg:getPassThrough()
body = string.format("Signal=%d\r\nDuration=100\r\n", digits)
pt:addContentBody("application/dtmf-relay", body)
end
end
end
return M

着信メッセージ

INFO sip: 1000@10.10.10.1 SIP/2.0
Via: SIP/2.0/UDP 10.10.10.57:5060
From: <sip:1234@10.10.10.57>;tag=d3f423d
To: <sip:1000@10.10.10.1>;tag=8942
Call-ID: 312352@10.10.10.57
CSeq: 5 INFO
Content-Type: application/vnd.nortelnetworks.digits
Content-Length: 72
 
p=Digit-Collection
y=Digits
s=success
u=12345678
i=87654321
d=4

発信メッセージ

INFO sip: 1000@10.10.10.58 SIP/2.0
Via: SIP/2.0/UDP 10.10.10.1:5060
From: <sip:1234@10.10.10.1>;tag=ef45ad
To: <sip:1000@10.10.10.58>;tag=1234567
Call-ID: 475623@10.10.10.1
CSeq: 5 INFO
Content-Type: application/dtmf-relay
Content-Length: 26
 
Signal=4
Duration=100
 

 

PCV および PAI ヘッダーのスクリプト パラメータ

P-Charging Vector の場合

P-Charging Vector ヘッダーのスクリプト パラメータは、モバイル関連情報を受け渡すための透過性を追加するように拡張されています。

リリース 8.6(1) よりも前は、Cisco Unified Communications Manager が P-Charging Vector を持つコールを受信した場合、Cisco Unified Communications Manager は、モバイルまたは IP Multimedia Subsystem(IMS)値なしの着信トランク レッグのコール情報を、そのサービス プロバイダーに送信していました。現在は、変更された PCV スクリプト パラメータを使用してより適切な透過性を得るため、Cisco Unified Communications Manager はモバイルまたは PSTN から送信された課金情報を抽出し(B サイドで受信)、その情報を変更せずに相手側のコール レッグに受け渡しします(A サイドで送信)。

スクリプト パラメータ

term-ioi:このパラメータでは、Call Manager から発信される発信 200 OK の P-Charging-Vector ヘッダーに term-ioi パラメータを、スクリプトで追加する必要があるかどうかを設定します。

P-Asserted Identity の場合

P-Asserted Identity ヘッダーのスクリプト パラメータは、Cisco Unified Communications Manager が、Cisco Unified Communications Manager から発信された発信コールに対する着信コールに存在する、未修正の PAI 情報を受け渡しできるように拡張されました。

スクリプト パラメータ

pai-passthru:このパラメータでは、発信コールの P-Asserted-Identity を、スクリプトで受け渡す必要があるかを設定します。

転送カウンタ

転送カウンタ スクリプトは、コール転送シナリオの転送カウンタ パラメータを処理します。転送カウンタ スクリプトは次の機能を提供します。

Unified CM クラスタ内の転送なしの基本的なタンデム(トランク間)コールのパススルー転送カウンタ パラメータとして動作します。

Unified CM クラスタ内で複数の転送を含むタンデム コールの転送カウンタ パラメータを処理します。

着信 INVITE メッセージに Diversion ヘッダーが 3 つ以上あり、さらに Unified CM クラスタ内に複数の転送がある場合、転送カウンタ パラメータを処理します。

例外

転送カウンタ スクリプトには次の例外がります。

転送カウンタ スクリプトはタンデム コールだけに適用されます。

クラスタ内に複数の転送がある場合、転送カウンタ パラメータは 1 ずつ加算されます。

スクリプト

--[[
Description:
Diversion Counter Handling For Call Forward Scenarios. This script should be attached to both inbound and outbound trunk. This script provides the following functionalists:
 
1. Pass through counter parameter in case Basic Tandem call with NO Diversion within the cluster.
2. Handling of counter parameter for Tandem call with one or more Diversion within CUCM cluster
3. Handling of counter parameter for Tandem call when inbound INVITE has more than two Diversion headers and there is also one or more Diversion within CUCM cluster
 
Exceptions:
1. This script is only applicable for Tandem (trunk-to-trunk) calls.
2. If there are multiple diversions within the cluster, the Diversion counter parameter will be increase just by 1.
--]]
 
M = {}
function M.inbound_INVITE(msg)
if msg:isReInviteRequest()
then
return
end
 
-- Get the Diversion header. If no Diversion header then return.
local diversion = msg:getHeader("Diversion")
if not diversion
then
return
end
local pt = msg:getPassThrough()
pt:addHeader("X-Diversion", diversion)
end
function M.outbound_INVITE(msg)
-- This script is applicable only for initial INVITE.
if msg:isReInviteRequest()
then
return
end
-- Get Diversion header. If there is no Diversion header then return
local diversion = msg:getHeader("Diversion")
if not diversion
then
return
end
 
-- Get X-Diversion Header. If there was no X-Diversion header then return
local xDiversion = msg:getHeader("X-Diversion")
if not xDiversion
then
return
end
 
-- Get URI from Diversion header
local divString = msg:getUri("Diversion")
if divString
then
-- Parse URI and get DN and Host
local divuri = sipUtils.parseUri(divString)
if divuri
then
lrn_user = divuri:getUser()
lrn_host = divuri:getHost()
 
end
end
 
-- Get URI from X-Diversion header
local xdivString = msg:getUri("X-Diversion")
if xdivString
then
-- Parse URI and get DN and Host
local xdivuri = sipUtils.parseUri(xdivString)
if xdivuri
then
xlrn_user = xdivuri:getUser()
xlrn_host = xdivuri:getHost()
end
end
 
-- Get counter parameter value from inbound diversion (X-Diversion).
local counter = msg:getHeaderValueParameter("X-Diversion", "counter")
 
-- If new LRN is different from incoming LRN, that means there was a local
-- call forward on UCM, so increase the counter.
if not ( string.match(lrn_user, xlrn_user) and string.match(lrn_host, xlrn_host) )
then
-- If there is no counter parameter, then find out how many Diversion
-- headers are there. Set the counter to no. of Diversion Header.
-- If there is a counter value, just increase it by 1.
if not counter
then
 
local xdiv = msg:getHeaderValues("X-Diversion")
if #xdiv > 1
then
counter = #xdiv
end
else
counter = counter + 1
end
msg:addHeaderValueParameter("Diversion","counter", counter)
else
-- As there is no local call forwarding, so pass through the counter
-- parameter.
if counter
then
msg:addHeaderValueParameter("Diversion","counter", counter)
end
end
msg:removeHeader("X-Diversion")
end
return M

 

メッセージの変換

クラスタ内でコール転送があり、着信 INVITE メッセージにカウンタ パラメータを持つ Diversion ヘッダーが含まれる場合、転送カウンタ スクリプトは、発信 INVITE メッセージのカウンタ パラメータを 1 だけ増やします。

元の着信メッセージ

INVITE sip:3002@10.10.10.53:5060 SIP/2.0^M
Via: SIP/2.0/TCP 10.10.10.51:5060;branch=z9hG4bK4b8a7eea6b41^M
From: <sip:1003@10.10.10.51>;tag=130169~d434b1d7-c1e3-44e7-a77e-abf211d2682e-26620367^M
To: <sip:3002@10.10.10.53>^M
Date: Fri, 04 Nov 2011 14:51:39 GMT^M
Call-ID: 7ef45500-eb31fbfb-3ec2-330a0a0a@10.10.10.51^M
Supported: timer,resource-priority,replaces^M
Min-SE: 1800^M
User-Agent: Cisco-CUCM8.6^M
Allow: INVITE, OPTIONS, INFO, BYE, CANCEL, ACK, PRACK, UPDATE, REFER, SUBSCRIBE, NOTIFY^M
CSeq: 101 INVITE^M
Expires: 180^M
Allow-Events: presence, kpml^M
Supported: X-cisco-srtp-fallback^M
Supported: Geolocation^M
Call-Info: <sip:10.10.10.51:5060>;method="NOTIFY;Event=telephone-event;Duration=500"^M
Cisco-Guid: 2129941760-0000065536-0000000148-0856295946^M
Session-Expires: 1800^M
Diversion: <sip:1001@10.10.10.51>;reason=no-
answer;privacy=off;screen=yes;counter=2,<sip:1006@10.10.10.51>;reason=no-
answer;privacy=off;screen=yes^M
P-Asserted-Identity: <sip:1003@10.10.10.51>^M
Remote-Party-ID: <sip:1003@10.10.10.51>;party=calling;screen=yes;privacy=off^M
Contact: <sip:1003@10.10.10.51:5060;transport=tcp>^M
Max-Forwards: 69^M
Content-Length: 0^

発信メッセージ

転送カウンタ スクリプトの実行後の発信メッセージに対する変更は、太字で示しています。

IINVITE sip:1005@10.10.10.51:5060 SIP/2.0^M
Via: SIP/2.0/TCP 10.10.10.53:5060;branch=z9hG4bK1d64062fa6f^M
From: <sip:1003@10.10.10.53>;tag=18448~94147210-61b5-4d32-a08d-5daf91ec321b-27003595^M
To: <sip:1005@10.10.10.51>^M
Date: Fri, 04 Nov 2011 14:51:44 GMT^M
Call-ID: 81ef4580-eb31fc00-e2-350a0a0a@10.10.10.53^M
Supported: timer,resource-priority,replaces^M
Min-SE: 1800^M
User-Agent: Cisco-CUCM8.6^M
Allow: INVITE, OPTIONS, INFO, BYE, CANCEL, ACK, PRACK, UPDATE, REFER, SUBSCRIBE, NOTIFY^M
CSeq: 101 INVITE^M
Expires: 180^M
Allow-Events: presence, kpml^M
Supported: X-cisco-srtp-fallback^M
Supported: Geolocation^M
Call-Info: <sip:10.10.10.53:5060>;method="NOTIFY;Event=telephone-event;Duration=500"^M
Cisco-Guid: 2179941760-0000065536-0000000121-0889850378^M
Session-Expires: 1800^M
Diversion: <sip:3002@10.10.10.53>;reason=no-
answer;privacy=off;screen=yes;counter=3,<sip:1006@10.10.10.51>;reason=no-
answer;privacy=off;screen=yes^M
P-Asserted-Identity: <sip:1003@10.10.10.53>^M
Remote-Party-ID: <sip:1003@10.10.10.53>;party=calling;screen=yes;privacy=off^M
Contact: <sip:1003@10.10.10.53:5060;transport=tcp>^M
Max-Forwards: 68^M
Content-Length: 0^M