XDR External Data Representation 1 Process A
Download
Report
Transcript XDR External Data Representation 1 Process A
XDR
External Data Representation
Process A
Process B
XDR Encode/Decode
XDR Encode/Decode
Transport
Transport
1
XDR as a case study
Sun RPC uses XDR.
A good example of a “layer”.
Interesting API.
Powerful paradigm for creation of complex
data structures.
2
XDR
XDR provides a service associated with the
OSI Presentation Layer.
–
–
–
–
Common data representation
Library (not part of the O.S.).
Easy to port to new architectures.
Independence from transport layer.
3
Data Conversion
Asymmetric Data Conversion
– client always converts to the server’s data
representation.
Symmetric Data Conversion
– both client and server convert to some standard
representation.
4
XDR Data Types
boolean
char
short
int
long
float
double
enumeration
structure
string
fixed length array (1-D)
variable length array (1-D)
union
opaque data
5
Implicit vs. Explicit Typing
Explicit Typing means that each piece of
data includes information about the type.
Implicit typing means that the sender and
receiver must agree on the order and type of
all data.
XDR uses Implicit Typing
6
XDR Programming
Most XDR implementations are based on a
buffer paradigm.
A buffer is allocated that is large enough to
hold an entire message.
Individual data items are added to the buffer
one at a time.
XDR buffers can be attached to a file, pipe,
socket or memory.
7
Conversion Terminology
Converting from local representation to
XDR representation is called Encoding.
Converting from XDR representation to
local representation is called Decoding.
Sender
ENCODE
XDR
DECODE
Receiver
8
XDR Buffer Creation
There are a number of buffer creation
functions in the XDR library.
– xdrmem_create
» destination for encoding -or- source for decoding is
a chunk of memory.
– xdrstdio_create
» destination for encoding -or- source for decoding is
a file descriptor.
9
XDR filters
The XDR library includes an extensive set
of filters that perform encoding/decoding
operations.
Each XDR stream includes an attribute that
determines the specific operation that will
be performed by a filter (encoding or
decoding).
10
XDR Filters
The filter to encode/decode an integer is
called xdr_int:
bool_t xdr_int(
XDR *xdrs, int *ip);
the return value indicates success or failure.
xdrs is a pointer to an XDR stream
ip is a pointer to an integer.
11
xdr_int()
If the XDR stream operation is XDR_ENCODE
int count;
XDR *xstream;
xdr_int(xstream, &count);
will convert (encode) the value of count to the
integer representation used by XDR (bigendian) and put the result on the XDR stream.
12
xdr_int()
If the XDR stream operation is XDR_DECODE
int count;
XDR *xstream;
xdr_int(xstream, &count);
will get an XDR integer from the stream, convert
(decode) the value to local integer representation
and put the result in count.
13
xdr_int()
Source Encodes
int count;
xdr_int(xstream,&count);
Destintation decodes
int count;
xdr_int(xstream,&count);
14
Complex Data Filters
The XDR library includes a set of filters
designed to translate complex C data
structures to and from XDR representation.
Many of these filters make use of the
simpler filters to convert individual
components.
15
xdr_array()
The xdr_array() filter provides support for
encoding/decoding a variable length array.
bool_t xdr_array( XDR *xdrs, char *arrp,
u_int *sizep, u_int maxsize, u_int elsize,
xdrproc_t elproc);
sizep is a pointer to the size of the array.
elsize is the size of each element (in bytes).
elproc is a pointer to a function that can encode/decode
individual array elements.
16
xdr_array()
Source
Array ->
0
1
2
3
elproc()
Destination
Array ->
0
1
2
3
17
Inside xdr_array()
xdr_int(xdrs,&sizep);
encode/decode the
number of elements
in the array
for (i=0;i<sizep;i++)
elproc(xdrs,arrp+elsize*i);
encode/decode each array element.
18
xdr_string()
the string conversion filter is a little
different since XDR strings have a
maximum size.
bool_t xdr_string( XDR *xdrs,
char *string, u_int maxsize);
19
Problem!!
We want to send an array of strings between
processes.
What is the problem (using xdr_array)?
What is a possible solution?
20
Distributed Program Design
Communication-Oriented Design
– Design protocol first.
– Build programs that adhere to the protocol.
Application-Oriented Design
– Build application(s).
– Divide programs up and add communication
protocols.
21
RPC
Remote Procedure Call
Call a procedure (subroutine) that is running
on another machine.
Issues:
– identifying and accessing the remote procedure
– parameters
– return value
22
Client
blah, blah, blah
bar = foo(a,b);
blah, blah, blah
Server
int foo(int x, int y ) {
if (x>100)
return(y-2);
else if (x>10)
return(y-x);
else
return(x+y);
}
23
Sun RPC
There are a number of popular RPC
specifications.
Sun RPC (ONC RPC) is widely used.
NFS (Network File System) is RPC based.
Rich set of support tools.
24
Sun RPC Organization
Remote Program
Shared Global Data
Procedure 1
Procedure 2
Procedure 3
25
Procedure Arguments
To reduce the complexity of interface
specification Sun RPC includes support for
a single argument to a remote procedure.*
Typically the single argument is a structure
that contains a number of values.
* Newer versions can handle multiple args.
26
Procedure Identification
Each procedure is identified by:
– Hostname (IP Address)
– Program identifier (32 bit integer)
– Procedure identifier (32 bit integer)
27
Procedure Identification
Each procedure is identified by:
– Hostname (IP Address)
– Program identifier (32 bit integer)
– Procedure identifier (32 bit integer)
– Program Version identifier
» for testing and migration.
28
Program Identifiers
Each remote program has a unique ID.
Sun divided up the IDs:
0x00000000 - 0x1fffffff Sun
0x20000000 - 0x3fffffff Sys Admin
0x40000000 - 0x5fffffff Transient
0x60000000 - 0xffffffff Reserved
29
Procedure Identifiers &
Program Version Numbers
Procedure Identifiers usually start at 1 and
are numbered sequentially
Version Numbers typically start at 1 and are
numbered sequentially.
30
Iterative Server
Sun RPC specifies that at most one remote
procedure within a program can be invoked
at any given time.
If a 2nd procedure is called the caller blocks
until the 1st procedure has completed.
This is useful for applications that may
share data among procedures.
Example: database - to avoid
insert/delete/modify collisions.
31
Communication Semantics
To act like a local procedure (exactly one
invocation per call) - a reliable transport
(TCP) is necessary.
Sun RPC does not support reliable call
semantics.
At Least Once Semantics If the procedure returns
Zero or More Semantics No reply
32
Dynamic Port Mapping
Servers typically do not use well known
protocol ports.
Clients known the Program ID (and host).
A port lookup service runs on each host that
contains RPC servers.
RPC servers register themselves with the
port mapper
33
The portmapper
Each system which will support RPC
servers runs a port mapper server that
provides a central registry for RPC services.
Servers tell the port mapper what services
they offer.
Clients ask a remote port mapper for the
port number corresponsing to Remote
Program ID.
34
More on the portmapper
The portmapper is itself an RPC server!
The portmapper is available on a wellknown port (111).
35
Sun RPC Programming
The RPC library is a collection of tools for
automating the creation of RPC clients and
servers.
RPC clients are processes that call remote
procedures.
RPC servers are processes that include
procedure(s) that can be called by clients.
36
RPC Programming
RPC library
– XDR routines
– RPC run time library
» call rpc service
» register with portmapper
» dispatch incoming request to correct procedure
– Program Generator
37
RPC Run-time Library
High- and Low-level functions that can be
used by clients and servers.
High-level functions provide simple access
to RPC services.
38
High-level Client Library
int callrpc( char *host,
u_long prognum,
u_long versnum,
u_long procnum,
xdrproc_t inproc,
char *in,
xdrproc_t outproc,
char *out);
39
High-Level Server Library
int registerrpc(
u_long prognum,
u_long versnum,
u_long procnum,
char *(*procname)()
xdrproc_t inproc,
xdrproc_t outproc);
40
High-Level Server Library
(cont.)
void svc_run();
svc_run() is a dispatcher.
A dispatcher waits for incoming
connections and invokes the appropriate
function to handle each incoming request.
41
High-Level Library Limitation
The High-Level RPC library calls support
UDP only (no TCP).
You must use lower-level RPC library
functions to use TCP.
The High-Level library calls do not support
any kind of authentication.
42
Low-level RPC Library
Full control over all IPC options
– TCP & UDP
– Timeout values
– Asynchronous procedure calls
Multi-tasking Servers
Broadcasting
43
RPCGEN
There is a tool for automating the creation
of RPC clients and servers.
The program rpcgen does most of the work
for you.
The input to rpcgen is a protocol definition
in the form of a list of remote procedures
and parameter types.
44
RPCGEN
Input File
Protocol Description
rpcgen
Client Stubs
XDR filters
header file
Server skeleton
C Source Code
45
rpcgen Output Files
> rpcgen foo.x
foo_clnt.c (client stubs)
foo_svc.c (server main)
foo_xdr.c (xdr filters)
foo.h
(shared header file)
46
Client Creation
> gcc -o fooclient foomain.c foo_clnt.c foo_xdr.c
foomain.c is the client main() (and possibly
other function) that call rpc services via the
client stub functions in foo_clnt.c
The client stubs use the xdr functions.
47
Server Creation
gcc -o fooserver fooservices.c foo_svc.c foo_xdr.c
fooservices.c contains the definitions of the
actual remote procedures.
48
Example Protocol Definition
struct twonums {
int a;
int b;
};
program UIDPROG {
version UIDVERS {
int RGETUID(string<20>) = 1;
string RGETLOGIN( int ) = 2;
int RADD(twonums) = 3;
} = 1;
} = 0x20000001;
49
50