External Data Representation

XDR
Название External Data Representation
Уровень (по модели OSI) Представления
Семейство TCP/IP, ONC
Назначение протокола Стандартизация формата данных
Спецификация RFC 4506 / STD 67
Разработчик Sun Microsystems

XDR (англ. External Data Representation - внешнее представление данных) — международный стандарт передачи данных в Интернете, используемый в различных RFC для описания типов. XDR позволяет организовать не зависящую от платформы передачу данных между компьютерами в гетерогенных сетях.

External Data Representation (XDR) — это стандарт IETF с 1995 года. Он позволяет данным быть упакованными не зависящим от архитектуры способом, таким образом, данные могут передаваться между гетерогенными компьютерными системами.

  • Преобразование из локального представления в XDR называется кодированием.
  • Преобразование из XDR в локальное представление называется декодированием.
  • XDR выполнен как портативная (переносная) библиотека функций между различными операционными системами и так же не зависит от транспортного уровня.

Среди использующих XDR программ можно назвать следующие:

Типы данных в XDR

[править | править код]
  • boolean
  • int (32-битное целое число)
  • hyper (64-битное целое число)
  • float
  • double
  • enumeration
  • structure
  • string
  • массивы фиксированной длины
  • массивы переменной длины
  • неформатированные («сырые») данные

Мотивация использования 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.
  • Шаги конвертирования
    1. Предоставление буфера для хранения всей информации сообщения, которая должна быть послана.
    2. Вызов xdrmem_create() для инициализации потока XDR.

Например: xdrmem_create() возвращает указатель на пустой поток.

    1. Вызов стандартной программы в XDR для преобразования каждого пункта информации. Она будет дописывать закодированную информацию в конец потока следующим образом:
       *#* помещать закодированную информацию в следующее доступное место в буфере
       *#* обновлять внутренний указатель на поток, помещая его на новое доступное свободное место 
      • Например, конвертирование 32-битного целого:
    1. После кодирования всех пунктов сообщения это сообщение посылается.

Получение сообщения в XDR

[править | править код]
  • Когда программа получает сообщение в XDR, она конвертирует каждый пункт данных в сообщении из XDR в своё внутреннее представление.
  • Шаги:
    1. Вызов xdrmem_create() для инициализации потока XDR , указав XDR_DECODE, как четвёртый аргумент.
    2. Помещение полученного сообщения в буфер.
    3. Вызов подходящей стандартной программы преобразования для декодирования каждого пункта данных полученного сообщения.

Например, декодирование 32-битного целого: