SylixOS中RPC簡介
SylixOS中移植了SUN公司的開源RPC庫——libsunrpc,主要用於遠程過程調用,現對其通信機制及遠程調用過程做簡單的介紹。
2、RPC通信機制
2.1 RPC介紹
RPC(Remote Procedure Call Protocol)——遠程過程調用協議,它是一種通過網絡從遠程計算機程序上請求服務,而不需要了解底層網絡技術的協議。RPC協議假定某些傳輸協議的存在,如TCP或UDP,為通信程序之間攜帶信息數據。在OSI網絡通信模型中,RPC跨越了傳輸層和應用層。RPC使得開發包括網絡分布式多程序在內的應用程序更加容易。
RPC采用客戶機/服務器模式,請求程序就是一個客戶機,而服務提供程序就是一個服務器。首先,客戶機調用進程發送一個有進程參數的調用信息到服務進程,然後等待應答信息。在服務器端,進程保持睡眠狀態直到調用信息到達為止。當一個調用信息到達,服務器獲得進程參數,計算結果,發送答復信息,然後等待下一個調用信息,最後,客戶端調用進程接收答復信息,獲得進程結果,然後調用執行繼續進行。
2.2 調用分類
RPC調用分以下兩種:
(1)同步調用:客戶方等待調用執行完成並返回結果。
(2)異步調用:客戶方調用後不用等待執行結果返回,但依然可以通過回調通知等方式獲取返回結果。若客戶方不關心調用返回結果,則變成單向異步調用,單向調用不用返回結果。
異步調用和同步調用的區分在於是否等待服務端執行完成並返回結果。
2.3 RPC調用過程
2.3.1 一次調用步驟
RPC一次遠程調用的具體步驟如下圖所示。
(1)客戶調用一個稱為客戶程序存根(client stub)的本地過程,對客戶來說,客戶存根看起來就是它想要調用的真正的服務器過程。客戶程序存根的作用在於把待傳輸給遠程過程的參數打包,轉換成某種標準格式,然後構造一個或多個網絡消息。
(2)構造的網絡消息由客戶程序存根發送給遠程系統,這通常需要進行系統調用(如write或sendto)。
(3)該步驟為網絡消息傳輸過程,使用的典型網絡傳輸協議為TCP或者UDP。
(4)遠程系統上的服務器程序存根(server stub)一直在等待客戶的請求,負責從接收到的網絡消息中解析出客戶的參數。
(5)服務器程序存根執行一個本地過程調用以激活真正的服務器函數,將上一步解析出的參數傳入該服務器過程。
(6)當服務器過程完成時,它向服務器程序存根返回其運行結果。
(7)服務器程序存根對返回值進行轉換,並將其構造成一個或多個網絡消息,以便發送給客戶。
(8)消息通過網絡傳送回客戶端。
(9)客戶程序存根從本地內核中讀出網絡消息(
(10)客戶程序存根對返回值進行必要的轉換後,將結果返回給客戶程序,這一步看起來就是一個普通的過程返回給客戶。
2.3.2如何唯一確定遠程過程
一個遠程過程是由三要素來唯一確定:
(1) 程序號
(2) 版本號
(3) 過程號
程序號用來區別一組相關的並且具有唯一過程號的遠程過程。一個程序可以有多個不同的版本,而每個版本的程序都包含一系列能被遠程調用的過程,每個過程則有其唯一標識的過程號。
客戶端與服務器端約定好某個遠程過程的程序號、版本號和過程號。服務器程序存根根據程序號和版本號註冊一個遠程調用程序,該遠程調用程序中再根據過程號去調用該遠程過程;客戶根據程序號和版本號調用RPC接口獲取一個客戶端句柄,然後調用句柄內保存的回調函數,傳入客戶主機的入參、遠程過程號、返回值、數據格式轉換回調函數等,最終實現調用一個唯一確定的遠程過程。
2.4 服務器捆綁
客戶端和服務器端建立網絡連接時,客戶端是如何發現服務器端的端口號的呢?首先我們需要註意的是,運行RPC服務器的任何主機必須先運行端口映射器,然後RPC服務器先綁定一個臨時端口號,再向本地端口映射器註冊該臨時端口。當一個客戶啟動時,它必須先跟服務器主機上的端口映射器聯系,詢問服務器的臨時端口號,然後再跟這個臨時端口號上的服務器聯系,建立網絡連接。如下圖所示。
2.5 RPC超時和重傳策略
RPC的超時和重傳策略中使用了兩個超時值:
(1) 總超時(total timeout):一個客戶等待其服務器的應答的總時間量,TCP和UDP都使用該值。
(2) 重試超時(retry timeout):只用於UDP, 是一個客戶等待其服務器的應答期間每次重傳請求的相隔時間。
因為TCP是一個可靠的協議,所以不需要重試超時,TCP請求流程如下圖所示。如果服務器主機沒有接收到客戶的請求,客戶的主機就會超時並重傳該請求。當服務器主機接收到客戶機的請求時,服務器主機會向客戶主機確認收到本次請求。如果服務器的確認丟失,導致客戶主機重傳該請求,那麽當服務器主機接收到這個重復的數據時,它將丟棄該數據,並再次發出一個確認。
有了可靠的協議後,可靠性(超時、重傳、重復數據或重復確認的處理)就由傳輸層保障。由客戶主機RPC層發出的一個請求將由服務器主機RPC層作為一個請求接收(如果該請求沒有得到確認,那麽客戶主機將會得到錯誤提示),而不管網絡層和傳輸層發生什麽。
2.6 XDR(外部數據表示法)
使用RPC進行通信的不同主機,它們的數據格式可能不同。首先,數據類型可能有不同的大小;其次,各主機可能存在大小端字節序的差異,所以RPC使用外部數據表示法(XDR)來消除這些差異,將數據包裝在獨立於介質的結構中使得數據可以在異構的計算機系統中傳輸。從局部表示轉換到XDR稱為編碼,從XDR轉換到局部表示稱為譯碼。SylixOS內核中的libsunrpc庫中,在“/libsunrpc/sunrpc/rpc/xdr.h”中提供了用於數據格式轉換的接口。
SylixOS中RPC簡介