External Data Representation
XDR (англ. External Data Representation - внешнее представление данных) — международный стандарт передачи данных в Интернете, используемый в различных RFC для описания типов. XDR позволяет организовать не зависящую от платформы передачу данных между компьютерами в гетерогенных сетях.
XDR | |
---|---|
Название | External Data Representation |
Уровень (по модели OSI) | Представления |
Семейство | TCP/IP, ONC |
Назначение протокола | Стандартизация формата данных |
Спецификация | RFC 4506 / STD 67 |
Разработчик | Sun Microsystems |
External Data Representation (XDR) — это стандарт IETF с 1995 года. Он позволяет данным быть упакованными не зависящим от архитектуры способом, таким образом, данные могут передаваться между гетерогенными компьютерными системами.
- Преобразование из локального представления в XDR называется кодированием.
- Преобразование из XDR в локальное представление называется декодированием.
- XDR выполнен как портативная (переносная) библиотека функций между различными операционными системами и так же не зависит от транспортного уровня.
Среди использующих XDR программ можно назвать следующие:
- Sun RPC
- NetCDF
- Язык программирования R
- SpiderMonkey
- Ganglia
- Interactive Data Language (IDL)
Типы данных в XDR
Мотивация использования XDR
Разные компьютеры могут иметь разное внутреннее представление информации. Например, 32-битный Integer имеет 2 возможные формы представления:
- Порядок байтов от старшего к младшему (Motorola 68000)
- Прямой порядок байтов (Intel 80x86)
Для некоторых функций WinSock их аргументы (то есть, параметры функций) должны храниться в обратном порядке.
- Сервер и клиент могут обмениваться разными типами данных.
- Если сервер и клиент выполняются на двух соответствующих машинах, используя разное внутреннее представление данных, то они должны согласовывать точно представление всех данных, передаваемых между ними.
- Sun Microsystems разработала external data representation (XDR), который определяет представление для различных типов данных (integer, enumeration….)
- XDR стал стандартом де-факто для большинства клиент-серверных приложений:
— Программа преобразует сообщения из своего внутреннего представления в XDR для последующей передачи. Это называется кодированием. — Получатель преобразует полученное сообщение из XDR в собственное представление. Это называется декодированием.
Типы данных в XDR
XDR указывает представление для большинства типов данных в C:
Закодированная информация содержит только данные, она не содержит информации о типе данных. Например, после кодирования 32-битного integer результатом будет 32-битный integer в XDR. Не будет информации о том, что это integer. Клиенты и серверы, использующие XDR, должны согласовывать тип данных сообщений, которыми они обмениваются.
Программная поддержка использования XDR
- XDR определяет представление для каждого типа данных.
- Например, 32-битный integer имеет порядок байтов от старшего к младшему.
- Для содействия программистам XDR обеспечивает библиотеку стандартных программ для конвертирования представления данных.
Посылка сообщения в XDR
- Посылаемое сообщение может состоять из нескольких пунктов данных (items).
- Например, сообщение содержит информацию о студенте. Оно состоит из трёх пунктов:
— имя (строка символов) -ID (целое) -совокупный GPA (floating-point number)
- Перед посылкой сообщения программа (клиент или сервер) конвертирует всю информацию пунктов из внутреннего представления в XDR.
- Шаги конвертирования
- Предоставление буфера для хранения всей информации сообщения, которая должна быть послана.
- Вызов xdrmem_create() для инициализации потока XDR.
Например: xdrmem_create() возвращает указатель на пустой поток.
- Вызов стандартной программы в XDR для преобразования каждого пункта информации. Она будет дописывать закодированную информацию в конец потока следующим образом:
*#* помещать закодированную информацию в следующее доступное место в буфере *#* обновлять внутренний указатель на поток, помещая его на новое доступное свободное место
- Например, конвертирование 32-битного целого:
- После кодирования всех пунктов сообщения это сообщение посылается.
Получение сообщения в XDR
- Когда программа получает сообщение в XDR, она конвертирует каждый пункт данных в сообщении из XDR в своё внутреннее представление.
- Шаги:
- Вызов xdrmem_create() для инициализации потока XDR , указав XDR_DECODE, как четвёртый аргумент.
- Помещение полученного сообщения в буфер.
- Вызов подходящей стандартной программы преобразования для декодирования каждого пункта данных полученного сообщения.
Например, декодирование 32-битного целого: