220 likes | 463 Views
分散システム特論. RPC:Remote Procedure Call Protocol Specification. 情報工学専攻 修士課程一年 谷口秀夫研究室 石井 陽介. 発表手順. (1)参照RFCについて. (2)RFC1050の構成. (3)RPCとは. (4)RPCプログラム作成の流れ. (5)RPCの利用例(NFS). (6)まとめ. 参照RFCについて. ・ RFC1050 (RPC) ・RFC1057 (RPC:Version2) ・RFC1831 (RPC:Version2)Standard Track ・RFC1014 (XDR)
E N D
分散システム特論 RPC:Remote Procedure Call Protocol Specification 情報工学専攻 修士課程一年 谷口秀夫研究室 石井 陽介
発表手順 (1)参照RFCについて (2)RFC1050の構成 (3)RPCとは (4)RPCプログラム作成の流れ (5)RPCの利用例(NFS) (6)まとめ
参照RFCについて ・RFC1050 (RPC) ・RFC1057 (RPC:Version2) ・RFC1831 (RPC:Version2)Standard Track ・RFC1014 (XDR) ・RFC1832 (XDR)Standard Track
RFC1050の構成 1. Introduction 2. Terminology 3. The RPC Model 4. Transports and Semantics 5. Binding and Rendezvous Independence 6. Authentication 7. RPC Protocol Requirements 8. The RPC Message Protocol 9. Authentication Protocols 10. Record Marking Standard 11. The RPC Language Appendix: Port Mapper Program Protocol
RPCとは RPC(Remote Procedure Call)(遠隔手続き呼び出し) ・処理要求全体を一つの手続き呼び出しとみなして実行する 「プロセス間通信」の方法の一つ ・NFS、NISなどで利用 ・代表的な実装(SunRPC、DCE RPC、CORBA etc.) RPCの特徴 (1)クライアント・サーバモデル (2)普通の手続き(関数)呼び出しと似た方法で通信可能 (3)コネクションが作られない (4)同期式通信(非同期も可) RPCにおける「遠隔(remote)」の概念 「別のコンピュータ」 「別のアドレス空間」
RPCの動作 クライアント サーバ クライアント側プログラム サーバ側プログラム クライアント側スタブ サーバ側スタブ ネットワークインタフェース (TCP/IP,UDP/IP etc.) ネットワークインタフェース (TCP/IP,UDP/IP etc.)
RPC実現のためには (1)RPCサービスの特定 (2)RPC利用時に必要な情報 (3)データ交換形式 (4)セキュリティ機能 (5)RPCメッセージの形式 (6)RPCで利用する手続きの定義
RPCサービスの特定 三つの番号によりサービスを特定 (1)プログラム番号: (2)バージョン番号: (3)プロシージャ番号: 提供サービスを識別 サービス毎のバージョンを識別 実行可能な手続きを識別 プログラム番号の割当て 0x0 - 0x1fffffff Sunが定義 0x20000000 - 0x3fffffff ユーザが独自に利用可能 0x40000000 - 0x5fffffff APが動的に利用可能 0x60000000 - 0x7fffffff reserved 0x80000000 - 0x9fffffff reserved 0xa0000000 - 0xbfffffff reserved 0xc0000000 - 0xdfffffff reserved 0xe0000000 - 0xffffffff reserved
RPC利用時に必要な情報 ・RPC利用時に必要な情報 (1)プログラム番号 (2)バージョン番号 (3)プロシージャ番号 ・通信に必要な情報 (4)サーバマシンのIPアドレス (5)サーバプログラム(利用サービス)のポート番号 ・動作ホスト上で動的にポート番号を割当てる サーバプログラムポート番号 対応関係を管理するサービス portmap
portmapサービス portmapサービスの特徴 (1)プログラム番号100000を持つ (2)ポート番号が固定されている ・TCP/IP、UDP/IPのポート111番 portmapサービスの機能 (1)PMAPPROC_SET: サーバプログラムに対応するポートの登録 (2)PMAPPROC_UNSET: サーバプログラムに対応するポートの登録解除 (3)PMAPPROC_GETPORT: サーバプログラムに対応するポート番号の獲得 (4)PMAPPROC_DUMP: portmapが持つ情報一覧の獲得 (5)PMAPPROC_CALLIT: 手続き呼び出し(ブロードキャスト時に利用)
portmapを利用したRPCの様子 RPCサービス起動時 RPCサービス呼び出し時 (port XXX) サーバプログラム (port 111) portmap (port 111) portmap (1)ポート番号 問い合わせ (3)RPC 呼び出し ポートの 登録要求 利用可能ポートの 登録 (4)RPC 実行結果 (2)ポート番号 返答 クライアントプログラム サーバプログラム
データ交換形式 異なるマシン間でのデータのやり取り ・エンディアン問題を解決する必要がある RPCにおける解決法 ・XDR(External Data Representation Standard) というデータ交換形式を利用(ref.RFC1014 RFC1832) マシンAにおける データ形式 マシンBにおける データ形式 XDR marshaling unmarshaling
セキュリティ機能 RPCで提供される認証方式(ユーザ認証方式) RPCメッセージのヘッダ部内に登録 (1)AUTH_NONE ・無認証(誰でもサービスが利用可能) (2)AUTH_UNIX(AUTH_SYS) ・UNIXにおけるユーザ情報を利用した認証 (ユーザID、グループID、ホスト名 etc.) (3)AUTH_DES ・DES暗号方式を利用した認証 (公開鍵暗号、秘密鍵暗号) ・ ・ ・ 認証方式はRPC実行前にクライアント側で設定 ・認証方式の変更: クライアントプログラムの変更 ・新たな認証方式の採用: サーバプログラムも変更
RPCメッセージの形式(呼び出し時) トランザクション識別子 xid mtype メッセージタイプ(CALL/REPLY) RPCバージョン番号(=2) rpcvers プログラム番号 prog バージョン番号 vers プロシージャ番号 proc auth_flavour 認証方式 cred クライアント側(credential) 認証情報 body auth_flavour 認証方式 verf サーバ側(verifier) 認証情報 body ・ ・ ・ サービス固有の引数
RPCメッセージの形式(accept返答時) トランザクション識別子 xid mtype メッセージタイプ(CALL/REPLY) 返答状態(ACCEPTED/DENIED) reply_stat auth_flavour 認証方式 verf サーバ側(verifier) 認証情報 body accept_stat 受け付け状態(SUCCESS/ PROG_MISMATCH/...) ・ ・ ・ サービス固有の処理結果
RPCで利用する手続きの定義 ・RPC言語を用いて利用する手続きのインタフェースを定義 XDRを拡張したもの ・手続き本体(クライアント/サーバ)は別に記述 ・定義例(portmap) 手続きの引数の型 program PMAP_PROG { version PMAP_VERS { void PMAPPROC_NULL(void) = 0; bool PMAPPROC_SET(mapping) = 1; bool PMAPPROC_UNSET(mapping) = 2; unsigned int PMAPPROC_GETPORT(mapping) = 3; pmaplist PMAPPROC_DUMP(void) = 4; call_result PMAPPROC_CALLIT(call_args) = 5; } = 2; } = 100000; 手続きの 戻り値の型 プロシージャ番号 バージョン番号 プログラム番号
RPCプログラムの作成 ユーザが作成するもの (1)クライアント側メインプログラム(XYZ_client.c) (2)サーバ側で呼び出されるプログラム(XYZ_server.c) (3)RPC言語による定義(XYZ.x) 自動生成されるもの(% rpcgen XYZ.x により生成) (4)RPCプログラムで利用するヘッダファイル(XYZ.h) (5)クライアント側スタブプログラム(XYZ_clnt.c) (6)XDRを利用するための手続き(XYZ_xdr.c) (7)サーバ側メインプログラムとディスパッチ手続き(XYZ_svc.c) (1)~(7)のファイルよりロードモジュールを作成 (A)XYZ_client (B)XYZ_server
RPCプログラム作成の流れ ユーザが 作成 XYZ_client.c XYZ.x XYZ_server.c rpcgen により生成 XYZ_clnt.c XYZ.h XYZ_xdr.c XYZ_svc.c XYZ_clnt.o XYZ_xdr.o XYZ_svc.o XYZ_server.o XYZ_client.o XYZ_client XYZ_server ロードモジュール
RPCの利用例 NFS(Version.3) ・FreeBSD4.3‐RELEASEのソースコードを参照 ($SRC = http://www.jp.FreeBSD.org/cgi/cvsweb.cgi/src/) ・RPC言語によるNFSのためのインタフェース定義 : /usr/include/rpcsvc/nfs_prot.x ($SRC/include/rpcsvc/nfs_prot.x?rev=1.7) ・カーネル内に手続き本体(クライアント/サーバ)を記述 : $SYS/nfs/krpc_subr.c ($SRC/sys/nfs/Attic/krpc_subr.c?rev=1.13.2.1) : $SYS/nfs/nfs_serv.c ($SRC/sys/nfs/Attic/nfs_serv.c?rev=1.93) etc.
RPCを利用したNFSサービスの流れ NFSクライアント NFSサーバ ユーザAP システムコールインタフェース システムコールインタフェース カーネル VFSインタフェース VFSインタフェース UFS UFS NFSクライアント NFSクライアント RPC RPC DK DK
NFSで利用する手続きの定義 ・NFS(Ver.3)で定義されている手続きの数は22個 ・NFSのポート番号は2049番とあらかじめ決められている nfs_prot.x 内の記述(抜粋) const NFS_PORT = 2049; ... program NFS3_PROGRAM { version NFS_V3 { void NFSPROC3_NULL(void) = 0; GETATTR3res NFSPROC3_GETATTR(GETATTR3args) = 1; SETATTR3res NFSPROC3_SETATTR(SETATTR3args) = 2; LOOKUP3res NFSPROC3_LOOKUP(LOOKUP3args) = 3; ACCESS3res NFSPROC3_ACCESS(ACCESS3args) = 4; ... COMMIT3res NFSPROC3_COMMIT(COMMIT3args) = 21; } = 3; } = 100003;
まとめ (1)参照RFCについて (2)RFC1050の構成 (3)RPCとは (4)RPCプログラム作成の流れ (5)RPCの利用例(NFS)