Введение
В информатике коды преобразования Люби (LT-коды) являются первым классом практических фонтанных кодов, близких к оптимальным кодам коррекции потерянных данных. Они были изобретены Майклом Люби в 1998 году и опубликованы в 2002 году. Как и некоторые другие фонтанные коды, LT-коды используют разреженные двудольные графы для компромисса между избыточностью приема и скоростью кодирования и декодирования. Отличительной особенностью LT-кодов является применение особенно простого алгоритма, основанного на операции исключающего ИЛИ, для кодирования и декодирования сообщения. LT-коды являются бесконечными, поскольку алгоритм кодирования теоретически может генерировать бесконечное количество пакетов сообщения (то есть процент пакетов, необходимых для декодирования сообщения, может быть сколь угодно мал). Они являются кодами коррекции потерянных данных, поскольку их можно использовать для надежной передачи цифровых данных по каналу с потерями. Следующим поколением после LT-кодов являются коды Raptor (см., например, IETF RFC 5053 или IETF RFC 6330), которые имеют линейное по времени кодирование и декодирование. Коды Raptor принципиально основаны на LT-кодах, то есть кодирование для Raptor-кодов использует два этапа, где второй этап – LT-кодирование. Аналогично, декодирование Raptor-кодов в основном опирается на LT-декодирование, но LT-декодирование сочетается с более продвинутыми методами декодирования. Код RaptorQ, специфицированный в IETF RFC 6330, являющийся самым современным фонтанным кодом, обладает значительно более высокими вероятностями успешного декодирования и производительностью по сравнению с использованием только LT-кода.
Зачем использовать код LT?
Традиционная схема передачи данных по каналу с потерями зависит от непрерывной двусторонней связи. Отправитель кодирует и отправляет пакет информации. Приемник пытается декодировать полученный пакет. Если декодирование успешно, приемник отправляет подтверждение отправителю. В противном случае, приемник запрашивает повторную отправку пакета. Этот двухсторонний процесс продолжается до тех пор, пока все пакеты сообщения не будут успешно переданы. Некоторые сети, такие как сети для сотовой беспроводной трансляции, не имеют канала обратной связи. Приложения в этих сетях все же требуют надежности. Коды фонтанов, в частности коды LT, решают эту проблему, используя по сути односторонний протокол связи. Отправитель кодирует и отправляет пакеты информации последовательно. Приемник оценивает каждый полученный пакет. Если обнаружена ошибка, ошибочный пакет отбрасывается. В противном случае пакет сохраняется как часть сообщения. В конечном итоге приемник получает достаточно корректных пакетов для восстановления всего сообщения. После успешного приема всего сообщения, приемник сигнализирует об окончании передачи. Как упоминалось выше, код RaptorQ, определенный в IETF RFC 6330, на практике показывает лучшие результаты, чем код LT.
Декодирование LT
В процессе декодирования используется операция "исключающее ИЛИ" для извлечения закодированного сообщения. Если текущий пакет не является корректным или дублирует уже обработанный пакет, он отбрасывается. Если текущий корректный пакет имеет степень d > 1, он сначала обрабатывается по отношению ко всем полностью декодированным блокам в области буферизации сообщений (как описано подробнее на следующем этапе), а затем сохраняется в буферной области, если его уменьшенная степень больше 1. Когда получен новый корректный пакет степени d = 1 (блок Mi) или степень текущего пакета уменьшена до 1 на предыдущем этапе, он перемещается в область буферизации сообщений и затем сопоставляется со всеми пакетами степени d > 1, находящимися в буфере. Он применяется операцией "исключающее ИЛИ" к части данных любого буферного пакета, который был закодирован с использованием Mi, степень соответствующего пакета уменьшается, а список индексов для этого пакета корректируется, чтобы отразить применение Mi. Когда этот процесс "разблокирует" блок степени d = 2 в буфере, этот блок уменьшается до степени 1 и, в свою очередь, перемещается в область буферизации сообщений, а затем обрабатывается по отношению к пакетам, оставшимся в буфере. Когда все n блоков сообщения перемещены в область буферизации сообщений, приемник сигнализирует передатчику об успешном декодировании сообщения. Эта процедура декодирования работает, поскольку A ⊕ A = 0 для любой битовой строки A. После применения операции "исключающее ИЛИ" к пакету степени d с d − 1 различными блоками, остается только исходное, незакодированное содержимое несовмещенного блока. В символьном виде это выглядит так:
Вариации
Возможны различные варианты процессов кодирования и декодирования, описанных выше. Например, вместо добавления к каждому пакету списка фактических индексов блоков сообщения {i1, i2, …, id}, кодировщик может просто отправить короткий "ключ", который использовался в качестве начального значения для генератора псевдослучайных чисел (PRNG) или таблицы индексов, применяемых для создания списка индексов. Поскольку приемник, располагающий тем же PRNG или таблицей индексов, может надежно восстановить "случайный" список индексов на основе этого начального значения, процесс декодирования может быть успешно завершен. В качестве альтернативы, путем комбинирования простого LT-кода с низкой средней степенью с надежным кодом коррекции ошибок, можно построить код Raptor, который на практике будет превосходить оптимизированный LT-код.