Кратко
- XDR не переносил внутреннюю раскладку памяти, а задавал одно внешнее big-endian-представление размером, кратным четырём байтам.
- Переменное значение несло длину и содержимое; нулевое заполнение восстанавливало границу, не увеличивая само значение.
- Порядок объявления и дискриминант определяли структуру, но границы сообщений, безопасность и прикладной смысл оставались за другими слоями.
Пустое место не могло хранить случайную память
В примере RFC 4506 имя файла занимает девять байтов. Сначала XDR записывает четырёхбайтную длину, затем девять байтов имени и ещё три нуля. Следующее поле начинается после них, хотя длина имени остаётся равной девяти.
Заполнять этот промежуток произвольным остатком памяти нельзя. Иначе две машины дали бы разные последовательности для одного значения. Побайтовое сравнение и контрольная сумма зависели бы от источника, хотя прикладные данные совпадали. Нулевое заполнение делает канонической даже часть, которая не несёт смысла.
Правило показывает устройство соглашения: компьютерам разрешалось быть разными внутри, но на внешней границе они обязаны были отказаться от частных представлений.
Внутренняя форма заканчивалась у кодировщика
RFC 1014 опубликовал XDR в 1987 году как язык описания и кодирования данных между неодинаковыми архитектурами. Среди пользователей уже назывались Sun RPC и NFS. Синтаксис был похож на C для ясного описания типов, но не являлся программой и не обещал копировать C-структуру прямо из памяти.
Знаковое целое XDR занимает 32 бита в дополнительном коде, старший байт идёт первым. Массивы следуют порядку элементов, структуры — порядку объявления. Каждый узел волен хранить локальный объект иначе, но перед отправкой обязан преобразовать его в общую форму, а после приёма — обратно.
В начале объекта нет переключателя порядка байтов. Если бы вариантов было два, понадобился бы более высокий протокол, сохраняющий сделанный выбор. Единый порядок неравномерно распределяет цену преобразования, зато сохранённый XDR-объект остаётся читаемым без старого сеанса согласования.
Четырёхбайтная единица тоже была компромиссом. Меньшая экономит место, но хуже соответствует выравниванию части машин; большая удобнее для большего числа архитектур, но раздувает кодирование. Стандарт не устранил цену, а сделал её общей.
Длина отделяла содержание от размещения
Переменные opaque-данные начинаются с беззнаковой 32-битной длины. Далее идут ровно указанные байты и до трёх нулей выравнивания. Строки имеют ту же счётную форму; переменный массив сначала называет число элементов.
Декодер может сверить длину с пределом протокола, проверить остаток record и вычислить начало следующего поля. Превышение объявленного максимума — ошибка кодирования. Если автор схемы не указал предел, огромный теоретический максимум языка не обязывает получателя отдавать неограниченную память. Лимиты ресурсов принадлежат работающей стороне.
Счётная строка XDR может содержать NUL. Нативная библиотека с NUL-терминатором способна выделить память по одной длине, а сравнивать или освобождать по другой. Канонический внешний формат не заменяет безопасного преобразования в локальный тип.
Дискриминант открывал только одну ветвь
XDR использует неявную типизацию: имя и универсальная метка типа не сопровождают каждое поле. Стороны заранее разделяют объявление. Поэтому порядок компонентов структуры является контрактом, а тихая перестановка меняет смысл следующих байтов.
Дискриминированный union сначала кодирует целое, enum или bool, а затем выбранную им ветвь. Если default отсутствует, неизвестное значение дискриминанта не имеет допустимого кодирования. Optional-data сводит схему к минимуму: true ведёт к элементу, false — к нулебайтовому void. Отсутствие обозначается выбором, а не угадывается по пустой нагрузке.
Эта власть узкая. Дискриминант выбирает тип продолжения, но не аутентифицирует отправителя, не разрешает удалённое действие и не доказывает истинность содержимого.
Представление не было рамкой сообщения
RFC 1832 в 1995 году оформил развёрнутую форму на Standards Track. В 2006 году RFC 4506 стал STD 67 и прямо сохранил техническое кодирование без изменений. Новые предупреждения касались реализации: ограничивать длины, защищать буферы, учитывать встроенный NUL и сдерживать рекурсию.
RFC 5531 проводит границу слоёв. Сообщения ONC RPC описаны на XDR, но поверх TCP RPC использует отдельный record marking. Заголовок его фрагмента прямо назван не-XDR-формой. Успешно разобранное значение само по себе не сообщает конец произвольного TCP-сообщения, соответствующий вызов или факт завершения операции.
XDR также не даёт шифрования, аутентификации, авторизации, целостности или защиты от повтора. Он делает грамматику проверяемой; основания для доверия и действия должен предоставить другой слой.
Источники и пределы
Закрытый набор состоит из RFC 1014, RFC 1832, RFC 4506 и RFC 5531. Документы подтверждают формат, его преемственность и границу с RPC. Они не измеряют нынешнее применение, не сертифицируют продукты и не превращают правильные байты в личность, полномочие или доказанное исполнение.
Обзор для участников
Подробный контекст профиля
Войдите с подходящим уровнем подписки, чтобы открыть полный обзор и примечания к источникам.
Только для Стратегического сообщества
Стратегическое сообщество
Открыто всем читателям. Вступите и войдите, чтобы открыть обзоры профилей.
Вступить в Стратегическое сообществоТолько для Альянса лидеров
Альянс лидеров
Для проверенных владельцев IP-активов и руководителей. Войдите, чтобы открыть обзоры Альянса.
Вступить в Альянс лидеров
