Кратко
- RFC 1014, опубликованный Sun Microsystems в июне 1987 года, укладывал кодируемые элементы в длину, кратную четырём байтам. Переменная строка несла сначала четырёхбайтовую длину, затем символы и нулевые байты до ближайшей границы.
- В примере RFC за девятью символами
sillyprogидут три нулевых байта заполнения. Тип файла начинается со смещения 16. Длина отделяет имя от остального потока, заполнение ставит следующий элемент на известное место.
У Sun Microsystems в конце RFC есть маленький файл с хорошим чувством юмора. Пользователь john сохраняет программу на Lisp под именем sillyprog; содержимое программы — (quit). Перед девятью символами имени XDR записывает число 9 в четырёх байтах, а после имени добавляет три нуля. Тип файла появляется со смещения 16. Имя осталось прежним. Свободные места достались расписанию остальных полей.
В 1987 году данные ходили между машинами с разными внутренними привычками. RFC перечисляет рабочую станцию Sun, VAX, IBM PC и Cray. XDR, внешнее представление данных, задавал общий язык описания и способ кодирования значений. Sun RPC и NFS использовали его для форматов обмена. За основу принимался восьмибитный байт, который разные устройства могли передавать без потери смысла. Затем включалось простое правило: каждый элемент кодирования занимает число байтов, кратное четырём.
Целое число в 32 бита заполняет такую четвёрку целиком. Имя из девяти символов занимает две полные четвёрки и одно место в третьей. Остальные три XDR заполняет нулями. Счётчик по-прежнему говорит «9», потому что в имени девять байтов содержания. В потоке после счётчика оно занимает двенадцать байтов вместе с заполнением. Получатель читает символы и переходит через нули. Следующий элемент начинается на границе, которую обе стороны могут вычислить одинаково.
Шестнадцатеричная таблица RFC позволяет проверить каждое движение. Смещения 0–3 заняты длиной 9. На смещениях 4–12 лежат буквы имени. Позиции 13–15 заполнены нулями. С 16 начинается EXEC, тип файла со значением 2. Если прибавить нули к имени, получится другое имя. Если начать следующий элемент сразу после девятой буквы, его чтение начнётся на три байта раньше. Ошибка в пустом промежутке испортит и занятые места.
Дальше пример меняет длины, сохраняя способ чтения. EXEC выбирает ветвь объединения с именем интерпретатора lisp: длина 4, затем четыре буквы. Владелец john кодируется так же. У данных (quit) шесть байтов, перед ними записана длина 6, за ними стоят два нуля. Получатель повторяет один порядок действий: прочитать счётчик, взять ровно столько данных, перейти к следующей границе четырёх байтов. Разный размер полей не мешает предсказуемой последовательности.
Строка и непрозрачные данные в XDR имеют разные назначения. Строка в RFC составлена из байтов ASCII. Непрозрачная последовательность передаёт байты, не поручая XDR толковать их содержимое. Для переменных значений можно объявить верхний предел длины; кодирование большего размера является ошибкой. Счётчик помогает найти конец содержимого и проверить допустимый размер. Нулевое заполнение помогает найти начало следующего значения. Это две разные функции, хотя стоят рядом в одном потоке.
Общая схема значений важнее расположения структуры в памяти отправителя. Локальный указатель на чужой машине не указывает на тот же объект. Компиляторы тоже могут по-разному размещать поля. Описание XDR определяет типы и порядок, а кодирование определяет передаваемые байты. В примере значение EXEC сообщает, что дальше следует интерпретатор. Четырёхбайтовая сетка гарантирует, что получатель примет это решение в нужном месте.
Пустые байты стоят денег: три после имени, два после шестибайтового содержимого. RFC показывает счёт без рекламных лозунгов — прямо в таблице смещений. За эту плату читатель получает точный адрес следующего поля. У программы может быть имя sillyprog, но в потоке даже шутке приходится соблюдать рассадку.
Обзор для участников
Подробный контекст профиля
Войдите с подходящим уровнем подписки, чтобы открыть полный обзор и примечания к источникам.
Только для Стратегического сообщества
Стратегическое сообщество
Открыто всем читателям. Вступите и войдите, чтобы открыть обзоры профилей.
Вступить в Стратегическое сообществоТолько для Альянса лидеров
Альянс лидеров
Для проверенных владельцев IP-активов и руководителей. Войдите, чтобы открыть обзоры Альянса.
Вступить в Альянс лидеров





