?? rfc1050.txt
字號:
然后,用以前B計算得到的結果來替換PK(B),對PK(A)也進行這樣的步驟
((PROOT ** SK(B)) ** SK(A) = (PROOT ** SK(A)) ** SK(B)
這將導致:
PROOT ** (SK(A) * SK(B)) = PROOT ** (SK(A) * SK(B))
不使用公共密鑰CK(A, B)來加密在協議中使用的時間戳。它只用于加密會話密鑰,而使用這個會話密鑰來加密時間戳。這樣做的原因是因為應該盡可能少的使用公共密鑰,以防公共密鑰被破譯。會話密鑰即使被破譯,造成的損失也較小,因為會話的時間總是相對較短。
會話密鑰是使用56比特DES密鑰加密的。而這個公共密鑰是128比特位。為了減少比特的數量,象下面這樣從公共密鑰中選擇56比特。從公共密鑰中選擇最中間的8個字節,然后把奇偶校驗加在每一個字節的最低比特位。這樣就產生了一個帶有8比特奇偶校驗位的56比特密鑰。
10.記錄標記的標準
當RPC消息在一個字節流協議(象TCP/IP)上層傳送的時候,有必要在一個消息和另一個消息之間劃定界線,這樣是為了檢測出用戶協議的錯誤,并可能對錯誤進行恢復。這就叫做記錄標記(RM)。Sun使用RM/TCP/IP來在TCP流上傳送RPC消息。一個RPC消息適配一個RM記錄。
一個記錄是由一個或者多個記錄片斷組成。一個記錄片斷是4字節的頭,后跟0至(2**31)-1字節的片斷數據。片斷頭的字節編碼成一個無符號的二進制數;象是XDR中的整數一樣,字節的順序是從高到底的。這個數字編碼成兩個部分的值:一個部分是布爾值,指示這個片斷是否是記錄的最后一個記錄片斷(值1表明此片斷是最后一個片斷),另一部分是一個31比特的無符號二進制值,它是這個片斷數據用字節計數時的長度。布爾值是這個片斷頭的最高位比特;長度是低位的31比特。(注意這個記錄規范并不是XDR的標準形式?。?11.RPC語言
就象在一個正式的語言中需要定義XDR數據類型一樣。也需要在正式的語言中定義操作XDR數據類型的過程。為了這個目的,我們使用RPC語言。它是XDR語言的擴展。使用下面的例子來描述這種語言的精髓。
用RPC語言描述的服務的例子
這里有一個簡單ping程序的例子說明。
/*
*簡單的ping程序
*/
program PING_PROG {
/*
* 最近和最好的版本
*/
version PING_VERS_PINGBACK {
void PINGPROC_NULL(void) = 0;
/*
* Ping這個調用者,返回往返時間(用微秒來表示)。如果操作超時,
* 返回-1。
*/
int PINGPROC_PINGBACK(void) = 1;
} = 2;
/*
* 原來的版本
*/
version PING_VERS_ORIG {
void PINGPROC_NULL(void) = 0;
} = 1;
} = 1;
const PING_VERS = 2; /* 最近的版本*/
在第一個版本中,PING_VERS_PINGBACK有兩個過程PINGPROC_NULL 和 PINGPROC_PINGBACK。PINGPROC_NULL不需要參數,也不返回結果,但是它對計算從客戶端到服務器再回到客戶端的往返時間很有用。在會話中,任何RPC協議的過程0都應該有同樣的語義,不需要任何種類的認證。客戶端用第二個過程來使服務器對客戶端進行一個反向的ping操作,并且它返回使用這個操作的時間值(用微秒表示)。下一個版本PING_VERS_ORIG是這個協議的原來的版本,它不包含PINGPROC_PINGBACK過程。這對兼容舊的客戶端程序很有用,隨著程序的升級,它可能從整個協議中刪去。
11.1 RPC語言規范
RPC語言除了加入了"program-def"的定義,與XDR語言一樣。
program-def:
"program" identifier "{"
version-def
version-def *
"}" "=" constant ";"
version-def:
"version" identifier "{"
procedure-def
procedure-def *
"}" "=" constant ";"
procedure-def:
type-specifier identifier "(" type-specifier ")"
"=" constant ";"
11.2語法的注意事項
(1) 下面的關鍵字不能用作標識符:"program" and "version";
(2)版本名不能在一個程序定義的范圍內出現超過一次。
同樣,版本號在這個程序定義的范圍里也不能出現超過一次。
(3) 過程名不能在一個版本定義的范圍內出現超過一次。
同樣,過程號在這個版本定義的范圍里也不能出現超過一次。
(4) 程序的標識符有象常數標識符和類型標識符同樣的名字空間。
(5) 只有無符號的常數可以分配給程序,版本和過程。
附錄A:端口映射器程序協議
端口映射器程序把RPC程序和版本號映射到特定的傳輸端口號上。這個程序可以對遠程的程序進行動態綁定。
這種方法是符合需要的,因為保留的端口號的范圍是有限的,而潛在的遠程程序是很多的。在一個保留端口號上運行端口映射器,只要查詢這個端口映射器就可以確定其它遠程成程序的端口號。
端口映射器也在廣播RPC中使用。一個給定的RPC程序在不同的機器上經常綁定到不同的端口號上,所以沒有方法直接廣播到所有的這些程序。而端口映射器有固定的端口號。要向給定的程序發送廣播,客戶端實際上把消息發送到廣播地址上的端口映射器。獲得廣播的每一個端口映射器調用由客戶端指定的本地服務。當端口映射器收到本地服務的響應,它再把這個響應發送給客戶端。
A.1端口映射器協議規范(用RPC語言)
const PMAP_PORT = 111; /* 端口映射器的端口號*/
/*
*(程序,版本,協議)到端口的映射
*/
struct mapping {
unsigned int prog;
unsigned int vers;
unsigned int prot;
unsigned int port;
};
/*
* "prot"字段支持的值
*/
const IPPROTO_TCP = 6; /* TCP/IP的協議號 */
const IPPROTO_UDP = 17; /* UDP/IP的協議號*/
/*
* 一個映射列表
*/
struct *pmaplist {
mapping map;
pmaplist next;
};
/*
* 調用的參數
*/
struct call_args {
unsigned int prog;
unsigned int vers;
unsigned int proc;
opaque args<>;
};
/*
* 調用的結果
*/
struct call_result {
unsigned int port;
opaque res<>;
};
/*
* 端口映射器的過程
*/
program PMAP_PROG {
version PMAP_VERS {
void PMAPPROC_NULL(void) = 0;
bool PMAPPROC_SET(mapping) = 1;
bool PMAPPROC_UNSET(mapping) = 2;
unsigned int PMAPPROC_GETPORT(mapping) = 3;
pmaplist PMAPPROC_DUMP(void) = 4;
call_result PMAPPROC_CALLIT(call_args) = 5;
} = 2;
} = 100000;
A.2 端口映射器操作
端口映射器程序當前支持兩種協議(UDP/IP和TCP/IP)。端口映射器在這兩種協議中的任一種中都分配在端口111上(SUNRPC [8])。下面是每一個端口映射器過程的描述:
PMAPPROC_NULL:
這個過程不工作。按照習慣,任何協議的0號過程不接收參數,也不返回結果。
PMAPPROC_SET:
當一個程序在一個機器上可用時,它要向同一臺機器上的端口映射器注冊它自己。
這個程序傳遞它的程序號 "prog",版本號 "vers", 傳輸協議號 "prot"和端口號
"port"。在 "port"這個端口號上,程序等待服務的請求。這個過程返回一個布爾值,如果過程成功建立了映射,這個值為"TRUE"。否則,這個值為"FALSE"。
如果已經存在"(prog, vers, prot)"元組,這個過程拒絕建立映射。
PMAPPROC_UNSET:
當程序變為不可用的時候,它將在同一臺機器上的端口映射器中注銷它自己。
它的參數和結果和"PMAPPROC_SET"有同樣的含義。參數中的協議和端口
號字段將被忽略。
PMAPPROC_GETPORT:
當被給出了程序號 "prog",版本號 "vers"和傳輸協議號 "prot",這個過程將返回
此程序等待調用請求的端口號。返回一個0的端口值意味著這個程序沒有注冊。
參數中的 "port"字段將被忽略。
PMAPPROC_DUMP:
這個過程列舉了端口映射器數據庫中的所有條目。
此過程不需要參數,它返回一個程序,版本,協議,和端口值的列表。
PMAPPROC_CALLIT:
這個過程允許調用者調用在同一臺機器上的另一個遠程過程,而不需要知道這個遠程過程的端口號。通過眾所周知的端口映射器的端口號,它支持二進制遠程程序的廣播。 參數"prog", "vers", "proc","args"分別是程序號,版本號,過程號和遠程過程的參數。
注意:
(1) 如果過程成功執行,過程僅發送一個響應。否則保持沉默(不響應)。
(2) 端口映射器只使用UDP/IP協議與遠程程序通信。
這個過程返回遠程程序的端口號和遠程過程執行的結果。
參考書目
[1] Birrel, A. D., and Nelson, B. J., "Implementing Remote
Procedure Calls", XEROX CSL-83-7, October 1983.
[2] Cheriton, D., "VMTP: Versatile Message Transaction Protocol",
Version 0.7, RFC-1045, Stanford University, February 1988.
[3] Diffie & Hellman, "Net Directions in Cryptography", IEEE
Transactions on Information Theory IT-22, November 1976.
[4] Postel, J., and Harrenstien, K., "Time Protocol", RFC-868,
Network Information Center, SRI, May 1983.
[5] National Bureau of Standards, "Data Encryption Standard",
Federal Information Processing Standards Publication 46,
January 1977.
[6] Postel, J., "Transmission Control Protocol - DARPA Internet
Program Protocol Specification", RFC-793; Network Information
Center, SRI, September 1981.
[7] Postel, J., "User Datagram Protocol", RFC-768, Network
Information Center, SRI, August 1980.
[8] Reynolds, J. and Postel, J.; "Assigned Numbers", RFC-1010,
Network Information Center, SRI, May 1987.
[9] Sun Microsystems; "XDR: External Data Representation
Standard", RFC-1014; Sun Microsystems, June 1987.
RFC1050---Remote Procedure Call Protocol Specification 遠程過程調用協議規范
1
RFC文檔中文翻譯計劃
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -