You are on page 1of 28

XDR (eXternal Data

Representation)
Biểu diễn dữ liệu ngoài

1
Nội dung

1. Tại sao chúng ta cần XDR?


2. XDR là gì?
3. Các hàm thư viện XDR

2
Truyền tham số trong các hệ thống phân
tán
Stubs
Client machine Server machine

sum sum sum (int i,int j){


n = sum (4,7); 4 4 return (i+j);
7 7 }

Kernel Kernel

3
Biểu diễn dữ liệu trong máy tính

n Mỗi cấu trúc máy tính tự định nghĩa về cách


thức biểu diễn dữ liệu
q Big endian vs. Little endian
q 16 bit integer vs. 32 bit integer
q Floating-point representation
MSB LSB
0 0 1 4

260 LSB MSB


4 1 0 0

Increasing memory address

4
Chuyển đổi dữ liệu

n Chuyển đổi dữ liệu không đối xứng


q client always converts to the server’s data
representation
q n-squared conversion problem
n In the case of a set of N computers, N(N-1)/2 versions of
client-server pairs are required
n Chuyển đổi dữ liệu đối xứng
q Cả máy khách và máy chủ đều chuyển đổi dữ liệu từ/
thành một dạng dữ liệu chuẩn.

XDR là Chuyển đổi dữ liệu đối xứng

5
Implicit vs. Explicit Typing
n Explicit typing: mỗi mảnh dữ liệu chứa thông
tin về kiểu dữ liệu .
n Implicit typing: Bên gửi và bên nhận phải
đồng ý về thứ tự và kiểu của tất cả các dữ
liệu.

XDR sử dụng Implicit Typing

6
XDR
n XDR cung cấp các dịch vụ tương ứng với tầng trình diễn trong
mô hình OSI.
q Biểu diễn dữ liệu chung

q Thư viện (không phải là một phần của O.S.).

q Dễ tích hợp với kiến trúc mới

q Độc lập với tầng giao vận

n RFC 1014

Process A Process B

XDR Encode/Decode XDR Encode/Decode

Transport Transport

7
XDR – Nhược điểm

n Dư thừa dữ liệu
q Nhưng không đáng kể

8
Các kiểu dữ liệu XDR
n int n hyper: 64-bit signed binary
n unsigned int integer
n enum n unsigned hyper
n float n structure
n double n fixed array
n string n counted array
n union
n opaque data: unconverted data

9
Các kiểu dữ liệu XDR(2)
(MSB) (LSB)

integer byte 0 byte 1 byte 2 byte 3

32 bits
(MSB) (LSB)

floating-point byte 0 byte 1 byte 2 byte 3


1 8bits 23 bits

32 bits

n See RFC 1832

10
Các hàm thư viện XDR
n Chuyển đổi các mục dữ liệu cục bộ thành dữ liệu XDR và
ngược lại
q Thư viện XDR được xây dựng dựa trên mô hình dòng (stream)
n Quá trình biến đổi dữ liệu cục bộ sang dữ liệu XDR là quá trình đưa
dữ liệu vào dòng XDR

XDR stream

11
Dòng XDR

n Dòng XDR có thể gán vào file, pipe, socket hoặc memory.
n Các mục dữ liệu đơn lẻ được thêm hoặc bớt vào dòng XDR
mỗi lần một phần tử.
n Chuyển đổi các mục dữ liệu cục bộ thành dữ liệu XDR được
gọi là mã hóa
n Chuyển đổi dữ liệu XDR thành các mục dữ liệu cục bộ được
gọi là giải mã

Sender’s XDR Receiver’s


ENCODE DECODE
Program Program

12
Tạo dòng XDR
n void xdrmem_create (XDR *xdrs, char *buf, int
bufsize, enum xdr_op op)
q khởi tạo vùng bộ nhớ cho dòng XDR
q trả về con trỏ trỏ tới dòng XDR tạo ra
n được sử dụng trong các lệnh gọi tiếp theo
q op : XDR_ENCODE, XDR_DECODE or XDR_FREE

#include <rpc/xdr.h>
#define BUFSIZE 4000
XDR *xdrs;
char buf[BUFSIZE];

xdrmem_create(xdrs, buf, BUFSIZE, XDR_ENCODE)

13
Bộ lọc XDR
n Thư viện XDR chứa tập các bộ lọc thực hiện
các thao tác mã hóa hoặc giải mã
n Mỗi dòng XDR chứa một thuộc tính xác định
thao tác (mã hóa hoặc giải mã) được thực
hiện với bộ lọc

14
Các bộ lọc XDR

n Bộ lọc mã hóa/giải mã một số nguyên được


gọi là xdr_int:
bool_t xdr_int(XDR *xdrs, int *ip);

q giá trị trả về true: thành công, false: thất bại


q xdrs: con trỏ trỏ đến một dòng XDR
q ip: con trỏ trỏ đến một số nguyên

15
xdr_int()
Nếu thao tác trên XDR là XDR_ENCODE thì:
int count;
XDR *xstream;
xdr_int(xstream, &count);
sẽ chuyển đổi giá trị của biến count sang biểu diễn số nguyên (big-
endian) trong dòng XDR

Nếu thao tác trên là XDR_DECODE thì:


int count;
XDR *xstream;
xdr_int(xstream, &count);
sẽ lấy số nguyên từ dòng XDR, chuyển đổi thành số nguyên biểu diễn
cục bộ và gán vào biến count

16
xdr_int() encode vs. decode
Mã hóa tại bên gửi

int count;
xdr_int(xstream,&count);

Giải mã tại bên nhận


int count;
xdr_int(xstream,&count);

17
Các bộ lọc XDR khác

n bool_t xdr_char (XDR *xdrs, char *cp)


n bool_t xdr_u_char (XDR *xdrs, unsigned char *ucp)
n bool_t xdr_u_int (XDR *xdrs, unsigned *up)
n bool_t xdr_long (XDR *xdrs, long *lip)
n bool_t xdr_u_long (XDR *xdrs, u_long *lup)
n bool_t xdr_short (XDR *xdrs, short *sip)
n bool_t xdr_u_short (XDR *xdrs, u_short *sup)
n …

18
xdr_string()
n Hàm chuyển đổi chuỗi ký tự khác so với
các hàm chuyển đổi khác
q Có thêm tham số là kích thước tối đa của
chuỗi ký tự

bool_t xdr_string(
XDR *xdrs,
char *string,
u_int maxsize);

19
Các hàm chuyển đổi dữ liệu kết hợp

n Thư viện XDR chứa một tập các hàm filter


chuyển đổi giữa các biến cấu trúc C và XDR
q Áp dụng các hàm chuyển đổi đơn giản vào các
thành phần của cấu trúc

20
xdr_array()
n Hàm xdr_array() chuyển đổi kiểu dữ
liệu dạng chuỗi với kích thước khác nhau
q Sử dụng cùng một hàm để mã hóa và giải mã

21
xdr_array prototype
rra y
he a
bool_t xdr_array( o f t
s iz e
t h e
XDR *xdrs, e r t o
o in t c an
char **arrp, a p t ha t
tion l
fu n c i d u a
u_int *sizep, a d i v
e r to d e in
o in t e c o
u_int maxsize, p de / d ts
c o e n
en e le m
u_int elsize, y
arra
xdrproc_t elproc);

22
xdr_array() (cont.)
Source
0 1 2 3
Array

elproc()

Dest.
0 1 2 3
Array

23
Inside xdr_array()
encode/decode the number of
elements in the array
xdr_int(xdrs,&sizep);
xdr_int(xdrs,&elsize);

for (i=0;i<sizep;i++)
elproc(xdrs,arrp+elsize*i);

encode/decode each array


element.

24
Example

n A user on a networked machine can be


identified by
q (a) the machine name
q (b) the user’s UID
q (c) the group numbers to which the user belongs

25
struct netuser {
char *nu_machinename; // tên máy
int nu_uid; // UID
u_int nu_glen; // số lượng group
int *nu_gids; // chuỗi các ID của group You can
}; create a XDR
#define NLEN 255 /* machine names < 256 chars */ routine by
#define NGRPS 20 /* user can’t be in > 20 groups */ yourself
bool_t xdr_netuser(XDR *xdrs, struct netuser *nup)
{
return(xdr_string(xdrs, &nup->nu_machinename, NLEN) &&
xdr_int(xdrs, &nup->nu_uid) &&
xdr_int(xdrs, &nup->nu_glen) &&
xdr_array(xdrs, &nup->nu_gids, &nup->nu_glen,
NGRPS, sizeof (int), xdr_int));
}

26
XDR streams, I/O and TCP

n Các hàm chuyển đổi XDR có thể gửi dữ liệu


qua kết nối TCP một cách tự động mỗi lần
chuyển đổi dữ liệu, theo các bước sau
q Tạo một socket
q Gọi hàm fdopen để gán dòng xuất nhập chuẩn
vào socket
q Tạo dòng XDR và kết nối với mô tả I/O đã tạo
n void xdrstdio_create (XDR *xdrs, FILE *file, enum
xdr_op op)

27
XDR và RPC

n RPC sử dụng XDR, nhưng các hàm XDR sẽ


được sử dụng một cách tự động
n Nhưng chúng ta cũng cần hiểu XDR hoạt
động như thế nào ...

28

You might also like