スライド タイトルなし

分散システム特論
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