WikiSort.ru - Не сортированное

ПОИСК ПО САЙТУ | о проекте

Циклический избыточный код (англ. Cyclic redundancy check, CRC[1]) — алгоритм нахождения контрольной суммы, предназначенный для проверки целостности данных[2]. CRC является практическим приложением помехоустойчивого кодирования, основанным на определённых математических свойствах циклического кода.

Введение

Понятие циклические коды достаточно широкое[3]. В англоязычной литературе CRC понимается двояко в зависимости от контекста: Cyclic Redundancy Code или Cyclic Redundancy Check[4]. Под первым понятием подразумевают математический феномен циклических кодов, под вторым — конкретное применение этого феномена как хеш-функции.

Помехоустойчивое кодирование

Первые попытки создания кодов с избыточной информацией начались задолго до появления современных компьютеров. К примеру, ещё в 1960-х годах Ридом и Соломоном была разработана эффективная методика кодирования — Код Рида-Соломона. Использование её в те времена не представлялось возможным, так как произвести операцию декодирования за разумное время первыми алгоритмами не удавалось. Точку в этом вопросе поставила фундаментальная работа Берлекэмпа, опубликованная в 1968 году. Эта методика, на практическое применение которой указал через год Мэсси, и по сей день используется в цифровых устройствах, обеспечивающих приём RS-кодированных данных. Более того: данная система позволяет не только определять позиции, но и исправлять неверные кодовые символы (чаще всего октеты).

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

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

Контрольная сумма

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

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

Математическое описание

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

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

Количество различных многочленов степени, меньшей , равно , что совпадает с числом всех двоичных последовательностей длины .

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

где

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

Умножение осуществляется приписыванием нулевых битов к входной последовательности, что улучшает качество хеширования для коротких входных последовательностей.

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

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

Вычисление CRC

Параметры алгоритма

Схема формирования контрольной суммы CRC-8. Порождающий многочлен g(x) = x8+x5+x4+1

Одним из основных параметров CRC является порождающий полином.

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

Ещё одним параметром является начальное (стартовое) значение слова. Указанные параметры полностью определяют «традиционный» алгоритм вычисления CRC. Существуют также модификации алгоритма, например, использующие обратный порядок обработки битов.

Описание процедуры

Реализация CRC на логических элементах

Из файла берётся первое слово — это может быть битовый (CRC-1), байтовый (CRC-8) или любой другой элемент. Если старший бит в слове «1», то слово сдвигается влево на один разряд с последующим выполнением операции XOR c порождающим полиномом. Соответственно, если старший бит в слове «0», то после сдвига операция XOR не выполняется. После сдвига теряется старый старший бит, а младший бит освобождается — его значение устанавливается равным нулю. На место младшего бита загружается очередной бит из файла, и операция повторяется до тех пор, пока не загрузится последний бит файла. После прохождения всего файла, в слове остается остаток, который и является контрольной суммой.

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

В то время, как циклические избыточные коды являются частью стандартов, у этого термина не существует общепринятого определения — трактовки различных авторов нередко противоречат друг другу.[1][5]

Этот парадокс касается и выбора многочлена-генератора: зачастую стандартизованные полиномы не являются самыми эффективными в плане статистических свойств соответствующего им check redundancy code.

При этом многие широко используемые полиномы не являются наиболее эффективными из всех возможных. В 1993—2004 годах группа учёных занималась исследованием порождающих многочленов разрядности до 16,[1] 24 и 32 бит[6][7] и нашла полиномы, дающие лучшую, нежели стандартизированные многочлены, производительность в смысле кодового расстояния.[7] Один из результатов этого исследования уже нашёл своё применение в протоколе iSCSI.

Самый популярный и рекомендуемый IEEE полином для CRC-32 используется в Ethernet, FDDI; также этот многочлен является генератором кода Хемминга[8]. Использование другого полинома — CRC-32C — позволяет достичь такой же производительности при длине исходного сообщения от 58 бит до 131 кбит, а в некоторых диапазонах длины входного сообщения может быть даже выше — поэтому в наши дни он тоже пользуется популярностью.[7] К примеру, стандарт ITU-T G.hn использует CRC-32C с целью обнаружения ошибок в полезной нагрузке.

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

НазваниеПолиномПредставления:[9] нормальное / реверсированное / реверсированное от обратного
CRC-1 (используется в аппаратном контроле ошибок; также известен как бит чётности)0x1 / 0x1 / 0x1
CRC-4-ITU (ITU G.704[10])0x3 / 0xC / 0x9
CRC-5-EPC (Gen 2 RFID[11])0x09 / 0x12 / 0x14
CRC-5-ITU (ITU G.704[12])0x15 / 0x15 / 0x1A
CRC-5-USB (USB token packets)0x05 / 0x14 / 0x12
CRC-6-ITU (ITU G.704[13])0x03 / 0x30 / 0x21
CRC-7 (системы телекоммуникации, ITU-T G.707[14], ITU-T G.832[15], MMC, SD)0x09 / 0x48 / 0x44
CRC-8-CCITT (ATM HEC), ISDN Header Error Control and Cell Delineation ITU-T I.432.1 (02/99)0x07 / 0xE0 / 0x83
CRC-8-Dallas/Maxim (1-Wire bus)0x31 / 0x8C / 0x98
CRC-8 (ETSI EN 302 307[16], 5.1.4)0xD5 / 0xAB / 0xEA[1]
CRC-8-SAE J1850 0x1D / 0xB8 / 0x8E
CRC-10 0x233 / 0x331 / 0x319
CRC-11 (FlexRay[17])0x385 / 0x50E / 0x5C2
CRC-12 (системы телекоммуникации[18][19]) 0x80F / 0xF01 / 0xC07
CRC-15-CAN 0x4599 / 0x4CD1 / 0x62CC
CRC-16-IBM (Bisync, Modbus, USB, ANSI X3.28[20], многие другие; также известен как CRC-16 и CRC-16-ANSI)0x8005 / 0xA001 / 0xC002
CRC-16-CCITT (X.25, HDLC, XMODEM, Bluetooth, SD и др.)0x1021 / 0x8408 / 0x8810[1]
CRC-16-T10-DIF (SCSI DIF)0x8BB7[21] / 0xEDD1 / 0xC5DB
CRC-16-DNP (DNP, IEC 870, M-Bus)0x3D65 / 0xA6BC / 0x9EB2
CRC-16-FletcherНе CRC; см. Fletcher's checksumИспользуется в Adler-32 A & B CRC
CRC-24 (FlexRay[17])0x5D6DCB / 0xD3B6BA / 0xAEB6E5
CRC-24-Radix-64 (OpenPGP)0x864CFB / 0xDF3261 / 0xC3267D
CRC-30 (CDMA)0x2030B9C7 / 0x38E74301 / 0x30185CE3
CRC-32-AdlerНе CRC; см. Adler-32См. Adler-32
CRC-32-IEEE 802.3 (V.42, MPEG-2, PNG[22], POSIX cksum) 0x04C11DB7 / 0xEDB88320 / 0x82608EDB[7]
CRC-32C (Castagnoli) (iSCSI, G.hn payload)0x1EDC6F41 / 0x82F63B78 / 0x8F6E37A0[7]
CRC-32K (Koopman) 0x741B8CD7 / 0xEB31D82E / 0xBA0DC66B[7]
CRC-32Q (aviation; AIXM[23])0x814141AB / 0xD5828281 / 0xC0A0A0D5
CRC-64-ISO (HDLC — ISO 3309)0x000000000000001B / 0xD800000000000000 / 0x800000000000000D
CRC-64-ECMA [24]0x42F0E1EBA9EA3693 / 0xC96C5795D7870F42 / 0xA17870F5D4F51B49

Существующие стандарты CRC-128 (IEEE) и CRC-256 (IEEE) в настоящее время вытеснены криптографическими хеш-функциями.

Спецификации алгоритмов CRC

Одной из самых известных является методика Ross N. Williams[25]. В ней используются следующие параметры:

  • Название алгоритма (name);
  • Степень порождающего контрольную сумму многочлена (width);
  • Сам производящий полином (poly). Для того, чтобы записать его в виде значения, его сначала записывают как битовую последовательность, при этом старший бит опускается — он всегда равен 1. К примеру, многочлен в данной нотации будет записан числом . Для удобства полученное двоичное представление записывают в шестнадцатеричной форме. Для нашего случая оно будет равно или 0x11;
  • Стартовые данные (init), то есть значения регистров на момент начала вычислений;
  • Флаг (RefIn), указывающий на начало и направление вычислений. Существует два варианта: False — начиная со старшего значащего бита (MSB-first), или True — с младшего (LSB-first);
  • Флаг (RefOut), определяющий, инвертируется ли порядок битов регистра при входе на элемент XOR;
  • Число (XorOut), с которым складывается по модулю 2 полученный результат;
  • Значение CRC (check) для строки «123456789» .
Примеры[26]
NameWidthPolyInitRefInRefOutXorOutCheck
CRC-3/ROHC30x30x7truetrue0x00x6
CRC-4/ITU40x30x0truetrue0x00x7
CRC-5/EPC50x90x9falsefalse0x00x0
CRC-5/ITU50x150x0truetrue0x00x7
CRC-5/USB50x50x1Ftruetrue0x1F0x19
CRC-6/CDMA2000-A60x270x3Ffalsefalse0x00xD
CRC-6/CDMA2000-B60x70x3Ffalsefalse0x00x3B
CRC-6/DARC60x190x0truetrue0x00x26
CRC-6/ITU60x30x0truetrue0x00x6
CRC-770x90x0falsefalse0x00x75
CRC-7/ROHC70x4F0x7Ftruetrue0x00x53
CRC-880x70x0falsefalse0x00xF4
CRC-8/CDMA200080x9B0xFFfalsefalse0x00xDA
CRC-8/DARC80x390x0truetrue0x00x15
CRC-8/DVB-S280xD50x0falsefalse0x00xBC
CRC-8/EBU80x1D0xFFtruetrue0x00x97
CRC-8/I-CODE80x1D0xFDfalsefalse0x00x7E
CRC-8/ITU80x70x0falsefalse0x550xA1
CRC-8/MAXIM80x310x0truetrue0x00xA1
CRC-8/ROHC80x70xFFtruetrue0x00xD0
CRC-8/WCDMA80x9B0x0truetrue0x00x25
CRC-10100x2330x0falsefalse0x00x199
CRC-10/CDMA2000100x3D90x3FFfalsefalse0x00x233
CRC-11110x3850x1Afalsefalse0x00x5A3
CRC-12/3GPP120x80F0x0falsetrue0x00xDAF
CRC-12/CDMA2000120xF130xFFFfalsefalse0x00xD4D
CRC-12/DECT120x80F0x0falsefalse0x00xF5B
CRC-13/BBC130x1CF50x0falsefalse0x00x4FA
CRC-14/DARC140x8050x0truetrue0x00x82D
CRC-15150x45990x0falsefalse0x00x59E
CRC-15/MPT1327150x68150x0falsefalse0x10x2566
CRC-16/ARC160x80050x0truetrue0x00xBB3D
CRC-16/AUG-CCITT160x10210x1D0Ffalsefalse0x00xE5CC
CRC-16/BUYPASS160x80050x0falsefalse0x00xFEE8
CRC-16/CCITT-FALSE160x10210xFFFFfalsefalse0x00x29B1
CRC-16/CDMA2000160xC8670xFFFFfalsefalse0x00x4C06
CRC-16/DDS-110160x80050x800Dfalsefalse0x00x9ECF
CRC-16/DECT-R160x5890x0falsefalse0x10x7E
CRC-16/DECT-X160x5890x0falsefalse0x00x7F
CRC-16/DNP160x3D650x0truetrue0xFFFF0xEA82
CRC-16/EN-13757160x3D650x0falsefalse0xFFFF0xC2B7
CRC-16/GENIBUS160x10210xFFFFfalsefalse0xFFFF0xD64E
CRC-16/MAXIM160x80050x0truetrue0xFFFF0x44C2
CRC-16/MCRF4XX160x10210xFFFFtruetrue0x00x6F91
CRC-16/RIELLO160x10210xB2AAtruetrue0x00x63D0
CRC-16/T10-DIF160x8BB70x0falsefalse0x00xD0DB
CRC-16/TELEDISK160xA0970x0falsefalse0x00xFB3
CRC-16/TMS37157160x10210x89ECtruetrue0x00x26B1
CRC-16/USB160x80050xFFFFtruetrue0xFFFF0xB4C8
CRC-A160x10210xC6C6truetrue0x00xBF05
CRC-16/KERMIT160x10210x0truetrue0x00x2189
CRC-16/MODBUS160x80050xFFFFtruetrue0x00x4B37
CRC-16/X-25160x10210xFFFFtruetrue0xFFFF0x906E
CRC-16/XMODEM160x10210x0falsefalse0x00x31C3
CRC-24240x864CFB0xB704CEfalsefalse0x00x21CF02
CRC-24/FLEXRAY-A240x5D6DCB0xFEDCBAfalsefalse0x00x7979BD
CRC-24/FLEXRAY-B240x5D6DCB0xABCDEFfalsefalse0x00x1F23B8
CRC-31/PHILIPS310x4C11DB70x7FFFFFFFfalsefalse0x7FFFFFFF0xCE9E46C
CRC-32/zlib320x4C11DB70xFFFFFFFFtruetrue0xFFFFFFFF0xCBF43926
CRC-32/BZIP2320x4C11DB70xFFFFFFFFfalsefalse0xFFFFFFFF0xFC891918
CRC-32C320x1EDC6F410xFFFFFFFFtruetrue0xFFFFFFFF0xE3069283
CRC-32D320xA833982B0xFFFFFFFFtruetrue0xFFFFFFFF0x87315576
CRC-32/MPEG-2320x4C11DB70xFFFFFFFFfalsefalse0x00x376E6E7
CRC-32/POSIX320x4C11DB70x0falsefalse0xFFFFFFFF0x765E7680
CRC-32Q320x814141AB0x0falsefalse0x00x3010BF7F
CRC-32/JAMCRC320x4C11DB70xFFFFFFFFtruetrue0x00x340BC6D9
CRC-32/XFER320xAF0x0falsefalse0x00xBD0BE338
CRC-40/GSM400x48200090x0falsefalse0xFFFFFFFFFF0xD4164FC646
CRC-64640x42F0E1EBA9EA36930x0falsefalse0x00x6C40DF5F0B497347
CRC-64/WE640x42F0E1EBA9EA36930xFFFFFFFFFFFFFFFFfalsefalse0xFFFFFFFFFFFFFFFF0x62EC59E3F1A4F00A
CRC-64/XZ640x42F0E1EBA9EA36930xFFFFFFFFFFFFFFFFtruetrue0xFFFFFFFFFFFFFFFF0x995DC9BBDF1939FA

Примечания

  1. 1 2 3 4 5 Philip Koopman, Tridib Chakravarty. Cyclic Redundancy Code (CRC) Polynomial Selection For Embedded Networks (2004). Проверено ???. Архивировано 23 августа 2011 года.
  2. Интернет-Университет Информационных Технологий. Лекция: Организация беспроводных сетей
  3. Интернет-Университет Информационных Технологий. Лекция: Алгоритмы сети Ethernet/Fast Ethernet
  4. Walma, M.; Pipelined Cyclic Redundancy Check (CRC) Calculation
  5. Greg Cook. Catalogue of parameterised CRC algorithms (29 апреля 2009). Проверено ???. Архивировано 23 августа 2011 года.
  6. G. Castagnoli, S. Braeuer, M. Herrman. Optimization of Cyclic Redundancy-Check Codes with 24 and 32 Parity Bits // IEEE Transactions on Communications. — июнь 1993. Т. 41, № 6. С. 883. DOI:10.1109/26.231911.
  7. 1 2 3 4 5 6 P. Koopman. 32-Bit Cyclic Redundancy Codes for Internet Applications // The International Conference on Dependable Systems and Networks. — июнь 2002. С. 459. DOI:10.1109/DSN.2002.1028931.
  8. Brayer, K; Hammond, J L Jr. (December 1975). "Evaluation of error detection polynomial performance on the AUTOVON channel" in National Telecommunications Conference, New Orleans, La. Conference Record 1: 8—21 to 8-25, New York: Institute of Electrical and Electronics Engineers. 
  9. В представлениях опущен старший бит.
  10. G.704, p. 12
  11. Class-1 Generation-2 UHF RFID Protocol version 1.2.0. — 23 октября 2008. С. 35.
  12. G.704, p. 9
  13. G.704, p. 3
  14. G.707 : Network node interface for the synchronous digital hierarchy (SDH)
  15. G.832 : Transport of SDH elements on PDH networks — Frame and multiplexing structures
  16. EN 302 307. Digital Video Broadcasting (DVB); Second generation framing structure, channel coding and modulation systems for Broadcasting, Interactive Services, News Gathering and other broadband satellite applications (DVB-S2)
  17. 1 2 FlexRay Protocol Specification version 2.1 Revision A. — 22 декабря 2005. С. 93.
  18. A. Perez, Wismer, Becker. Byte-Wise CRC Calculations // IEEE Micro. — 1983. Т. 3, № 3. С. 40—50. DOI:10.1109/MM.1983.291120.
  19. T. V. Ramabadran, S. S. Gaitonde. A tutorial on CRC computations // IEEE Micro. — 1988. Т. 8, № 4. С. 62—75. DOI:10.1109/40.7773.
  20. http://www.incits.org/press/1997/pr97020.htm
  21. Pat Thaler. 16-bit CRC polynomial selection. INCITS T10 (28 августа 2003). Проверено ???. Архивировано 23 августа 2011 года.
  22. Thomas Boutell, Glenn Randers-Pehrson и др. PNG (Portable Network Graphics) Specification, Version 1.2 (14 июля 1998). Проверено ???. Архивировано 23 августа 2011 года.
  23. AIXM Primer version 4.5. European Organisation for the Safety of Air Navigation (20 марта 2006). Проверено ???. Архивировано 23 августа 2011 года.
  24. ECMA-182 p. 51
  25. Ross N. Williams. CRC Rocksoft (1993). Архивировано 15 мая 2012 года.
  26. Greg Cook. Catalogue of parametrised CRC algorithms (18 January 2016).

Литература

  • Генри С. Уоррен, мл. Глава 5. Подсчет битов // Алгоритмические трюки для программистов = Hacker’s Delight. М.: Вильямс, 2007. — 288 с. ISBN 0-201-91465-4.

Ссылки

CRC Калькуляторы


Данная страница на сайте WikiSort.ru содержит текст со страницы сайта "Википедия".

Если Вы хотите её отредактировать, то можете сделать это на странице редактирования в Википедии.

Если сделанные Вами правки не будут кем-нибудь удалены, то через несколько дней они появятся на сайте WikiSort.ru .




Текст в блоке "Читать" взят с сайта "Википедия" и доступен по лицензии Creative Commons Attribution-ShareAlike; в отдельных случаях могут действовать дополнительные условия.

Другой контент может иметь иную лицензию. Перед использованием материалов сайта WikiSort.ru внимательно изучите правила лицензирования конкретных элементов наполнения сайта.

2019-2024
WikiSort.ru - проект по пересортировке и дополнению контента Википедии