Математика циклических избыточных проверок
Проверка циклическим избыточным кодом (CRC) основана на делении кольца многочленов над конечным полем GF(2) (целые числа по модулю 2 ), то есть наборе многочленов , где каждый коэффициент равен нулю или единице, и арифметических операциях обернуть вокруг.
Любую строку битов можно интерпретировать как коэффициенты полинома сообщения такого типа, и чтобы найти CRC, мы умножаем полином сообщения на а затем находим остаток при делении на степень - полином генератора . Коэффициентами полинома остатка являются биты CRC.
Формулировка
[ редактировать ]В общем, вычисление CRC соответствует евклидову делению полиномов по GF(2) :
Здесь является исходным полиномом сообщения и это степень- генераторный полином. Части оригинальное сообщение с в конце добавлены нули. «Контрольная сумма» CRC формируется из коэффициентов полинома остатка. степень которого строго меньше . Факторный полином не представляет интереса. Используя операцию по модулю , можно сказать, что
При сообщении отправитель прикрепляет биты R после битов исходного сообщения M, что, как можно показать, эквивалентно отправке ( кодовое слово .) Получатель, зная и поэтому , отделяет M от R и повторяет расчет, проверяя, что полученное и вычисленное R равны. Если да, то получатель предполагает, что биты полученного сообщения верны.
На практике вычисления CRC больше всего напоминают длинное деление в двоичном формате, за исключением того, что используемые вычитания не заимствуются из более значащих цифр и, таким образом, становятся исключающими операциями.
CRC — это контрольная сумма в строгом математическом смысле, поскольку ее можно выразить как взвешенную по модулю 2 сумму побитовых синдромов , но это слово обычно зарезервировано для сумм, вычисленных с использованием больших модулей, таких как 10, 256, или 65535.
CRC также могут использоваться как часть кодов, исправляющих ошибки , которые позволяют не только обнаруживать ошибки передачи, но и восстанавливать правильное сообщение. Эти коды основаны на тесно связанных математических принципах.
Полиномиальная арифметика по модулю 2
[ редактировать ]Поскольку коэффициенты ограничены одним битом, любая математическая операция над полиномами CRC должна отображать коэффициенты результата либо в ноль, либо в единицу. Например, дополнительно:
Обратите внимание, что эквивалентно нулю в приведенном выше уравнении, поскольку сложение коэффициентов выполняется по модулю 2:
Полиномиальное сложение по модулю 2 аналогично побитовому исключающему ИЛИ . Поскольку исключающее ИЛИ является обратным самому себе, полиноминальное вычитание по модулю 2 аналогично побитовому исключающему ИЛИ.
Умножение аналогично ( произведение без переноса ):
Мы также можем разделить многочлены по модулю 2 и найти частное и остаток. Например, предположим, что мы делим к . Мы бы нашли это
Другими словами,
Деление дает частное от x 2 + 1 с остатком -1, который, поскольку он нечетный, имеет последний бит 1.
В приведенных выше уравнениях представляет исходные биты сообщения 111
, – образующий полином, а остаток (эквивалентно, ) — это CRC. Степень полинома генератора равна 1, поэтому мы сначала умножили сообщение на получить .
Вариации
[ редактировать ]Существует несколько стандартных вариантов CRC, любой или все из которых могут использоваться с любым полиномом CRC. Варианты реализации, такие как порядок байтов и представление CRC, влияют только на отображение битовых строк в коэффициенты и и не влияют на свойства алгоритма.
- Для проверки CRC вместо вычисления CRC сообщения и сравнения его с CRC можно выполнить вычисление CRC для всего кодового слова. Если результат (называемый остатком) равен нулю, проверка проходит. Это работает, потому что кодовое слово , которое всегда делится на .
- Это упрощает многие реализации, устраняя необходимость особой обработки последних нескольких байтов сообщения при проверке CRC.
- Регистр сдвига может быть инициализирован единицами вместо нулей. Это эквивалентно инвертированию первого биты сообщения перед подачей их в алгоритм. Уравнение CRC становится , где длина сообщения в битах. Изменение, которое это накладывает на является функцией производящего полинома и длины сообщения, .
- Причина использования этого метода заключается в том, что немодифицированная CRC не различает два сообщения, которые отличаются только количеством ведущих нулей, поскольку ведущие нули не влияют на значение . Когда эта инверсия выполнена, CRC различает такие сообщения.
- CRC может быть инвертирован перед добавлением в поток сообщений. Хотя немодифицированный CRC различает сообщения с различным количеством конечных нулей он не обнаруживает конечные нули, добавленные после самого остатка CRC. Это связано с тем, что все допустимые кодовые слова кратны , так раз это кодовое слово также кратно. (На самом деле именно поэтому работает первый вариант, описанный выше.)
На практике последние два варианта всегда используются вместе. Они изменяют передаваемый CRC, поэтому должны быть реализованы как на передатчике, так и на приемнике. Хотя предварительно установить сдвиговый регистр на единицы несложно на обоих концах, инвертирование влияет на приемники, реализующие первый вариант, поскольку CRC полного кодового слова, которое уже включает CRC, больше не равен нулю. Вместо этого это фиксированный ненулевой шаблон, CRC шаблона инверсии те.
Таким образом, CRC можно проверить либо очевидным методом вычисления CRC в сообщении, его инвертирования и сравнения с CRC в потоке сообщений, либо путем вычисления CRC для всего кодового слова и сравнения его с ожидаемым фиксированным значением. , называемый проверочным полиномом, остатком или магическим числом . Это может быть вычислено как или, что то же самое, путем вычисления немодифицированного CRC сообщения, состоящего из те, .
Эти инверсии чрезвычайно распространены, но не выполняются повсеместно, даже в случае полиномов CRC-32 или CRC-16-CCITT.
Обратные представления и обратные полиномы
[ редактировать ]Полиномиальные представления
[ редактировать ]Пример 16-битного полинома CCITT в описанных формах (биты внутри квадратных скобок включены в словесное представление; биты снаружи подразумеваются 1 бит; вертикальные полосы обозначают границы полубайта ):
16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 coefficient 1 [0 0 0 1 |0 0 0 0 |0 0 1 0 |0 0 0 1] Normal [ 1 | 0 | 2 | 1 ] Nibbles of Normal 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 Reverse [ 8 | 4 | 0 | 8 ] Nibbles of Reverse 0x8408 16 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] Reciprocal [ 0 | 8 | 1 | 1 ] Nibbles of Reciprocal 0x0811 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 Reverse reciprocal 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 Koopman [1 0 0 0 |1 0 0 0 |0 0 0 1 |0 0 0 0] 1 [ 8 | 8 | 1 | 0 ] Nibbles 0x8810
Все известные полиномы генератора CRC степени имеют два общих шестнадцатеричных представления. В обоих случаях коэффициент опускается и понимается как 1.
- Представление msbit-first представляет собой шестнадцатеричное число с бит, младший бит из которых всегда равен 1. Самый старший бит представляет коэффициент и младший бит представляет собой коэффициент .
- Представление lsbit-first представляет собой шестнадцатеричное число с бит, старший бит из которых всегда равен 1. Самый старший бит представляет коэффициент и младший бит представляет собой коэффициент .
Форма msbit-first часто упоминается в литературе как нормальное представление, а форма lsbit-first называется обратным представлением. При реализации CRC важно использовать правильную форму. Если коэффициент бывает нулевым, формы можно отличить с первого взгляда, увидев, на каком конце установлен бит.
Чтобы еще больше запутать дело, статья П. Купмана и Т. Чакраварти [1] [2] преобразует полиномы генератора CRC в шестнадцатеричные числа еще одним способом: сначала msbit, но включая коэффициент и опуская коэффициент. Преимущество этого представления «Купмана» состоит в том, что степень можно определить по шестнадцатеричной форме, а коэффициенты легко считывать в порядке слева направо. Однако он больше нигде не используется и не рекомендуется из-за риска путаницы.
Взаимные полиномы
[ редактировать ]создается Обратный полином путем присвоения через коэффициенты одного полинома к через коэффициенты нового полинома. То есть обратная степень полиномиальный является .
Наиболее интересным свойством обратных полиномов при их использовании в CRC является то, что они обладают точно такой же способностью обнаруживать ошибки, что и полиномы, обратными которым они являются. Обратная величина полинома генерирует те же самые кодовые слова , только с обратным битом — то есть, если все, кроме первого биты кодового слова под исходным полиномом берутся, переворачиваются и используются в качестве нового сообщения, CRC этого сообщения под обратным полиномом равен обратной величине первого бит исходного кодового слова. Но обратный полином не совпадает с исходным полиномом, и CRC, сгенерированные с его использованием, не совпадают (даже по модулю разворота битов), сгенерированные исходным полиномом.
Сила обнаружения ошибок
[ редактировать ]Способность CRC обнаруживать ошибки зависит от степени его ключевого полинома и от конкретного используемого ключевого полинома. «Полином ошибки» представляет собой симметричную разность кодового слова полученного сообщения и правильного кодового слова сообщения. Ошибка останется незамеченной алгоритмом CRC тогда и только тогда, когда полином ошибки делится на полином CRC.
- Поскольку CRC основан на делении, ни один полином не может обнаружить ошибки, состоящие из строки нулей, добавленных к данным, или из пропущенных начальных нулей. Однако см. Вариации .
- Все однобитовые ошибки будут обнаружены с помощью любого полинома, содержащего как минимум два члена с ненулевыми коэффициентами. Полином ошибки , и делится только на многочлены где .
- все две битовые ошибки, разделенные расстоянием меньшим, чем порядок примитивного полинома, который является коэффициентом полинома генератора Будут обнаружены . Полином ошибки в двухбитном случае равен . Как отмечалось выше, член не будет делиться на полином CRC, что оставляет срок. По определению, наименьшее значение такой, что многочлен делит полинома — порядок или показатель . Полиномы наибольшего порядка называются примитивными многочленами , а многочлены степени с двоичными коэффициентами имеют порядок .
- Все ошибки в нечетном числе битов будут обнаруживаться полиномом, кратным . Это эквивалентно полиному, имеющему четное количество членов с ненулевыми коэффициентами. Эта емкость предполагает, что полином генератора является произведением и примитивный полином степени поскольку все примитивные полиномы, кроме иметь нечетное количество ненулевых коэффициентов.
- Все пакетные ошибки длины будет обнаружен любым полиномом степени или больше, который имеет ненулевое значение срок.
(Кстати, нет смысла использовать многочлен с нулевым значением. срок. Напомним, что CRC — это остаток полиномиального времени сообщения. разделенное на полином CRC. Полином с нулем термин всегда имеет как фактор. Итак, если является исходным полиномом CRC и , затем
То есть CRC любого сообщения с полином такой же, как у того же сообщения с многочлен с добавленным нулем. Это просто пустая трата времени.)
Сочетание этих факторов означает, что хорошие полиномы CRC часто представляют собой примитивные полиномы (которые лучше всего обнаруживают 2-битные ошибки) или примитивные полиномы степени , умноженный на (который обнаруживает все нечетные числа битовых ошибок и имеет вдвое меньшую способность обнаружения двухбитных ошибок, чем примитивный полином степени ). [1]
Битфильтры
[ редактировать ]Техника анализа с использованием битфильтров [1] позволяет очень эффективно определять свойства данного порождающего полинома. Результаты следующие:
- Все пакетные ошибки (кроме одной) длиной не длиннее полинома генератора могут быть обнаружены любым полиномом генератора. . Сюда входят 1-битные ошибки (пакет длиной 1). Максимальная длина , когда — степень порождающего полинома (который сам имеет длину ). Исключением из этого результата является битовая комбинация, такая же, как и в полиноме генератора.
- Все нечетные битовые ошибки обнаруживаются с помощью генераторных полиномов с четным числом членов.
- 2-битные ошибки на (кратном) расстоянии самого длинного битового фильтра четности до полинома генератора не обнаруживаются; все остальные обнаруживаются. Для степеней до 32 существует оптимальный порождающий полином этой степени и четного числа членов; в этом случае период, упомянутый выше, составляет . Для это означает, что блоки длиной 32 767 бит не содержат необнаруженных 2-битных ошибок. Для нечетного числа членов в полиноме генератора может быть период ; однако эти полиномы-генераторы (с нечетным числом членов) не обнаруживают все нечетное количество ошибок, поэтому их следует избегать. Список соответствующих генераторов с четным количеством термов можно найти по ссылке, указанной в начале этого раздела.
- Все однобитовые ошибки в течение упомянутого выше периода битового фильтра (для четных членов полинома генератора) могут быть однозначно идентифицированы по их остатку. Таким образом, метод CRC можно использовать и для исправления однобитовых ошибок (в этих пределах, например, 32 767 бит с оптимальными полиномами генератора 16-й степени). Поскольку все нечетные ошибки оставляют нечетный остаток, можно различать все четные и четные ошибки, 1-битные ошибки и 2-битные ошибки. Однако, как и другие методы SECDED , CRC не всегда может отличить 1-битные ошибки от 3-битных ошибок. Когда в блоке возникают 3 или более битовых ошибки, коррекция битовых ошибок CRC сама по себе будет ошибочной и приведет к увеличению количества ошибок.
См. также
[ редактировать ]- Сокращение Барретта
- Код исправления ошибок
- Список алгоритмов контрольной суммы
- Паритет (телекоммуникации)
- Полиномиальные представления проверок циклическим избыточным кодом
Ссылки
[ редактировать ]- ^ Jump up to: а б с Купман, Филип (июль 2002 г.). «32-битные циклические избыточные коды для интернет-приложений». Материалы Международной конференции по надежным системам и сетям (PDF) . стр. 459–468. CiteSeerX 10.1.1.11.8323 . дои : 10.1109/DSN.2002.1028931 . ISBN 978-0-7695-1597-7 . S2CID 14775606 . Проверено 14 января 2011 г. - проверка результатов Кастаньоли перебором и некоторыми новыми хорошими полиномами.
- ^ Купман, Филип; Чакраварти, Тридиб (июнь 2004 г.). «Выбор полинома циклического избыточного кода (CRC) для встроенных сетей». Международная конференция по надежным системам и сетям, 2004 г. (PDF) . стр. 145–154. CiteSeerX 10.1.1.648.9080 . дои : 10.1109/DSN.2004.1311885 . ISBN 978-0-7695-2052-0 . S2CID 793862 . Проверено 14 января 2011 г. – анализ коротких полиномов CRC для встроенных приложений
Внешние ссылки
[ редактировать ]- Купман, Фил. «Блог: Контрольная сумма и CRC Central» . — перечисляет полиномы CRC, дающие наилучшие расстояния Хэмминга .