Скачиваний:
22
Добавлен:
02.05.2014
Размер:
495.1 Кб
Скачать

2 Специальная часть

2.1 Принцип работы вычислителя контрольной суммы

Различные контрольные суммы широко применяются в цифровых устройст­вах и системах для контроля правильности хранения или передачи массивов информации. Суть этого метода контроля проста: к хранимому или переда­ваемому информационному массиву присоединяется небольшой контроль­ный код (обычно от 1 разряда до 32 разрядов), в котором в свернутом виде содержится информация обо всем массиве. При чтении или получении этого массива еще раз вычисляется тот же самый контрольный код по тому же са­мому алгоритму. Если этот вновь вычисленный код равен тому коду, кото­рый был присоединен к массиву, то считается, что массив сохранен или пе­редан без ошибок. Логика здесь следующая: контрольный код (он же кон­трольная сумма) гораздо меньше контролируемого массива, поэтому вероят­ность искажения контрольной суммы гораздо меньше, чем вероятность ис­кажения массива. Если же исказятся как массив, так и контрольная сумма, то вероятность того, что эти искажения не будут замечены при повторном под­счете контрольной суммы, крайне мала. Существует, правда, вероятность, что массив будет искажен в нескольких местах таким образом, что контроль­ная сумма от этих искажений никак не изменится, но такая вероятность так­же обычно мала.

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

Существует множество способов вычисления контрольной суммы, разли­чающихся степенью сложности вычисления и надежностью выявления оши­бок. Но наибольшее распространение получил в настоящее время так назы­ваемый «циклический метод контроля по избыточности» или CRC (Cyclic Redundancy Check), при котором применяется циклическая контрольная сум­ма.

Вычисляется циклическая контрольная сумма таким образом. Весь массив информации рассматривается как одно N-разрядное двоичное число, где N -количество бит во всех байтах массива. Для вычисления контрольной суммы это N-разрядное число делится на некоторое постоянное число (полином), выбранное специальным образом (но делится не просто, а по модулю 2). Ча­стное от этого деления отбрасывается, а остаток как раз и используется в ка­честве контрольной суммы. Мы не будем углубляться в математическое обоснование этого метода.

Интересующиеся читатели могут обратиться к специальной литературе. Здесь же мы отметим только, что данный метод выявляет одиночные ошибки в масси­ве с вероятностью 100%, а любое другое количество ошибок с вероятностью, примерно равной (1-2 ), где n - количество разрядов контрольной суммы (это верно только при условии, что N гораздо больше n, что, впрочем, почти всегда выполняется). Например, при n = 8 данная вероятность составит 0,996, для n = 16 она будет равна 0,999985, а для n = 32 она будет 0,9999999997672. То есть почти все ошибки будут выявляться.

А теперь кратко поясним, что такое деление по модулю 2. Пусть массив (последовательность бит) имеет следующий вид: 101111001110 (для простоты берем небольшую разряд­ность). В качестве делителя (называемого обычно полиномом) возьмем число 1001 1. Как оно выбирается? Оно должно делиться по модулю 2 без остатка только на единицу и само на себя (то есть это должно быть простое число в смысле деления по модулю 2). Разрядность полинома берется на единицу большая, чем требуемая разрядность контрольной суммы (остатка отделе­ния). Так, чтобы получить 8-разрядный остаток (8-разрядную контрольную сумму), надо брать 9-разрядный полином. В нашем случае полином 5-разрядный, следовательно, остаток будет 4-разрядный. Для получения 8-разрядного остатка можно использовать, например, полином 1 0001 1101 или 1 11D в 16-ричном коде.

Деление по модулю 2 производится точно так же, как и привычное для нас деление «в столбик» (рис. 3), но вместо вычитания в данном случае исполь­зуется поразрядное сложение по модулю 2, то есть каждый результирующий бит представляет собой функцию Исключающее ИЛИ от соответствующих битов слагаемых. Частное от деления нас не интересует, а остаток, равный в нашем примере 1000, и будет циклической контрольной суммой.

Рисунок 3. Вычисление циклической контрольной суммы.

Как практически реализовать вычисление этого остатка (контрольной сум­мы)? Можно сделать это по приведенному здесь принципу деления в столбик (аппаратно или программно). Но в любом случае это довольно громоздко и медленно. Ускорить процесс вычисления можно, воспользовавшись таблич­ным методом. Для этого составляется таблица чисел размером 2N x n, где n - разрядность контрольной суммы. Принцип вычисления чисел в таблице очень прост (табл. 4).

Таблица 4. Таблица для табличного метода вычисления циклической кон­трольной суммы

Адрес в таблице

Данные в таблице (числа)

0

0

1

Остаток отделения числа 1 0000 0000 на полином

2

Остаток отделения числа 10 0000 0000 на полином

3

Остаток отделения числа 11 0000 0000 на полином

4

Остаток отделения числа 100 0000 0000 на полином

5

Остаток отделения числа 101 0000 0000 на полином

255

Остаток отделения числа 1111 1111 0000 0000 на полином

Числа представляют собой остаток от деления по модулю 2 числа с n конеч­ными нулями (в нашем примере n = 8) и с начальными разрядами, равными номеру числа (его адресу) в таблице. Деление производится на выбранный полином (в нашем случае - 9-разрядный). Таблица вычисляется один раз и хранится на диске или в ПЗУ.

Алгоритм вычисления контрольной суммы с помощью этой таблицы сле­дующий (рассматриваем случай n = 8). Берем первый байт нашего информа­ционного массива. Рассматриваем его как адрес в таблице (номер числа). Бе­рем из таблицы число с полученным номером - получаем остаток О1. Берем второй байт массива и складываем его по модулю 2 с остатком О1. По­лученное число используем как адрес в таблице. По этому адресу выбираем из таблицы остаток О2. Берем третий байт массива, складываем его по моду­лю 2 с остатком О2. Используя это число как адрес в таблице, выбираем из нее остаток ОЗ и так продолжаем до последнего байта массива. Естественно, это будет гораздо быстрее, чем вычисление «в столбик».

Рисунок 4. Параллельный вычислитель 8-разрядной циклической контрольной суммы на ПЗУ.

Для реализации этого алгоритма с помощью цифровых схем требуется толь­ко ПЗУ с организацией (256 X 8 при 8-разрядной контрольной сумме), n-разрядный регистр и n элементов Исключающее ИЛИ (рис. 4).

В ПЗУ заносится таблица промежуточных остатков (табл. 4), на вход схемы подаются один за другим байты массива, сопровождаемые стробом. Адресом ПЗУ служит сумма по модулю 2 входных данных и содержимого выходного регистра, в который по сигналу строба записывается выходной код ПЗУ. Пе­ред началом вычисления состояние регистра обнуляется. После окончания всего массива в регистре образуется циклическая контрольная сумма. Недостаток данной схемы параллельного вычислителя очевиден: в случае большого числа разрядов контрольной суммы требуется очень большой объ­ем ПЗУ (64К х 16 для 16-разряд ной суммы и 4Г х 32 для 32-разрядной сум­мы). Поэтому она применяется сравнительно редко. Зато параллельный вы­числитель обладает высоким быстродействием (байты могут поступать с пе­риодом, равным сумме задержки выходного регистра, времени выборки ад­реса ПЗУ и задержки элемента Исключающее ИЛИ).

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

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

На рис. 5. приведен пример последовательного вычислителя 16-разрядной циклической контрольной суммы при выбранном полиноме 1 0001 0000 0010 0001 или 11021 в 16-ричном коде (рекомендация МККТТ V.41). Так как в ко­де полинома три единицы (без младшего разряда), необходимо взять три точ­ки включения обратной связи. При этом номера разрядов сдвигового регист­ра, к которым подключаются обратные связи, определяются положением единичных битов в полиноме. Перед началом работы сдвиговый регистр не­обходимо сбросить в нуль (сигнал -Сброс). Биты массива должны сопровож­даться сигналом строба. После окончания массива в регистре будет цикли­ческая контрольная сумма.

Рисунок 5. Последовательный вычислитель 16-разрядной циклической кон­трольной суммы на регистре сдвига.

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

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