TCP/IP 與 Internet 網路:第九章 RPC 高階程式介面  上一頁           下一頁

 

翻轉工作室:粘添壽

 

9-3 RPC 運作方式

RPC 運作方式可區分為兩大部份:RPC 連線方式和 RPC 程序呼叫方式,以下分別介紹之。

9-3-1 RPC 連線方式

9-4 RPC 連線方式的運作圖,它的基本架構是伺服端有一個超級服務程式(Portmap)監督 RPC 連線要求,並告知 Client 端遠端程序呼叫的程式是位於哪一個埠口,運作方式如下:

(1) 當伺服程式(RPC Server)啟動時,便向 Portmap 註冊本身的傳輸埠口位址(含 IP 位址)和伺服程式名稱。

(2) 客戶端如欲呼叫遠端程式,首先向伺服器的 Portmap 查詢遠端程式所連接的埠口位址。

(3) 客戶端得到遠端程式的埠口位址後,便可以直接透過該位址連結到遠端程式。

9-4 RPC 連線方式

        由以上的敘述得知,我們需要一個 Well-known 的傳輸埠口(Portmap),來隨時監督等待 Client 的連線要求,並告知服務程式的位址,這個 Well-known 傳輸埠口一般都設定在 111/udp 111/tcp 埠口上,它是屬於 /etc/services 描述檔中的 sunrpc 服務。至於 /etc/services 部分檔案內容如下:

# cat /etc/services

pop3     110/tcp         pop-3        # POP version 3

pop3     110/udp         pop-3

sunrpc    111/tcp         portmapper    # RPC 4.0 portmapper TCP

sunrpc    111/udp         portmapper    # RPC 4.0 portmapper UDP

auth      113/tcp         authentication tap ident

        portmapper 收到 RPC 連線要求時,會依照 /etc/rpc 內所描述的『程式號碼』(Program Number,尋找相對應的埠口位址。一般系統對於程式號碼的編排如下:

號碼 0x0 ~ 0x1FFFFFFF此範圍內保留給 Sun Microsystem 現有的呼叫程式使用。一般使用者不可使用此範圍號碼。

號碼 0x20000000 ~ 0x3FFFFFFF此範圍給一般使用者規劃自行的遠端程序呼叫。

號碼 0x40000000 ~ 0x5FFFFFFF暫時性(Transient)使用。

號碼 0x60000000 ~ 0xFFFFFFFF保留未用。

有關程式號碼的編排放置於 /etc/rpc 檔案內,其內容如下:(部分範例內容)

# cat /etc/rpc

#ident  "@(#)rpc1.11    95/07/14 SMI"   /* SVr4.0 1.2   */

#

#rpc

#

portmapper      100000  portmap sunrpc rpcbind

rstatd           100001  rstat rup perfmeter rstat_svc

rusersd          100002  rusers

nfs             100003  nfsprog

ypserv          100004  ypprog

mountd         100005  mount showmount

ypbind          100007

walld           100008  rwall shutdown

yppasswdd       100009  yppasswd

etherstatd        100010  etherstat

selection_svc     100015  selnsvc

database_svc      100016

 

bwnfsd          545580417

fypxfrd          600100069 freebsd-ypxfrd

sched            100019

9-3-2 RPC 程序呼叫方式

9-5 RPC 程序呼叫方式,也就是在 RPC 連線建立後如何執行程序呼叫的運作。從客戶端呼叫遠端程序到收取伺服端回應訊息,其中經過了Client Stub Server Stub 兩個基礎檔(Stub),Stub 主要的功能是處理連線雙方資料格式的轉換,一般標準傳輸資料格式都採用 XDR 格式。

Client 執行某一程序呼叫(clnt_call()),它經由 Client Stub 時,也許會產生許多網路的系統呼叫來實現它,這些系統呼叫主要是讓 Client Stub Server Stub 之間通訊使用,另外 Client Stub 也會將呼叫程序中的參數轉換成 XDR 格式。Server Stub 收到 Client 端訊息後,將呼叫程序的參數由 XDR 轉換成 Server 端主機的資料格式,再呼叫 RPC Server 上的遠端程序(如範例中的 add_1_svc())。遠端程序執行完成後,再將結果傳送給 Server StubServer Stub 又將傳送回去的參數轉換成 XDR 格式,並從事下層協定的呼叫來連接與傳遞給 Client StubClient Stub 再將參數由 XDR 格式轉換成 Client 端主機的格式,並傳遞給 RPC Client。在整個呼叫傳遞過程之中,都屬於同步傳輸方式(也就是 Blocking 方式),RPC Client 端會一直等待到有回應,才會再執行下一個步驟,否則便以計時器溢時(Time out)方式來中斷它。

9-5 RPC 程序呼叫方式

 

 

<GOTOP>