ASN.1
Notación de sintaxis abstracta uno (ASN.1) es un lenguaje de descripción de interfaz estándar para definir estructuras de datos que se pueden serializar y deserializar de forma multiplataforma. Se utiliza ampliamente en telecomunicaciones y redes informáticas, y especialmente en criptografía.
Los desarrolladores de protocolos definen estructuras de datos en módulos ASN.1, que generalmente son una sección de un documento de estándares más amplio escrito en el lenguaje ASN.1. La ventaja es que la descripción ASN.1 de la codificación de datos es independiente de una computadora o lenguaje de programación en particular. Debido a que ASN.1 es legible tanto por humanos como por máquinas, un compilador ASN.1 puede compilar módulos en bibliotecas de código, códecs, que decodifican o codifican las estructuras de datos. Algunos compiladores ASN.1 pueden producir código para codificar o decodificar varias codificaciones, p. empaquetado, BER o XML.
ASN.1 es un estándar conjunto del Sector de Normalización de Telecomunicaciones de la Unión Internacional de Telecomunicaciones (ITU-T) en el Grupo de estudio 17 de ITU-T e ISO/IEC, definido originalmente en 1984 como parte de CCITT X.409:1984. En 1988, ASN.1 pasó a su propio estándar, X.208, debido a su amplia aplicabilidad. La versión sustancialmente revisada de 1995 está cubierta por la serie X.680. La última revisión de la serie de recomendaciones X.680 es la edición 6.0, publicada en 2021.
Soporte de idiomas
ASN.1 es una notación de declaración de tipos de datos. No define cómo manipular una variable de este tipo. La manipulación de variables se define en otros lenguajes como SDL (lenguaje de especificación y descripción) para el modelado ejecutable o TTCN-3 (notación de prueba y control de prueba) para la prueba de conformidad. Ambos lenguajes admiten de forma nativa las declaraciones ASN.1. Es posible importar un módulo ASN.1 y declarar una variable de cualquiera de los tipos ASN.1 declarados en el módulo.
Aplicaciones
ASN.1 se utiliza para definir una gran cantidad de protocolos. Sus usos más extensos siguen siendo las telecomunicaciones, la criptografía y la biometría.
Protocolo | Especificación | Normas de codificación específicas o consuetudinarias | Usos |
---|---|---|---|
Interledger Protocol | https://interledger.org/rfcs/asn1/index.html | Reglas de codificación | |
NTCIP 1103 - Protocolos de gestión del transporte | NTCIP 1103 | Reglas de codificación | Tráfico, Transporte y Gestión de Infraestructuras |
X.500 Servicios de Directorio | The ITU X.500 Recommendation Series | Reglas básicas de codificación, Normas de codificación distinguidas | LDAP, TLS (X.509) Certificados, Autenticación |
Protocolo de acceso al directorio ligero (LDAP) | RFC 4511 | Normas básicas de codificación | |
PKCS Cryptography Standards | PKCS Cryptography Standards | Reglas básicas de codificación y reglas de codificación distinguidas | Asimétrica Llaves, paquetes de certificados |
X.400 Manipulación de mensajes | The ITU X.400 Recommendation Series | Un competidor temprano para email | |
EMV | EMVCo Publications | Tarjetas de pago | |
T.120 Conferencias multimedia | The ITU T.120 Recommendation Series | Reglas básicas de codificación, Reglas de codificación envasadas | Protocolo de escritorio remoto de Microsoft (RDP) |
Protocolo de gestión de redes simples (SNMP) | RFC 1157 | Normas básicas de codificación | Gestión y supervisión de redes y computadoras, en particular características relacionadas con el rendimiento y la fiabilidad |
Protocolo Común de Información sobre Gestión (CMIP) | Recomendación de la UIT X.711 | Un competidor para SNMP pero más capaz y no casi tan popular | |
Signalling System No. 7 (SS7) | The ITU Q.700 Recommendation Series | Gestión de las conexiones telefónicas sobre la red telefónica conmutada pública (PSTN) | |
UIT H-Series Protocolos multimedia | The ITU H.200, H.300, and H.400 Recommendation Series | Protocolo de voz sobre Internet (VOIP) | |
BioAPI Interworking Protocol (BIP) | ISO/IEC 24708:2008 | ||
Biometría Común Marco de formatos de cambio (CBEFF) | NIST IR 6529-A | Normas básicas de codificación | |
Authentication Contexts for Biometrics (ACBio) | ISO/IEC 24761:2019 | ||
Aplicaciones de telecomunicaciones apoyadas por computadora (CSTA) | https://www.ecma-international.org/activities/Communications/TG11/cstaIII.htm | Normas básicas de codificación | |
Comunicaciones de corto alcance dedicadas | SAE J2735 | Reglas de codificación envasadas | Comunicaciones de vehículos |
IEEE 802.11p (IEEE WAVE) | IEEE 1609.2 | Comunicaciones de vehículos | |
Sistemas de transporte inteligentes (ETSI ITS) | ETSI EN 302 637 2 (CAM) ETSI EN 302 637 3 (DENM) | Normas de codificación empaquetadas | Comunicaciones de vehículos |
Global System for Mobile Communications (GSM) | http://www.ttfn.net/techno/smartcards/gsm11-11.pdf | 2G Móvil Phone Communications | |
General Packet Radio Service (GPRS) / Mejora de las tasas de datos para GSM Evolution (EDGE) | http://www.3gpp.org/technologies/keywords-acronyms/102-gprs-edge | 2.5G Comunicaciones de teléfonos móviles | |
Sistema Universal de Telecomunicaciones Móviles (UMTS) | http://www.3gpp.org/DynaReport/25-series.htm | Comunicaciones de teléfonos móviles 3G | |
Evolución a largo plazo (LTE) | http://www.3gpp.org/technologies/keywords-acronyms/98-lte | Comunicaciones de teléfono móvil 4G | |
5G | https://www.3gpp.org/news-events/3gpp-news/1987-imt2020_workshop | 5G Móvil Phone Communications | |
Common Alerting Protocol (CAP) | http://docs.oasis-open.org/emergency/cap/v1.2/CAP-v1.2-os.html | Reglas de codificación XML | Información de alerta de intercambio, como Alertas ámbares |
Comunicaciones de enlace de datos Controller-pilot (CPDLC) | Comunicaciones aeronáuticas | ||
Space Link Extension Services (SLE) | Comunicaciones de sistemas espaciales | ||
Especificación del mensaje de fabricación (MMS) | ISO 9506-1:2003 | Fabricación | |
Transferencia de Archivos, Acceso y Gestión (FTAM) | Un competidor temprano y más capaz de Protocolo de Transferencia de Archivos, pero su rara vez utilizado más. | ||
Protocolo de Elementos del Servicio de Operaciones Remotas (ROSE) | Recomendaciones de la UIT X.880, X.881 y X.882 | Una forma temprana de llamada de procedimiento remoto | |
Elemento del Servicio de Control de Asociación (ACSE) | Recomendación de la UIT X.227 | ||
Building Automation and Control Networks Protocol (BACnet) | ASHRAE 135-2020 | BACnet Encoding Rules | Automatización y control de edificios, como con alarmas de incendios, ascensores, sistemas HVAC, etc. |
Kerberos | RFC 4120 | Normas básicas de codificación | autenticación segura |
WiMAX 2 | Wide Area Networks | ||
Intelligent Network | The ITU Q.1200 Recommendation Series | Telecomunicaciones y redes informáticas | |
X2AP | Normas básicas de codificación preparadas por los Países Bajos |
Codificaciones
ASN.1 está estrechamente relacionado con un conjunto de reglas de codificación que especifican cómo representar una estructura de datos como una serie de bytes. Las reglas de codificación ASN.1 estándar incluyen:
Normas de codificación | Identificador de objetos | Valor descriptor de objetos | Descripción | ||||||
---|---|---|---|---|---|---|---|---|---|
Dotted | IRI | ||||||||
Reglas básicas de codificación (BER) | 2.1.1 | /ASN.1/Basic-Encoding | Codificación básica de un solo tipo ASN.1 | UIT X.690 | Octet | Sí. | Sí. | No | Las primeras reglas de codificación especificadas. codifica elementos como secuencias de valor de longitud de etiqueta (TLV). Típicamente ofrece varias opciones sobre cómo se deben codificar los valores de datos. Esta es una de las reglas de codificación más flexibles. |
Distinguished Encoding Rules (DER) | 2.1.2.1 | /ASN.1/BER‐Derived/Distinguido-Encoding | Codificación distinguida de un único tipo ASN.1 | UIT X.690 | Octet | Sí. | Sí. | No | Un subconjunto restringido de las Reglas de codificación básica (BER). Típicamente utilizado para cosas que se firman digitalmente porque, dado que el DER permite menos opciones para la codificación, y debido a que los valores DER-encoded son más propensos a ser re-codificados en exactamente los mismos bytes, las firmas digitales producidas por un valor abstracto dado serán los mismos a través de implementaciones y firmas digitales producidas sobre datos DER-encoded serán menos susceptibles a ataques basados en colisión. |
Reglas de codificación canónicas | 2.1.2.0 | /ASN.1/BER‐Derived/Canonical‐Encoding | Codificación canónica de un único tipo ASN.1 | UIT X.690 | Octet | Sí. | Sí. | No | Un subconjunto restringido de las Reglas de codificación básica (BER). Emplea casi todas las mismas restricciones que las Reglas de Codificación Distinguidas (DER), pero la diferencia notable es que la RCE especifica que muchos valores grandes (especialmente cadenas) deben ser "recogidos" en elementos de subestring individuales en la marca de 1000 bytes o 1000 caracteres (dependiendo del tipo de datos). |
Normas básicas de codificación preparadas (PER) | 2.1.3.0.0 | /ASN.1/Embalado-Encoding/Básicos/Alineados | Codificación envasada de un único tipo ASN.1 (básico alineado) | UIT X.691 | Bit | No | Sí. | No | codifica valores en bits, pero si los bits codificados no son uniformemente divisibles por ocho, los bits de relleno se añaden hasta que un número integral de octets codifican el valor. Capaz de producir codificaciones muy compactas, pero a expensas de la complejidad, y el PER depende en gran medida de las limitaciones impuestas a los tipos de datos. |
Reglas básicas de codificación envasadas (PER) | 2.1.3.0.1 | /ASN.1/Embalado-Encoding/Básico/no obligatorio | Codificación envasada de un único tipo ASN.1 (sótano sin instrucción) | UIT X.691 | Bit | No | No | No | Una variante de las reglas básicas de codificación (PER), pero no remata los valores de datos con bits para producir un número integral de octets. |
Reglas de codificación envasadas canónicas (CPER) | 2.1.3.1.0 | /ASN.1/Embalado-Encoding/Canónicos/Alineados | Codificación envasada de un único tipo ASN.1 (canónico alineado) | UIT X.691 | Bit | No | Sí. | No | Una variante de las Reglas de codificación envasadas (PER) que especifica una única forma de codificación de valores. Las Reglas de codificación canónicas envasadas tienen una relación similar con las Reglas de codificación envasadas que las Reglas de codificación distinguidas (DER) y las Reglas de codificación canónica (CER) tienen a las Reglas de codificación básica (BER). |
Reglas de codificación envasadas canónicas (CPER) | 2.1.3.1.1 | /ASN.1/Embalado-Encoding/Canonical/Unaligned | Codificación envasada de un único tipo ASN.1 (canal no alineado) | UIT X.691 | Bit | No | No | No | Una variante de las Reglas de codificación canónicas (CPER), pero no remata los valores de datos con bits para producir un número integral de octets. |
Reglas básicas de codificación XML (XER) | 2.1.5.0 | /ASN.1/XML‐Encoding/Básico | Codificación XML básica de un único tipo ASN.1 | UIT X.693 | Cara | Sí. | Sí. | Sí. | codifica los datos ASN.1 como XML. |
XML canónico Reglas de codificación (CXER) | 2.1.5.1 | /ASN.1/XML‐Encoding/Canónico | Codificación XML canónica de un único tipo ASN.1 | UIT X.693 | Cara | Sí. | Sí. | Sí. | |
Reglas de codificación XML ampliadas (EXER) | 2.1.5.2 | /ASN.1/XML‐Encoding/Extended | Configuración XML ampliada de un solo tipo ASN.1 | UIT X.693 | Cara | Sí. | Sí. | Sí. | |
Reglas de codificación de Octet (OER) | 2.1.6.0 | Codificación básica OER de un solo tipo ASN.1 | UIT X.696 | Octet | No | Sí. | Un conjunto de reglas de codificación que codifican valores en octets, pero no codifica etiquetas o determinantes de longitud como las Reglas de codificación básica (BER). Los valores de datos codificados usando las Reglas de codificación de Octet a menudo parecen los que se encuentran en protocolos "basados en registros". Las Reglas de Codificación de Octet (OER) fueron diseñadas para ser fáciles de implementar y producir codificaciones más compactas que las producidas por las Reglas de Codificación Básica (BER). Además de reducir el esfuerzo de desarrollar encoder/decoders, el uso de OER puede disminuir la utilización del ancho de banda (aunque no tanto como las Reglas de codificación envasadas), guardar ciclos de CPU y menor latencia de codificación/decodificación. | ||
Reglas de codificación canónicas (OER) | 2.1.6.1 | Codificación Canónica OER de un solo tipo ASN.1 | UIT X.696 | Octet | No | Sí. | |||
JSON Encoding Rules (JER) | UIT X.697 | Cara | Sí. | Sí. | Sí. | codifica datos ASN.1 como JSON. | |||
Reglas de codificación genéricas (GSER) | 1.2.36.79672281.0,0 | Reglas de codificación genéricas (GSER) | RFC 3641 | Cara | Sí. | No | Una especificación incompleta para la codificación de reglas que producen valores legibles por el ser humano. El propósito de GSER es representar datos codificados al usuario o datos de entrada del usuario, en un formato muy sencillo. GSER fue diseñado originalmente para el protocolo de acceso al directorio ligero (LDAP) y rara vez se utiliza fuera de él. El uso de GSER en protocolos reales se desalienta ya que no todas las codificacións de cadenas de caracteres soportadas por ASN.1 pueden reproducirse en él. | ||
BACnet Encoding Rules | ASHRAE 135 | Octet | Sí. | Sí. | Sí. | Encodes elements as tag-length-value (TLV) sequences like the Basic Encoding Rules (BER). | |||
Signalling Specific Encoding Rules (SER) | France Telecom R duplicaD Internal Document | Octet | Sí. | Sí. | Utilizado principalmente en protocolos relacionados con las telecomunicaciones, como GSM y SS7. Diseñado para producir una codificación idéntica de ASN.1 que los protocolos previamente existentes no especificados en ASN.1 producirían. | ||||
Reglas de codificación ligera (LWER) | Documento interno de INRIA. | Palabra de memoria | Sí. | Origina de un documento interno producido por INRIA detallando el "Flat Tree Light Weight Syntax" (FTLWS). Abandonado en 1997 debido al desempeño superior de las Reglas de codificación envasadas (PER). Opcionalmente la transmisión Big-Endian o Little-Endian, así como palabras de memoria de 8 bits, 16 bits y 32 bits. (Por lo tanto, hay seis variantes, ya que hay seis combinaciones de esas opciones.) | |||||
Reglas mínimas de codificación (MBER) | Bit | Propuesto en el decenio de 1980. Se desea ser lo más compacto posible, como las Reglas de codificación envasadas (PER). | |||||||
NEMA Reglas de codificación envasadas | Bit | An incomplete encoding rule specification produced by NEMA. Es incompleta porque no puede codificar y decodificar todos los tipos de datos ASN.1. Compacto como las Reglas de codificación envasadas (PER). | |||||||
Reglas de codificación de alta velocidad | "Reglas de codificación para redes de alta velocidad" | La definición de estas reglas de codificación fue un subproducto de la obra de INRIA en el Sintaxis de peso ligero de árbol plano (FTLWS). |
Notación de control de codificación
Las recomendaciones de ASN.1 proporcionan una serie de reglas de codificación predefinidas. Si ninguna de las reglas de codificación existentes es adecuada, la notación de control de codificación (ECN) proporciona una forma para que un usuario defina sus propias reglas de codificación personalizadas.
Relación con la codificación de correo con privacidad mejorada (PEM)
La codificación de correo con privacidad mejorada (PEM) no tiene ninguna relación con ASN.1 y sus códecs, pero los datos ASN.1 codificados, que a menudo son binarios, suelen estar codificados con PEM para que puedan transmitirse como datos de texto, p. a través de retransmisiones SMTP o a través de búferes de copiar/pegar.
Ejemplo
Este es un módulo ASN.1 de ejemplo que define los mensajes (estructuras de datos) de un protocolo Foo ficticio:
FooProtocol DEFINICIONES::= BEGIN FooQuestion::= SEQUENCE { TrackNumber INTEGER, cuestión IA5String } FooAnswer::= SEQUENCE { cuestión Número INTEGER, respuesta BOOLEAN } FIN
Esta podría ser una especificación publicada por los creadores de Foo Protocol. Los flujos de conversación, los intercambios de transacciones y los estados no se definen en ASN.1, pero se dejan para otras notaciones y descripciones textuales del protocolo.
Asumiendo un mensaje que cumple con el Protocolo Foo y que será enviado a la parte receptora, este mensaje en particular (unidad de datos de protocolo (PDU)) es:
myQuestion FooQuestion::= {} trackingNumber 5, pregunta "¿Hay alguien ahí?" }
ASN.1 admite restricciones en valores y tamaños, y extensibilidad. La especificación anterior se puede cambiar a
FooProtocol DEFINICIONES::= BEGIN FooQuestion::= SEQUENCE { trackingNumber INTEGER(0..199), cuestión IA5String } FooAnswer::= SEQUENCE { cuestión Número INTEGER(10..20), respuesta BOOLEAN } FooHistory::= SEQUENCE { preguntas SEQUENCE(SIZE(0..10)) OF FooQuestion, respuestas SEQUENCE(SIZE(1..10)) DE FooAnswer, anArray SEQUENCE(SIZE(100)) OF INTEGER(0.1000), ... } FIN
Este cambio restringe trackingNumbers para tener un valor entre 0 y 199 inclusive, y questionNumbers para tener un valor entre 10 y 20 inclusive. El tamaño de la matriz de preguntas puede estar entre 0 y 10 elementos, con la matriz de respuestas entre 1 y 10 elementos. El campo anArray es una matriz de enteros de 100 elementos de longitud fija que debe estar en el rango de 0 a 1000. El campo '...' el marcador de extensibilidad significa que la especificación del mensaje FooHistory puede tener campos adicionales en futuras versiones de la especificación; los sistemas que cumplen con una versión deben poder recibir y transmitir transacciones de una versión posterior, aunque pueden procesar solo los campos especificados en la versión anterior. Los buenos compiladores ASN.1 generarán (en C, C++, Java, etc.) un código fuente que verificará automáticamente que las transacciones cumplan con estas restricciones. Las transacciones que violen las restricciones no deben aceptarse ni presentarse en la aplicación. La gestión de restricciones en esta capa simplifica significativamente la especificación de protocolos porque las aplicaciones estarán protegidas contra violaciones de restricciones, lo que reduce el riesgo y el costo.
Para enviar el mensaje myQuestion a través de la red, el mensaje se serializa (codifica) como una serie de bytes usando una de las reglas de codificación. La especificación del protocolo Foo debe nombrar explícitamente un conjunto de reglas de codificación para usar, de modo que los usuarios del protocolo Foo sepan cuál deben usar y esperar.
Ejemplo codificado en DER
A continuación se muestra la estructura de datos que se muestra arriba como myQuestion codificada en formato DER (todos los números están en hexadecimal):
30 13 02 05 16 0e 41 6e 79 62 6f 64 79 20 74 68 65 72 65 3f
DER es una codificación de tipo-longitud-valor, por lo que la secuencia anterior se puede interpretar, con referencia a los tipos estándar SEQUENCE, INTEGER e IA5String, de la siguiente manera:
30 — tipo de etiqueta indicando SEQUENCE 13 — longitud en octets de valor que sigue 02 — tipo de etiqueta que indica INTEGER 01 — longitud en octets de valor que sigue 05 - valor (5) 16 — tipo de etiqueta que indica IA5String (IA5 significa el conjunto completo de 7 bits ISO 646, incluyendo variantes, pero es generalmente US-ASCII) 0e - longitud en octets de valor que sigue 41 6e 79 62 6f 64 79 20 74 68 65 72 65 65 3f — valor ("Hay alguien allí?")
Ejemplo codificado en XER
Como alternativa, es posible codificar la misma estructura de datos ASN.1 con reglas de codificación XML (XER) para lograr una mayor legibilidad humana "por cable". Entonces aparecería como los siguientes 108 octetos (el recuento de espacios incluye los espacios utilizados para la sangría):
" FooQuestion " IdentificandoNúmero5■/trackingNumber - No.¿Hay alguien ahí?■/pregunta relativa" FooQuestion "
Ejemplo codificado en PER (no alineado)
Alternativamente, si se emplean reglas de codificación empaquetada, se producirán los siguientes 122 bits (16 octetos equivalen a 128 bits, pero aquí solo 122 bits contienen información y los últimos 6 bits son simplemente relleno):
01 05 0e 83 bb ce 2d f9 3c a0 e9 a3 2f 2c af c0
En este formato, las etiquetas de tipo para los elementos requeridos no están codificadas, por lo que no se pueden analizar sin conocer los esquemas esperados utilizados para codificar. Además, los bytes para el valor de IA5String se empaquetan utilizando unidades de 7 bits en lugar de unidades de 8 bits, porque el codificador sabe que codificar un valor de byte de IA5String requiere solo 7 bits. Sin embargo, los bytes de longitud todavía están codificados aquí, incluso para la primera etiqueta de entero 01 (pero un empacador PER también podría omitirlo si sabe que el rango de valores permitido se ajusta a 8 bits, e incluso podría compactar el byte de valor único 05 con menos de 8 bits, si sabe que los valores permitidos solo pueden caber en un rango más pequeño).
Los últimos 6 bits del PER codificado se rellenan con bits nulos en los 6 bits menos significativos del último byte c0: estos bits adicionales no se pueden transmitir ni utilizar para codificar otra cosa si esta secuencia se inserta como parte de una secuencia PER no alineada más larga.
Esto significa que los datos PER no alineados son esencialmente un flujo ordenado de bits, y no un flujo ordenado de bytes como con el PER alineado, y que será un poco más complejo de descifrar por software en los procesadores habituales porque requerirá más cambio de bits contextual y enmascaramiento y no direccionamiento directo de bytes (pero la misma observación sería cierta con los procesadores modernos y las unidades de memoria/almacenamiento cuya unidad mínima direccionable es mayor que 1 octeto). Sin embargo, los procesadores modernos y los procesadores de señales incluyen soporte de hardware para una decodificación interna rápida de flujos de bits con manejo automático de unidades informáticas que cruzan los límites de las unidades de almacenamiento direccionables (esto es necesario para un procesamiento eficiente en códecs de datos para compresión/descompresión o con algo de cifrado/ algoritmos de descifrado).
Si se requiriera alineación en los límites de octetos, un codificador PER alineado produciría:
01 05 0e 41 6e 79 62 6f 64 79 20 74 68 65 72 65 3f
(en este caso, cada octeto se rellena individualmente con bits nulos en sus bits más significativos no utilizados).
Herramientas
La mayoría de las herramientas compatibles con ASN.1 hacen lo siguiente:
- parse los archivos ASN.1,
- genera la declaración equivalente en un lenguaje de programación (como C o C++),
- genera las funciones de codificación y decodificación basadas en las declaraciones anteriores.
Puede encontrar una lista de herramientas compatibles con ASN.1 en la página web de la herramienta ITU-T.
Herramientas en línea
- ASN1 Web Tool (muy limitada)
- ASN1 Playground (sandbox)
Comparación con esquemas similares
ASN.1 es similar en propósito y uso a los búferes de protocolo y Apache Thrift, que también son lenguajes de descripción de interfaz para la serialización de datos multiplataforma. Al igual que esos lenguajes, tiene un esquema (en ASN.1, llamado "módulo") y un conjunto de codificaciones, generalmente codificaciones de tipo-longitud-valor. A diferencia de ellos, ASN.1 no proporciona una implementación de código abierto única y fácil de usar, y se publica como una especificación para ser implementada por proveedores externos. Sin embargo, ASN.1, definido en 1984, los precede en muchos años. También incluye una variedad más amplia de tipos de datos básicos, algunos de los cuales están obsoletos, y tiene más opciones de extensibilidad. Un solo mensaje ASN.1 puede incluir datos de múltiples módulos definidos en múltiples estándares, incluso estándares definidos con años de diferencia.
ASN.1 también incluye soporte integrado para restricciones de valores y tamaños. Por ejemplo, un módulo puede especificar un campo entero que debe estar en el rango de 0 a 100. También se puede especificar la longitud de una secuencia de valores (una matriz), ya sea como una longitud fija o un rango de longitudes permitidas. Las restricciones también se pueden especificar como combinaciones lógicas de conjuntos de restricciones básicas.
Los valores utilizados como restricciones pueden ser literales utilizados en la especificación de PDU o valores ASN.1 especificados en otra parte del archivo de esquema. Algunas herramientas ASN.1 pondrán estos valores ASN.1 a disposición de los programadores en el código fuente generado. Usados como constantes para el protocolo que se está definiendo, los desarrolladores pueden usarlos en la implementación lógica del protocolo. Por lo tanto, todas las PDU y las constantes de protocolo se pueden definir en el esquema, y todas las implementaciones del protocolo en cualquier idioma admitido se basan en esos valores. Esto evita la necesidad de que los desarrolladores entreguen constantes de protocolo de código en el código fuente de su implementación. Esto ayuda significativamente al desarrollo del protocolo; las constantes del protocolo se pueden modificar en el esquema ASN.1 y todas las implementaciones se actualizan simplemente recompilando, lo que promueve un ciclo de desarrollo rápido y de bajo riesgo.
Si las herramientas ASN.1 implementan correctamente la verificación de restricciones en el código fuente generado, esto actúa para validar automáticamente los datos del protocolo durante la operación del programa. Por lo general, las herramientas ASN.1 incluirán restricciones para verificar las rutinas de serialización/deserialización generadas, generando errores o excepciones si se encuentran datos fuera de los límites. Es complejo implementar todos los aspectos de las restricciones ASN.1 en un compilador ASN.1. No todas las herramientas admiten la gama completa de posibles expresiones de restricciones. El esquema XML y el esquema JSON admiten conceptos de restricciones similares. El soporte de herramientas para restricciones varía. El compilador xsd.exe de Microsoft los ignora.
ASN.1 es visualmente similar al formulario de Backus-Naur aumentado (ABNF), que se utiliza para definir muchos protocolos de Internet como HTTP y SMTP. Sin embargo, en la práctica son bastante diferentes: ASN.1 define una estructura de datos, que se puede codificar de varias formas (p. ej., JSON, XML, binario). ABNF, por otro lado, define la codificación ("sintaxis") al mismo tiempo que define la estructura de datos ("semántica"). ABNF tiende a usarse con más frecuencia para definir protocolos textuales legibles por humanos y, en general, no se usa para definir codificaciones de tipo-longitud-valor.
Muchos lenguajes de programación definen formatos de serialización específicos del lenguaje. Por ejemplo, Python's "pickle" módulo y Ruby's "Marshal" módulo. Estos formatos son generalmente específicos del idioma. Tampoco requieren un esquema, lo que los hace más fáciles de usar en escenarios de almacenamiento ad hoc, pero inapropiados para los protocolos de comunicaciones.
JSON y XML tampoco requieren un esquema, lo que los hace fáciles de usar. Ambos son también estándares multiplataforma que son muy populares para los protocolos de comunicaciones, especialmente cuando se combinan con un esquema JSON o un esquema XML.
Algunas herramientas ASN.1 pueden traducir entre ASN.1 y el esquema XML (XSD). La traducción está estandarizada por la UIT. Esto hace posible que se defina un protocolo en ASN.1, y también automáticamente en XSD. Por lo tanto, es posible (aunque tal vez desaconsejable) tener en un proyecto un esquema XSD compilado por herramientas ASN.1 que producen código fuente que serializa objetos a/desde formato de cable JSON. Un uso más práctico es permitir que otros subproyectos consuman un esquema XSD en lugar de un esquema ASN.1, tal vez adaptándose a la disponibilidad de herramientas para el idioma de elección de los subproyectos, con XER utilizado como formato de cable de protocolo.
Para obtener más detalles, consulte Comparación de formatos de serialización de datos.
Contenido relacionado
Lempel–Ziv–Welch
CiteSeerX
Corporación Burroughs