En los protocolos de comunicación , TLV ( tipo-longitud-valor o etiqueta-longitud-valor ) es un esquema de codificación utilizado para elementos informativos. Un flujo de datos codificado en TLV contiene código relacionado con el tipo de registro, la longitud del valor del registro y, finalmente, el valor en sí.
Detalles
El tipo y la longitud tienen un tamaño fijo (normalmente de 1 a 4 bytes) o pueden analizarse sin conocer el tamaño (véase: LEB128 , cantidad de longitud variable ), y el campo de valor es de tamaño variable. Estos campos se utilizan de la siguiente manera:
- Tipo
- Un código binario, a menudo simplemente alfanumérico, que indica el tipo de campo que representa esta parte del mensaje;
- Longitud
- El tamaño del campo de valor (normalmente en bytes);
- Valor
- Serie de bytes de tamaño variable que contiene datos para esta parte del mensaje.
Algunas ventajas de utilizar una representación TLV son:
- Las secuencias TLV se pueden buscar fácilmente utilizando funciones de análisis sintáctico generalizadas;
- Los nuevos elementos de mensaje que se reciben en un nodo anterior se pueden omitir de forma segura, y el resto del mensaje se puede analizar. Esto es similar a la forma en que se pueden omitir de forma segura las etiquetas XML desconocidas;
- Los elementos TLV se pueden colocar en cualquier orden dentro del cuerpo del mensaje;
- Los elementos TLV se utilizan normalmente en formato binario y con protocolos binarios , lo que hace que el análisis sea más rápido y los datos más pequeños que en protocolos similares basados en texto.
Ejemplo ilustrativo
Imagina un mensaje para realizar una llamada telefónica. Una primera versión del sistema define la siguiente estructura:
struct mensaje { uint16_t etiqueta ; uint16_t longitud ; char valor [ longitud ]; } /* Etiquetas */ #define T_COMMAND 0x00 #define T_PHONE_NUMBER_TO_CALL 0x10 /* Valores de comando */ #define C_MAKE_CALL 0x20Cuando realiza una llamada, envía los siguientes datos:
00 00 T_COMANDO 00 04 longitud = 4 00 00 00 20 C_MAKE_CALL 00 10 NÚMERO DE TELÉFONO PARA LLAMAR 00 08 longitud = 8 37 32 32 ASCII 2D para "722-" 34 32 34 36 ASCII para "4246"
Un sistema receptor entendería entonces que el mensaje le indica que llame al "722-4246".
Posteriormente (en la versión 2) se podría añadir un nuevo campo que contuviera el número de llamada:
#define T_CALLER_NUMBER 0x11Enviaría un mensaje como este:
00 00 T_COMANDO 00 04 longitud = 4 00 00 00 20 C_MAKE_CALL 00 11 NÚMERO_DE_LLAMADA 00 0c longitud = 12 36 31 33 ASCII 2D para "613-" 37 31 35 ASCII 2D para "715-" 39 37 31 39 ASCII para "9719" 00 10 NÚMERO DE TELÉFONO PARA LLAMAR 00 08 longitud = 8 37 32 32 ASCII 2D para "722-" 34 32 34 36 ASCII para "4246"
Un sistema de versión 1 que recibiera un mensaje de un sistema de versión 2 primero leería el T_COMMANDelemento y luego leería un elemento de tipo T_CALLER_NUMBER. El sistema de versión 1 no entiende T_CALLER_NUMBER, por lo que se lee el campo de longitud (es decir, 12) y el sistema salta 12 bytes para leer T_PHONE_NUMBER_TO_CALL, que sí entiende, y el análisis del mensaje continúa.
Ejemplos del mundo real
protocolos de transporte
- TLS (y su predecesor, SSL) utilizan mensajes codificados con TLV.
- SSH
- POLICÍAS
- ES-ES
- RADIO
- El protocolo de descubrimiento de capa de enlace (LLDP) permite el envío de información específica de la organización como un elemento TLV dentro de los paquetes LLDP.
- El protocolo de redundancia de medios permite que la información específica de la organización
- El Protocolo de configuración dinámica de host (DHCP) utiliza opciones codificadas en TLV.
- Protocolo RR utilizado en teléfonos móviles GSM (definido en 3GPP 04.18). En este protocolo, cada mensaje se define como una secuencia de elementos de información.
formatos de almacenamiento de datos
- IFF
- Matroska utiliza TLV para las etiquetas de marcado.
- QTFF (la base de los contenedores MPEG-4 )
Otro
Otras formas de representar datos
Los protocolos TCP/IP principales (en particular IP , TCP y UDP ) utilizan campos estáticos predefinidos.
Algunos protocolos de capa de aplicación , incluidos HTTP/1.1 (y sus predecesores no estandarizados), FTP , SMTP , POP3 y SIP , utilizan pares de texto "Campo: Valor" formateados según la RFC 2822. ( HTTP representa la longitud de la carga útil con un encabezado Content-Length y separa los encabezados de la carga útil con una línea en blanco y los encabezados entre sí con una nueva línea).
ASN.1 especifica varias reglas de codificación basadas en TLV ( BER , DER ), así como otras que no se basan en TLV ( PER , XER , reglas de codificación JSON). Las reglas basadas en TLV se pueden analizar sin conocer los posibles miembros del mensaje, mientras que las reglas PER (estáticas/no basadas en TLV) no. XER utiliza XML, lo que también permite el análisis sin conocer los posibles miembros del mensaje; lo mismo se aplica a las reglas de codificación JSON.
CSN.1 describe las reglas de codificación utilizando semántica no TLV.
Más recientemente, XML se ha utilizado para implementar mensajería entre diferentes nodos en una red. Estos mensajes suelen ir precedidos de comandos de texto basados en líneas, como por ejemplo BEEP .
Véase también
- KLV , tipo específico de codificación tipo-longitud-valor
Referencias
- ↑ "Documentación de OpenWrt en ubus" . openwrt.org . 15 de abril de 2022. Consultado el 15 de abril de 2022 .
- formatos de serialización de datos
- Transmisión de datos
- Estándares de Internet
- Protocolos de Internet