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 Stub,Server Stub 又將傳送回去的參數轉換成 XDR 格式,並從事下層協定的呼叫來連接與傳遞給 Client Stub,Client Stub 再將參數由 XDR 格式轉換成 Client 端主機的格式,並傳遞給 RPC Client。在整個呼叫傳遞過程之中,都屬於同步傳輸方式(也就是 Blocking 方式),RPC Client 端會一直等待到有回應,才會再執行下一個步驟,否則便以計時器溢時(Time out)方式來中斷它。
圖 9-5 RPC 程序呼叫方式