Из Википедии, свободной энциклопедии
Перейти к навигации Перейти к поиску

Абстрактная синтаксическая нотация 1 ( ASN.1 ) - это стандартный язык описания интерфейса для определения структур данных, которые могут быть сериализованы и десериализованы кроссплатформенным способом. Он широко используется в телекоммуникациях и компьютерных сетях , особенно в криптографии .

Разработчики протоколов определяют структуры данных в модулях ASN.1, которые обычно являются разделом более широкого стандарта, написанного на языке ASN.1. Преимущество состоит в том, что описание кодировки данных в ASN.1 не зависит от конкретного компьютера или языка программирования. Поскольку ASN.1 читается как человеком, так и машинами, компилятор ASN.1 может компилировать модули в библиотеки кода, кодеки , которые декодируют или кодируют структуры данных. Некоторые компиляторы ASN.1 могут создавать код для кодирования или декодирования нескольких кодировок, например, упакованный, BER или XML .

ASN.1 - это совместный стандарт Сектора стандартизации электросвязи Международного союза электросвязи ( ITU-T ) 17-й Исследовательской комиссии ITU-T и ISO / IEC , первоначально определенный в 1984 году как часть CCITT X.409: 1984. [1] В 1988 году ASN.1 перешла на собственный стандарт X.208 из-за широкой применимости. Существенно переработанная версия 1995 года входит в серию X.680 . [2] Последней версией серии рекомендаций X.680 является версия 5.0, опубликованная в 2015 году.

Языковая поддержка [ править ]

ASN.1 - это обозначение объявления типа данных. Он не определяет, как управлять переменной такого типа. Управление переменными определяется на других языках, таких как SDL (язык спецификации и описания) для исполняемого моделирования или TTCN-3 (нотация тестирования и управления тестированием) для тестирования на соответствие. Оба этих языка изначально поддерживают объявления ASN.1. Можно импортировать модуль ASN.1 и объявить переменную любого из типов ASN.1, объявленных в модуле.

Приложения [ править ]

ASN.1 используется для определения большого количества протоколов. Наиболее широко он используется в телекоммуникациях, криптографии и биометрии.

Кодировки [ править ]

ASN.1 тесно связан с набором правил кодирования, которые определяют, как представлять структуру данных в виде серии байтов. Стандартные правила кодирования ASN.1 включают:

Обозначение управления кодированием [ править ]

Рекомендации ASN.1 предоставляют ряд предопределенных правил кодирования. Если ни одно из существующих правил кодирования не подходит, нотация управления кодированием (ECN) предоставляет пользователю возможность определить свои собственные настраиваемые правила кодирования.

Связь с кодированием почты с улучшенной конфиденциальностью (PEM) [ править ]

Кодирование почты с улучшенной конфиденциальностью (PEM) полностью не связано с ASN.1 и его кодеками, однако закодированные данные ASN.1 (которые часто являются двоичными) часто кодируются PEM. Это может помочь при транспортировке по носителям, чувствительным к текстовому кодированию, таким как реле SMTP, а также к копированию и вставке.

Пример [ править ]

Это пример модуля ASN.1, определяющего сообщения (структуры данных) фиктивного протокола Foo :

ОПРЕДЕЛЕНИЯ FooProtocol :: = НАЧАТЬ FooQuestion :: = ПОСЛЕДОВАТЕЛЬНОСТЬ { trackingNumber INTEGER, вопрос IA5String } FooAnswer :: = SEQUENCE { questionNumber INTEGER, ответ BOOLEAN }КОНЕЦ

Это может быть спецификация, опубликованная создателями Foo Protocol. Потоки разговоров, обмены транзакциями и состояния не определены в ASN.1, но оставлены для других обозначений и текстового описания протокола.

Предполагая, что сообщение соответствует протоколу Foo и будет отправлено принимающей стороне, это конкретное сообщение ( блок данных протокола (PDU)):

myQuestion FooQuestion :: = { trackingNumber 5, вопрос "Есть кто-нибудь?"}

ASN.1 поддерживает ограничения на значения и размеры, а также расширяемость. Вышеуказанная спецификация может быть изменена на

ОПРЕДЕЛЕНИЯ FooProtocol :: = НАЧАТЬ FooQuestion :: = ПОСЛЕДОВАТЕЛЬНОСТЬ { trackingNumber INTEGER (0..199), вопрос IA5String } FooAnswer :: = SEQUENCE { questionNumber INTEGER (10..20), ответ BOOLEAN } FooHistory :: = SEQUENCE { вопросы ПОСЛЕДОВАТЕЛЬНОСТЬ (РАЗМЕР (0..10)) FooQuestion, отвечает ПОСЛЕДОВАТЕЛЬНОСТЬ (РАЗМЕР (1..10)) FooAnswer, anArray SEQUENCE (SIZE (100)) OF INTEGER (0..1000), ... }КОНЕЦ

Это изменение ограничивает значение trackingNumbers от 0 до 199 включительно, а questionNumbers - значение от 10 до 20 включительно. Размер массива вопросов может составлять от 0 до 10 элементов, а массива ответов от 1 до 10 элементов. Поле anArray представляет собой массив целых чисел фиксированной длины из 100 элементов, который должен находиться в диапазоне от 0 до 1000. Маркер расширяемости «...» означает, что спецификация сообщения FooHistory может иметь дополнительные поля в будущих версиях спецификации; системы, совместимые с одной версией, должны иметь возможность получать и передавать транзакции из более поздней версии, хотя и способны обрабатывать только поля, указанные в более ранней версии. Хорошие компиляторы ASN.1 сгенерируют (на C, C ++, Java и т. Д.) Исходный код, который автоматически проверяет соответствие транзакций этим ограничениям.Транзакции, которые нарушают ограничения, не должны приниматься из приложения или передаваться в него. Управление ограничениями на этом уровне значительно упрощает спецификацию протокола, поскольку приложения будут защищены от нарушения ограничений, что снизит риски и затраты.

Чтобы отправить сообщение myQuestion по сети, сообщение сериализуется (кодируется) в виде серии байтов с использованием одного из правил кодирования . Спецификация протокола Foo должна явно указывать один набор правил кодирования для использования, чтобы пользователи протокола Foo знали, какое из них им следует использовать и ожидать.

Пример, закодированный в DER [ править ]

Ниже представлена ​​структура данных, показанная выше как FooQuestion, закодированная в формате DER (все числа в шестнадцатеричном формате):

30 13 02 01 05 16 0e 41 6e 79 62 6f 64 79 20 74 68 65 72 65 3f

DER - это кодирование типа длина-значение , поэтому приведенную выше последовательность можно интерпретировать со ссылкой на стандартные типы SEQUENCE, INTEGER и IA5String следующим образом:

30 - тип тега с указанием ПОСЛЕДОВАТЕЛЬНОСТИ13 - длина в октетах следующего значения 02 - тип тега, указывающий INTEGER 01 - длина в октетах следующего значения 05 - значение (5) 16 - тип тега с указанием IA5String  (IA5 означает полный 7-битный набор ISO 646, включая варианты,  но обычно это US-ASCII) 0e - длина в октетах следующего за ним значения 41 6e 79 62 6f 64 79 20 74 68 65 72 65 3f - значение («Кто-нибудь там?»)

Пример, закодированный в XER [ править ]

В качестве альтернативы можно закодировать ту же структуру данных ASN.1 с помощью правил кодирования XML (XER) для достижения большей удобочитаемости человеком "по сети". Тогда это будет выглядеть как следующие 108 октетов (количество пробелов включает пробелы, используемые для отступов):

<FooQuestion>  <trackingNumber> 5 </trackingNumber>  <question> Есть кто-нибудь? </question> </FooQuestion>

Пример, закодированный в PER (без выравнивания) [ править ]

В качестве альтернативы, если используются правила упакованного кодирования, будут созданы следующие 122 бита (16 октетов составляют 128 бит, но здесь только 122 бита несут информацию, а последние 6 бит являются просто заполнением):

01 05 0e 83 bb ce 2d f9 3c a0 e9 a3 2f 2c af c0

В этом формате теги типов для требуемых элементов не кодируются, поэтому его нельзя проанализировать, не зная ожидаемых схем, используемых для кодирования. Кроме того, байты для значения IA5String упакованы с использованием 7-битных единиц вместо 8-битных единиц, поскольку кодировщик знает, что для кодирования байтового значения IA5String требуется только 7 бит. Однако байты длины здесь по-прежнему закодированы, даже для первого целочисленного тега 01 (но упаковщик PER также может пропустить его, если он знает, что допустимый диапазон значений умещается на 8 битах, и он может даже сжать один байт значения 05 с меньшими затратами. чем 8 бит, если он знает, что допустимые значения могут соответствовать только меньшему диапазону).

Последние 6 бит в закодированном PER дополняются нулевыми битами в 6 младших значащих битах последнего байта c0: эти дополнительные биты не могут быть переданы или использованы для кодирования чего-либо еще, если эта последовательность вставлена ​​как часть более длинного невыровненного PER последовательность.

Это означает, что невыровненные данные PER представляют собой, по сути, упорядоченный поток битов, а не упорядоченный поток байтов, как при выровненном PER, и что их будет немного сложнее декодировать программным обеспечением на обычных процессорах, поскольку для этого потребуются дополнительные контекстные биты. сдвиг и маскирование, а не прямая байтовая адресация (но то же самое замечание будет справедливо для современных процессоров и модулей памяти / хранения, минимальная адресуемая единица которых превышает 1 октет). Однако современные процессоры и сигнальные процессоры включают аппаратную поддержку быстрого внутреннего декодирования битовых потоков с автоматической обработкой вычислительных блоков, которые пересекают границы адресных блоков хранения (это необходимо для эффективной обработки в кодеках данных для сжатия / декомпрессии или с некоторым шифрованием / алгоритмы дешифрования).

Если требуется выравнивание границ октетов, выровненный кодер PER выдаст:

01 05 0e 41 6e 79 62 6f 64 79 20 74 68 65 72 65 3f

(в этом случае каждый октет отдельно заполняется нулевыми битами на неиспользуемых наиболее значимых битах).

Инструменты [ править ]

Большинство инструментов, поддерживающих ASN.1, делают следующее:

  • проанализировать файлы ASN.1,
  • генерирует эквивалентное объявление на языке программирования (например, C или C ++),
  • генерирует функции кодирования и декодирования на основе предыдущих объявлений.

Список инструментов, поддерживающих ASN.1, можно найти на веб-странице ITU-T Tool .

Онлайн-инструменты [ править ]

  • Веб-инструмент ASN1

Сравнение с аналогичными схемами [ править ]

ASN.1 аналогичен по назначению и использованию буферам протокола и Apache Thrift , которые также являются языками описания интерфейсов для межплатформенной сериализации данных. Подобно этим языкам, он имеет схему (в ASN.1, называемую «модулем») и набор кодировок, обычно кодировок типа-длины-значения . Однако ASN.1, определенная в 1984 году, предшествует им на много лет. Он также включает более широкий спектр основных типов данных, некоторые из которых являются устаревшими, и имеет больше возможностей для расширения. Одно сообщение ASN.1 может включать данные из нескольких модулей, определенных в нескольких стандартах, даже стандартах, определенных с разницей в годы.

ASN.1 также включает встроенную поддержку ограничений на значения и размеры. Например, модуль может указывать целочисленное поле, которое должно находиться в диапазоне от 0 до 100. Длина последовательности значений (массива) также может быть указана либо как фиксированная длина, либо как диапазон разрешенных длин. Ограничения также могут быть указаны как логические комбинации наборов основных ограничений.

Значения, используемые в качестве ограничений, могут быть литералами, используемыми в спецификации PDU, или значениями ASN.1, указанными в другом месте файла схемы. Некоторые инструменты ASN.1 делают эти значения ASN.1 доступными для программистов в сгенерированном исходном коде. Используемые как константы для определяемого протокола, разработчики могут использовать их в логической реализации протокола. Таким образом, все PDU и константы протокола могут быть определены в схеме, и все реализации протокола на любом поддерживаемом языке основываются на этих значениях. Это избавляет разработчиков от необходимости указывать константы протокола кода в исходном коде своей реализации. Это значительно облегчает разработку протокола; константы протокола могут быть изменены в схеме ASN.1, и все реализации обновляются просто путем перекомпиляции, что способствует быстрому и низкому риску цикла разработки.

Если инструменты ASN.1 правильно реализуют проверку ограничений в сгенерированном исходном коде, это автоматически проверяет данные протокола во время работы программы. Как правило, инструменты ASN.1 включают проверку ограничений в сгенерированных процедурах сериализации / десериализации, вызывая ошибки или исключения, если встречаются данные, выходящие за границы. Сложно реализовать все аспекты ограничений ASN.1 в компиляторе ASN.1. Не все инструменты поддерживают полный набор возможных выражений ограничений. XML - схема и JSON схема и поддержка аналогичных ограничений понятие. Инструментальная поддержка ограничений в них различается. Компилятор Microsoft xsd.exe игнорирует их.

ASN.1 визуально похож на расширенную форму Бэкуса-Наура (ABNF), которая используется для определения многих Интернет-протоколов, таких как HTTP и SMTP . Однако на практике они совершенно разные: ASN.1 определяет структуру данных, которая может быть закодирована различными способами (например, JSON, XML, двоичный). ABNF, с другой стороны, определяет кодировку («синтаксис»), в то же время он определяет структуру данных («семантику»). ABNF, как правило, чаще используется для определения текстовых, удобочитаемых протоколов и обычно не используется для определения кодировок типа длина-значение.

Многие языки программирования определяют специфичные для языка форматы сериализации. Например, модуль Python «pickle» и модуль Ruby «Marshal». Эти форматы обычно зависят от языка. Они также не требуют схемы, что упрощает их использование в сценариях специального хранилища, но не подходит для протоколов связи.

JSON и XML также не требуют схемы, что упрощает их использование. Однако они оба являются межплатформенными стандартами и широко используются для протоколов связи, особенно в сочетании со схемой XML или схемой JSON .

Некоторые инструменты ASN.1 могут переводить между ASN.1 и XML-схемой (XSD). Перевод стандартизирован ITU. Это позволяет определять протокол в ASN.1, а также автоматически в XSD. Таким образом, возможно (хотя и не рекомендуется) иметь в проекте схему XSD, компилируемую инструментами ASN.1, производящими исходный код, который сериализует объекты в / из формата JSON. Более практическое использование состоит в том, чтобы разрешить другим подпроектам использовать схему XSD вместо схемы ASN.1, возможно, с учетом доступности инструментов для выбранного языка подпроектов с XER, используемым в качестве формата передачи протокола.

Дополнительные сведения см. В разделе Сравнение форматов сериализации данных .

См. Также [ править ]

  • X.690
  • Класс информационных объектов (ASN.1)
  • Уровень представления

Ссылки [ править ]

  1. ^ "База данных рекомендаций ITU-T" . ITU . Проверено 6 марта 2017 .
  2. ^ ITU-T X.680 - Спецификация основных обозначений
  3. ^ ITU-T X.690 - Основные правила кодирования (BER)
  4. ^ ITU-T X.690 - Особые правила кодирования (DER)
  5. ^ ITU-T X.690 - Канонические правила кодирования (CER)
  6. ^ a b c d ITU-T X.691 - Правила упакованного кодирования (PER)
  7. ^ a b c ITU-T X.693 - Правила кодирования XML (XER)
  8. ^ a b ITU-T X.696 - Правила кодирования октетов (OER)
  9. ^ ITU-T X.697 - Правила кодирования обозначений объектов JavaScript (JER)
  10. ^ RFC 3641 - Общие правила кодирования строк (GSER) 

Внешние ссылки [ править ]

  • Руководство непрофессионала по подмножеству ASN.1, BER и DER Хорошее введение для новичков
  • Веб-сайт МСЭ-Т - Введение в ASN.1
  • Видео-введение в ASN.1
  • Учебное пособие по ASN.1 Учебное пособие по основным концепциям ASN.1
  • Учебное пособие по ASN.1 Учебное пособие по ASN.1
  • Компилятор ASN.1-> C ++ с открытым исходным кодом; Включает некоторые спецификации ASN.1. , Онлайн-компилятор ASN.1-> C ++
  • Декодер ASN.1 Позволяет декодировать сообщения, закодированные в ASN.1, в вывод XML.
  • Средство проверки синтаксиса и кодировщик / декодер ASN.1 Проверяет синтаксис схемы ASN.1 и кодирует / декодирует сообщения.
  • Кодер / декодер ASN.1 сообщений 3GPP Кодирует / декодирует сообщения ASN.1 3GPP и позволяет легко редактировать эти сообщения.
  • Бесплатные книги по ASN.1
  • Список инструментов ASN.1 в проекте IvmaiAsn
  • Обзор правил кодирования октетов (OER)
  • Обзор правил кодирования JSON (JER)
  • Утилита узла Typescript для анализа и проверки сообщений ASN.1