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