Откройте актуальную версию документа прямо сейчас
Если вы являетесь пользователем интернет-версии системы ГАРАНТ, вы можете открыть этот документ прямо сейчас или запросить по Горячей линии в системе.
Приложение G
(справочное)
Руководство
по модели расширения типа АСН.1
G.1 Обзор
G.1.1 Может случиться так, что тип АСН.1 с течением времени выходит за корень расширения с помощью серии расширений, называемых расширяющими дополнениями.
G.1.2 Тип АСН.1, доступный конкретной реализации, может быть типом корня расширения или типом корня расширения плюс одно или несколько расширяющих дополнений. Каждый тип АСН.1, содержащий расширяющее дополнение, содержит и все ранее определенные расширяющие дополнения.
G.1.3 Говорят, что определения типов АСН.1 в этой последовательности являются связанными расширением (более точное определение понятия "связанные расширением" см. в 3.8.32), и требуется, чтобы правила кодирования применялись к связанным расширением типам таким образом, что если две системы используют два разных связанных расширением типа, то между ними будут успешно переданы те части информации содержимого этих типов, которая является общей для двух систем. Кроме того, требуется, чтобы части, не являющиеся общими для обеих систем, могли быть выделены и в последующем ретранслированы (возможно, третьей стороне) при условии использования того же синтаксиса передачи.
Примечание - Отправитель может использовать тип, который находится в последовательности расширяющих дополнений как раньше, так и позже.
G.1.4 Последовательность типов, полученная добавлениями к корневому типу, называется серией расширений. Для того чтобы правила кодирования могли обеспечить соответствующую передачу связанных расширением типов (которая может потребовать больше битов в строке), такие типы (включая корень расширения) должны быть отмечены синтаксически. Признаком является многоточие (...) и называется маркером расширения.
Пример
Корень расширения 1-е расширение 2-е расширение 3-е расширение
A : : = SEQUENCE { A : : = SEQUENCE { A : : = SEQUENCE { A : : = SEQUENCE {
a INТEGER, a INТEGER, a INТEGER, a INТEGER,
... ..., ..., ...,
} b BOOLEAN, b BOOLEAN, b BOOLEAN,
с INTEGER с INTEGER, с INTEGER,
} d SEQUENCE { d SEQUENCE {
e INTEGER, e INTEGER,
..., ...,
..., g BOOLEAN OPTIONAL,
f IA5String h BMPString,
} ...,
} f IA5String
}
}
G.1.5 Все расширяющие дополнения вставляются между парами маркеров расширения. Единственный маркер расширения допустим, если в корне расширения он стоит последним элементом типа; в этом случае принимается, что парный ему маркер расширения стоит непосредственно перед закрывающей фигурной скобкой типа, а расширяющие дополнения вставляются в конец типа.
G.1.6 Тип, имеющий маркер расширения, может быть вложен либо в тип, не имеющий такого маркера, либо в тип в корне расширения, либо в тип расширяющего дополнения. В таких случаях серии расширений трактуются независимо друг от друга и вложенный тип с маркером расширения не влияет на тип, в который он вложен. В любой конкретной конструкции может быть только одна точка вставки расширения (в конце типа, если используется единственный маркер расширения, или непосредственно перед вторым маркером расширения, если используется пара маркеров расширения).
G.1.7 Новое расширяющее дополнение в серии расширений определяется в терминах расширяющей дополнительной группы (из одного или нескольких типов, заключенных между "[[" и "]]") или единственного типа, добавленного в точке вставки расширения. В следующем примере первое расширение определяет расширяющую дополнительную группу, когда b, с должны одновременно присутствовать или отсутствовать в значении типа А. Второе расширение определяет единственный тип компонента d, который может отсутствовать в значении типа А. Третье расширение определяет расширяющую дополнительную группу, в которой компонент h должен присутствовать в значении типа А всякий раз, когда в нем есть новая расширяющая дополнительная группа.
Пример
Корень расширения 1-е расширение 2-е расширение 3-е расширение
A : : = SEQUENCE { A : : = SEQUENCE { A : : = SEQUENCE { A : : = SEQUENCE {
a INТEGER, a INТEGER, a INТEGER, a INТEGER,
... ..., ..., ...,
} [[ [[ [[
b BOOLEAN, b BOOLEAN, b BOOLEAN,
c INTEGER c INTEGER, c INTEGER,
]] ]], ]],
} d SEQUENCE { d SEQUENCE {
e INTEGER, e INTEGER,
..., ...,
..., [[
f IA5String g BOOLEAN OPTIONAL,
} h BMPString,
} ]],
...,
f IA5String
}
}
G.1.8 Хотя обычной практикой должно стать добавление со временем расширяющих дополнений, используемые модель и спецификация АСН.1 не содержат время. Два типа являются связанными расширением, если один может быть "выращен" из другого расширяющими дополнениями. Таким образом, один тип содержит все компоненты другого. Могут быть типы, которые "наращиваются" в противоположном направлении (хотя это мало вероятно). Это может произойти, если тип начинается (во времени) с большого количества расширений, которые последовательно удаляются. Все, что передает АСН.1 и ее правила кодирования, является две спецификации типов связанные или не связанные расширением. Если они связаны, то все правила кодирования АСН.1 должны обеспечивать взаимодействие между их пользователями.
G.1.9 Обычно начинают с некоторого типа и затем решают, хотят ли взаимодействовать с предшествующими версиями, если они были расширены. Если это так, то включают маркер расширения. Затем к типу можно добавить последующие расширяющие дополнения без изменения битов в строке для более ранних значений, но с определенной обработкой расширенных значений ранними системами. Существенно отметить, что добавление маркера расширения к типу, который ранее его не имел, или удаление существующего маркера расширения в общем случае изменит биты в строке и будет препятствовать взаимодействию. Такие изменения в общем случае потребуют изменения версий всех задействованных протоколов.
G.1.10 В таблице G.1 приведены типы АСН.1, которые могут быть типом корня расширения для последовательности расширений АСН.1, и виды единичных расширяющих дополнений, допустимых для этого типа (конечно, кратные расширяющие дополнения могут быть сделаны последовательно или одновременно).
Таблица G.1 - Расширяющие дополнения
Тип корня расширения |
Вид расширяющих дополнений |
ENUMERATED |
Добавление единичного перечисления в конец "AdditionalEnumeration" со значением перечисления большим, чем значение любого добавленного ранее перечисления |
SEQUENCE и SET |
Добавление единичного типа или расширяющей дополнительной группы в конец "ExtensionAdditionList". "ComponentType", которые являются расширяющими дополнениями (не содержащимися в расширяющей дополнительной группе) не обязательно должны быть отмечены как OPTIONAL или DEFAULT, хотя чаще всего это именно так |
CHOICE |
Добавление единичного "NamedType" в конец "ExtensionAdditionAlter-nativesList" |
Нотация ограничения |
Добавление единичного "AdditionalElementSetSpec" к нотации "Element-SetSpecs" |
G.2 Влияние на нумерацию версий
G.2.1 Когда спецификация АСН.1 используется повторно с определениями типов, измененными в терминах определений, связанных расширением типов, то для любых задач эти изменения сами по себе не требуют изменения идентификатора объекта модуля или номера версии протокола.
G.2.2 Может быть так, что по некоторым другим причинам такие изменения должны сопровождаться изменением номера версии, но это не является обязательным требованием.
G.2.3 Напротив, добавление маркера расширения к типу, который ранее его не имел, или добавление компонентов к типу "последовательность" или "множество" без маркера расширения создает новый тип, который не связан расширением со старым, и содержащему его модулю должен быть присвоен новый идентификатор объекта, а с протоколом должен быть связан новый номер версии.
G.3 Требования к правилам кодирования
G.3.1 Абстрактный синтаксис может быть определен как значения единственного типа АСН.1, который является расширяемым. Он содержит все значения, которые могут быть получены добавлением или удалением расширяющих дополнений. Такой абстрактный синтаксис называется связанным расширением абстрактным синтаксисом.
G.3.2 Набор правильно созданных правил кодирования для связанного расширением абстрактного синтаксиса удовлетворяет дополнительным требованиям, установленным в G.3.3 - G.3.5.
Примечание - Правила кодирования АСН.1 удовлетворяют этим требованиям.
G.3.3 Определение процедур для преобразования абстрактного значения в кодирование для передачи и преобразования полученного кодирования в абстрактное значение должно распознавать возможность того, что отправитель и получатель используют разные абстрактные синтаксисы, которые не идентичны, но связаны расширением.
G.3.4 В этом случае правила кодирования должны гарантировать, что когда отправитель имеет спецификацию более раннюю в серии расширений, чем получатель, то значения отправителя должны быть преобразованы таким образом, чтобы получатель мог определить, что расширяющие дополнения отсутствуют.
G.3.5 Правила кодирования должны гарантировать, что когда отправитель имеет спецификацию типа, которая является более поздней в серии расширений, чем спецификация получателя, то передача значений этого типа получателю остается возможной.
Если вы являетесь пользователем интернет-версии системы ГАРАНТ, вы можете открыть этот документ прямо сейчас или запросить по Горячей линии в системе.