En el ámbito de los protocolos de comunicaciones, se denomina tipo-longitud-valor (del inglés type-length-value, comúnmente simbolizado como TLV) o valores de longitud tipo a un formato de representar información, de forma que haya información que pueda tener presencia opcional y longitud variable.
Los tipos (tags) y las longitudes suelen ser de longitud establecida, pero el valor (la información real) es de longitud variable y es determinada por el campo "longitud".
Cada "tupla" de información codificada de esta forma se compone de tres partes:
- Tipo (tag): código que indica el dato que se está codificando.
- Longitud (length): longitud del dato a codificar (Suele estar indicada en bytes).
- Valor (value): valor a codificar.
Ventajas
- Una secuencia de datos codificada en TLV es fácil de interpretar.
- Se pueden añadir tags a los mensajes sin hacer que el mensaje sea incompatible hacia atrás.
- La redudancia de datos al codificar en TLV es muy baja y suele ser menor que en XML.
- Permite anidar estructuras, de forma que el dato de un TLV puede ser a su vez otro TLV.
- Es fácil saber si el mensaje ha llegado completamente sin necesidad de carga extra.
Inconvenientes
- No es un formato "amigable a humanos", pues es difícil decodificar un mensaje al verlo, al contrario que en XML.
Usos comunes
- Codificación BER.
- Codificación DER.
- Codificación CER.
- Codificación que utiliza CDP en los mensajes de publicación de Routers CISCO, para proporcionar información acerca de los dispositivos vecinos, es decir, que se encuentran directamente conectados entre sí.
Ejemplo
Un ejemplo básico de lo que podría ser un mensaje TLV es el siguiente, aunque no está optimizado para primar la claridad:
Para representar una persona de 30 años, que se casó el 28 de julio de 1900, cuyo nombre Pedro y se casó con Carmen, pueden usarse estos tags:
- 01 significa "persona" (que contiene una edad, una fecha de casarse, el nombre de la persona y el nombre de la persona con quien se casa).
- 20 significa "edad" (dos dígitos por byte, en años).
- 21 significa "fecha de matrimonio" (dos dígitos por byte, codificado DD/MM/AAAA).
- 22 significa "nombre" (un carácter por byte).
- 23 significa "nombre de la persona con quien se casa" (un carácter por byte).
El mensaje quedaría en formato binario. Por claridad, se representa aquí un ejemplo de mensaje en ASCII:
- 01 24 20 01 30 21 04 28 06 19 90 22 05 P e d r o 23 06 C a r m e n
Descomponiéndolo en partes quedaría de la siguiente forma.
TAG | LONGITUD | VALOR | Interpretación |
---|---|---|---|
01 | 24 | 20 01 30 21 04 28 06 19 00 22 05 P e d r o 23 06 C a r m e n | Debe descomponerse más. "Persona" tiene más cosas dentro |
20 | 01 | 30 | Edad: 30 años |
21 | 04 | 28 06 19 90 | Fecha de la boda: día 28, mes 06, año 1990 |
22 | 05 | P e d r o | El nombre de la persona: Pedro |
23 | 06 | C a r m e n | Nombre de la persona con quien se casa: Carmen |
La cadena podría dividirse también en varios TLV para así poder añadir precisión en caso de requerirse (por ejemplo la hora).