通信プロトコルにおいて、情報の表現形式としてType-Length-Value(TLV、またはTag-Length-Valueとも呼ばれます)が用いられることがあります。これは、データの種類(Type)、データの長さ(Length)、そして実際のデータ(Value)を組み合わせて表現するフォーマットです。TLVは、情報の種類や長さを動的に変更できるため、柔軟なデータ構造を扱う上で非常に便利な形式です。
TLVの構造
TLVフォーマットは、以下の3つの要素で構成されています。
Type(種類):データの種類を示す数値または文字で、通常は固定長(1~4バイト)で表現されます。これにより、受信側はデータの意味を識別できます。
Length(長さ):Valueフィールドのデータサイズを示す数値で、これも通常は固定長(1~4バイト)です。Valueフィールドの可変長に対応するために用いられます。
Value(値):可変長のデータ本体であり、実際の情報が含まれます。データの種類に応じて様々な形式や構造を取ることができます。
TLVの利用例
例えば、「電話をかける」というコマンドを例に考えてみましょう。
最初のバージョン(バージョン1)では、「コマンド」と「宛先電話番号」の2つの要素をTLV形式で表現します。
command_c/4/makeCall_c/phoneNumberToCall_c/8/"722-4246"
ここで、`command_c`、`makeCall_c`、`phoneNumberToCall_c`はそれぞれ整数値で、4と8はValueフィールドの長さを表しています。
その後、バージョン2で「送信元電話番号」を追加する場合、以下のように表現できます。
command_c/4/makeCall_c/callingNumber_c/14/"1-613-715-9719"/phoneNumberToCall_c/8/"722-4246"
バージョン2のシステムから送信されたこのメッセージを、バージョン1のシステムが受信した場合、`command_c`要素を読み取った後、バージョン1は知らない`callingNumber_c`要素に遭遇します。しかし、Lengthフィールド(14)を読み取り、そのバイト数だけスキップすることで、次の`phoneNumberToCall_c`要素を正しく読み取ることができます。
この例は、Link Layer Discovery Protocol(LLDP)で組織特有の情報をTLV形式でパケットに含めることができる例を示しています。LLDP以外にも、COPS、IS-IS、RADIUSなど、様々なプロトコルでTLV形式が利用されています。
その他のデータ表現形式との比較
ネットワークプロトコルの世界では、TLV形式以外にも様々なデータ表現形式が用いられます。
固定長フィールド:TCP/IPプロトコルの根幹であるIP、TCP、UDPなどでは、データフィールドの長さが固定されています。この形式は単純で高速に処理できますが、柔軟性に欠けます。
「種類: 値」形式:HTTP、FTP、SMTP、POP3、SIPなどのTCP/IPベースのプロトコルでは、文字列による「種類: 値」の形式が採用されています。これはRFC 2822を継承するもので、人間が読みやすいという利点がありますが、解析に手間がかかる場合があります。
ASN.1:ASN.1は、TLV形式(BER, DER)と非TLV形式(PER, XER)の両方をサポートしています。より複雑なデータ構造を表現するのに適しています。
まとめ
TLV形式は、データ構造の柔軟性と拡張性が求められる状況で非常に有効です。Lengthフィールドを用いることで、受信側は未知のデータ要素をスキップし、必要なデータのみを効率的に処理できます。この特性から、ネットワークプロトコル、特に拡張性を重視するプロトコルで幅広く採用されています。
関連情報
Common Open Policy Service (COPS)
IS-IS
key-length-value
Link Layer Discovery Protocol
RADIUS
OBEX
* tlve, A common TLV parser