stringtranslate.com

Математика циклических проверок избыточности

Циклический избыточный контроль (CRC) — это проверка остатка после деления в кольце многочленов над GF(2) ( конечное поле целых чисел по модулю 2). То есть, множество многочленов , где каждый коэффициент равен либо нулю, либо единице, а арифметические операции цикличны.

Любая строка битов может быть интерпретирована как коэффициенты полинома такого рода, и сообщение имеет допустимый CRC, если оно делится на (т.е. является кратным) согласованному генераторному полиному . CRC удобны и популярны, поскольку они обладают хорошими свойствами обнаружения ошибок, и такое кратное может быть легко построено из любого полинома сообщения путем добавления -битового остаточного полинома для получения , где - степень генераторного полинома.

Хотя разделение на часть сообщения и часть контрольной суммы удобно для использования CRC, свойства обнаружения ошибок не делают различий; ошибки обнаруживаются одинаково в любом месте внутри .

Формулировка

В общем случае вычисление CRC соответствует евклидову делению многочленов над GF(2):

Вот исходный многочлен сообщения, а — многочлен степени- генератора. Биты — это исходное сообщение с нулями, добавленными в конце. Контрольная сумма CRC формируется коэффициентами остаточного многочлена, степень которого строго меньше . Многочлен частного не представляет интереса. Используя операцию по модулю , можно утверждать, что

В процессе коммуникации отправитель присоединяет биты R после исходных битов сообщения M, что может быть показано как эквивалент отправки ( кодовое слово ). Получатель, зная , делит на и проверяет, что остаток равен нулю. Если это так, получатель отбрасывает (последние биты) и предполагает, что полученные биты сообщения верны.

Программные реализации иногда разделяют сообщение на части и сравнивают полученное значение со значением, восстановленным из полученного сообщения, но аппаратные реализации неизменно обнаруживают, что описанное выше полное разделение является более простым.

На практике вычисления CRC наиболее близки к делению в двоичном коде, за исключением того, что при вычитании не используются более значимые цифры, и, таким образом, они становятся операциями «исключающее ИЛИ» .

CRC — это контрольная сумма в строгом математическом смысле, поскольку ее можно выразить как взвешенную по модулю 2 сумму побитовых синдромов , но это слово обычно зарезервировано для более специфичных сумм, вычисляемых с использованием больших модулей, таких как 10, 256 или 65535.

CRC также могут использоваться как часть кодов исправления ошибок , которые позволяют не только обнаруживать ошибки передачи, но и восстанавливать правильное сообщение. Эти коды основаны на тесно связанных математических принципах.

Полиномиальная арифметика по модулю 2

Поскольку коэффициенты ограничены одним битом, любая математическая операция над полиномами CRC должна отображать коэффициенты результата либо в ноль, либо в единицу. Например, в дополнение:

Обратите внимание, что в приведенном выше уравнении эквивалентно нулю, поскольку сложение коэффициентов выполняется по модулю 2:

Полиномиальное сложение по модулю 2 — это то же самое, что и побитовое XOR . Поскольку XOR — это обратная операция, полиномиальное вычитание по модулю 2 — это то же самое, что и побитовое XOR.

Умножение аналогично ( произведение без переноса ):

Мы также можем разделить многочлены mod 2 и найти частное и остаток. Например, предположим, что мы делим на . Мы бы обнаружили, что

Другими словами,

Деление дает частное с остатком −1, которое, поскольку оно нечетное, имеет последний бит 1.

В приведенных выше уравнениях представляет исходные биты сообщения , является генераторным полиномом, а остаток (эквивалентно, ) является CRC. Степень генераторного полинома равна 1, поэтому мы сначала умножили сообщение на , чтобы получить .111

Вариации

Существует несколько стандартных вариаций CRC, любая или все из которых могут использоваться с любым полиномом CRC. Варианты реализации, такие как порядок байтов и представление CRC, влияют только на отображение битовых строк в коэффициенты и и не влияют на свойства алгоритма.

Эти два варианта служат для обнаружения нулевых битов, добавленных к сообщению. Предшествующий нулевой бит добавляет ведущий нулевой коэффициент, к которому не меняет своего значения, и, таким образом, не меняет его делимости на полином генератора. Добавляя фиксированный шаблон к первым битам сообщения, можно обнаружить такие дополнительные нулевые биты.

Аналогично, использование ненулевого остатка обнаруживает конечные нулевые биты, добавленные к сообщению. Если сообщение, защищенное CRC, имеет добавленный нулевой бит, полученный полином будет Если первый делится на порождающий полином, то и второй делится. Использование ненулевого остатка , добавление нулевого бита приведет к другому остатку , и, следовательно, будет обнаружен дополнительный бит.

На практике эти два варианта неизменно используются вместе. Они изменяют переданный CRC, поэтому должны быть реализованы как на передатчике, так и на приемнике. Оба конца должны предварительно установить свои схемы деления на все единицы, передатчик должен добавить к результату шаблон инверсии конца, а приемник должен ожидать этот шаблон при проверке CRC. Если приемник проверяет CRC делением полной длины, остаток, поскольку CRC полного кодового слова, которое уже включает CRC, больше не равен нулю. Вместо этого это фиксированный ненулевой шаблон, CRC шаблона инверсии единиц .

Эти инверсии чрезвычайно распространены, но не выполняются повсеместно, даже в случае полиномов CRC-32 или CRC-16-CCITT. Они почти всегда включаются при отправке сообщений переменной длины, но часто опускаются при отправке сообщений фиксированной длины, поскольку проблема добавления нулевых битов возникает реже.

Обратные представления и обратные многочлены

Полиномиальные представления

Все практические полиномы генератора CRC имеют ненулевые и коэффициенты. Очень часто это преобразуется в строку двоичных битов путем опускания коэффициента.

Эту битовую строку затем можно преобразовать в двоичное число, используя одно из двух соглашений:

Форма msbit-first часто упоминается в литературе как нормальное представление, в то время как lsbit-first называется обратным представлением. Важно использовать правильную форму при реализации CRC. Если коэффициент равен нулю, формы можно различить с первого взгляда, увидев, на каком конце установлен бит.

Например, полином CCITT степени 16 в описанных формах (биты внутри квадратных скобок включены в представление слова; биты снаружи подразумеваются как 1 бит; вертикальные черты обозначают границы полубайта ):

16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 коэффициент 1 [0 0 0 1 |0 0 0 0 |0 0 1 0 |0 0 0 1] Нормальный  [ 1 | 0 | 2 | 1 ] Кусочки нормального0x1021 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16[1 0 0 0 |0 1 0 0 |0 0 0 0 |1 0 0 0] 1 Обратный [ 8 | 4 | 0 | 8 ] Кусочки обратного0x840816 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 1 [0 0 0 0 |1 0 0 0 |0 0 0 1 |0 0 0 1] Взаимный  [ 0 | 8 | 1 | 1 ] Откусывания взаимного0x0811 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 Обратный обратный16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 Купман[1 0 0 0 |1 0 0 0 |0 0 0 1 |0 0 0 0] 1 [ 8 | 8 | 1 | 0 ] Откусывает0x8810

Все известные полиномы CRC-генератора степени имеют два общих шестнадцатеричных представления. В обоих случаях коэффициент опускается и понимается равным 1.

Форма msbit-first часто упоминается в литературе как нормальное представление, в то время как lsbit-first называется обратным представлением. Важно использовать правильную форму при реализации CRC. Если коэффициент равен нулю, формы можно различить с первого взгляда, увидев, на каком конце установлен бит.

Чтобы еще больше запутать вопрос, статья П. Купмана и Т. Чакраварти [1] [2] преобразует полиномы генератора CRC в шестнадцатеричные числа еще одним способом: msbit-first, но включая коэффициент и опуская коэффициент. Это представление «Купмана» имеет то преимущество, что степень может быть определена из шестнадцатеричной формы, а коэффициенты легко считываются в порядке слева направо. Однако оно больше нигде не используется и не рекомендуется из-за риска путаницы.

Взаимные многочлены

Обратный многочлен создается путем присвоения сквозных коэффициентов одного многочлена сквозным коэффициентам нового многочлена. То есть, обратная величина степени многочлена равна .

Самое интересное свойство обратных многочленов при использовании в CRC заключается в том, что они имеют точно такую ​​же силу обнаружения ошибок, как и многочлены, которым они обратны. Обратная величина многочлена генерирует те же самые кодовые слова , только биты которых перевернуты — то есть, если все, кроме первых битов кодового слова под исходным многочленом, взяты, перевернуты и использованы как новое сообщение, CRC этого сообщения под обратным многочленом будет равна перевернутым первым битам исходного кодового слова. Но обратный многочлен не совпадает с исходным многочленом, и CRC, сгенерированные с его помощью, не совпадают (даже по модулю бита перевернуты), как те, которые генерируются исходным многочленом.

Уровень обнаружения ошибок

Способность CRC обнаруживать ошибки зависит от степени его генераторного полинома и от конкретного используемого генераторного полинома. «Полином ошибки» — это симметричная разность полученного кодового слова сообщения и правильного кодового слова сообщения. Ошибка останется необнаруженной алгоритмом CRC, если и только если полином ошибки делится на полином CRC.

(Кстати, никогда не бывает смысла использовать многочлен с нулевым членом. Напомним, что CRC — это остаток от полинома сообщения, умноженного на полином CRC. Многочлен с нулевым членом всегда имеет в качестве множителя. Так что если — исходный полином CRC и , то

То есть CRC любого сообщения с полиномом такой же, как и у того же сообщения с полиномом, к которому добавлен ноль. Это просто пустая трата бита.)

Сочетание этих факторов означает, что хорошие полиномы CRC часто являются примитивными полиномами (которые имеют наилучшее обнаружение 2-битных ошибок) или примитивными полиномами степени , умноженными на (которые обнаруживают все нечетные числа битовых ошибок и имеют половину способности обнаружения двухбитных ошибок примитивного полинома степени ). [1]

Битфильтры

Метод анализа с использованием битфильтров [1] позволяет очень эффективно определять свойства заданного генераторного полинома. Результаты следующие:

  1. Все пакетные ошибки (кроме одной) с длиной, не превышающей длину генераторного полинома, могут быть обнаружены любым генераторным полиномом . Это включает в себя 1-битные ошибки (пакет длиной 1). Максимальная длина равна , когда — степень генераторного полинома (который сам имеет длину ). Исключением из этого результата является битовый шаблон, такой же, как у генераторного полинома.
  2. Все ошибки нечетных бит обнаруживаются генераторными полиномами с четным числом членов.
  3. 2-битные ошибки в (кратном) расстоянии самого длинного битового фильтра четной четности до генераторного полинома не обнаруживаются; все остальные обнаруживаются. Для степеней до 32 существует оптимальный генераторный полином с такой степенью и четным числом членов; в этом случае период, упомянутый выше, равен . Для это означает, что блоки длиной 32 767 бит не содержат необнаруженных 2-битных ошибок. Для нечетного числа членов в генераторном полиноме может быть период ; однако эти генераторные полиномы (с нечетным числом членов) не обнаруживают все нечетное число ошибок, поэтому их следует избегать. Список соответствующих генераторов с четным числом членов можно найти по ссылке, упомянутой в начале этого раздела.
  4. Все ошибки в одном бите в пределах периода фильтра битов, упомянутого выше (для четных членов в полиноме генератора), могут быть однозначно идентифицированы по их остатку. Таким образом, метод CRC может использоваться для исправления ошибок в одном бите (в этих пределах, например, 32 767 бит с оптимальными полиномами генератора степени 16). Поскольку все нечетные ошибки оставляют нечетный остаток, все четные — четный остаток, можно различать ошибки в одном бите и ошибки в двух битах. Однако, как и другие методы SECDED , CRC не всегда могут различать ошибки в одном бите и ошибки в трех битах. Когда в блоке возникает 3 или более ошибок бита, исправление ошибок бита CRC само по себе будет ошибочным и приведет к большему количеству ошибок.

Смотрите также

Ссылки

  1. ^ abc Купман, Филип (июль 2002 г.). "32-битные циклические избыточные коды для интернет-приложений" (PDF) . Труды Международной конференции по надежным системам и сетям . стр. 459–468. CiteSeerX  10.1.1.11.8323 . doi :10.1109/DSN.2002.1028931. ISBN 978-0-7695-1597-7. S2CID  14775606 . Получено 14 января 2011 г. .- проверка результатов Кастаньоли с помощью исчерпывающего поиска и некоторых новых хороших полиномов
  2. ^ Купман, Филипп; Чакраварти, Тридиб (июнь 2004 г.). "Выбор полинома циклического избыточного кода (CRC) для встраиваемых сетей" (PDF) . Международная конференция по надежным системам и сетям, 2004 г. стр. 145–154. CiteSeerX 10.1.1.648.9080 . doi :10.1109/DSN.2004.1311885. ISBN  978-0-7695-2052-0. S2CID  793862 . Получено 14 января 2011 г. .– анализ коротких CRC-полиномов для встраиваемых приложений


Внешние ссылки