형식-길이-값

형식-길이-값 또는 TLV(type-length-value 또는 tag-length-value의 약자)는 정보 요소를 위해 사용되는 인코딩 스킴이다. TLV로 인코딩된 데이터 스트림은 레코드 형식, 레코드 값의 길이, 그리고 마지막으로 값 자체와 관련된 코드를 포함한다.

 상세 
형식(Type)과 길이(Length)는 크기가 고정되어 있거나(보통 1–4바이트), 크기에 대한 지식 없이도 파싱할 수 있으며(LEB128, 가변 길이 수량 참조), 값(Value) 필드는 가변적인 크기를 가진다. 이 필드들은 다음과 같이 사용된다:
 형식 (Type) 이 메시지 부분이 나타내는 필드의 종류를 가리키는 이진 코드(종종 단순히 영숫자)이다.
 길이 (Length) 값 필드의 크기이다(보통 바이트 단위).
 값 (Value) 이 메시지 부분에 대한 데이터를 포함하는 가변 크기의 바이트 시리즈이다.

TLV 표현 데이터 시스템 솔루션을 사용하는 것의 몇 가지 장점은 다음과 같다:
 TLV 시퀀스는 일반화된 파싱 함수를 사용하여 쉽게 검색할 수 있다.
 이전 버전의 노드에서 수신된 새로운 메시지 요소는 안전하게 건너뛸 수 있으며, 메시지의 나머지 부분을 파싱할 수 있다. 이는 알 수 없는 XML 태그를 안전하게 건너뛸 수 있는 방식과 유사하다.
 TLV 요소는 메시지 본문 내부에서 어떤 순서로든 배치될 수 있다.
 TLV 요소는 일반적으로 이진 형식 및 이진 프로토콜에서 사용되는데, 이는 텍스트 기반 프로토콜에 비해 파싱 속도가 빠르고 데이터 크기가 작다.

 예시 
전화 통화를 하기 위한 메시지를 상상해 보자. 시스템의 첫 번째 버전은 다음과 같은 구조를 정의한다:

struct message {
  uint16_t tag;
  uint16_t length;
  char value[length];
}
/* 태그 */
#define T_COMMAND                0x00
#define T_PHONE_NUMBER_TO_CALL   0x10
/* 명령 값 */
#define C_MAKE_CALL              0x20

전화를 걸 때, 다음과 같은 데이터를 전송한다:
 00 00         T_COMMAND
 00 04         길이 = 4
 00 00 00 20   C_MAKE_CALL
 00 10         T_PHONE_NUMBER_TO_CALL
 00 08         길이 = 8
 37 32 32 2D   "722-"의 ASCII
 34 32 34 36   "4246"의 ASCII

수신 시스템은 이 메시지가 "722-4246"으로 전화하라는 명령임을 이해하게 된다.

나중에(버전 2에서) 발신자 번호를 포함하는 새로운 필드가 추가될 수 있다:
#define T_CALLER_NUMBER           0x11

그 결과 다음과 같은 메시지를 보낼 수 있다:
 00 00         T_COMMAND
 00 04         길이 = 4
 00 00 00 20   C_MAKE_CALL
 00 11         T_CALLER_NUMBER
 00 0c         길이 = 12
 36 31 33 2D   "613-"의 ASCII
 37 31 35 2D   "715-"의 ASCII
 39 37 31 39   "9719"의 ASCII
 00 10         T_PHONE_NUMBER_TO_CALL
 00 08         길이 = 8
 37 32 32 2D   "722-"의 ASCII
 34 32 34 36   "4246"의 ASCII

버전 2 시스템으로부터 메시지를 받은 버전 1 시스템은 먼저 T_COMMAND 요소를 읽고, 그 다음 T_CALLER_NUMBER 형식의 요소를 읽는다. 버전 1 시스템은 T_CALLER_NUMBER를 이해하지 못하므로 길이 필드(즉, 12)를 읽고 12바이트를 건너뛰어 자신이 이해하는 T_PHONE_NUMBER_TO_CALL을 읽으며 메시지 파싱을 계속 진행한다.

 실제 사례 
 전송 프로토콜 
 TLS(및 그 전신인 SSL)는 TLV로 인코딩된 메시지를 사용한다.
 SSH
 COPS
 IS-IS
 RADIUS
 링크 계층 탐색 프로토콜(LLDP)은 조직 특화 정보를 LLDP 패킷 내의 TLV 요소로 전송할 수 있도록 허용한다.
 미디어 리던던시 프로토콜(MRP)은 조직 특화 정보를 허용한다.
 동적 호스트 구성 프로토콜(DHCP)은 TLV로 인코딩된 옵션을 사용한다.
 GSM 휴대전화에서 사용되는 RR 프로토콜(3GPP 04.18에 정의됨). 이 프로토콜에서 각 메시지는 정보 요소의 시퀀스로 정의된다.

 데이터 저장 형식 

 IFF
 Matroska는 마크업 태그를 위해 TLV를 사용한다.
 QTFF(MPEG-4 컨테이너의 기초)

 기타 

 OpenWrt에서 프로세스 간 통신(IPC)을 위해 사용되는 ubus

 데이터를 표현하는 다른 방법들 

핵심 TCP/IP 프로토콜(특히 IP, TCP, UDP)은 미리 정의된 정적 필드를 사용한다.

HTTP/1.1(및 표준화되지 않은 전신들), FTP, SMTP, POP3, SIP를 포함한 일부 응용 계층 프로토콜은 에 따라 형식화된 텍스트 기반 "필드: 값" 쌍을 사용한다. (HTTP는 Content-Length 헤더로 페이로드의 길이를 나타내며, 빈 줄로 헤더와 페이로드를 구분하고 줄바꿈으로 헤더들을 서로 구분한다.)

ASN.1은 여러 TLV 기반 인코딩 규칙(BER, DER)뿐만 아니라 TLV 기반이 아닌 규칙(PER, XER, JSON 인코딩 규칙)도 지정한다. TLV 기반 규칙은 메시지의 가능한 멤버를 알지 못해도 파싱할 수 있는 반면, TLV가 아닌 정적인 PER은 그렇지 못하다. XER은 XML을 사용하며, 이는 메시지의 가능한 멤버를 알지 못해도 파싱이 가능하다. JSON 인코딩 규칙도 마찬가지다.

CSN.1은 TLV가 아닌 시맨틱을 사용하여 인코딩 규칙을 기술한다.

최근에는 네트워크의 서로 다른 노드 간에 메시징을 구현하기 위해 XML이 사용되어 왔다. 이러한 메시지 앞에는 대개 BEEP와 같은 행 기반 텍스트 명령이 붙는다.

 각주 

분류:데이터 전송
분류:인터넷 표준
분류:인터넷 기반 프로토콜
분류:데이터 직렬화 포맷