No âmbito dos protocolos de comunicação, TLV (type-length-value ou tipo-comprimento-valor, também conhecido como tag-length-value ou etiqueta-comprimento-valor) é um esquema de codificação usado para elementos informativos. Um fluxo de dados codificado em TLV contém códigos relacionados ao tipo do registro, ao comprimento do valor do registro e, finalmente, ao valor em si.
Detalhes
O tipo e o comprimento possuem tamanho fixo (geralmente de 1 a 4 bytes) ou podem ser analisados de outra forma sem o conhecimento prévio do tamanho (ver LEB128, quantidade de comprimento variável), e o campo de valor possui tamanho variável. Esses campos são usados da seguinte forma: Tipo Um código binário, muitas vezes simplesmente alfanumérico, que indica o tipo de campo que esta parte da mensagem representa; Comprimento O tamanho do campo de valor (geralmente em bytes); Valor Uma série de bytes de tamanho variável que contém os dados desta parte da mensagem.
Algumas vantagens de usar uma representação TLV são: Sequências TLV são facilmente pesquisadas usando funções genéricas de análise; Novos elementos de mensagem recebidos por um nó mais antigo podem ser ignorados com segurança, e o restante da mensagem pode ser analisado. Isso é semelhante à maneira como tags XML desconhecidas podem ser ignoradas com segurança; Elementos TLV podem ser colocados em qualquer ordem dentro do corpo da mensagem; Elementos TLV são tipicamente usados em formato binário e em protocolos binários, o que torna a análise mais rápida e os dados menores do que em protocolos comparáveis baseados em texto.
Exemplo ilustrativo Imagine uma mensagem para fazer uma chamada telefônica. Uma primeira versão do sistema define a seguinte estrutura:
struct message { uint16_t tag; uint16_t length; char value[length]; } /* Tags */ #define T_COMMAND 0x00 #define T_PHONE_NUMBER_TO_CALL 0x10 /* Command values */ #define C_MAKE_CALL 0x20
Quando ele faz uma chamada, envia os seguintes dados: 00 00 T_COMMAND 00 04 length = 4 00 00 00 20 C_MAKE_CALL 00 10 T_PHONE_NUMBER_TO_CALL 00 08 length = 8 37 32 32 2D ASCII para "722-" 34 32 34 36 ASCII para "4246"
Um sistema receptor entenderia então que a mensagem lhe diz para ligar para "722-4246".
Mais tarde (na versão 2), um novo campo contendo o número de origem da chamada poderia ser adicionado: #define T_CALLER_NUMBER 0x11
Ele enviaria uma mensagem como: 00 00 T_COMMAND 00 04 length = 4 00 00 00 20 C_MAKE_CALL 00 11 T_CALLER_NUMBER 00 0c length = 12 36 31 33 2D ASCII para "613-" 37 31 35 2D ASCII para "715-" 39 37 31 39 ASCII para "9719" 00 10 T_PHONE_NUMBER_TO_CALL 00 08 length = 8 37 32 32 2D ASCII para "722-" 34 32 34 36 ASCII para "4246"
Um sistema da versão 1 que recebesse uma mensagem de um sistema da versão 2 leria primeiro o elemento T_COMMAND e depois leria um elemento do tipo T_CALLER_NUMBER. O sistema da versão 1 não entende T_CALLER_NUMBER, então o campo de comprimento é lido (ou seja, 12) e o sistema avança 12 bytes para ler o T_PHONE_NUMBER_TO_CALL, que ele entende, e a análise da mensagem continua.
Exemplos do mundo real Protocolos de transporte TLS (e seu predecessor, SSL) usam mensagens codificadas em TLV. SSH COPS IS-IS RADIUS O Link Layer Discovery Protocol (LLDP) permite o envio de informações específicas da organização como um elemento TLV dentro de pacotes LLDP. O Media Redundancy Protocol (MRP) permite informações específicas da organização. O Dynamic Host Configuration Protocol (DHCP) usa opções codificadas em TLV. Protocolo RR usado em telefones celulares GSM (definido na 3GPP 04.18). Neste protocolo, cada mensagem é definida como uma sequência de elementos de informação.
Formatos de armazenamento de dados
IFF Matroska usa TLV para tags de marcação. QTFF (a base para o contêineres MPEG-4)
Outros
ubus usado para IPC no OpenWrt
Outras formas de representar dados
Protocolos essenciais do TCP/IP (particularmente o IP, TCP e UDP) usam campos estáticos e predefinidos.
Alguns protocolos da camada de aplicação, incluindo HTTP/1.1 (e seus predecessores não padronizados), FTP, SMTP, POP3 e SIP, usam pares textuais do tipo "Campo: Valor" formatados de acordo com a RFC2822. (O HTTP representa o comprimento da carga útil com um cabeçalho Content-Length, separa os cabeçalhos da carga útil com uma linha em branco e os cabeçalhos entre si com uma nova linha.)
O ASN.1 especifica várias regras de codificação baseadas em TLV (BER, DER), bem como outras não baseadas em TLV (PER, XER, JSON Encoding Rules). As regras baseadas em TLV podem ser analisadas sem conhecer os possíveis membros da mensagem, enquanto o formato PER estático/não-TLV não pode. O XER usa XML, que também permite a análise sem conhecer os possíveis membros da mensagem; o mesmo se aplica às regras de codificação JSON.
O CSN.1 descreve regras de codificação usando semânticas que não são baseadas em TLV.
Mais recentemente, o XML tem sido usado para implementar mensagens entre diferentes nós em uma rede. Essas mensagens geralmente são prefixadas com comandos de texto baseados em linhas, como ocorre no BEEP.
Ver também KLV (key-length-value), um tipo específico de codificação tipo-comprimento-valor.
Referências
Categoria:Formatos de serialização de dados Categoria:Normas da Internet Categoria:Protocolos da Internet Categoria:Transmissão de dados