b528cefc6b
Userland to follow.
1012 lines
37 KiB
Plaintext
1012 lines
37 KiB
Plaintext
|
||
|
||
|
||
|
||
|
||
|
||
Network Working Group R. Srinivasan
|
||
Request for Comments: 1831 Sun Microsystems
|
||
Category: Standards Track August 1995
|
||
|
||
|
||
RPC: Remote Procedure Call Protocol Specification Version 2
|
||
|
||
Status of this Memo
|
||
|
||
This document specifies an Internet standards track protocol for the
|
||
Internet community, and requests discussion and suggestions for
|
||
improvements. Please refer to the current edition of the "Internet
|
||
Official Protocol Standards" (STD 1) for the standardization state
|
||
and status of this protocol. Distribution of this memo is unlimited.
|
||
|
||
ABSTRACT
|
||
|
||
This document describes the ONC Remote Procedure Call (ONC RPC
|
||
Version 2) protocol as it is currently deployed and accepted. "ONC"
|
||
stands for "Open Network Computing".
|
||
|
||
TABLE OF CONTENTS
|
||
|
||
1. INTRODUCTION 2
|
||
2. TERMINOLOGY 2
|
||
3. THE RPC MODEL 2
|
||
4. TRANSPORTS AND SEMANTICS 4
|
||
5. BINDING AND RENDEZVOUS INDEPENDENCE 5
|
||
6. AUTHENTICATION 5
|
||
7. RPC PROTOCOL REQUIREMENTS 5
|
||
7.1 RPC Programs and Procedures 6
|
||
7.2 Authentication 7
|
||
7.3 Program Number Assignment 8
|
||
7.4 Other Uses of the RPC Protocol 8
|
||
7.4.1 Batching 8
|
||
7.4.2 Broadcast Remote Procedure Calls 8
|
||
8. THE RPC MESSAGE PROTOCOL 9
|
||
9. AUTHENTICATION PROTOCOLS 12
|
||
9.1 Null Authentication 13
|
||
10. RECORD MARKING STANDARD 13
|
||
11. THE RPC LANGUAGE 13
|
||
11.1 An Example Service Described in the RPC Language 13
|
||
11.2 The RPC Language Specification 14
|
||
11.3 Syntax Notes 15
|
||
APPENDIX A: SYSTEM AUTHENTICATION 16
|
||
REFERENCES 17
|
||
Security Considerations 18
|
||
Author's Address 18
|
||
|
||
|
||
|
||
Srinivasan Standards Track [Page 1]
|
||
|
||
RFC 1831 Remote Procedure Call Protocol Version 2 August 1995
|
||
|
||
|
||
1. INTRODUCTION
|
||
|
||
This document specifies version two of the message protocol used in
|
||
ONC Remote Procedure Call (RPC). The message protocol is specified
|
||
with the eXternal Data Representation (XDR) language [9]. This
|
||
document assumes that the reader is familiar with XDR. It does not
|
||
attempt to justify remote procedure calls systems or describe their
|
||
use. The paper by Birrell and Nelson [1] is recommended as an
|
||
excellent background for the remote procedure call concept.
|
||
|
||
2. TERMINOLOGY
|
||
|
||
This document discusses clients, calls, servers, replies, services,
|
||
programs, procedures, and versions. Each remote procedure call has
|
||
two sides: an active client side that makes the call to a server,
|
||
which sends back a reply. A network service is a collection of one
|
||
or more remote programs. A remote program implements one or more
|
||
remote procedures; the procedures, their parameters, and results are
|
||
documented in the specific program's protocol specification. A
|
||
server may support more than one version of a remote program in order
|
||
to be compatible with changing protocols.
|
||
|
||
For example, a network file service may be composed of two programs.
|
||
One program may deal with high-level applications such as file system
|
||
access control and locking. The other may deal with low-level file
|
||
input and output and have procedures like "read" and "write". A
|
||
client of the network file service would call the procedures
|
||
associated with the two programs of the service on behalf of the
|
||
client.
|
||
|
||
The terms client and server only apply to a particular transaction; a
|
||
particular hardware entity (host) or software entity (process or
|
||
program) could operate in both roles at different times. For
|
||
example, a program that supplies remote execution service could also
|
||
be a client of a network file service.
|
||
|
||
3. THE RPC MODEL
|
||
|
||
The ONC RPC protocol is based on the remote procedure call model,
|
||
which is similar to the local procedure call model. In the local
|
||
case, the caller places arguments to a procedure in some well-
|
||
specified location (such as a register window). It then transfers
|
||
control to the procedure, and eventually regains control. At that
|
||
point, the results of the procedure are extracted from the well-
|
||
specified location, and the caller continues execution.
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Srinivasan Standards Track [Page 2]
|
||
|
||
RFC 1831 Remote Procedure Call Protocol Version 2 August 1995
|
||
|
||
|
||
The remote procedure call model is similar. One thread of control
|
||
logically winds through two processes: the caller's process, and a
|
||
server's process. The caller process first sends a call message to
|
||
the server process and waits (blocks) for a reply message. The call
|
||
message includes the procedure's parameters, and the reply message
|
||
includes the procedure's results. Once the reply message is
|
||
received, the results of the procedure are extracted, and caller's
|
||
execution is resumed.
|
||
|
||
On the server side, a process is dormant awaiting the arrival of a
|
||
call message. When one arrives, the server process extracts the
|
||
procedure's parameters, computes the results, sends a reply message,
|
||
and then awaits the next call message.
|
||
|
||
In this model, only one of the two processes is active at any given
|
||
time. However, this model is only given as an example. The ONC RPC
|
||
protocol makes no restrictions on the concurrency model implemented,
|
||
and others are possible. For example, an implementation may choose
|
||
to have RPC calls be asynchronous, so that the client may do useful
|
||
work while waiting for the reply from the server. Another
|
||
possibility is to have the server create a separate task to process
|
||
an incoming call, so that the original server can be free to receive
|
||
other requests.
|
||
|
||
There are a few important ways in which remote procedure calls differ
|
||
from local procedure calls:
|
||
|
||
1. Error handling: failures of the remote server or network must
|
||
be handled when using remote procedure calls.
|
||
|
||
2. Global variables and side-effects: since the server does not
|
||
have access to the client's address space, hidden arguments cannot
|
||
be passed as global variables or returned as side effects.
|
||
|
||
3. Performance: remote procedures usually operate one or more
|
||
orders of magnitude slower than local procedure calls.
|
||
|
||
4. Authentication: since remote procedure calls can be transported
|
||
over unsecured networks, authentication may be necessary.
|
||
Authentication prevents one entity from masquerading as some other
|
||
entity.
|
||
|
||
The conclusion is that even though there are tools to automatically
|
||
generate client and server libraries for a given service, protocols
|
||
must still be designed carefully.
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Srinivasan Standards Track [Page 3]
|
||
|
||
RFC 1831 Remote Procedure Call Protocol Version 2 August 1995
|
||
|
||
|
||
4. TRANSPORTS AND SEMANTICS
|
||
|
||
The RPC protocol can be implemented on several different transport
|
||
protocols. The RPC protocol does not care how a message is passed
|
||
from one process to another, but only with specification and
|
||
interpretation of messages. However, the application may wish to
|
||
obtain information about (and perhaps control over) the transport
|
||
layer through an interface not specified in this document. For
|
||
example, the transport protocol may impose a restriction on the
|
||
maximum size of RPC messages, or it may be stream-oriented like TCP
|
||
with no size limit. The client and server must agree on their
|
||
transport protocol choices.
|
||
|
||
It is important to point out that RPC does not try to implement any
|
||
kind of reliability and that the application may need to be aware of
|
||
the type of transport protocol underneath RPC. If it knows it is
|
||
running on top of a reliable transport such as TCP [6], then most of
|
||
the work is already done for it. On the other hand, if it is running
|
||
on top of an unreliable transport such as UDP [7], it must implement
|
||
its own time-out, retransmission, and duplicate detection policies as
|
||
the RPC protocol does not provide these services.
|
||
|
||
Because of transport independence, the RPC protocol does not attach
|
||
specific semantics to the remote procedures or their execution
|
||
requirements. Semantics can be inferred from (but should be
|
||
explicitly specified by) the underlying transport protocol. For
|
||
example, consider RPC running on top of an unreliable transport such
|
||
as UDP. If an application retransmits RPC call messages after time-
|
||
outs, and does not receive a reply, it cannot infer anything about
|
||
the number of times the procedure was executed. If it does receive a
|
||
reply, then it can infer that the procedure was executed at least
|
||
once.
|
||
|
||
A server may wish to remember previously granted requests from a
|
||
client and not regrant them in order to insure some degree of
|
||
execute-at-most-once semantics. A server can do this by taking
|
||
advantage of the transaction ID that is packaged with every RPC
|
||
message. The main use of this transaction ID is by the client RPC
|
||
entity in matching replies to calls. However, a client application
|
||
may choose to reuse its previous transaction ID when retransmitting a
|
||
call. The server may choose to remember this ID after executing a
|
||
call and not execute calls with the same ID in order to achieve some
|
||
degree of execute-at-most-once semantics. The server is not allowed
|
||
to examine this ID in any other way except as a test for equality.
|
||
|
||
On the other hand, if using a "reliable" transport such as TCP, the
|
||
application can infer from a reply message that the procedure was
|
||
executed exactly once, but if it receives no reply message, it cannot
|
||
|
||
|
||
|
||
Srinivasan Standards Track [Page 4]
|
||
|
||
RFC 1831 Remote Procedure Call Protocol Version 2 August 1995
|
||
|
||
|
||
assume that the remote procedure was not executed. Note that even if
|
||
a connection-oriented protocol like TCP is used, an application still
|
||
needs time-outs and reconnection to handle server crashes.
|
||
|
||
There are other possibilities for transports besides datagram- or
|
||
connection-oriented protocols. For example, a request-reply protocol
|
||
such as VMTP [2] is perhaps a natural transport for RPC. ONC RPC
|
||
uses both TCP and UDP transport protocols. Section 10 (RECORD
|
||
MARKING STANDARD) describes the mechanism employed by ONC RPC to
|
||
utilize a connection-oriented, stream-oriented transport such as TCP.
|
||
|
||
5. BINDING AND RENDEZVOUS INDEPENDENCE
|
||
|
||
The act of binding a particular client to a particular service and
|
||
transport parameters is NOT part of this RPC protocol specification.
|
||
This important and necessary function is left up to some higher-level
|
||
software.
|
||
|
||
Implementors could think of the RPC protocol as the jump-subroutine
|
||
instruction ("JSR") of a network; the loader (binder) makes JSR
|
||
useful, and the loader itself uses JSR to accomplish its task.
|
||
Likewise, the binding software makes RPC useful, possibly using RPC
|
||
to accomplish this task.
|
||
|
||
6. AUTHENTICATION
|
||
|
||
The RPC protocol provides the fields necessary for a client to
|
||
identify itself to a service, and vice-versa, in each call and reply
|
||
message. Security and access control mechanisms can be built on top
|
||
of this message authentication. Several different authentication
|
||
protocols can be supported. A field in the RPC header indicates
|
||
which protocol is being used. More information on specific
|
||
authentication protocols is in section 9: "Authentication Protocols".
|
||
|
||
7. RPC PROTOCOL REQUIREMENTS
|
||
|
||
The RPC protocol must provide for the following:
|
||
|
||
(1) Unique specification of a procedure to be called.
|
||
(2) Provisions for matching response messages to request messages.
|
||
(3) Provisions for authenticating the caller to service and
|
||
vice-versa.
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Srinivasan Standards Track [Page 5]
|
||
|
||
RFC 1831 Remote Procedure Call Protocol Version 2 August 1995
|
||
|
||
|
||
Besides these requirements, features that detect the following are
|
||
worth supporting because of protocol roll-over errors, implementation
|
||
bugs, user error, and network administration:
|
||
|
||
(1) RPC protocol mismatches.
|
||
(2) Remote program protocol version mismatches.
|
||
(3) Protocol errors (such as misspecification of a procedure's
|
||
parameters).
|
||
(4) Reasons why remote authentication failed.
|
||
(5) Any other reasons why the desired procedure was not called.
|
||
|
||
7.1 RPC Programs and Procedures
|
||
|
||
The RPC call message has three unsigned integer fields -- remote
|
||
program number, remote program version number, and remote procedure
|
||
number -- which uniquely identify the procedure to be called.
|
||
Program numbers are administered by a central authority
|
||
(rpc@sun.com). Once implementors have a program number, they can
|
||
implement their remote program; the first implementation would most
|
||
likely have the version number 1. Because most new protocols evolve,
|
||
a version field of the call message identifies which version of the
|
||
protocol the caller is using. Version numbers enable support of both
|
||
old and new protocols through the same server process.
|
||
|
||
The procedure number identifies the procedure to be called. These
|
||
numbers are documented in the specific program's protocol
|
||
specification. For example, a file service's protocol specification
|
||
may state that its procedure number 5 is "read" and procedure number
|
||
12 is "write".
|
||
|
||
Just as remote program protocols may change over several versions,
|
||
the actual RPC message protocol could also change. Therefore, the
|
||
call message also has in it the RPC version number, which is always
|
||
equal to two for the version of RPC described here.
|
||
|
||
The reply message to a request message has enough information to
|
||
distinguish the following error conditions:
|
||
|
||
(1) The remote implementation of RPC does not support protocol
|
||
version 2. The lowest and highest supported RPC version numbers
|
||
are returned.
|
||
|
||
(2) The remote program is not available on the remote system.
|
||
|
||
(3) The remote program does not support the requested version
|
||
number. The lowest and highest supported remote program version
|
||
numbers are returned.
|
||
|
||
|
||
|
||
|
||
Srinivasan Standards Track [Page 6]
|
||
|
||
RFC 1831 Remote Procedure Call Protocol Version 2 August 1995
|
||
|
||
|
||
(4) The requested procedure number does not exist. (This is
|
||
usually a client side protocol or programming error.)
|
||
|
||
(5) The parameters to the remote procedure appear to be garbage
|
||
from the server's point of view. (Again, this is usually caused
|
||
by a disagreement about the protocol between client and service.)
|
||
|
||
7.2 Authentication
|
||
|
||
Provisions for authentication of caller to service and vice-versa are
|
||
provided as a part of the RPC protocol. The call message has two
|
||
authentication fields, the credential and verifier. The reply
|
||
message has one authentication field, the response verifier. The RPC
|
||
protocol specification defines all three fields to be the following
|
||
opaque type (in the eXternal Data Representation (XDR) language [9]):
|
||
|
||
enum auth_flavor {
|
||
AUTH_NONE = 0,
|
||
AUTH_SYS = 1,
|
||
AUTH_SHORT = 2
|
||
/* and more to be defined */
|
||
};
|
||
|
||
struct opaque_auth {
|
||
auth_flavor flavor;
|
||
opaque body<400>;
|
||
};
|
||
|
||
In other words, any "opaque_auth" structure is an "auth_flavor"
|
||
enumeration followed by up to 400 bytes which are opaque to
|
||
(uninterpreted by) the RPC protocol implementation.
|
||
|
||
The interpretation and semantics of the data contained within the
|
||
authentication fields is specified by individual, independent
|
||
authentication protocol specifications. (Section 9 defines the
|
||
various authentication protocols.)
|
||
|
||
If authentication parameters were rejected, the reply message
|
||
contains information stating why they were rejected.
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Srinivasan Standards Track [Page 7]
|
||
|
||
RFC 1831 Remote Procedure Call Protocol Version 2 August 1995
|
||
|
||
|
||
7.3 Program Number Assignment
|
||
|
||
Program numbers are given out in groups of hexadecimal 20000000
|
||
(decimal 536870912) according to the following chart:
|
||
|
||
0 - 1fffffff defined by rpc@sun.com
|
||
20000000 - 3fffffff defined by user
|
||
40000000 - 5fffffff transient
|
||
60000000 - 7fffffff reserved
|
||
80000000 - 9fffffff reserved
|
||
a0000000 - bfffffff reserved
|
||
c0000000 - dfffffff reserved
|
||
e0000000 - ffffffff reserved
|
||
|
||
The first group is a range of numbers administered by rpc@sun.com and
|
||
should be identical for all sites. The second range is for
|
||
applications peculiar to a particular site. This range is intended
|
||
primarily for debugging new programs. When a site develops an
|
||
application that might be of general interest, that application
|
||
should be given an assigned number in the first range. Application
|
||
developers may apply for blocks of RPC program numbers in the first
|
||
range by sending electronic mail to "rpc@sun.com". The third group
|
||
is for applications that generate program numbers dynamically. The
|
||
final groups are reserved for future use, and should not be used.
|
||
|
||
7.4 Other Uses of the RPC Protocol
|
||
|
||
The intended use of this protocol is for calling remote procedures.
|
||
Normally, each call message is matched with a reply message.
|
||
However, the protocol itself is a message-passing protocol with which
|
||
other (non-procedure call) protocols can be implemented.
|
||
|
||
7.4.1 Batching
|
||
|
||
Batching is useful when a client wishes to send an arbitrarily large
|
||
sequence of call messages to a server. Batching typically uses
|
||
reliable byte stream protocols (like TCP) for its transport. In the
|
||
case of batching, the client never waits for a reply from the server,
|
||
and the server does not send replies to batch calls. A sequence of
|
||
batch calls is usually terminated by a legitimate remote procedure
|
||
call operation in order to flush the pipeline and get positive
|
||
acknowledgement.
|
||
|
||
7.4.2 Broadcast Remote Procedure Calls
|
||
|
||
In broadcast protocols, the client sends a broadcast call to the
|
||
network and waits for numerous replies. This requires the use of
|
||
packet-based protocols (like UDP) as its transport protocol. Servers
|
||
|
||
|
||
|
||
Srinivasan Standards Track [Page 8]
|
||
|
||
RFC 1831 Remote Procedure Call Protocol Version 2 August 1995
|
||
|
||
|
||
that support broadcast protocols usually respond only when the call
|
||
is successfully processed and are silent in the face of errors, but
|
||
this varies with the application.
|
||
|
||
The principles of broadcast RPC also apply to multicasting - an RPC
|
||
request can be sent to a multicast address.
|
||
|
||
8. THE RPC MESSAGE PROTOCOL
|
||
|
||
This section defines the RPC message protocol in the XDR data
|
||
description language [9].
|
||
|
||
enum msg_type {
|
||
CALL = 0,
|
||
REPLY = 1
|
||
};
|
||
|
||
A reply to a call message can take on two forms: The message was
|
||
either accepted or rejected.
|
||
|
||
enum reply_stat {
|
||
MSG_ACCEPTED = 0,
|
||
MSG_DENIED = 1
|
||
};
|
||
|
||
Given that a call message was accepted, the following is the status
|
||
of an attempt to call a remote procedure.
|
||
|
||
enum accept_stat {
|
||
SUCCESS = 0, /* RPC executed successfully */
|
||
PROG_UNAVAIL = 1, /* remote hasn't exported program */
|
||
PROG_MISMATCH = 2, /* remote can't support version # */
|
||
PROC_UNAVAIL = 3, /* program can't support procedure */
|
||
GARBAGE_ARGS = 4, /* procedure can't decode params */
|
||
SYSTEM_ERR = 5 /* errors like memory allocation failure */
|
||
};
|
||
|
||
Reasons why a call message was rejected:
|
||
|
||
enum reject_stat {
|
||
RPC_MISMATCH = 0, /* RPC version number != 2 */
|
||
AUTH_ERROR = 1 /* remote can't authenticate caller */
|
||
};
|
||
|
||
Why authentication failed:
|
||
|
||
enum auth_stat {
|
||
AUTH_OK = 0, /* success */
|
||
|
||
|
||
|
||
Srinivasan Standards Track [Page 9]
|
||
|
||
RFC 1831 Remote Procedure Call Protocol Version 2 August 1995
|
||
|
||
|
||
/*
|
||
* failed at remote end
|
||
*/
|
||
AUTH_BADCRED = 1, /* bad credential (seal broken) */
|
||
AUTH_REJECTEDCRED = 2, /* client must begin new session */
|
||
AUTH_BADVERF = 3, /* bad verifier (seal broken) */
|
||
AUTH_REJECTEDVERF = 4, /* verifier expired or replayed */
|
||
AUTH_TOOWEAK = 5, /* rejected for security reasons */
|
||
/*
|
||
* failed locally
|
||
*/
|
||
AUTH_INVALIDRESP = 6, /* bogus response verifier */
|
||
AUTH_FAILED = 7 /* reason unknown */
|
||
};
|
||
|
||
The RPC message:
|
||
|
||
All messages start with a transaction identifier, xid, followed by a
|
||
two-armed discriminated union. The union's discriminant is a
|
||
msg_type which switches to one of the two types of the message. The
|
||
xid of a REPLY message always matches that of the initiating CALL
|
||
message. NB: The xid field is only used for clients matching reply
|
||
messages with call messages or for servers detecting retransmissions;
|
||
the service side cannot treat this id as any type of sequence number.
|
||
|
||
struct rpc_msg {
|
||
unsigned int xid;
|
||
union switch (msg_type mtype) {
|
||
case CALL:
|
||
call_body cbody;
|
||
case REPLY:
|
||
reply_body rbody;
|
||
} body;
|
||
};
|
||
|
||
Body of an RPC call:
|
||
|
||
In version 2 of the RPC protocol specification, rpcvers must be equal
|
||
to 2. The fields prog, vers, and proc specify the remote program,
|
||
its version number, and the procedure within the remote program to be
|
||
called. After these fields are two authentication parameters: cred
|
||
(authentication credential) and verf (authentication verifier). The
|
||
two authentication parameters are followed by the parameters to the
|
||
remote procedure, which are specified by the specific program
|
||
protocol.
|
||
|
||
The purpose of the authentication verifier is to validate the
|
||
authentication credential. Note that these two items are
|
||
|
||
|
||
|
||
Srinivasan Standards Track [Page 10]
|
||
|
||
RFC 1831 Remote Procedure Call Protocol Version 2 August 1995
|
||
|
||
|
||
historically separate, but are always used together as one logical
|
||
entity.
|
||
|
||
struct call_body {
|
||
unsigned int rpcvers; /* must be equal to two (2) */
|
||
unsigned int prog;
|
||
unsigned int vers;
|
||
unsigned int proc;
|
||
opaque_auth cred;
|
||
opaque_auth verf;
|
||
/* procedure specific parameters start here */
|
||
};
|
||
|
||
Body of a reply to an RPC call:
|
||
|
||
union reply_body switch (reply_stat stat) {
|
||
case MSG_ACCEPTED:
|
||
accepted_reply areply;
|
||
case MSG_DENIED:
|
||
rejected_reply rreply;
|
||
} reply;
|
||
|
||
Reply to an RPC call that was accepted by the server:
|
||
|
||
There could be an error even though the call was accepted. The first
|
||
field is an authentication verifier that the server generates in
|
||
order to validate itself to the client. It is followed by a union
|
||
whose discriminant is an enum accept_stat. The SUCCESS arm of the
|
||
union is protocol specific. The PROG_UNAVAIL, PROC_UNAVAIL,
|
||
GARBAGE_ARGS, and SYSTEM_ERR arms of the union are void. The
|
||
PROG_MISMATCH arm specifies the lowest and highest version numbers of
|
||
the remote program supported by the server.
|
||
|
||
struct accepted_reply {
|
||
opaque_auth verf;
|
||
union switch (accept_stat stat) {
|
||
case SUCCESS:
|
||
opaque results[0];
|
||
/*
|
||
* procedure-specific results start here
|
||
*/
|
||
case PROG_MISMATCH:
|
||
struct {
|
||
unsigned int low;
|
||
unsigned int high;
|
||
} mismatch_info;
|
||
default:
|
||
/*
|
||
|
||
|
||
|
||
Srinivasan Standards Track [Page 11]
|
||
|
||
RFC 1831 Remote Procedure Call Protocol Version 2 August 1995
|
||
|
||
|
||
* Void. Cases include PROG_UNAVAIL, PROC_UNAVAIL,
|
||
* GARBAGE_ARGS, and SYSTEM_ERR.
|
||
*/
|
||
void;
|
||
} reply_data;
|
||
};
|
||
|
||
Reply to an RPC call that was rejected by the server:
|
||
|
||
The call can be rejected for two reasons: either the server is not
|
||
running a compatible version of the RPC protocol (RPC_MISMATCH), or
|
||
the server rejects the identity of the caller (AUTH_ERROR). In case
|
||
of an RPC version mismatch, the server returns the lowest and highest
|
||
supported RPC version numbers. In case of invalid authentication,
|
||
failure status is returned.
|
||
|
||
union rejected_reply switch (reject_stat stat) {
|
||
case RPC_MISMATCH:
|
||
struct {
|
||
unsigned int low;
|
||
unsigned int high;
|
||
} mismatch_info;
|
||
case AUTH_ERROR:
|
||
auth_stat stat;
|
||
};
|
||
|
||
9. AUTHENTICATION PROTOCOLS
|
||
|
||
As previously stated, authentication parameters are opaque, but
|
||
open-ended to the rest of the RPC protocol. This section defines two
|
||
standard "flavors" of authentication. Implementors are free to
|
||
invent new authentication types, with the same rules of flavor number
|
||
assignment as there is for program number assignment. The "flavor"
|
||
of a credential or verifier refers to the value of the "flavor" field
|
||
in the opaque_auth structure. Flavor numbers, like RPC program
|
||
numbers, are also administered centrally, and developers may assign
|
||
new flavor numbers by applying through electronic mail to
|
||
"rpc@sun.com". Credentials and verifiers are represented as variable
|
||
length opaque data (the "body" field in the opaque_auth structure).
|
||
|
||
In this document, two flavors of authentication are described. Of
|
||
these, Null authentication (described in the next subsection) is
|
||
mandatory - it must be available in all implementations. System
|
||
authentication is described in Appendix A. It is strongly
|
||
recommended that implementors include System authentication in their
|
||
implementations. Many applications use this style of authentication,
|
||
and availability of this flavor in an implementation will enhance
|
||
interoperability.
|
||
|
||
|
||
|
||
Srinivasan Standards Track [Page 12]
|
||
|
||
RFC 1831 Remote Procedure Call Protocol Version 2 August 1995
|
||
|
||
|
||
9.1 Null Authentication
|
||
|
||
Often calls must be made where the client does not care about its
|
||
identity or the server does not care who the client is. In this
|
||
case, the flavor of the RPC message's credential, verifier, and reply
|
||
verifier is "AUTH_NONE". Opaque data associated with "AUTH_NONE" is
|
||
undefined. It is recommended that the length of the opaque data be
|
||
zero.
|
||
|
||
10. RECORD MARKING STANDARD
|
||
|
||
When RPC messages are passed on top of a byte stream transport
|
||
protocol (like TCP), it is necessary to delimit one message from
|
||
another in order to detect and possibly recover from protocol errors.
|
||
This is called record marking (RM). One RPC message fits into one RM
|
||
record.
|
||
|
||
A record is composed of one or more record fragments. A record
|
||
fragment is a four-byte header followed by 0 to (2**31) - 1 bytes of
|
||
fragment data. The bytes encode an unsigned binary number; as with
|
||
XDR integers, the byte order is from highest to lowest. The number
|
||
encodes two values -- a boolean which indicates whether the fragment
|
||
is the last fragment of the record (bit value 1 implies the fragment
|
||
is the last fragment) and a 31-bit unsigned binary value which is the
|
||
length in bytes of the fragment's data. The boolean value is the
|
||
highest-order bit of the header; the length is the 31 low-order bits.
|
||
(Note that this record specification is NOT in XDR standard form!)
|
||
|
||
11. THE RPC LANGUAGE
|
||
|
||
Just as there was a need to describe the XDR data-types in a formal
|
||
language, there is also need to describe the procedures that operate
|
||
on these XDR data-types in a formal language as well. The RPC
|
||
Language is an extension to the XDR language, with the addition of
|
||
"program", "procedure", and "version" declarations. The following
|
||
example is used to describe the essence of the language.
|
||
|
||
11.1 An Example Service Described in the RPC Language
|
||
|
||
Here is an example of the specification of a simple ping program.
|
||
|
||
program PING_PROG {
|
||
/*
|
||
* Latest and greatest version
|
||
*/
|
||
version PING_VERS_PINGBACK {
|
||
void
|
||
PINGPROC_NULL(void) = 0;
|
||
|
||
|
||
|
||
Srinivasan Standards Track [Page 13]
|
||
|
||
RFC 1831 Remote Procedure Call Protocol Version 2 August 1995
|
||
|
||
|
||
/*
|
||
* Ping the client, return the round-trip time
|
||
* (in microseconds). Returns -1 if the operation
|
||
* timed out.
|
||
*/
|
||
int
|
||
PINGPROC_PINGBACK(void) = 1;
|
||
} = 2;
|
||
|
||
/*
|
||
* Original version
|
||
*/
|
||
version PING_VERS_ORIG {
|
||
void
|
||
PINGPROC_NULL(void) = 0;
|
||
} = 1;
|
||
} = 1;
|
||
|
||
const PING_VERS = 2; /* latest version */
|
||
|
||
The first version described is PING_VERS_PINGBACK with two
|
||
procedures, PINGPROC_NULL and PINGPROC_PINGBACK. PINGPROC_NULL takes
|
||
no arguments and returns no results, but it is useful for computing
|
||
round-trip times from the client to the server and back again. By
|
||
convention, procedure 0 of any RPC protocol should have the same
|
||
semantics, and never require any kind of authentication. The second
|
||
procedure is used for the client to have the server do a reverse ping
|
||
operation back to the client, and it returns the amount of time (in
|
||
microseconds) that the operation used. The next version,
|
||
PING_VERS_ORIG, is the original version of the protocol and it does
|
||
not contain PINGPROC_PINGBACK procedure. It is useful for
|
||
compatibility with old client programs, and as this program matures
|
||
it may be dropped from the protocol entirely.
|
||
|
||
11.2 The RPC Language Specification
|
||
|
||
The RPC language is identical to the XDR language defined in RFC
|
||
1014, except for the added definition of a "program-def" described
|
||
below.
|
||
|
||
program-def:
|
||
"program" identifier "{"
|
||
version-def
|
||
version-def *
|
||
"}" "=" constant ";"
|
||
|
||
version-def:
|
||
"version" identifier "{"
|
||
|
||
|
||
|
||
Srinivasan Standards Track [Page 14]
|
||
|
||
RFC 1831 Remote Procedure Call Protocol Version 2 August 1995
|
||
|
||
|
||
procedure-def
|
||
procedure-def *
|
||
"}" "=" constant ";"
|
||
|
||
procedure-def:
|
||
type-specifier identifier "(" type-specifier
|
||
("," type-specifier )* ")" "=" constant ";"
|
||
|
||
11.3 Syntax Notes
|
||
|
||
(1) The following keywords are added and cannot be used as
|
||
identifiers: "program" and "version";
|
||
|
||
(2) A version name cannot occur more than once within the scope of a
|
||
program definition. Nor can a version number occur more than once
|
||
within the scope of a program definition.
|
||
|
||
(3) A procedure name cannot occur more than once within the scope of
|
||
a version definition. Nor can a procedure number occur more than once
|
||
within the scope of version definition.
|
||
|
||
(4) Program identifiers are in the same name space as constant and
|
||
type identifiers.
|
||
|
||
(5) Only unsigned constants can be assigned to programs, versions and
|
||
procedures.
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Srinivasan Standards Track [Page 15]
|
||
|
||
RFC 1831 Remote Procedure Call Protocol Version 2 August 1995
|
||
|
||
|
||
APPENDIX A: SYSTEM AUTHENTICATION
|
||
|
||
The client may wish to identify itself, for example, as it is
|
||
identified on a UNIX(tm) system. The flavor of the client credential
|
||
is "AUTH_SYS". The opaque data constituting the credential encodes
|
||
the following structure:
|
||
|
||
struct authsys_parms {
|
||
unsigned int stamp;
|
||
string machinename<255>;
|
||
unsigned int uid;
|
||
unsigned int gid;
|
||
unsigned int gids<16>;
|
||
};
|
||
|
||
The "stamp" is an arbitrary ID which the caller machine may generate.
|
||
The "machinename" is the name of the caller's machine (like
|
||
"krypton"). The "uid" is the caller's effective user ID. The "gid"
|
||
is the caller's effective group ID. The "gids" is a counted array of
|
||
groups which contain the caller as a member. The verifier
|
||
accompanying the credential should have "AUTH_NONE" flavor value
|
||
(defined above). Note this credential is only unique within a
|
||
particular domain of machine names, uids, and gids.
|
||
|
||
The flavor value of the verifier received in the reply message from
|
||
the server may be "AUTH_NONE" or "AUTH_SHORT". In the case of
|
||
"AUTH_SHORT", the bytes of the reply verifier's string encode an
|
||
opaque structure. This new opaque structure may now be passed to the
|
||
server instead of the original "AUTH_SYS" flavor credential. The
|
||
server may keep a cache which maps shorthand opaque structures
|
||
(passed back by way of an "AUTH_SHORT" style reply verifier) to the
|
||
original credentials of the caller. The caller can save network
|
||
bandwidth and server cpu cycles by using the shorthand credential.
|
||
|
||
The server may flush the shorthand opaque structure at any time. If
|
||
this happens, the remote procedure call message will be rejected due
|
||
to an authentication error. The reason for the failure will be
|
||
"AUTH_REJECTEDCRED". At this point, the client may wish to try the
|
||
original "AUTH_SYS" style of credential.
|
||
|
||
It should be noted that use of this flavor of authentication does not
|
||
guarantee any security for the users or providers of a service, in
|
||
itself. The authentication provided by this scheme can be considered
|
||
legitimate only when applications using this scheme and the network
|
||
can be secured externally, and privileged transport addresses are
|
||
used for the communicating end-points (an example of this is the use
|
||
of privileged TCP/UDP ports in Unix systems - note that not all
|
||
systems enforce privileged transport address mechanisms).
|
||
|
||
|
||
|
||
Srinivasan Standards Track [Page 16]
|
||
|
||
RFC 1831 Remote Procedure Call Protocol Version 2 August 1995
|
||
|
||
|
||
REFERENCES
|
||
|
||
[1] Birrell, A. D. & Nelson, B. J., "Implementing Remote Procedure
|
||
Calls", XEROX CSL-83-7, October 1983.
|
||
|
||
[2] Cheriton, D., "VMTP: Versatile Message Transaction Protocol",
|
||
Preliminary Version 0.3, Stanford University, January 1987.
|
||
|
||
[3] Diffie & Hellman, "New Directions in Cryptography", IEEE
|
||
Transactions on Information Theory IT-22, November 1976.
|
||
|
||
[4] Mills, D., "Network Time Protocol", RFC 1305, UDEL,
|
||
March 1992.
|
||
|
||
[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", STD 7, RFC 793, USC/Information
|
||
Sciences Institute, September 1981.
|
||
|
||
[7] Postel, J., "User Datagram Protocol", STD 6, RFC 768,
|
||
USC/Information Sciences Institute, August 1980.
|
||
|
||
[8] Reynolds, J., and Postel, J., "Assigned Numbers", STD 2,
|
||
RFC 1700, USC/Information Sciences Institute, October 1994.
|
||
|
||
[9] Srinivasan, R., "XDR: External Data Representation Standard",
|
||
RFC 1832, Sun Microsystems, Inc., August 1995.
|
||
|
||
[10] Miller, S., Neuman, C., Schiller, J., and J. Saltzer, "Section
|
||
E.2.1: Kerberos Authentication and Authorization System",
|
||
M.I.T. Project Athena, Cambridge, Massachusetts, December 21,
|
||
1987.
|
||
|
||
[11] Steiner, J., Neuman, C., and J. Schiller, "Kerberos: An
|
||
Authentication Service for Open Network Systems", pp. 191-202 in
|
||
Usenix Conference Proceedings, Dallas, Texas, February 1988.
|
||
|
||
[12] Kohl, J. and C. Neuman, "The Kerberos Network Authentication
|
||
Service (V5)", RFC 1510, Digital Equipment Corporation,
|
||
USC/Information Sciences Institute, September 1993.
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Srinivasan Standards Track [Page 17]
|
||
|
||
RFC 1831 Remote Procedure Call Protocol Version 2 August 1995
|
||
|
||
|
||
Security Considerations
|
||
|
||
Security issues are not discussed in this memo.
|
||
|
||
Author's Address
|
||
|
||
Raj Srinivasan
|
||
Sun Microsystems, Inc.
|
||
ONC Technologies
|
||
2550 Garcia Avenue
|
||
M/S MTV-5-40
|
||
Mountain View, CA 94043
|
||
USA
|
||
|
||
Phone: 415-336-2478
|
||
Fax: 415-336-6015
|
||
EMail: raj@eng.sun.com
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Srinivasan Standards Track [Page 18]
|
||
|