La comprobación de redundancia cíclica (CRC) verifica el resto de la división en el anillo de polinomios sobre GF(2) (el cuerpo finito de los enteros módulo 2). Es decir, el conjunto de polinomios donde cada coeficiente es cero o uno, y las operaciones aritméticas se repiten en círculo.
Cualquier cadena de bits puede interpretarse como los coeficientes de un polinomio de este tipo, y un mensaje tiene un CRC válido si es divisible por (es decir, es un múltiplo de) un polinomio generador acordado . Como ejemplo, el mensajese considera como(que es divisible por(véase Aritmética polinomial módulo 2 más abajo para más detalles). Los CRC son convenientes y populares porque tienen buenas propiedades de detección de errores y un múltiplo de este tipo se puede construir fácilmente a partir de cualquier polinomio de mensaje.al agregar unpolinomio de resto de -bitsproducir, dóndees el grado del polinomio generador.
Aunque la separación deen la parte del mensajey la parte de la suma de comprobaciónes conveniente para el uso de CRC, las propiedades de detección de errores no hacen distinción; los errores se detectan por igual en cualquier lugar dentro de.
Formulación
En general, el cálculo de CRC corresponde a la división euclidiana de polinomios sobre GF(2):
Aquíes el mensaje original polinomial yes el grado-polinomio generador. Los bits deson el mensaje original conceros añadidos al final. La suma de verificación CRC se forma mediante los coeficientes del polinomio restante.cuyo grado es estrictamente menor quepor las propiedades de la división euclidiana. El polinomio cocienteno tiene interés. Usando la operación módulo , se puede afirmar que
En la comunicación, el remitente adjunta elbits de R después de los bits del mensaje original de M, lo que equivale a enviar(la palabra clave ). Esta equivalencia se puede ver porque sabemos quetiene un grado estrictamente menor quey el mensaje binariocorresponde a es el mensaje original desplazado a la izquierdaveces. Por lo tanto, se añade elbits de R (posiblemente con ceros iniciales) al mensaje simplemente sumando los polinomios. EscribiendoDe esta manera se demuestra quecomo
- porque en GF(2)
El receptor, sabiendo, dividepory comprueba que el resto sea cero. Si lo es, el receptor lo descarta.(el últimobits) y asume los bits del mensaje recibidoson correctas.
Las implementaciones de software a veces separan el mensaje en sus partes y comparan el recibido.a un valor reconstruido a partir del mensaje recibido, pero las implementaciones de hardware invariablemente encuentran que la división de longitud completa descrita anteriormente es más simple.
En la práctica, los cálculos CRC se asemejan mucho a la división larga en binario, excepto que las restas involucradas no toman prestados dígitos más significativos y, por lo tanto, se convierten en operaciones "o" exclusivas .
Un CRC es una suma de verificación en un sentido matemático estricto, ya que puede expresarse como la suma ponderada módulo 2 de síndromes por bit , pero esa palabra generalmente se reserva más específicamente para sumas calculadas utilizando módulos más grandes, como 10, 256 o 65535.
Los CRC también pueden utilizarse como parte de códigos de corrección de errores , que permiten no solo la detección de errores de transmisión, sino también la reconstrucción del mensaje correcto. Estos códigos se basan en principios matemáticos muy similares.
Aritmética de polinomios módulo 2
Dado que los coeficientes están restringidos a un solo bit, cualquier operación matemática sobre polinomios CRC debe asignar los coeficientes del resultado a cero o a uno. Por ejemplo, además:
Tenga en cuenta quees equivalente a cero en la ecuación anterior porque la suma de coeficientes se realiza módulo 2:
La suma de polinomios módulo 2 es lo mismo que la operación XOR a nivel de bits . Dado que XOR es la inversa de sí misma, la resta de polinomios módulo 2 también es lo mismo que la operación XOR a nivel de bits.
La multiplicación es similar (un producto sin acarreo ):
También podemos dividir polinomios módulo 2 y hallar el cociente y el resto. Por ejemplo, supongamos que estamos dividiendoporDescubriríamos que
En otras palabras,
La división produce un cociente decon un resto de −1, que, al ser impar, tiene un último bit de 1.
En las ecuaciones anteriores,representa los bits del mensaje original 111,es el polinomio generador y el resto(equivalentemente,) es el CRC. El grado del polinomio generador es 1, por lo que primero multiplicamos el mensaje porLlegar.
Variaciones
Existen varias variaciones estándar de CRC, cualquiera de las cuales puede usarse con cualquier polinomio CRC. Las variaciones de implementación, como el orden de bytes y la presentación del CRC, solo afectan la asignación de cadenas de bits a los coeficientes deyy no afectan las propiedades del algoritmo.
- El resto de la división no tiene por qué ser cero. Aunque todo el texto anterior está escrito en términos de divisibilidad por el polinomio generador, cualquier resto fijopuede utilizarse y tendrá el mismo rendimiento que un resto cero. Lo más común es el polinomio de todos unos.se utiliza, pero, por ejemplo, el campo de control de errores del encabezado del modo de transferencia asíncrono tiene un resto de La única complicación surge si el mismo hardware que genera el CRC al encontrarse utiliza para comprobar el CRC con una división de ancho completo de Este último no producirá un resto de 0, ni de, pero de Esto no dificulta la comprobación CRC; simplemente hay que conocer el patrón esperado.
- La división larga puede comenzar con un resto distinto de cero. El resto generalmente se calcula utilizando una-registro de desplazamiento de bits que contiene el resto actual, mientras se suman los bits del mensaje y se realiza la reducción móduloSe realiza la división normal inicializa el registro de desplazamiento a cero, pero también puede inicializarse a un valor distinto de cero. (De nuevo, lo más común es que todos los valores sean unos, pero se puede usar cualquier patrón). Esto es equivalente a sumar (XOR) el patrón de inicialización con el primero.fragmentos del mensaje antes de introducirlos en el algoritmo. La ecuación CRC se convierte en:, dóndees la longitud del mensaje en bits. El cambio que esto impone enes una función del polinomio generador y la longitud del mensaje,.
Estas dos variaciones sirven para detectar bits cero añadidos al mensaje. Un bit cero precedente añade un coeficiente cero inicial aque no cambia su valor y, por lo tanto, no cambia su divisibilidad por el polinomio generador. Al agregar un patrón fijo a los primeros bits de un mensaje, se pueden detectar esos bits cero adicionales.
Asimismo, el uso de un resto distinto de cero detecta los bits cero finales añadidos a un mensaje. Si un mensaje protegido por CRCtiene un bit cero añadido, el polinomio recibido es Si el primero es divisible por el polinomio generador, también lo es el segundo. Usando un resto distinto de cero, agregar un bit cero dará como resultado un resto diferentey, por lo tanto, se detectará el bit adicional.
En la práctica, estas dos variaciones se utilizan invariablemente juntas. Cambian el CRC transmitido, por lo que deben implementarse tanto en el transmisor como en el receptor. Ambos extremos deben preconfigurar sus circuitos de división a todos unos, el transmisor debe agregar el patrón de inversión final al resultado, y el receptor debe esperar este patrón al verificar el CRC. Si el receptor verifica el CRC mediante división de longitud completa, el resto porque el CRC de una palabra clave completa que ya incluye un CRC ya no es cero. En cambio, es un patrón fijo distinto de cero, el CRC del patrón de inversión deunos.
Estas inversiones son extremadamente comunes, pero no se realizan universalmente, incluso en el caso de los polinomios CRC-32 o CRC-16-CCITT. Casi siempre se incluyen al enviar mensajes de longitud variable, pero a menudo se omiten al comunicar mensajes de longitud fija, ya que es menos probable que surja el problema de los bits cero añadidos.
Representaciones inversas y polinomios recíprocos
Representaciones polinómicas
Todos los polinomios generadores CRC prácticos tienen valores distintos de cero.ycoeficientes. Es muy común convertir esto en una cadena debits binarios omitiendo elcoeficiente.
Esta cadena de bits se puede convertir a un número binario utilizando una de dos convenciones:
- La representación msbit-first tiene el coeficiente decomo el bit más significativo y el coeficiente de(que siempre es 1) como el bit menos significativo.
- La representación lsbit-first tiene el coeficiente decomo el bit menos significativo y el coeficiente de(que siempre es 1) como el bit más significativo.
La forma msbit-first se suele denominar en la literatura como la representación normal , mientras que la forma lsbit-first se denomina representación invertida . Es esencial utilizar la forma correcta al implementar un CRC. Si el coeficiente deSi resulta ser cero, las formas se pueden distinguir de un vistazo viendo en qué extremo está activado el bit.
Por ejemplo, el polinomio CCITT de grado 16 en las formas descritas (los bits dentro de los corchetes se incluyen en la representación de la palabra; los bits fuera son bits 1 implícitos; las barras verticales designan los límites de los nibbles ):
16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 coeficiente 1 [0 0 0 1 |0 0 0 0 |0 0 1 0 |0 0 0 1] Normal [ 1 | 0 | 2 | 1 ] Bocados de 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 Inverso [ 8 | 4 | 0 | 8 ] Mordiscos de reversa 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] Recíproco [ 0 | 8 | 1 | 1 ] Bocados de reciprocidad 0x0811 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 Recíproco inverso 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 ] Bocadillos 0x8810
Todos los polinomios generadores CRC conocidos de gradotienen dos representaciones hexadecimales comunes. En ambos casos, el coeficiente dese omite y se entiende que es 1.
- La representación con el bit más significativo primero es un número hexadecimal conbits, cuyo bit menos significativo siempre es 1. El bit más significativo representa el coeficiente dey el bit menos significativo representa el coeficiente de.
- La representación lsbit-first es un número hexadecimal conbits, cuyo bit más significativo siempre es 1. El bit más significativo representa el coeficiente dey el bit menos significativo representa el coeficiente de.
La forma msbit-first se suele denominar en la literatura como la representación normal , mientras que la forma lsbit-first se denomina representación invertida . Es esencial utilizar la forma correcta al implementar un CRC. Si el coeficiente deSi resulta ser cero, las formas se pueden distinguir de un vistazo viendo en qué extremo está activado el bit.
Para complicar aún más el asunto, el artículo de P. Koopman y T. Chakravarty [ 1 ] [ 2 ] convierte los polinomios generadores de CRC a números hexadecimales de otra manera: msbit-first, pero incluyendo elcoeficiente y omitiendo elCoeficiente. Esta representación de Koopman tiene la ventaja de que el grado se puede determinar a partir de la forma hexadecimal y los coeficientes se leen fácilmente de izquierda a derecha. Sin embargo, no se utiliza en ningún otro lugar y no se recomienda debido al riesgo de confusión.
Polinomios recíprocos
Un polinomio recíproco se crea asignando ela través decoeficientes de un polinomio ala través decoeficientes de un nuevo polinomio. Es decir, el recíproco del gradopolinomioes.
La propiedad más interesante de los polinomios recíprocos, cuando se utilizan en CRC, es que tienen exactamente la misma capacidad de detección de errores que los polinomios de los que son recíprocos. El recíproco de un polinomio genera las mismas palabras clave , solo que con los bits invertidos ; es decir, si todos menos el primeroSe toman bits de una palabra clave bajo el polinomio original, se invierten y se utilizan como un nuevo mensaje, el CRC de ese mensaje bajo el polinomio recíproco es igual al inverso del primero.bits de la palabra clave original. Pero el polinomio recíproco no es el mismo que el polinomio original, y los CRC generados con él no son los mismos (incluso con inversión de bits del módulo) que los generados por el polinomio original.
fuerza de detección de errores
La capacidad de detección de errores de un CRC depende del grado de su polinomio generador y del polinomio generador específico utilizado. El "polinomio de error"es la diferencia simétrica entre la palabra clave del mensaje recibido y la palabra clave del mensaje correcto. Un algoritmo CRC no detectará un error si y solo si el polinomio de error es divisible por el polinomio CRC.
- Dado que un CRC se basa en la división, ningún polinomio puede detectar errores que consistan en una cadena de ceros antepuestos a los datos, o en la falta de ceros iniciales. Sin embargo, consulte la sección Variaciones .
- Todos los errores de un solo bit serán detectados por cualquier polinomio con al menos dos términos con coeficientes distintos de cero. El polinomio de error es, yes divisible solo por polinomiosdónde.
- Se detectarán todos los errores de dos bits separados por una distancia menor que el orden del polinomio primitivo que es un factor del polinomio generador . El polinomio de error en el caso de dos bits es. Como se indicó anteriormente, elEl término no será divisible por el polinomio CRC, lo que deja eltérmino. Por definición, el valor más pequeño dede tal manera que un polinomio dividees el orden o exponente del polinomio . Los polinomios de mayor orden se denominan polinomios primitivos , y para polinomios de gradocon coeficientes binarios, tienen orden.
- Todos los errores en un número impar de bits serán detectados por un polinomio que es un múltiplo deEsto es equivalente a que el polinomio tenga un número par de términos con coeficientes distintos de cero. Esta capacidad supone que el polinomio generador es el producto dey un polinomio primitivo de gradoya que todos los polinomios primitivos exceptotienen un número impar de coeficientes distintos de cero.
- Todos los errores de ráfaga de longitudserá detectado por cualquier polinomio de gradoo mayor que tenga un valor distinto de cerotérmino.
(Como nota al margen, nunca hay razón para usar un polinomio con cerotérmino. Recuerde que un CRC es el resto del polinomio del mensaje multiplicado pordividido por el polinomio CRC. Un polinomio con una raíz cuadrada.el término siempre tienecomo factor. Entonces, sies el polinomio CRC original y, entonces
Es decir, el CRC de cualquier mensaje con elEl polinomio es el mismo que el del mismo mensaje con elpolinomio con un cero añadido. Es simplemente un desperdicio de bits.
La combinación de estos factores significa que los buenos polinomios CRC suelen ser polinomios primitivos (que tienen la mejor detección de errores de 2 bits) o polinomios primitivos de grado, multiplicado por(que detecta todos los números impares de errores de bits y tiene la mitad de la capacidad de detección de errores de dos bits de un polinomio primitivo de grado). [ 1 ]
Filtros de bits
El análisis mediante filtros de bits [ 1 ] permite determinar de forma muy eficiente las propiedades de un polinomio generador dado. Los resultados son los siguientes:
- Todos los errores de ráfaga (excepto uno) con una longitud no mayor que el polinomio generador pueden ser detectados por cualquier polinomio generador.Esto incluye errores de 1 bit (ráfaga de longitud 1). La longitud máxima es, cuandoes el grado del polinomio generador (que a su vez tiene una longitud de). La excepción a este resultado es un patrón de bits idéntico al del polinomio generador.
- Todos los errores de bits impares son detectados por polinomios generadores con un número par de términos.
- Los errores de 2 bits en una distancia (múltiple) del filtro de bits más largo de paridad par a un polinomio generador no se detectan; todos los demás se detectan. Para grados hasta 32 hay un polinomio generador óptimo con ese grado y número par de términos; en este caso el período mencionado anteriormente es. ParaEsto significa que los bloques de 32.767 bits de longitud no contienen errores de 2 bits no detectados. Para un número impar de términos en el polinomio generador puede haber un período deSin embargo, estos polinomios generadores (con un número impar de términos) no detectan todos los errores impares, por lo que deben evitarse. En el enlace mencionado al inicio de esta sección se puede encontrar una lista de los generadores correspondientes con un número par de términos.
- Todos los errores de un solo bit dentro del período del filtro de bits mencionado anteriormente (para términos pares en el polinomio generador) pueden identificarse de forma única por su residuo. Por lo tanto, el método CRC puede utilizarse para corregir errores de un solo bit también (dentro de esos límites, por ejemplo, 32.767 bits con polinomios generadores óptimos de grado 16). Dado que todos los errores impares dejan un residuo impar, y todos los pares un residuo par, se pueden distinguir los errores de 1 bit y los de 2 bits. Sin embargo, al igual que otras técnicas SECDED , los CRC no siempre pueden distinguir entre errores de 1 bit y de 3 bits. Cuando se producen 3 o más errores de bit en un bloque, la corrección de errores de bit mediante CRC será errónea y producirá más errores.
Véase también
Referencias
- 1 2 3 Koopman, Philip (julio de 2002). "Códigos de redundancia cíclica de 32 bits para aplicaciones de Internet" (PDF) . Actas de la Conferencia Internacional sobre Sistemas y Redes Confiables . págs. 459–468 . CiteSeerX 10.1.1.11.8323 . doi : 10.1109/DSN.2002.1028931 . ISBN 978-0-7695-1597-7. S2CID 14775606 . Consultado el 14 de enero de 2011 . - Verificación de los resultados de Castagnoli mediante búsqueda exhaustiva y algunos nuevos polinomios de buena calidad.
- ↑ Koopman, Philip; Chakravarty, Tridib (junio de 2004). «Selección de polinomios de código de redundancia cíclica (CRC) para redes embebidas» (PDF) . Conferencia Internacional sobre Sistemas y Redes Confiables, 2004. págs. 145–154 . CiteSeerX 10.1.1.648.9080 . doi : 10.1109/DSN.2004.1311885 . ISBN 978-0-7695-2052-0. S2CID 793862 . Consultado el 14 de enero de 2011 . – Análisis de polinomios CRC cortos para aplicaciones embebidas
Enlaces externos
- Koopman, Phil. "Blog: Checksum and CRC Central" .— enumera los polinomios CRC que dan las mejores distancias de Hamming .
- Comprobaciones de redundancia cíclica
- Campos finitos