Title: ENUM対応SIP UAによる通話とプロトコル表示デモ Author(s): 菊地高広 (kick@wide.ad.jp) Date: 09/01/2004 1. 概要 WIDE ENUMトライアル実験の一貫として、2003年9月のWIDE研究会合宿において、 ENUM対応SIP User Agent (perl scriptによるソフトフォン)による 通話とプロトコル表示解説のデモを行なった。 ここではその目的ならびにデモにおけるプロトコル表示と解説を示す。 2. 目的と特徴 ENUMは電話番号をインターネットアドレス(URI)へと対応させる機構である[1]。 例えば、電話などのリアルタイムコミュニケーションの通信では、SIP URIが 用いられる。このSIPアドレス以外にも、メールアドレスやウェブアドレスなどを 自由にENUM機構で登録し、電話番号と対応づける用いることができる。これらの SIP以外の機能を用いて活用するには、ENUM解決をSIPサーバに任せる[2]のではなく、 UA自身がENUM解決をすることが望ましい。 SIP UAは指定されたSIPアドレスの相手へ通信をおこなうとき、自分では そのSIPアドレスの解決をせずに、SIP代理サーバに解決を任せることもできる。 しかし、その場合はどのSIP代理サーバに任せるかという問題があり、 あらかじめUAに登録しておいたり、誰かに必ず教えてもらう必要がある。 また、通信相手が通信可能な状況でも、それと直接関係ないSIP代理サーバとの 通信が不能であれば、影響を受けて通信ができなくなってしまう問題もある。 本UAでは、これらの問題に対応する目的と、ならびに、ENUMおよびSIPにおいて DNSを持ちいてどのように通信が行なわれるかという各プロトコルの挙動理解を 普及する目的から、以下の方針にてUAを設計作成してデモで用いた。 ・UA自身がENUM関係のDNSを自分で引いて処理を行なう ・UA自身がSIP関係のDNSを自分で引いて処理を行なう この方針により、UA自体は全く特定のホストやIPアドレスなどの情報を 設定として必要せずに、与えられた電話番号あるいはSIP URIの情報のみから、 DNSを用いて通信先の解決をおこなうことを実現している。 なお、今回はWIDE ENUMトライアル実験として、WIDEのENUMテストベッド[3]を 用いたため、UAとしては、e164.arpaの代わりにe164.wide.ad.jpを ENUM用ドメインの情報としてあらかじめ保持している。 また、今回の特殊事情として、実験で用いられたsip1.e164.wide.ad.jpドメインを 管轄するSIPサーバが、外からuser@sip1.e164.wide.ad.jp宛へのINVITEリクエストでも パスワード認証を必要とする形で用いられたため、通常本来ならば必要としない、 通信相手側の管轄SIPサーバのパスワード情報をあらかじめ持つ必要があった。 3. デモ環境 デモ環境としては、研究会合宿の一般ネットワークの上で行なわれ、 ENUMやSIPなどのDNS設定はWIDEのENUMテストベッド環境が用いられた。 作成して用いたENUM対応SIP UAとネットワーク接続の情報は以下の通りである。 使用機器: ThinkPad X30 + ヘッドセット 使用OS: FreeBSD 4.8-RELEASE 記述言語: Perl scriptで作成 ネットワーク: 研究会合宿の無線LAN利用 通信相手側はSIP対応でG.711による音声通信ができれば対応することができるが、 今回のデモにおいてはYAMAHAのRTに電話機を接続したものが用いられた。 4. デモ時のプロトコル画面表示と解説 今回のデモにおいては、ENUM対応SIP UAがまわりにない状況において、 電話番号指定にて通話がちゃんとできることを示すとともに、 まだ少数の人にしか知られていないENUMとSIPのプロトコルについて 実際どのようなしくみで行なわれるかを示すことも目的となっている。 ここでは、実際にデモ画面に出されたプロトコルシーケンスと その解説について、以下に簡単に示す。 4.1. 指定された電話番号から対応するURIへの解決 command> enum 9433-8351 WIDEのENUMトライアル実験用の電話番号9433-8351へと発信指示 >>> NAPTR 1.5.3.8.3.3.4.9.e164.wide.ad.jp 『9433-8351』をひっくり返した『1.5.3.8.3.3.4.9.e164.wide.ad.jp』で NAPTRレコードを問い合わせる (e164.wide.ad.jpはENUM用実験ドメイン) <<< NAPTR 10 20 "u" "E2U+email:mailto" "!^.*$!mailto:fujiwara@wide.ad.jp!" . <<< NAPTR 10 30 "u" "E2U+web:http" "!^.*$!http://www.wide.ad.jp/!" . <<< NAPTR 10 10 "u" "E2U+sip" "!^.*$!sip:fujiwara@sip1.e164.wide.ad.jp!" . NAPTRレコード3つ(メールとウェブとSIPアドレス)を得る --- SIP URI = sip:fujiwara@sip1.e164.wide.ad.jp ここではそのうちSIPアドレス『sip:fujiwara@sip1.e164.wide.ad.jp』を選択 4.2. 得られたSIP URIから対応するSIP通信先への解決 >>> NAPTR sip1.e164.wide.ad.jp <<< NAPTR 0 0 "s" "SIP+D2U" "" _sip._udp.sip1.e164.wide.ad.jp. OK: SIP NAPTR = _sip._udp.sip1.e164.wide.ad.jp (<= sip1.e164.wide.ad.jp) ドメイン部『sip1.e164.wide.ad.jp』によりSIP通信先の解決をはかる。 UDPでSIP利用可能なSRV用の『_sip._udp.sip1.e164.wide.ad.jp』が返る >>> SRV _sip._udp.sip1.e164.wide.ad.jp <<< SRV 0 0 5060 sip1.e164.wide.ad.jp. OK: SIP SRV = sip1.e164.wide.ad.jp/5060 (<= _sip._udp.sip1.e164.wide.ad.jp) 得られた『_sip._udp.sip1.e164.wide.ad.jp』でSRVを引き、 サーバホスト名『sip1.e164.wide.ad.jp』とポート番号『5060』を得る >>> AAAA/A sip1.e164.wide.ad.jp <<< AAAA/A 2001:240:2f:300::100 (<= sip1.e164.wide.ad.jp) サーバ『sip1.e164.wide.ad.jp』のIPアドレス『2001:240:2f:300::100』を得る 4.3. 得られたSIP通信先へのINVITEリクエストとセッション確立 >>> INVITE sip:fujiwara@sip1.e164.wide.ad.jp (Cseq 30165) [to 2001:240:2f:300::1 00/5060] 『sip:fujiwara@sip1.e164.wide.ad.jp』のINVITEリクエストを、 得られたSIP通信先のIPアドレスとポート番号の元へ投げる <<< 407 Proxy Authorization Required (CSeq 30165 INVITE) [from 2001:240:2f:300:: 100/5060] Proxy-Authenticate: Digest realm="WIDE ENUM WG", nonce="cfb897414240a0e91dd3 edbb2a2d7985", opaque="", qop="auth,auth-int", stale=FALSE, algorithm=MD5 >>> ACK sip:fujiwara@sip1.e164.wide.ad.jp (Cseq 30165) [to 2001:240:2f:300::100/ 5060] SIPサーバから認証エラーとチャレンジ情報が返る チャレンジ−レスポンス型なため、1回目は必ず一旦エラーとなる (今回は、たまたま、認証が必要な相手との通信例であることに注意) >>> INVITE sip:fujiwara@sip1.e164.wide.ad.jp (Cseq 30166) [to 2001:240:2f:300::1 00/5060] Proxy-Authorization: Digest username="wide", realm="WIDE ENUM WG", nonce="cf b897414240a0e91dd3edbb2a2d7985", opaque="", uri="sip:fujiwara@sip1.e164.wide.ad. jp", response="67feb09491f0a65fe7493f56109e5423" パスワードにより計算した認証データ付で再びINVITEを投げる <<< 180 Ringing (CSeq 30166 INVITE) [from 2001:240:2f:300::100/5060] 『180 Ringing』が返ってくる (通常は、180の前に『100 Trying』が入るが、SIPサーバが返さなかった) この状況では相手側の電話の呼び出しがずっと鳴っている <<< 200 OK (CSeq 30166 INVITE) [from 2001:240:2f:300::100/5060] 相手側で電話の受話器をとると、相手から『200 OK』がやって来る >>> ACK sip:fujiwara@sip1.e164.wide.ad.jp (Cseq 30166) [to 2001:200:0:ff20:2a0:d eff:fe11:7373/5060] 相手へACKを返し、これで通話のためのやりとりが成立する === RTP: 2001:200:0:ff20:205:3cff:fe06:2498/1139 <=> 2001:200:0:ff20:2a0:deff:fe 11:7373/5004 実際の通話の音声は、双方向のRTPによって実現される このRTPのための情報は INVITE/200 OK/ACKにおいてSDPで指定されている どのようなSDPがやりとりされたかは付録Aを参照のこと 4.4. 通話セッションの終了 <<< BYE sip:kick@[2001:200:0:ff20:205:3cff:fe06:2498]:5060 (CSeq 30) [from 2001: 240:2f:300::100/5060] 相手側にて受話器をおろして電話を切ると、BYEリクエストがやってくる >>> 200 OK (CSeq 30) [to 2001:240:2f:300::100/5060] XXX RTP nothing こちらから『200 OK』を返すことで、SIPのセション完了し、RTP(音声)も切られる 以上で、電話における通話が完了する 5. 参考文献 [1] "ENUMの概要", wide-draft-enum-enumsummary-03.txt [2] "SIPサーバのENUM機能", wide-draft-enum-report2003-sipserverenum-03.txt [3] "ENUMテストベッド", wide-draft-enum-report2003-enumtestbed-03.txt 6. 変更履歴 2004年1月 2003年度WIDE報告書向けに執筆 2004年9月 WIDE Draft向けに体裁更新 A. 付録: デモで行なわれたSIP部分のプロトコル完全版 >>> to 2001:240:2f:300::100/5060 INVITE sip:fujiwara@sip1.e164.wide.ad.jp SIP/2.0 Via: SIP/2.0/UDP [2001:200:0:ff20:205:3cff:fe06:2498]:5060 From: ;tag=1033192065 To: Call-ID: 6396cf26@[2001:200:0:ff20:205:3cff:fe06:2498] CSeq: 18848 INVITE Contact: Content-Type: application/sdp Content-Length: 177 v=0 o=- 1063085649 1063085649 IN IP6 2001:200:0:ff20:205:3cff:fe06:2498 s=- c=IN IP6 2001:200:0:ff20:205:3cff:fe06:2498 t=0 0 m=audio 1190 RTP/AVP 0 a=rtpmap:0 PCMU/8000 <<< from 2001:240:2f:300::100/5060 SIP/2.0 407 Proxy Authorization Required Call-ID: 6396cf26@[2001:200:0:ff20:205:3cff:fe06:2498] Content-Length: 0 CSeq: 18848 INVITE From: ;tag=1033192065 Proxy-Authenticate: Digest realm="WIDE ENUM WG", nonce="cfb897414240a0e91dd3edbb 2a2d7985", opaque="", qop="auth,auth-int", stale=FALSE, algorithm=MD5 To: ;tag=1063085753467 Via: SIP/2.0/UDP [2001:200:0:ff20:205:3cff:fe06:2498]:5060 >>> to 2001:240:2f:300::100/5060 ACK sip:fujiwara@sip1.e164.wide.ad.jp SIP/2.0 Via: SIP/2.0/UDP [2001:200:0:ff20:205:3cff:fe06:2498]:5060 From: ;tag=1033192065 To: Call-ID: 6396cf26@[2001:200:0:ff20:205:3cff:fe06:2498] CSeq: 18848 ACK Content-Length: 0 >>> to 2001:240:2f:300::100/5060 INVITE sip:fujiwara@sip1.e164.wide.ad.jp SIP/2.0 Via: SIP/2.0/UDP [2001:200:0:ff20:205:3cff:fe06:2498]:5060 From: ;tag=934803303 To: Call-ID: 475fe914@[2001:200:0:ff20:205:3cff:fe06:2498] CSeq: 18849 INVITE Contact: Content-Type: application/sdp Content-Length: 177 Proxy-Authorization: Digest username="wide", realm="WIDE ENUM WG", nonce="cfb897 414240a0e91dd3edbb2a2d7985", opaque="", uri="sip:fujiwara@sip1.e164.wide.ad.jp", response="67feb09491f0a65fe7493f56109e5423" v=0 o=- 1063085649 1063085649 IN IP6 2001:200:0:ff20:205:3cff:fe06:2498 s=- c=IN IP6 2001:200:0:ff20:205:3cff:fe06:2498 t=0 0 m=audio 1194 RTP/AVP 0 a=rtpmap:0 PCMU/8000 <<< from 2001:240:2f:300::100/5060 SIP/2.0 180 Ringing Call-ID: 475fe914@[2001:200:0:ff20:205:3cff:fe06:2498] Content-Length: 0 CSeq: 18849 INVITE From: ;tag=934803303 Server: SOFTFRONT-SIP-Proxy ($Revision: 1.100.2.7 $) To: ;tag=164723426 Via: SIP/2.0/UDP [2001:200:0:ff20:205:3cff:fe06:2498]:5060 <<< from 2001:240:2f:300::100/5060 SIP/2.0 200 OK Call-ID: 475fe914@[2001:200:0:ff20:205:3cff:fe06:2498] Contact: Content-Length: 189 Content-Type: application/sdp CSeq: 18849 INVITE From: ;tag=934803303 Record-Route: Server: SOFTFRONT-SIP-Proxy ($Revision: 1.100.2.7 $) To: ;tag=164723426 Via: SIP/2.0/UDP [2001:200:0:ff20:205:3cff:fe06:2498]:5060 v=0 o=- 3272074472 3272074472 IN IP6 2001:200:0:ff20:2a0:deff:fe11:7373 s=- c=IN IP6 2001:200:0:ff20:2a0:deff:fe11:7373 t=0 0 m=audio 5004 RTP/AVP 0 a=rtpmap:0 PCMU/8000 a=ptime:20 >>> to 2001:200:0:ff20:2a0:deff:fe11:7373/5060 ACK sip:fujiwara@sip1.e164.wide.ad.jp SIP/2.0 Via: SIP/2.0/UDP [2001:200:0:ff20:205:3cff:fe06:2498]:5060 From: ;tag=934803303 To: Call-ID: 475fe914@[2001:200:0:ff20:205:3cff:fe06:2498] CSeq: 18849 ACK Content-Length: 0 RTP: 2001:200:0:ff20:205:3cff:fe06:2498/1194 <=> 2001:200:0:ff20:2a0:deff:fe11:7 373/5004 <<< from 2001:240:2f:300::100/5060 BYE sip:kick@[2001:200:0:ff20:205:3cff:fe06:2498]:5060 SIP/2.0 Call-ID: 475fe914@[2001:200:0:ff20:205:3cff:fe06:2498] Content-Length: 0 CSeq: 30 BYE From: Max-Forwards: 69 Record-Route: Server: SOFTFRONT-SIP-Proxy ($Revision: 1.100.2.7 $) To: ;tag=934803303 User-Agent: YAMAHA RT56v Via: SIP/2.0/UDP [2001:240:2f:300:0:0:0:100];branch=z9hG4bK16ff67cf.1 Via: SIP/2.0/UDP [2001:200:0:ff20:2a0:deff:fe11:7373]:5060;branch=z9hG4bK4215059 335 >>> to 2001:240:2f:300::100/5060 SIP/2.0 200 OK Via: SIP/2.0/UDP [2001:240:2f:300:0:0:0:100];branch=z9hG4bK16ff67cf.1 Via: SIP/2.0/UDP [2001:200:0:ff20:2a0:deff:fe11:7373]:5060;branch=z9hG4bK4215059 335 To: ;tag=934803303 From: Call-ID: 475fe914@[2001:200:0:ff20:205:3cff:fe06:2498] CSeq: 30 BYE Content-Length: 0 Copyright Notice Copyright (C) WIDE Project (2004). All Rights Reserved.