Within communication protocols, TLV (type-length-value or tag-length-value) is an encoding scheme used for informational elements. A TLV-encoded data stream contains code related to the record type, the record value's length, and finally the value itself.
The type and length are fixed in size (typically 1–4 bytes), and the value field is of variable size. These fields are used as follows:
Some advantages of using a TLV representation data system solution are:
Imagine a message to make a telephone call. In a first version of a system this might use two message elements: a "command" and a "phoneNumberToCall":
Here command_c
, makeCall_c
and phoneNumberToCall_c
are integer constants and 4 and 8 are the lengths of the "value" fields, respectively.
Later (in version 2) a new field containing the calling number could be added:
A version 1 system which received a message from a version 2 system would first read the command_c
element and then read an element of type callingNumber_c
. The version 1 system does not understandcallingNumber_c
, so the length field is read (i.e. 14) and the system skips forward 14 bytes to read
phoneNumberToCall_c
which it understands, and message parsing carries on.
Core TCP/IP protocols (particularly IP, TCP, and UDP) use predefined, static fields.
Some application layer protocols, including HTTP/1.1 (and its non-standardized predecessors), FTP, SMTP, POP3, and SIP, use text-based "Field: Value" pairs formatted according to . (HTTP represents length of payload with a Content-Length header and separates headers from the payload with an empty line and headers from each other with a new line.)
ASN.1 specifies several TLV-based encoding rules (BER, DER), as well as non-TLV based ones (PER, XER).
CSN.1 describes encoding rules using non-TLV semantics.
More recently, XML has been used to implement messaging between different nodes in a network. These messages are typically prefixed with line-based text commands, such as with BEEP.