Bienvenidos

Welcome

comenten

comenten

martes, 27 de abril de 2010

DETECCIÓN Y CONTROL DE ERRORES


DETECCIÓN Y CONTROL DE ERRORES
Los errores en la transmisión pueden ser debidos a tres causas distintas:
• Características materiales de la línea.
• Equipos de transmisión.
• Causas externas al circuito de datos.
Para cuantificar el efecto de los errores sobre la transmisión se utiliza la tasa de error, o BER (Bit Error Rate), que es el cociente entre el número de bits recibidos erróneamente y el número total de bits transmitidos. Para redes WAN se considera como BER aceptable uno en torno a 106 y para redes LAN

Otra forma de cuantificar los errores es mediante la tasa de error residual, que es el cociente entre el número de bits erróneos no detectados y el número de bits erróneos transmitidos.
Códigos de detección de errores
Para detectar el mayor número de errores se utilizan los códigos de control de errores. Estos códigos se dividen en autocorrectores y detectores.
Códigos autocorrectores
Los códigos autocorrectores son aquellos que detectan y corrigen los errores producidos en una posición concreta. Esta tarea la desempeña el equipo receptor.
Códigos detectores
En los códigos puramente detectores el receptor detecta los errores, pero no es capaz de corregirlos, lo que hace es solicita el reenvío de la información. Las técnicas de solicitud de reenvío se denominan ARQ.
Modalidades de ARQ
Las distintas modalidades de ARQ son las siguientes:
ARQ con envío y espera. Es el método más lento. El emisor envía un paquete, si hay un error el receptor envía una señal de no reconocido, NAK, con lo que el emisor reenvía el paquete. Si no hay error el receptor envía señal de reconocido, ACK, con lo que el emisor pasa a enviar el siguiente paquete.
ARQ de envío continuo no selectivo. Se emplea en conexiones full-duplex. El emisor va enviando bloques de paquetes sin espera entre ellos, a la vez que los almacena en búferes de memoria. Si el receptor advierte un error en un bloque, le envía al emisor una señal NAK, con lo que el emisor reenvía todo el bloque. Cuando los búferes de memoria están saturados hay un tiempo de espera hasta que el receptor comunica que se pueden vaciar y se puede comenzar a enviar el siguiente bloque de paquetes.
ARQ de envío continuo selectivo. Es una mejora del modo anterior, en la que además de línea full-duplex se necesita una identificación de cada paquete del bloque enviado. Cuando se produce un NAK se reenvía sólo el paquete que ha llegado mal, y no todo el bloque. Además, al llegar un NAK se vacían los búferes anteriores a ese paquete, que ya se sabe que no son defectuosos, con lo que se reducen los tiempos de parada. El inconveniente de este método es que la información a enviar es mayor.
2 Códigos de control de errores
Los códigos de control de errores son siempre redundantes. Un código redundante es el que utiliza más bits de los estrictamente necesarios para la transmisión de los datos; gracias a esta característica se pueden detectar y corregir los errores.
Se dividen en sistemáticos y no sistemáticos, según la forma de añadir los bits redundantes.

Códigos no sistemáticos
En los códigos no sistemáticos los bits redundantes se añaden implícitamente en el código. Se les llama códigos M entre N, como por ejemplo el 3 entre 8, que para emitir un carácter de 8 bits añade otros 3 de control.
Los bits de control siempre se ponen a 1 flanqueando el carácter.
Códigos sistemáticos
En los códigos sistemáticos para determinar el valor de los bits redundantes se aplica un algoritmo a la información a transmitir.
Ejemplos de códigos sistemáticos
Código de paridad horizontal Con este código se añade un único bit redundante para hacer que el número total de bits sea par o impar.
Código de paridad vertical Se aplica a más de una palabra de información. Es necesario saber cuántas palabras forman el bloque al que se aplica el algoritmo. A cada palabra se le aplica un código de paridad horizontal y al bloque la paridad vertical, como se ve en el siguiente ejemplo, en el que se ha aplicado paridad par.
01001 0
00110 0
00111 1
01000 1
Con este código si hay un error no sólo se detecta sino que se corrige, ya que se puede saber en qué bit se ha producido el error.
Código de Hamming Con el código de Hamming se añade un número de bits redundantes que depende del número de bits que se usan para representar una palabra de información, de modo que se cumpla la desigualdad

2P  P+N+1,

donde N es el número de bits por palabra y P el número de bits redundantes. Los bits redundantes se añaden intercalándose con los bits que forman la palabra en las posiciones 1, 2, 4, 8, ..., empezando por los bits menos significativos.
Este código es difícil de implementar por circuitería pero sencillo a nivel de software. Sólo es capaz de detectar y corregir un bit erróneo.
Códigos lineales En este caso se considera que los bits de la palabra forman un vector. A partir de este vector y de un polinomio generador establecido se obtiene otro vector final, según la fórmula

c = i×G,

siendo i el vector inicial, G el polinomio generador y c el vector resultante.
Estos códigos facilitan la implementación en hardware, por lo que son más utilizados que los códigos anteriores.
Dentro de los códigos lineales los más utilizados son los CRC, códigos de redundancia cíclica. En éstos los bits del carácter a enviar son los coeficientes de un polinomio. Utilizan la siguiente fórmula:

P(x) = C(x)•C(x)+R(x),
(1)
con R(x) = resto(C(x), G(x)). Lo que se envía por la línea es la información C(x) y el resto R(x), de forma que el destino puede detectar errores mediante la fórmula (1).
Con estos códigos se pueden detectar errores de uno o varios bits en bloques grandes






Paridad simple (paridad horizontal)
Consiste en añadir un bit de más a la cadena que queremos enviar, y que nos indicará si el número de unos (bits puestos a 1) es par o es impar. Si es par incluiremos este bit con el valor = 0, y si no es así, lo incluiremos con valor = 1.
Ejemplo de generación de un bit de paridad simple:

Queremos enviar la cadena “1110100”:
1º Contamos la cantidad de unos que hay: 4 unos
2º El número de unos es par por tanto añadimos un bit con valor = 0
3º La cadena enviada es 11101000
El receptor ahora, repite la operación de contar la cantidad de “unos” que hay (menos el último bit) y si coincide, es que no ha habido error.
Problemas de este método:
Hay una alta probabilidad de que se cuelen casos en los que ha habido error, y que el error no sea detectado, como ocurre si se cambian dos números en la transmisión en vez de uno.
Paridad cruzada (paridad horizontal-vertical)
Para mejorar un poco el método anterior, se realiza una paridad que afecte tanto a los bits de cada cadena o palabra como a un conjunto de todos ellos. Siempre se utilizan cadenas relativamente cortas para evitar que se cuelen muchos errores.
Para ver más claro este método, se suelen agrupar los bits en una matriz de N filas por K columnas, luego se realizan todas las paridades horizontales por el método anterior, y por último, se hace las misma operación de calcular el número de unos, pero ahora de cada columna.
La probabilidad de encontrar un solo error es la misma, pero en cambio, la probabilidad de encontrar un número par errores ya no es cero, como en el caso anterior. Aun así, existen todavía una gran cantidad de errores no detectables
Un ejemplo de paridad cruzada (o de código geométrico)

Tenemos este código para transmitir: 1100101111010110010111010110
Agrupamos el código en cada una de las palabras, formando una matriz de N x K:

1100101
1110101
1001011
1010110
Añadimos los bits de paridad horizontal:

1100101 0
1110101 1
1001011 0
1010110 0

4º Añadimos los bits de paridad vertical:

1100101 0
1110101 1
1001011 0
1010110 0

0001101 1

Una vez creada la matriz, podemos enviar ésta por filas, o por columnas. Enviando las palabras por columnas aumentamos la posibilidad de corregir una palabra que haya sufrido un error de ráfaga (errores que afectan a varios bits consecutivos, debidos a causas generalmente electrónicas, como chispazos, y que harían que se perdiera toda una palabra completa).
Códigos de redundancia cíclica también llamados CRC
Intentando mejorar los códigos que sólo controlan la paridad de bit, aparecen los códigos cíclicos. Estos códigos utilizan la aritmética modular para detectar una mayor cantidad de errores, se usan operaciones en módulo 2 y las sumas y restas se realizan sin acarreo (convirtiéndose en operaciones de tipo O-Exclusivo o XOR). Además, para facilitar los cálculos se trabaja, aunque sólo teóricamente, con polinomios.
La finalidad de este método es crear una parte de redundancia la cual se añade al final del código a transmitir (como en los métodos de paridad) que siendo la más pequeña posible, detecte el mayor número de errores que sea posible.
Pero además de esto, debe ser un método sistemático, es decir, que con un mismo código a transmitir (y un mismo polinomio generador) se genere siempre el mismo código final.
El polinomio generador: es un polinomio elegido previamente y que tiene como propiedad minimizar la redundancia. Suele tener una longitud de 16 bits, para mensajes de 128 bytes, lo que indica que la eficiencia es buena. Ya que sólo incrementa la longitud en un aproximado 1,6%:
(16bits / (128bytes * 8bitsporbyte)) * 100 = 1,5625
Un ejemplo de polinomio generador usado normalmente en las redes WAN es: g(x) = x16 + x12 + x5 + 1
Los cálculos que realiza el equipo transmisor para calcular su CRC son:
1. Añade tantos ceros por la derecha al mensaje original como el grado del polinomio generador
2. Divide el mensaje con los ceros incluidos entre el polinomio generador
3. El resto que se obtiene de la división se suma al mensaje con los ceros incluidos
4. Se envía el resultado obtenido
Estas operaciones generalmente son incorporadas en el hardware para que pueda ser calculado con mayor rapidez, pero en la teoría se utilizan los polinomios para facilitar los cálculos.
Ejemplo de obtención del CRC:

Datos:
Mensaje codificado en binario: 1101001
Polinomio generador: x4 + x + 1

Operaciones:

Obtener el polinomio equivalente al mensaje: x6 + x5 + x3 + 1

Multiplicar el mensaje por x4 (añadir 4 ceros por la derecha): x10 + x9 + x7 + x4

Dividir en binario el mensaje por el polinomio generador y sacar el resto: x2 + 1

Restar el mensaje con el resto (en módulo 2 también): x10 + x9 + x7 + x4 + x2 + 1

Transmitir el mensaje
El equipo receptor debe comprobar el código CRC para detectar si se han producido o no errores.
Ejemplo de los cálculos del receptor:

Mediante el protocolo correspondiente acuerdan el polinomio generador Divide el código recibido entre el polinomio generador
Comprueba el resto de dicha operación

Si el resto es cero, no se han producido errores
Procesar el mensaje

Si el resto es distinto de cero, significa que se han producido errores
Reenviar el mensaje

Intentar corregir los errores mediante los códigos correctores
En resumen, este método requiere de un polinomio generador que, elegido correctamente, puede llegar a detectar gran cantidad de errores:
Errores simples: todos
Errores dobles: todos
Errores en las posiciones impares de los bits: todos
Errores en ráfagas con una longitud menor que el grado del polinomio generador: todos
Otras ráfagas: un porcentaje elevado y cercano al 100%
Suma de comprobación
Es un método sencillo pero eficiente sólo con cadenas de palabras de una longitud pequeña, es por esto que se suele utilizar en cabeceras de tramas importantes u otras cadenas importantes y en combinación con otros métodos.
Funcionalidad: consiste en agrupar el mensaje a transmitir en cadenas de una longitud determinada L no muy grande, de por ejemplo 16 bits. Considerando a cada cadena como un número entero numerado según el sistema de numeración 2L − 1. A continuación se suma el valor de todas las palabras en las que se divide el mensaje, y se añade el resultado al mensaje a transmitir, pero cambiado de signo.
Con esto, el receptor lo único que tiene que hacer es sumar todas las cadenas, y si el resultado es 0 no hay errores.
Ejemplo:

Mensaje 101001110101

Acordar la longitud de cada cadena: Acordar el sistema de numeración: 23 − 1 = 7

Dividir el mensaje: 101 001 110 101

Corresponder a cada cadena con un entero: 5 1 6 5

Sumar todos los valores y añadir el número cambiado de signo: -17

6º Enviar 5 1 6 5 -17 codificado en binario
El receptor:

1º Suma todos los valores si = 0 procesa el mensaje sino se ha producido un error.
Este método al ser más sencillo es óptimo para ser implementado en software ya que se puede alcanzar velocidades de cálculo similares a la implementación en hardware
Distancia de Hamming basada en comprobación



Hipercubo binario de dimensión cuatro.
Si queremos detectar d bit erróneos en una palabra de n bits, podemos añadir a cada palabra de n bits d+1 bits predeterminados al final, de forma que quede una palabra de n+d+1 bits con una distancia mínima de Hamming de d+1. De esta manera, si uno recibe una palabra de n+d+1 bits que no encaja con ninguna palabra del código (con una distancia de Hamming x <= d+1 la palabra no pertenece al código) detecta correctamente si es una palabra errónea. Aún más, d o menos errores nunca se convertirán en una palabra válida debido a que la distancia de Hamming entre cada palabra válida es de al menos d+1, y tales errores conducen solamente a las palabras inválidas que se detectan correctamente. Dado un conjunto de m*n bits, podemos detectar x <= d bits errores correctamente usando el mismo método en todas las palabras de n bits. De hecho, podemos detectar un máximo de m*d errores si todas las palabras de n bits son transmitidas con un máximo de d errores.
Ejemplo
Palabras a enviar:
1. 000001
2. 000001
3. 000010
Codificadas con distancia mínima de Hamming = 2:
000001 0000
000001 0011
000010 1100
Si las palabras recibidas tienen una distancia de Hamming < 2, son palabras incorrectas.

No hay comentarios:

Publicar un comentario