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