% DO NOT EDIT THIS FILE $OpenXM: OpenXM/doc/OpenXM-specs/ox-rfc-104.oxw,v 1.3 2004/10/14 07:05:21 takayama Exp $ OX-RFC: 104 Nobuki Takayama October 14, 2004 HTTP protocol で包むことによる OX-RFC 100 形式の通信方法 Status of this memo This is an experimental specification of sending OpenXM 100 packets over http (GET) and https. Distribution of this memo is unlimited. Copyright Notice OpenXM.org, 2004 @@要約 OpenXM 100 形式の通信を HTTP GET (または POST) で wrap する方法を定義 する. この wrapping により, 次のことを実現することを目標とする. 1. OpenXM 100 対応のサーバを容易に CGI サービス化する. 2. OpenXM のサービスを http を基本にグリッド化する. OpenXM 100 ではサーバを立ち上げるには "login" することが一般に必要である. OpenXM-100 over HTTP GET (以下 OoHG と略記) は次のように login不要, login必要の二つの動作モードをもつ. 1. 不特定人が一度のみの計算利用をするような場合に login 不要で動作する. 2. OpenXM 100 と同様に login して session を維持することも可能である. このメモでは HTTP GET (POST) と HTTPS しか既存技術は利用していない. Web 技術に関して現在研究中や実用化初期段階のさまざまなプロトコルを活用して このメモと同等かそれ以上のことを実現することは可能であろう. 我々は単純で必要十分な仕様を与えたいと思っている. その条件に合致する限り Web 技術に関して現在研究中や実用化初期段階の さまざまなプロトコルを活用することを否定するものではない. 別のアプローチも試みよりよいプロトコルを作っていきたい. @@OX-RFC-100 (OpenXM 100) 形式の通信の復習 OpenXM 100 およびその派生形式の通信は以下のような仕組みで行われる. client server ---------------- step 1 -----------------------> ssh による server への login. localhost では ox100start/ox などの launcher が直接起動される. controle server, engine server との接続を確立するための ポート番号および -control= ... , -data=... 認証方法および -authtype=NONE | <> 認証パスワード -passControl=... , -passData=... も送信される. 認証パスワードの暗号 -authEncoding=<> | file | RSA 化方法の指定. << >> は src/kxx/ox の標準値 <---------------- step 2 --------------------------> -reverse の場合は <--- の向きに TCP/IP 接続が確立される. そうでないときは ---> の向きに TCP/IP 接続が確立される. <---------------- step 3 --------------------------> -authtype=oneTimePassword の時. connect した側が accept した側へ oneTimePassword を送る. 以下 launcher の仕事は終了して, engine と control に制御が移る. <---------------- step 4 --------------------------> engine の byte order を設定. <----------------------------------------------------> OpenXM のパケット交換 詳しくは OX-RFC-100, OX-RFC 103 (OX-RFC 100 補遺) を見よ. @@OoHG のデータ形式. OoHG での通信は送信, 受信で非対称である. GET を利用するためデータの形式は RFC 2396 で指定されている いわゆる URL エンコーディング方法を用いる. GET の利用の代わりに POST method を利用してもよい. 送信データは キーワード = 値 を & で区切ったものである. キーワードは英数字と _ をもちいるものとする. キーワードと値の組は入れ子構造となってもよい. 受信データは次の形式で送信する. OX100-OVER-HTTP-GET0-に下のキーワードをつないだもの : URL エンコードされた値 以下キーワードを列挙する. oxMessageBody: OpenXM のパケット. 複数の OX パケットを一度に送ってよい. oxMessageEncoding: OpenXM のパケットの encoding 方法の指定. <> が省略時の値. 方法は以下のとおり. 1. xml_ox100 (OX-RFC100 に定義された XML 表現) 2. lisplike_ox100 (OX-RFC100 に定義された Lisp風表現) 3. binary_ox100 (OX-RFC100 に定義された binary 表現) 4. text_executeString_popString これは一度のみの実行を想定している. executeString に与える引数を text 形式で与える. 補助的な値として次のものがある. a. 3DES Body を 3DES で暗号化する. b. RSA Body を RSA で暗号化する. なお oxMessageEncoding キーワードの値は二つ以上存在して よい. この場合 and として扱われる. たとえば oxMessageEncoding=xml_ox100,3DES の場合 xml_ox100 形式の情報が 3DES で暗号化されて 送られる. ("," は URL encoding される.) dataChannelId: data ポートの番号に相当. controlChannelId: control ポートの番号に相当. sessionKeyFor3Des: 64 bit x 3 3Des 用の Des Key. サーバ側が生成し, RSA で暗号化されサーバより送信される. channelKey: サーバより一つ前の HTTP トランズアクションで与えられる キー. 第3者が session に割り込むのを禁止するため. 10 桁以上の数字で与える. サーバが与えるキーは nextChannelKey (Cookie に相当). (ネットワークが盗聴されているときは, この方法は無力である. https か 次の channelKeyIn3Des, nextChannelKeyIn3Des を用いるべきである.) channelKeyIn3Des: 3Des で暗号化された channelKey. nextChannelKeyIn3Des: 3Des で暗号化された nextChannelKey. responseEncoding: サーバの返答の encoding 方法. 省略時には oxMessageEncoding に対応した方法で 本体部分は送られる. nextChannelKey 等の情報は特に指定しない場合 OX100-OVER-HTTP-GET-nextChannelKey: による header を用いた返答を行う. text_execute_popString の時は text 形式で送信される. 詳細後述. その他. 1. presentation_html loginRSA: RSA 認証による login. challenge , challenge-response は お互いの public key を用いて送信される. 下の例参照. RSA については OX-RFC-103 を見よ. logout: logout sessionTimeOut: controlChannelKey: nextControlChannelKey: challenge: challenge-response: 以下のキーワードについては後述. doSignature: response-doSignature: getMathCap2: grepDirectoryInfo: sendPublicKey: @@始めての例 例1. fctr(x^2-1); を fctr.cgi へ送信する. http://fctr.openxm.org/fctr.cgi?oxMessageBody=fctr(x%5E2-1)%3B oxMessageBody 以外の全てのキーワードが省略されているので, anonymous, 1 回のみの実行, executeString & popString, 返答は text 形式 となり [[1,1],[x-1],[x+2]] が戻る. 例2. 同じ問題を session を確立してから実行する. URL encoding 部分は " ... " で記述. RSA 暗号化されてる部分は ' ... 'で記述. ---> http://fctr.openxm.org/fctr.cgi?loginRSA="takayama@hoge.org" <--- OX100-OVER-HTTP-GET-controlChannelId: 4010 OX100-OVER-HTTP-GET-dataChannelId: 4011 OX100-OVER-HTTP-GET-challenge: '.............' ---> http://fctr.openxm.org/fctr.cgi?chanllenge-response='..........' <--- OX100-OVER-HTTP-GET-nextChannelKey: 143245 OX100-OVER-HTTP-GET-nextControlChannelKey: 534256 ---> http://fctr.openxm.org/fctr.cgi?dataChannelId=4011& channelKey=143245& oxMessageEncoding="lisplike_ox100"& responseEncoding="text" oxMessageBody="(OX_DATA,(CMO_STRING,\"fctr(x^2-1);\")) (OX_COMMAND,(SM_executeString)) (OX_COMMAND,(SM_popString))" <--- Content-Type: text/plain OX100-OVER-HTTP-GET-nextChannelKey: 345137 [[1,1],[x-1],[x+2]] ---> http://fctr.openxm.org/fctr.cgi?dataChannelId=4011& channelKey=345137& logout& @@エラーコード一覧. HTTP 準拠のエラーの他, CMO エラー object を responseEncoding に従い 送る. << 以下まだ検討してない >> @@コントロールプロセスとの通信 接続中の connection が切断された場合, エンジン, コントロールサーバともに 終了する. コントロールサーバに中断メッセージを送った場合, OX-RFC-103 の中断動作 をおこなう. << 以下まだ書いてない >> @@ホストのなりすましの防止 https を利用する場合はサーバが偽物でないことの証明は https の機能を用いて 実現される. http の場合には RSA public キーを用いてサーバが偽物でない ことを証明することが可能である. このためのキーワードが doSignature である. doSignature=anonymous@fctr.openxm.org,'challenge words encrypted' 'challenge words encrypted' は anonymous@fctr.openxm.org の public key を用いて RSA 暗号化される. サーバは response-DoSignature キーワードを用いて送られた words をクライアントに戻す. @@OpenXM grid のサービス一覧提供方法. @@@mathCap2 mathCap2 は キーワード = 値 形式で表現された mathCap である. キーワードは以下のとおり. systemName systemVersion acceptOXtags acceptSMtags acceptCMOtags exportedCommands 実行可能な関数名 値は [名前,引数の数,引数1のデータ型, 引数2のデータ型, ...] 形式のリストである. 引数の数が -1 の場合引数は不定. 引数のデータ型は省略してもよい. データ型の表現方法は XML name space の表記方法を用い, 文字列型で戻す. なおPolymorphic な関数の場合は同じ関数名で表記してかまわない. 例: ["gcd", 2, "", "" ] resourceLimit [time,値], [memory,値] 等の リスト 注意: systemName, systemVersion, acceptOXtags, acceptSMtags, acceptCMOtags は現在の MathCap の戻す情報にほかならない. 注意: ある一定のサーバでは変数に格納されたデータも関数として取り出す systemName は Java の package の命名方法の真似をする. 例: org.openxm.ox_sm1 org.openxm.ox_polymake_2 @@@SM_getMathCap2 SM_printMathCap2 はそのサーバの mathCap2 を CMO データとして戻す 新しいスタックマシンコマンドである. 何らかのサービスを提供するサーバは (OX_COMMAND,(SM_getMathCap2)) (OX_COMMAND,(SM_popCMO)) が実行可能であるべきである. このコマンドは anonymous に実行を許す場合 もあるので, (OX_COMMAND,(SM_getMathCap2)) (OX_COMMAND,(SM_popCMO)) の省略形式が OoHG のキーワード getMathCap2=1 として用意されている. Example: http://fctr.openxm.org/fctr.cgi?getMathCap2=1 @@@ディレクトリサービス OpenXM grid のディレクトリサービスは各サーバの mathCap2 の情報をもとに している. 信用のおけるディレクトリサービスを実現するためには サーバの RSA public key が必須である. このキーがあると doSignature をもとにディジタル署名された mathCap2 情報を得ることが可能となる. OpenXM grid のディレクトリ情報は キーワード=値 の集合体である. この情報は次のいずれかの方法を用いて表現する. 1. キーワードを要素とする XML として表現. XML の根要素は OpenXMnode. OpenXMnode の集まりは OpenXMnodes. 2. CMO のリストとして キーワード, 値 のペアとして表現する. 必須のキーワード OpenXMnodeURL, mathCap2, listOfAnonymousPublicKeys OpenXM directory サーバはこれらの情報を検索して返答する. Directory サーバもまた OpenXM エンジンである. たとえば factor をキーワードとする grep 検索は以下のとおり. (OX_DATA,(CMO_STRING,"factor")) (OX_DATA,(CMO_INT32,1)) (OX_DATA,(CMO_STRING,"ox104_grepDirectoryInfo")) (OX_COMMAND,(SM_execute)) (XO_COMMAND,(SM_popCMO)) 同等な機能を実現する OoHG 用のキーワードとして grepDirectoryInfo がある. 例: grepDirectoryInfo="factor" @@@OX-104 Directory サービス Directory サーバはいわゆる agent の一種である. Directory サーバは個人のローカルマシンで動作させてよいが, ox-rfc-104 では anonymous な計算サービスの検索のため, いわゆる根となるべき directory server を以下のように定義する. URLは以下のとおり. http://ox104_directory.openxm.org/cgi-bin/ox104_directory.sh http://ox104_directory.math.kobe-u.ac.jp/cgi-bin/ox104_directory.sh http://ox104_directory.math.kyushu-u.ac.jp/cgi-bin/ox104_directory.sh http://ox104_directory.s.kanazawa-u.ac.jp/cgi-bin/ox104_directory.sh OX-server ox104_directory は次の関数をもつ. 1. ox104_findSystem(String systemName) ox サーバを検索して戻す. 見付けたものを (cmo) リストとする. 例: ox104_findSystem("org.openxm.ox_polymake_2"); [server= [url="http://polymake.math.kobe-u.ac.jp/cgi-bin/cgi-polymake.sh", protocol="org.openxm.ox-rfc-104", description="CGI 版の polymake サーバ. Version 2 ベース", version="??", loadAverage=0, cpuType=, memory=, anonymous=]] なお directoryServer=[...] として情報が戻る場合は, あらためてそのサーバに聞く必要がある. 例: ox104_findSystem("org.openxm.ox_sm1"); [localServer= [path="/usr/local/OpenXM/bin/ox_sm1", protocol="org.openxm.ox-rfc-100" ]] 2. ox104_grepDirectoryInfo(String key) 情報を grep して該当するサーバを戻す. OX-server ox104_directory は cash 機能を持つべきである. サーバは機能の制限をしている場合がある. その場合サーバに mathcap2 を問い合わせる必要がある. @@@システム名のリスト org.openxm.ox_polymake_2 org.openxm.ox_asir org.openxm.ox_sm1 << It has not yet been completed. >> @@@anonymous@host の RSA public key の入手方法 anonymous@host の RSA public key は別の信頼できる情報源から入手するか, "host" にたいして sendPublicKey="anonymous@host" 要求を出すことにより入手する. << 以下, まだ検討してない >> @@共通関数名 名前 引数の数 ox104_equal 2 ox104_add 2 ox104_sub 2 ox104_times 2 ox104_divide 2 ox104_power 2 ox104_inverse 1 ox104_translate 2 @@関連する技術 IAMC (symbolicnet.org) @@貢献者および試験実装 まだサンプル実装はない. @@参考文献 [OpenXM-RFC-100] Design and Implementation of OpenXM Client-Server Model and Common Mathematical Object Format. M.Noro, N.Takayama [OpenXM-RFC-101] Protocol to Start Engines. K.Ohara [OpenXM-RFC-103] Supplement to OX-RFC-100 --- Broadcasting in process trees and engine authentication. OpenXM committers. [RFC1945] Hypertext Transfer Protocol -- HTTP/1.0. T. Berners-Lee, R. Fielding, H. Frystyk. May 1996. (Format: TXT=137582 bytes) (Status: INFORMATIONAL) [RFC2660] The Secure HyperText Transfer Protocol. E. Rescorla, A. Schiffman. August 1999. (Format: TXT=95645 bytes) (Status: EXPERIMENTAL) $Id: ox-rfc-104.oxw,v 1.14 2004/10/14 07:03:55 taka Exp $