Comprobación de redundancia cíclica (CRC).
September 7, 2016
La Comprobación de redundancia cíclica(CRC), es una técnica de detección de errores usada frecuentemente en redes digitales y en dispositivos de almacenamiento para detectar cambios accidentales en los datos. Los bloques de datos ingresados en estos sistemas contiene un valor de verificación adjunto, basado en el residuo de una división de polinomios, por eso también se conoce con el nombre de códigos polinómicos.
¿Como funciona?
Consideremos una secuencia de datos de n bits que llamaremos D, que el nodo Emisor desea enviar al nodo Receptor. El Emisor y el receptor tienen que acordar primero un patrón de r + 1 bits conocido como Generador que denominaremos con la letra G.
Para un determinada secuencia de datos, D, el emisor seleccionará r bits adicionales, R, y se los añadirá a D, de modo que el patrón de d + rbits resultante (interpretado como un número binario) sea exactamente divisible por G (es decir, no tenga ningún resto) utilizando aritmética módulo 2. El proceso de comprobación de errores con los códigos CRC es, por tanto, muy simple: el receptor divide los d + rbits recibidos entre G. Si el resto es distinto de cero, el receptor sabrá que se ha producido error; en caso contrario, se aceptarán los datos como correctos.
Tal vez parezca un poco confuso pero trataremos de ilustrar mejor el metodo con un ejemplo, Asi:
Ejemplo
Nos piden que Consideremos una secuencia de datos D = 111100101, que un nodo Emisor desea enviar al nodo Receptor y cuyo Generador es G = 10101. Calcule el CRC y compruebe en el lado del receptor la secuencia de datos completa
Procedimiento para calcular CRC
1- Tomamos la secuencia de datos D y le agregamos tantos ‘ceros’ nos diga el grado del polinomio, esto equivale al tamaño de nuestro CRC y que reemplazaremos posteriormente para que sea enviado al receptor. Para nuestro ejemplo el grado del polinomio generador es 5 por lo tanto tendremos lo siguiente que denotaremos como D’ = D + 00000, entonces:
2- Hacemos los cálculos de los códigos CRC, que se realizan en aritmética módulo 2, es decir sin ningun tipo de acarreo ni en las sumas ni en las restas. Esto quiere decir que la suma y la resta son idénticas, y que ambas son equivalentes a la operación OR-exclusiva (XOR) bit a bit de los operandos, por ejemplo:
Regresando a nuestro ejemplo lo que haremos es una division usando la operacion OR-Exclusiva de nuestro D’ con G para obtener el CRC asi:
El resto o residuo de nuestra operación es 0001010 y este es el dato que nos interesa tomaremos los 5 ultimos bits de la operación ya que 5 es el grado de nuestro polinomio generador y este sera nuestro CRC asi para nuestro ejercicio:
.
3- Con nuestro CRC calculado entonces enviaremos el mensaje M resultante a nuestro Receptor de esta forma D+CRC asi:
4- Como nuestro Receptor había negociado el patron conocido como Generador y lo tiene a disposición debe realizar la división OR-Exclusiva de M y G y si es exactamente divisible por G ( Es decir no tiene ningún resto) entonces el Receptor aceptará los datos como correctos; en caso contrario ( el resto es ditinto de cero) el Receptor sabrá que se ha producido un error. Para nuestro ejemplo entonces:
5- Finalmente el resto o residuo de nuestra operación es 0000000 esto quiere decir que M Es exactamente divisible por G Entonces el Receptor puede concluir que los datos no contienen ningún error y concluye la comprobación de redundancia cíclica.
Implementación CRC en Python
La comprobación de redundancia cíclica se realiza en el hardware de las tarjetas de red entre dos nodos.
Con el fin de entender el funcionamiento de dicha técnica realizaremos una analogía de esta pero en la capa de aplicación. De tal forma que cada nodo estará representado por un proceso, y el enlace estará representado por un socket de la capa de transporte.
Utilizaremos el lenguaje Python por su sintaxis sencilla y cómoda para esta demostración, además es fácil el manejo de sockets.
Cliente (client.py):
Servidor (server.py):
Utilities.py
Ejecución
Cliente (client.py)
Servidor (server.py)
Check this:
Autores: Albeiro Cuadrado y Sebastián Arteaga.
El codigo de la implementación puede ser encontrado Aqui