[Japanese version] [English version]

SSIP コミュニケータ

著: 金田 泰

SSIP コミュニケータは GUI ベースでチャットができる,みじかい Java のプログラムです. プロトコルと通信プログラムの学習のためにつかうことを意図しています. まずプログラムをうごかしてみてください. そして興味があれば,なかをのぞいてみてください. ここでは SSIP というプロトコルと SSIP コミュニケータの 使用法構造などに ついて説明します. また,SSIP の問題点とその可能な解決策などについても ふれます.

はじめに

通信プログラムの初歩的な演習問題としては,ソケットをつかったかんたんな プログラムがつかわれます. でも,それだけではあまりあそべなくて,おもしろく ありません. そして,そのトイ・プログラムと実際につかわれる通信プログラム とのあいだにはおおきなギャップがあります. かといって,実用的なプロトコルを つかったプログラムを演習につかうのはむちゃだとおもわれます. このギャップをうめたいとおもってつくったのが SSIP コミュニケータです. SSIP コミュニケータは IP 電話などで最近よくつかわれるようになった SIP (Session Initiation Protocol) という標準プロトコルに似たずっとかんたんな 独自プロトコルである SSIP (Simple Session Initiation Protocol) を使用し, かんたんな GUI (Graphical User Interface) によってテキスト・チャット (文字をつかった会話) の実験ができる通信プログラムです.

インターネットのプロトコル

SSIP は UDP/IP (または TCP/IP) というインターネットのプロトコルのうえに きずかれています. したがって,SSIP を理解するためには IP (Internet Protocol) と UDP (User Datagram Protocol) や TCP (Transmission Control Protocol) について最低限の理解をしておくことが必要です.

IP はインターネットや IP ネットワーク (IP を使用するネットワーク) における基本のプロトコルであり,インターネットのプロトコル全般を標準化 している IETF (Internet Engineering Task Force) という組織によって 標準化されています. IP はパケット交換にもとづくネットワークで つかわれるので,「IP パケット」 とよばれる形式のパケットがつかわれます. IP パケットは他の種類のパケットと同様にヘッダとペイロード (データ部) とで構成されています. IP ネットワークにおいては通常,各コンピュータが 1 個ずつ IP アドレスと よばれる 32 bit (IPv4 のとき) または 128 bit (IPv6 のとき) のアドレスを もっています. IP パケットのヘッダには送信元・受信元の IP アドレスが ふくまれています.

UDP は IP の上位プロトコルのひとつです. すなわち,IP の機能を利用して,より高度な機能を付加しています. UDP も IETF によって標準化されています. UDP のパケットは IP パケットのペイロードにふくまれます. 1 台のコンピュータによって複数の通信がくべつできるようにするため, UDP においては 「ポート」 という 16 bit の正の整数値を使用します. 送信元,受信元それぞれに対してポートを指定することができます.

IP ネットワークのひとつの特徴は,通信路の途中でパケットがうしなわれても, かならずしも回復する必要がないということです. UDP はうしなわれた パケットを回復する機能はもっていないので,UDP を使用する通信において 信頼性が必要とされるときは,うしなわれたパケットを再送する機能を追加する 必要があります. しかし,アプリケーションごとにこのような機能を実装する のはむだなので,信頼性をたかめるために必要なパケット再送などの機能を もたせたプロトコルである TCP (Transmission Control Protocol) が IETF において標準化されています. TCP も UDP と同様に IP に機能を付加する かたちで構成されています. TCP においては通信開始前に相手と接続 (connect) し,通信終了時に接続を きります. これは電話で話をするときには相手をよびだすようなものです. 接続しているあいだはパケットが相手にとどくことが保証されますが,そのかわり 遅延時間は保証されないので,リアルタイム通信には不向きです. TCP においても UDP と同様にポートを指定することができます.

SIP (Session Initiation Protocol) はおもに IP 電話や会議システムのような 双方向性のある通信を制御するためにつくられ,IETF で標準化されたプロトコルです. Web でつかわれている HTTP (Hyper-Text Transfer Protocol) ににせて つくられています. SIP によって チャットのテキストもおくることができますが,基本的には通信のコンテンツは べつのプロトコルによっておくります. SIP によっておくられるのは 通信の開始・終了の宣言,通信につかわれるプロトコルやメディアの型 (コーデックなど) などの情報です. SIP の下位のプロトコルとしては TCP または UDP がつかわれます.

SSIP -- 対話のためのおもちゃプロトコル

SIP はさまざまな通信制御に関する要求にこたえられるようにつくられている ため,その仕様はかなりおおきく複雑になっています. SIP の仕様書である RFC 3261 は 269 ページあり,ほかにも関連のドキュメントが多数あります. 初心者はもちろんそれをすべて読む必要はありませんが,それにしても SIP をつかったプログラムを書くことはもちろん,そのしくみや アプリケーション・プログラムを 理解するのもかならずしも容易なことではありません. [SSIP sequence]

そこで,初心者でも理解できるように SIP にちかいがずっとかんたんな プロトコルとして SSIP (Simple Session Initiation Protocol) を 著者が独自につくりました. SIP の要求メッセージの種類 (メソッド) として INVITE, BYE, MESSAGE があり,それらに対する応答のための メッセージとして OK (200 OK) がありますが,SSIP ではメッセージは INVITE, BYE, MESSAGE, OK という 4 種類だけです. また,SIP や HTTP とはちがって要求メッセージと応答メッセージというくべつはありません.

SSIP の基本通信シーケンスは右図のとおりです. つまり,A が B と対話したいときは,まず A から B に INVITE という メッセージをおくります. B が A に OK という返事をかえすと対話が 成立します (つまり,電話のように "接続" されます). 接続された 状態では A から B へ,また B から A へ,自由にテキスト・メッセージをおくる ことができます. (SIP の MESSAGE メソッドとはちがって,INVITE メッセージをおくって接続しなければ MESSAGE メッセージをおくることはできません.) 対話をおわるときは A から B へ,または B から A へ,BYE メッセージを おくります. それによって,接続がきられます.

[SSIP transition] SSIP による通信における状態遷移は右図のようになっています. 基本の状態は Disconnected, Calling, Ringing, Connected の 4 状態です. 初期状態は Disconnected ですが,Call ボタンがおされると INVITE メッセージを送出して Calling 状態に遷移します. そこで相手から OK メッセージをうけとると Connected 状態に遷移します. あるいは, Disconnected 状態において INVITE メッセージを受信すると Ringing 状態に遷移します. そこで Answer ボタンがおされると OK メッセージを 送出して Connected 状態に遷移します. Connected 状態において MESSAGE メッセージを受信しても Connected 状態のままですし, Send ボタンがおされても MESSAGE メッセージを送出しますが 状態は Connected のままです. また,Connected, Calling または Ringing 状態において BYE メッセージを受信すると Disconnected 状態に遷移しますし, Hung ボタンがおされても BYE メッセージを送出して Disconnected 状態に遷移します.

SSIP コミュニケータの使用法

SSIP コミュニケータのプログラムは http://www.kanadas.com/ssip/ssip.zip においてあります. ここからダウンロードして,解凍してつかってください. つかうためには J2SE (Java 2 Standard Edition) (1.3 版以上?) が必要です. もしまだインストールしてなければ (2004 年はじめであれば) J2SE 1.4.2 をインストールしてから使用してください. LAN やインターネットなどの IP ネットワークでつながっている複数の コンピュータのそれぞれにインストールすれば,そのあいだで通信する ことができます. (ただし,あいだにファイアウォールや NAT (Network Adress Translator) などがあると通信できません.)

SSIP コミュニケータを Microtoft Windows 上で起動するには, 上記の ZIP ファイルを展開してえられる ssip.bat というバッチ・ファイルを マウスでダブルクリックするか,またはコマンド・プロンプトでこの ファイルがあるディレクトリに移動してから ssip と入力します. (ただし,J2SE の java.exe があるディレクトリが実行パスにはいって いる必要があります.) このファイルをみれば,Linux, Solaris など,他のプラットフォームで 起動する方法もわかるでしょう.

[Example] SSIP コミュニケータを使用した通信の例を右図にしめします. SSIP コミュニケータが起動すると右図のようなウィンドウが表示されます. ここでは A と B がそれぞれ自分のパソコンで SSIP コミュニケータを 起動したと仮定します. また,A のパソコンの IP アドレスは 133.144.4.246,B のパソコンの IP アドレスは 133.144.4.99 だと 仮定します. この例ではまず A が B のパソコンの IP アドレスを 指定して Call ボタンをおします. ここでもし B のパソコンにホスト名が あれば,ホスト名で指定することもできます. (SIP とはちがって, ユーザ ID を指定するのではなくて端末 (コンピュータ) を指定して 通信します.) すると INVITE メッセージが B のパソコンにおくられて, ウィンドウ上に Ringing: ... (相手のアドレス) というメッセージが表示されます. B が Answer ボタンをおすと,A のパソコンに OK メッセージがおくられて, A, B 両方のパソコンに Connected to ... (相手のアドレス) というメッセージ が表示されます. これで自由に MESSAGE メッセージをつかってテキストが おくれるようになりますが, ここでは A から B に Hello! というメッセージをおくっています. 接続をきるのも A, B どちからからでもできますが,ここでは A が Hung ボタンをおして BYE メッセージをおくって切断しています.

SSIP コミュニケータの構造

[SSIP stack] SSIP コミュニケータは Java で記述され,600 行くらいです. プログラム 全体をみることができるように,できるだけみじかくなるようにしています. プロトコルは通常,IP-UDP-SIP というように階層的につくられているので, それを実装するプログラムも階層的になります. プログラムがつみかさなる (スタックする) ので,このようなプログラムのことを通信の世界では 「プロトコル・スタック」 とよびます. SSIP のプロトコル・スタックは右図のような構造をしています. つまり,IP 層のうえに TCP または UDP の層があり,これらは Java にくみこまれています. そして,TCP / UDP と SSIP とのあいだにうすい層 (付加機能がちいさいプログラム) があります. このプロトコルにはなまえはありませんが,Java のインタフェース (クラスを抽象化したもの) SocketIOStream によって表現されています. SSIP プロトコルは SsipProvider というクラスによって実装されています. SsipProvider を使用するクラスは SsipListener というインタフェースを 実装する (SsipListener において宣言された 4 個のメソッドをもつ) 必要があります. SSIP コミュニケータにおいては Main というクラスが GUI を定義し,そこで指定される通信を SsipProvider をつかって実現しています.

Main クラスのなかで自分のポート (LocalPort) や相手のポート (RemotePort) を設定したり,ウィンドウやウィンドウ上のオブジェクトのおおきさを 設定したりすることができます. LocalPort と RemotePort にことなる値を指定すれば 1 台のコンピュータ上で SSIP コミュニケータを 2 つ起動してその間で通信することもできます (ただし,そのためには LocalPort と RemotePort の値がことなる 2 個の SSIP コミュニケータのコピーをつくる必要があります).

よりくわしくみると,SSIP コミュニケータはつぎのようなクラスによって 構成されています.

問題点と可能な解決策

SSIP は非常に単純なプロトコルなので,あまり実用的ではありません. そのため,SSIP コミュニケータにはリアルタイム通信をするうえでさまざまな 問題点や不便な点があります. それらをみつけて,その一部を SSIP コミュニケータを改造することによって解決してみるのが 通信プログラム入門のための演習問題としてよいのではないかとおもいます. (ただし,すべてを解決するのはとてもたいへんなので,すすめられません.) 問題点は多数ありますが,そのヒントをあげてみます.

これらの事実からどのような問題点が生じるか,また,ほかにどのような 問題点があるか,そして,それらはどうすれば解決することができるか, かんがえてみるとよいでしょう.

注意


金田 泰 (yasusi @ kanadas . com)
作成日 : 2003-12-30, 最終改訂日 : 2006-9-30