# RPC,第 1 部分:遠程過程調用簡介
> 原文:<https://github.com/angrave/SystemProgramming/wiki/RPC%2C-Part-1%3A-Introduction-to-Remote-Procedure-Calls>
## 什么是 RPC?
遠程過程調用。 RPC 是我們可以在不同的機器上執行過程(函數)的想法。在實踐中,該過程可以在同一臺機器上執行,但是它可以在不同的上下文中 - 例如在具有不同權限和不同生命周期的不同用戶下。
## 什么是特權分離?
遠程代碼將在不同的用戶下執行,并具有來自調用者的不同權限。實際上,遠程呼叫可以以比呼叫者更多或更少的特權執行。這原則上可用于提高系統的安全性(通過確保組件以最小特權運行)。遺憾的是,需要仔細評估安全問題,以確保不會破壞 RPC 機制來執行不需要的操作。例如,RPC 實現可以隱式地信任任何連接的客戶端來執行任何操作,而不是對數據子集的操作子集。
## 什么是存根代碼?什么是編組?
存根代碼是隱藏執行遠程過程調用的復雜性的必要代碼。存根代碼的作用之一是 _ 將 _ 必要的數據編組成可以作為字節流發送到遠程服務器的格式。
```c
// On the outside 'getHiscore' looks like a normal function call
// On the inside the stub code performs all of the work to send and receive the data to and from the remote machine.
int getHiscore(char* game) {
// Marshall the request into a sequence of bytes:
char* buffer;
asprintf(&buffer,"getHiscore(%s)!", name);
// Send down the wire (we do not send the zero byte; the '!' signifies the end of the message)
write(fd, buffer, strlen(buffer) );
// Wait for the server to send a response
ssize_t bytesread = read(fd, buffer, sizeof(buffer));
// Example: unmarshal the bytes received back from text into an int
buffer[bytesread] = 0; // Turn the result into a C string
int score= atoi(buffer);
free(buffer);
return score;
}
```
## 什么是服務器存根代碼?什么是解組?
服務器存根代碼將接收請求,將請求解組為有效的內存數據調用底層實現,并將結果發送回調用方。
## 你怎么發送 int?浮動?結構?鏈表?圖表?
要實現 RPC,您需要決定(并記錄)將用于將數據序列化為字節序列的約定。即使是簡單的整數也有幾種常見的選擇:
* 簽名還是未簽名?
* ASCII
* 固定的字節數或變量取決于幅度
* 小端或大端二進制格式?
要編組結構,請確定需要序列化哪些字段。可能沒有必要發送所有數據項(例如,某些項可能與特定 RPC 無關,或者可以由服務器從存在的其他數據項重新計算)。
要編組鏈表,不必發送鏈接指針 - 只是流式傳輸值。作為解組的一部分,服務器可以從字節序列重新創建鏈表結構。
通過從頭節點/頂點開始,可以遞歸地訪問簡單樹以創建數據的序列化版本。循環圖通常需要額外的內存來確保每個邊和頂點只處理一次。
## 什么是 IDL(接口設計語言)?
手動編寫存根代碼是痛苦的,乏味的,容易出錯的,難以維護的,并且難以從實現的代碼中對線協議進行反向工程。更好的方法是指定數據對象,消息和服務,并自動生成客戶端和服務器代碼。
接口設計語言的一個現代示例是 Google 的 Protocol Buffer .proto 文件。
## RPC 與本地呼叫的復雜性和挑戰?
遠程過程調用明顯較慢(10x 到 100x)并且比本地調用更復雜。 RPC 必須將數據編組為與線路兼容的格式。這可能需要多次通過數據結構,臨時存儲器分配和數據表示的轉換。
強大的 RPC 存根代碼必須智能地處理網絡故障和版本控制。例如,服務器可能必須處理來自仍在運行存根代碼的早期版本的客戶端的請求。
安全 RPC 需要實現額外的安全檢查(包括身份驗證和授權),驗證數據并加密客戶端和主機之間的通信。
## 傳輸大量結構化數據
我們來看看三種使用 3 種不同格式傳輸數據的方法--JSON,XML 和 Google Protocol Buffers。 JSON 和 XML 是基于文本的協議。下面是 JSON 和 XML 消息的示例。
```text-xml
<ticket><price currency='dollar'>10</price><vendor>travelocity</vendor></ticket>
```
```source-js
{ 'currency':'dollar' , 'vendor':'travelocity', 'price':'10' }
```
Google Protocol Buffers 是一種開源高效的二進制協議,強調高吞吐量,低 CPU 開銷和最小內存復制。存在多種語言的實現,包括 Go,Python,C ++和 C.這意味著可以從.proto 規范文件生成多種語言的客戶端和服務器存根代碼,以便將數據與二進制流進行編組。
Google Protocol Buffers 通過忽略消息中存在的未知字段來減少版本控制問題。有關更多信息,請參閱協議緩沖區簡介。
[https://developers.google.com/protocol-buffers/docs/overview](https://developers.google.com/protocol-buffers/docs/overview)
- UIUC CS241 系統編程中文講義
- 0. 簡介
- #Informal 詞匯表
- #Piazza:何時以及如何尋求幫助
- 編程技巧,第 1 部分
- 系統編程短篇小說和歌曲
- 1.學習 C
- C 編程,第 1 部分:簡介
- C 編程,第 2 部分:文本輸入和輸出
- C 編程,第 3 部分:常見問題
- C 編程,第 4 部分:字符串和結構
- C 編程,第 5 部分:調試
- C 編程,復習題
- 2.進程
- 進程,第 1 部分:簡介
- 分叉,第 1 部分:簡介
- 分叉,第 2 部分:Fork,Exec,等等
- 進程控制,第 1 部分:使用信號等待宏
- 進程復習題
- 3.內存和分配器
- 內存,第 1 部分:堆內存簡介
- 內存,第 2 部分:實現內存分配器
- 內存,第 3 部分:粉碎堆棧示例
- 內存復習題
- 4.介紹 Pthreads
- Pthreads,第 1 部分:簡介
- Pthreads,第 2 部分:實踐中的用法
- Pthreads,第 3 部分:并行問題(獎金)
- Pthread 復習題
- 5.同步
- 同步,第 1 部分:互斥鎖
- 同步,第 2 部分:計算信號量
- 同步,第 3 部分:使用互斥鎖和信號量
- 同步,第 4 部分:臨界區問題
- 同步,第 5 部分:條件變量
- 同步,第 6 部分:實現障礙
- 同步,第 7 部分:讀者編寫器問題
- 同步,第 8 部分:環形緩沖區示例
- 同步復習題
- 6.死鎖
- 死鎖,第 1 部分:資源分配圖
- 死鎖,第 2 部分:死鎖條件
- 死鎖,第 3 部分:餐飲哲學家
- 死鎖復習題
- 7.進程間通信&amp;調度
- 虛擬內存,第 1 部分:虛擬內存簡介
- 管道,第 1 部分:管道介紹
- 管道,第 2 部分:管道編程秘密
- 文件,第 1 部分:使用文件
- 調度,第 1 部分:調度過程
- 調度,第 2 部分:調度過程:算法
- IPC 復習題
- 8.網絡
- POSIX,第 1 部分:錯誤處理
- 網絡,第 1 部分:簡介
- 網絡,第 2 部分:使用 getaddrinfo
- 網絡,第 3 部分:構建一個簡單的 TCP 客戶端
- 網絡,第 4 部分:構建一個簡單的 TCP 服務器
- 網絡,第 5 部分:關閉端口,重用端口和其他技巧
- 網絡,第 6 部分:創建 UDP 服務器
- 網絡,第 7 部分:非阻塞 I O,select()和 epoll
- RPC,第 1 部分:遠程過程調用簡介
- 網絡復習題
- 9.文件系統
- 文件系統,第 1 部分:簡介
- 文件系統,第 2 部分:文件是 inode(其他一切只是數據...)
- 文件系統,第 3 部分:權限
- 文件系統,第 4 部分:使用目錄
- 文件系統,第 5 部分:虛擬文件系統
- 文件系統,第 6 部分:內存映射文件和共享內存
- 文件系統,第 7 部分:可擴展且可靠的文件系統
- 文件系統,第 8 部分:從 Android 設備中刪除預裝的惡意軟件
- 文件系統,第 9 部分:磁盤塊示例
- 文件系統復習題
- 10.信號
- 過程控制,第 1 部分:使用信號等待宏
- 信號,第 2 部分:待處理的信號和信號掩碼
- 信號,第 3 部分:提高信號
- 信號,第 4 部分:信號
- 信號復習題
- 考試練習題
- 考試主題
- C 編程:復習題
- 多線程編程:復習題
- 同步概念:復習題
- 記憶:復習題
- 管道:復習題
- 文件系統:復習題
- 網絡:復習題
- 信號:復習題
- 系統編程笑話