Что такое tlv данные
Смарт-карты. Часть 3. TLV
В прошлой части мы видели как происходит общение между терминалом и картой. Мы посмотрели форматы C-APDU и R-APDU, но мы не обращали внимания на то, какие данные содержат эти APDU. В этой части мы рассмотрим самые распространенные форматы, в которых передается информация между терминалом и картой (и наоборот). Все они относятся к одному семейству — TLV.
TLV означает Tag, Length, Value и используется для того, чтобы структурировать информацию. На очень абстрактном уровне, TLV можно рассматривать как бинарную версию XML. Однако что такое Tag, Length, Value?
BER-TLV
Итак, говорим о главном герое этой статьи — BER-TLV. Это часть стандарта ASN.1 и используется далеко не только в области смарт-карт.
Первый байт тэга имеет следующий формат:
b8 | b7 | b6 | b5 | b4 | b3 | b2 | b1 |
---|---|---|---|---|---|---|---|
Класс | Тип | Тэг |
Существуют нижеуказанные классы:
b8 | b7 | Описание |
---|---|---|
0 | 0 | Универсальный — базовые типы данных, такие как строковые данные или номера. Редко используются в смарт-картах |
0 | 1 | Прикладной — типы, смысл которых меняется в зависимости от приложения |
1 | 0 | Контекстно-зависимый — типы, смысл которых зависит от данного составного типа |
1 | 1 | Частный — типы, смысл которых зависит от конкретной организации |
Поскольку в спецификации описано полное значение тэга, запоминать значение классов совершенно лишнее. Класс не влияет на то, как будет обработан тэг.
Наиболее интересным является бит 6. Когда он равен 1, то этот TLV содержит в себе другие TLV. Если, напротив, его значение — 0, то TLV содержит простые данные или данные, структурированные не в формате TLV.
Остальные биты (5-1) — это, как правило, просто номер тэга. Однако если они все единицы, значит номер тэга продолжается на втором байте. Если бит8 второго байта равен 1, то номер продолжается дальше на третем байте и т.д. На практике, в смарт-картах используются только тэги, записанные на одном или двух байтах.
Length
Длина может быть определенной и неопределенной.
Неопределенная длина записывается на одном байте со значением 0x80. Такой способ допустим только для составных TLV (т.е. TLV, содержащих другие TLV). В таком случае TLV должен обязательно содержать ТLV-NULL как последний элемент, который кодируется как «00 00». Подобный способ зачастую используется в более современных стандартах, но, в целом, он не очень распространен.
Русские Блоги
Понимание протокола связи: приложение для кодирования TLV индивидуального дизайна протокола связи
Поскольку я раньше занимался телефонной сигнализацией, те, у кого больше контактовASN.1Кодирование BER и PER, где BER кодируется на основе TLV. Эта статья в основном знакомит с применением TLV в настраиваемых протоколах.
С помощью этой статьи вы можете понять некоторые похожие протоколы двоичной связи невооруженным глазом, и вы можете попытаться инкапсулировать свои собственные протоколы связи.
1. Протокол связи
Протокол позволяет двум сторонам общаться, не зная деталей реализации другой стороны. Таким образом, обе стороны могут быть разнородными. Сервер может быть C ++, а клиент может быть Java. На основе того же протокола мы можем использовать язык инструменты, с которыми мы знакомы.
Протокол обычно состоит из одного или нескольких сообщений.Проще говоря, сообщение похоже на таблицу, состоящую из заголовка (определение поля сообщения, включая имя и тип данных) и строки (значение поля).
2. Пользовательский протокол связи.
Согласованы методы кодирования и декодирования для обеих сторон для обмена данными, включая согласованные базовые типы данных, типы услуг, порядок следования байтов, содержимое сообщения и т. Д.
3. Кодирование
Можно настроить в соответствии с потребностями бизнеса, такими как скорость кодека, пропускная способность сети, количество пользователей и т. Д.
3.1. На основе строковой кодировки
Заголовок (4 байта, описывающие длину тела данных) + данные (строка + разделитель или напрямую с использованием JSON). Этот метод прост в реализации, и затраты на этапах кодирования и декодирования низкие, но затраты на преобразование типов данных выше и может быть дороже. Занять пропускную способность.
3.2. На основе двоичного кодирования
Закодируйте протокол в массив байтов в определенном формате. По сравнению с методом кодирования строк, этот метод требует более высоких требований к реализации, но пропускная способность относительно мала. В этой статье в основном вводится один из наиболее часто используемых методов кодирования TLV, а именно Tag \ Длина \ значение.
4. Введение в кодирование TLV (введение в одну реализацию)
TLV: TLV относится к структуре, состоящей из типа данных Tag, длины данных Length и значения данных Value. Можно описать практически любой тип данных. TLV Value также может быть структурой TLV из-за этой вложенной функции, которая позволяет нам обернуть реализация протокола.
Следующее поясняет соответственно тег, длину и значение:
4.1. Тег описывает тип данных значения и может использоваться для описания типа сообщения, когда TLV вложен.
Тег состоит из одного или нескольких байтов, рисунок выше описывает конкретное значение первого байта 0
1) Описание первого раздела тега
4: когда значение тега меньше 0x1F (31), первый байт 0
4 используется для описания значения тега, в противном случае все 0
4 биты устанавливаются в 1, как признак существования последующих байтов, будет использоваться значение тега. Описываются следующие байты.
2) Пометьте последующее описание байта
Последующие байты используют 0-6 битов (т. Е. 7 битов) каждого байта для хранения значения тега, а седьмой бит используется для определения наличия следующих байтов.
6: заполните соответствующие биты значения тега (от младшего к старшему), например: значение тега: 0000001 11111111 11111111 (десятичное: 131071), фактическое содержимое байта после заполнения: 10000111 11111111 01111111.
Ниже представлена реализация JAVA кодирования тегов.
4.2. Длина описывает длину значения.
Опишите количество байтов, занимаемых частью значения, формат кодирования разделен на две категории: режим фиксированной длины (DefiniteForm) и режим неопределенной длины (IndefiniteForm), из которых режим фиксированной длины включает краткую и полную форму.
1) Метод фиксированной длины
В методе фиксированной длины, в зависимости от того, превышает ли длина одной восьмизначной цифры, она делится на краткую и длинную формы. Метод кодирования следующий:
6 битов. используются для описания длины Число байтов, занимаемых значением, а затем значение длины преобразуется в байт и добавляется к нему, например: Размер значения занимает 234 байта (11101010), так как он больше 127, тогда требуется длина чтобы использовать два байта для описания, 10000001 11101010
Ниже представлена реализация JAVA метода фиксированной длины Length.
2) Метод переменной длины
Октет длины имеет фиксированный код 0x80, но заканчивается двумя 0x00 после окончания кодирования значения. Этот способ позволяет сначала отправить часть данных другой стороне, когда кодирование не полностью завершено.
4.3. Значение описывает ценность данных
Состоящее из одного или нескольких значений значение может быть примитивным типом данных (примитивные данные) или структурой TLV (сконструированные данные).
1) Примитивное кодирование данных
2) Кодирование сконструированных данных
5. Приложение для кодирования TLV
Если вы полностью усвоили описание четвертого TLV, вы можете легко применить его к настраиваемому протоколу. Фактически, нам нужно только настроить различные настраиваемые типы TLV (частный фрейм), чтобы они соответствовали сообщениям в протоколе. Еще лучше
Ниже описывается применение TLV с простым протоколом, предполагая, что сообщение протокола определено следующим образом:
Имя сообщения | Код неисправности устройства (DEVICE_FAULT_1) | Значение тега | 1 | |
---|---|---|---|---|
Определение общего поля | ||||
имя | Поле | Значение тега | длина | Типы |
идентификатор устройства | DeviceNo | 1 | 4 | Integer |
Номер версии устройства | DeviceVersion | 2 | 12 | String |
Определение запроса | ||||
имя | Поле | Значение тега | длина | Типы |
код ошибки | FaultCode | 3 | 4 | Integer |
Определение ответа | ||||
имя | Поле | Значение тега | длина | Типы |
Код ответа | ResponseCode | 3 | 4 | Integer |
Ответное сообщение | ResponseMsg | 4 | -1 | String |
5.1 Базовое соглашение о типах данных
В это время необходимо согласовать примитивный тип данных, чтобы взаимодействующие стороны могли согласованно выполнять преобразование данных, что также является частью формулировки соглашения.
Базовое соглашение о типах данных
9, и обе стороны соглашения соглашаются кодировать и декодировать
В приведенной выше таблице необходимо обратить внимание на значение тега и значение длины, соответствующие типу данных.
5.2 Соглашение Сообщение Соглашение
имя | Новости | Тег: Тег |
---|---|---|
Код неисправности устройства | DEVICE_FAULT_1 | 1 |
За счет трехуровневого вложения TLV завершите пакетирование протокольных сообщений
Советы: каждый уровень вложения имеет увеличение на 2 или более байта (тег и длина). Как правило, стороны связи могут сделать вывод о типе данных в соответствии с протоколом, поэтому вы можете решить, следует ли пропустить тег третьего уровня и длину в соответствии с фактическими данными. Длина, вы можете сообщить программе тип поля через файл конфигурации или другими способами, тем самым уменьшив размер пакета данных и сэкономив трафик.
6 Резюме
что такое tlv (tag-length-value)?
поместить крючки (функции) в код вместо if/else?
Если у меня есть один кусок кода, работающий на разных платформах, в разных местах в коде, я могу поместить крючки функции tlv, чтобы определить, на какой платформе я нахожусь и делаю соответственно? Или что-то в этом роде?
преимущества могут быть более чистым кодом? легко поддерживать? Когда новая платформа добавляется, только код tlv должен измениться, а не исходный код?
Я могу быть здесь совершенно неправильно.
7 ответов
TLV-это метка-длина-значение кодирования. Часто его лучше называть его оригинальным именем, type-length-value.
множественные части данных можно передать в таком же сообщении путем добавлять больше триплетов к ранее существующему сообщение.
есть страница в Википедии, охватывающая ее чуть более подробно. Не запутайтесь, хотя каждый триплет является описанием «верхнего уровня», обычно нет вложенности элементов в TLV (хотя вы могли бы придумать способ сделать это, кодируя триплеты TLV в V другого тега).
TLV-это способ хранения данных для облегчения быстрого анализа данных.
обычно Вы читаете тип (тег), длину и значение, а затем отправляете эти данные в функцию процессора. Этот процессор функционирует только функция будет обрабатывать тип X. Затем вы читаете следующий тип, его длину и значение и отправляете его в соответствующий процессор.
обычно он используется как простой способ обработки данных без больших дополнительных затрат.
мы все еще используем TLV для форматирования данных. И если мы хотим отправить данные получателю, мы готовим пакет TLV, который содержит данные длины тега. Например:
когда мы хотим отправить его, мы объединяем эти 3 строки данных, таких как DF 82 0A 03 30 31 32. Пакеты данных могут содержать множество таких данных.
когда приемник получает его, пакет разбора очень легок и приемник может разобрать все данные ровно.
сведения : DF 82 0A 03 30 31 32 DF 82 0B 04 01 12 22 33
DF 82 0A и DF 82 0B являются предварительно определенными(тип значения(BCD, HEX, ASCII)) тегами. Когда данные поступают, в цикле, сначала парсер будет искать тег(т. е. DF 82 0A) и еще один байт(data len). Он также будет считывать байты данных до len.
TLV относится к значениям кодирования в трио типа-длины-значения, и это более общая форма документирована в Википедии.
TLV имеет следующие преимущества:
самый большой недостаток TLV заключается в том, что он не читается непосредственно человеком. Однако если данные преобразуются в шестнадцатеричную это не очень трудно читать.
Я думаю, что вы имеете в виду называется тип длина стоимостью, и есть Википедия страница для него. Надеюсь, это поможет.
Если мы взяли в качестве примера, что в конфигурации : 045 смысл
выигрышный номер в телешоу так: значение выигрышного номера: 12
TLV полезно для создания протоколов связи. Вы используете тег, длина, стоимостью для хранения информации. Вы можете видеть очень beautifull реализация (я думаю, что лучший) на github.
Простой-TLV против BER-TLV
2 ответов
поля данных в ISO / IEC 7816-4 для смарт-карт
BER кодировка
это спецификация более общего BER кодировка используется ISO / IEC 7816-4:
каждый объект данных BER-TLV должен состоять из 2 или 3 последовательных полей (см. ISO / IEC 8825 и приложение D).
поле тега T состоит из одного или нескольких последовательных байтов. Он кодирует класс, тип и число. Поле длины состоит из одного или больше последовательных байта. Он кодирует целое число L. Если L не равно null, то поле значения V состоит из L последовательных байтов. Если L равно null, то объект данных пуст: поле значение отсутствует.
The BER TLV спецификация гораздо более экспансивна, как указывает «простая» часть SIMPLE-TLV. Я не буду вдаваться в детали слишком много, так как есть много информации, доступной в интернете.
обычно BER следует использовать только в качестве кодировки ASN.1 структуры, с ASN.1 синтаксис, определяющий структуру. Однако ISO 7816-4 портит это и только указывает байты тега BER напрямую.
обратите внимание, что иногда вместо BER указывается DER. В этом случае вы много только используете минимальное количество байтов для размера поля длины-например, 05 в приведенных ниже примерах. Также обратите внимание, что спецификация ISO/IEC для кодирования BER в основном является копией стандарта X. 690 для США.
простой-TLV кодировка
спецификация BER за ней следует спецификация SIMPLE-TLV, которая специфична для ISO 7816-4. Обратите внимание, что стандарт забывает указать endianness напрямую. Вы можете предположить, что большая кодировка прямой в ИСО/МЭК 7816-4.
каждый объект данных SIMPLE-TLV состоит из 2 или 3 последовательных поля.
поле тега T состоит из одного байта, кодирующего только число из 1-254 (например, идентификатор записи). Его кодов нет класса и нет тип конструкции. Поле длины состоит из 1 или 3 подряд байты. Если ведущий байт поля length находится в диапазоне от ’00’ к ‘FE’, тогда поле длины состоит из однобайтовой кодировки целое число L ценится от 0 до 254. Если старший байт равен «FF», затем поле length продолжается на двух последующих байтах который кодирует целое число L со значением от 0 до 65535. Если L на не null, тогда поле значения V состоит из последовательных байтов. Если L null, тогда объект данных пуст: нет поля значения.
образцы
следующие образцы все использованы для того чтобы транспортировать такие же номер бирки (который определяет поле) и значение, за исключением тот, который определяет номер тега 31 для BER.
различия
следует отметить следующие различия:
простой TLV просто состоит из тега (или типа), длины и значения.
BER-TLV-это специальный TLV, который имеет один или несколько TLV внутри своего значения. Так оно имеет составную структуру.
ИТ База знаний
Полезно
— Онлайн генератор устойчивых паролей
— Онлайн калькулятор подсетей
— Руководство администратора FreePBX на русском языке
— Руководство администратора Cisco UCM/CME на русском языке
— Руководство администратора по Linux/Unix
Навигация
Серверные решения
Телефония
FreePBX и Asterisk
Настройка программных телефонов
Корпоративные сети
Протоколы и стандарты
Формат Type Length Value (TLV) в компьютерных сетях
Полный курс по Сетевым Технологиям
В курсе тебя ждет концентрат ТОП 15 навыков, которые обязан знать ведущий инженер или senior Network Operation Engineer
Формат Type Length Value (TLV) является еще одним широко используемым решением проблемы маршалинга данных. На рисунке 1 показан пример протокола маршрутизации от промежуточной системы к промежуточной системе IS-IS.
По существу, TLV можно рассматривать как полный набор автономной информации, переносимой в более крупном пакете. TLV состоит из трех частей:
Форматы на основе TLV менее компактны, чем форматы фиксированной длины, поскольку они содержат больше метаданных в самом пакете. Информация о типе и длине, содержащаяся в данных, предоставляет информацию о том, где искать в словаре информацию о форматировании, а также информацию о грамматике для использования (как каждое поле отформатировано и так далее). Форматы TLV компенсируют возможность изменять форматирование информации, передаваемой протоколом, не требуя обновления каждого устройства или позволяя некоторым реализациям выбирать не поддерживать все возможные TLV по сравнению с дополнительными метаданными, передаваемыми по проводам.
TLV обычно считаются очень гибким способом маршалинга данных в протоколах.
Словари общих объектов
Одной из основных проблем с полями фиксированной длины является фиксированность определений полей; если вы хотите изменить протокол поля фиксированной длины, вам нужно увеличить номер версии и изменить пакет, или вы должны создать новый тип пакета с различными кодировками для полей. Форматирование TLV решает эту проблему путем включения встроенных метаданных с передаваемыми данными за счет передачи большего количества информации и уменьшения компактности. Общие скомпилированные словари пытаются решить эту проблему, помещая словарь в общий файл (или библиотеку), а не в спецификацию. Рисунок 2 иллюстрирует процесс.
На рисунке 2 этот процесс начинается с того, что разработчик создает структуру данных для организации определенного набора данных, которые будут передаваться по сети. Как только структура данных построена, она компилируется в функцию или, возможно, копируется в библиотеку функций (1) и копируется в приемник (2). Затем приемник использует эту библиотеку для написания приложения для обработки этих данных (3). На стороне передатчика необработанные данные кодируются в формат (4), а затем передаются по протоколу через сеть к приемнику (5). Получатель использует свою общую копию формата данных (6) для декодирования данных и передачи декодированной информации принимающему приложению (7).
Этот вид системы сочетает в себе гибкость модели на основе TLV с компактностью протокола фиксированного поля. Хотя поля имеют фиксированную длину, определения полей задаются таким образом, чтобы обеспечить быстрое и гибкое обновление при необходимости изменения формата маршалинга. Пока общая библиотека отделена от приложения, использующего данные, словарь и грамматика могут быть изменены путем распространения новой версии исходной структуры данных.
Потребуется ли «День флага», если будет распространена новая версия структуры данных? Необязательно. Если номер версии включен в структуру данных, чтобы получатель мог сопоставить полученные данные с правильной структурой данных, то в системе одновременно может существовать несколько версий структуры данных. Как только отправитель не найден с использованием более старого формата данных, старая структура может быть безопасно отброшена по всей системе.
Онлайн курс по Кибербезопасности
Изучи хакерский майндсет и научись защищать свою инфраструктуру! Самые важные и актуальные знания, которые помогут не только войти в ИБ, но и понять реальное положение дел в индустрии