TCP/IP 與 Internet 網路:第九章 RPC 高階程式介面 上一頁 下一頁
9-2 RPC 協定架構
我們用 OSI 參考模型來介紹 RPC 的協定架構,也許會讓讀者比較容易瞭解,說明如下:(如圖 9-3 所示)
※ 應用層:也就是我們一般發展的應用程式,譬如,Client/Server 資料庫伺服器。
※ 表現層:在不同主機上,對於抽象資料型態(Abstract Data Type)的表示法也許會有所不同。如果 Client/Server 的資料表示法不同,當它們執行呼叫遠端程序時,很容易發生嚴重的錯誤,因此,程序呼叫之前必須將所傳遞的參數以標準格式表示,才不會發生錯誤。目前一般應用環境大多以『外部資料表示法』(eXternal Data Representation, XDR)來表示資料型態,但近年來也有許多環境開始以 ASN.1 表示(請參考 8-10 節介紹)。
※ 交談層:遠端程序呼叫實現在這層次裡。
圖 9-3 RPC 系統與 OSI 參考模型
※ 傳輸層:可採用 TCP 或 IP 協定,也就是使用連接導向(虛擬電路)或非連接方式(電報傳輸)。
※ 網路層:採用 IP 協定。
※ 鏈路層與實體層:架設在一般區域網路或 Internet 網路上。
RPC 程式介面工具最主要是架設在傳輸層上,但不同傳輸層介面也會引起系統設計的不同。一般傳輸層介面大略可區分為:傳輸獨立(Transport-Independent, TI)介面和 Socket 介面兩種,前者稱之為 TIRPC;而後者稱之為 Socket-based RPC。TIRPC 是架設在 Network Selection 系統上,它是將有關網路上的伺服器、服務程式、網路位址、傳輸埠口等等都宣告成符號層次(Symbolic Level),而以 rpcbind() 程序來管理呼叫。Socket-based RPC 較為單純,直接連接到 Socket 傳輸埠口上,以 portmap() 程序取代 rpcbind()。雖然 Socket-based RPC 在製作上比較容易,但沒有 TIRPC 的變通性高,因為 TIRPC 將網路環境都以資料型態表示,不論現有的本地程序呼叫轉換成遠端程式呼叫,或網路環境變更,TIRPC 的處理都比 Socket-based RPC 較為容易。又從另一角度來看,TIRPC 比較適合一般範圍較小的區域網路使用;然而 Internet 網路上較適合簡單連結方式的 Socket-based RPC。本章為了延續上一章的介紹,而採用 Socket-based RPC 來介紹,至於 TIRPC 因限於篇幅不再另述。
無論 RPC 採用 Socket-based 或是 TIRPC,在連線方面也可區分為連接導向(TCP)和非連接方式(UDP),它們的運作方式如圖 10-4 與 10-5 所示。至於 RPC 連線應該選用 TCP 或 UDP 協定?這就得好好考慮。雖然 TCP 連線可保證訊息是否安全到達目的,並且可將連續大量的資料在預期時間內連續送達目的,但也有其缺點,譬如,每一連線會佔用系統資源,一般系統都會限制連線的數量,才不會使整個系統癱瘓掉。另一方面也要考慮到,如果傳輸資料過於短少,則先建立連線再傳送資料的過程就不需要了。UDP 連線雖然不能保證訊息是否安全到達,但也有其時效性,對於需要快速傳輸或較少量的資料而言,的確是個很好的傳輸工具,更何況它所佔用的資源最少,又不會受到系統連線數目的限制。但 UDP 最大的缺點是傳送端發送訊號時,可能會因為認為對方沒有收到訊息,而重複傳送同樣的訊息。當接收端收到重複訊息時,得有能力判斷而將之拋棄,才不至於發生錯誤。因此,在下面情況允許範圍內,可考慮使用 UDP:
● 遠端程序是否屬於『等冪性』(Idempotent),也就是遠端程序可連續接收同一訊息,而不會出問題。
● 呼叫訊息和回應訊息都可以在一個 UDP 封包內包裝完成。
● 伺服器需要多重客戶端要求,或客戶端需要多重伺服器要求的遠端呼叫程序。因為 UDP 不受系統連線數目的限制,也就是所使用的系統資源較少,因此可同時提供多重連線傳輸資料。
另外,如欲使用 TCP 連線的考慮因素如下:
(1) 對可靠性要求較高的遠端程序呼叫。
(2) 遠端程序不屬於『等冪性』的。
(3) 呼叫程序或回應訊息無法用一個 UDP 封包包裝。
由上述我們可以瞭解,UDP 協定在許多應用範圍也非常適合,譬如,DNS 伺服器之間的查詢。早期 Sun 發展 RPC 是應用在區域網路上的 NFS 系統上,一般區域網路範圍較小,封包在網路上不會跨越太多的路由端點,IP 封包在網路上不會有太多的延遲現象,因此,在 NFS 系統上是利用 UDP 來製作 RPC。但目前有許多應用發展在 Internet 網路上,通訊之間也許會經過較多的路由端點,對於傳輸的可靠性就較為薄弱,因此,大多建議使用 TCP 協定來銜接 RPC 程式。