RC Clase4
RC Clase4
RC Clase4
CLASE 4; TEMA 3.
LA CAPA DE ENLACE DE DATOS
Contenido:
1. Diseño de la capa de enlace de datos.
2. Detección y corrección de errores.
3. Protocolos de enlaces de datos.
Objetivos:
Para cumplir con estas metas, la capa de enlace de datos toma los paquetes que obtiene de la capa
de red y los encapsula en tramas para transmitirlos. Cada trama contiene un encabezado, un campo
de carga útil (payload) para almacenar el paquete y un terminador, como se muestra en la figura 3-
1. El manejo de las tramas es la tarea más importante de la capa de enlace de datos. En las siguientes
secciones examinaremos en detalle todos los aspectos antes mencionados.
Entramado
Para proveer servicio a la capa de red, la capa de enlace de datos debe usar el servicio que la capa
física le proporciona. Lo que hace la capa física es aceptar un flujo de bits puros y tratar de entregarlo
al destino.
Es más difícil dividir el flujo de bits en tramas de lo que parece a simple vista. Un buen diseño debe
facilitar a un receptor el proceso de encontrar el inicio de las nuevas tramas al tiempo que utiliza
una pequeña parte del ancho de banda del canal.
1. Conteo de bytes.
Cuando el receptor ve cinco bits 1 de entrada consecutivos, seguidos de un bit 0, extrae (es decir,
borra) de manera automática el bit 0 de relleno. Así como el relleno de bytes es completamente
transparente para la capa de red en ambas computadoras, también lo es el relleno de bits. Si los
datos de usuario contienen el patrón bandera 01111110, éste se transmite como 011111010, pero
se almacena en la memoria del receptor como 01111110. En la figura 3-5 se muestra un ejemplo del
relleno de bits.
Control de errores
La subcapa de enlace lógico ofrece la posibilidad de realizar un control de errores de los datos
enviados, con el objeto de asegurar que los datos transmitidos y luego enviados a niveles superiores
(nivel de red) estén libres de errores:
* Sin alteraciones en las secuencias de los bits
* Sin duplicidades
Como ejemplo observamos la siguiente tabla donde se muestra algunos errores y sus posibles
soluciones, luego analizaremos con detalle algunos métodos de corrección:
Por supuesto existen ciertas premisas que deben tener en consideración a la hora de entrar en el
campo de errores:
Al añadir información redundante a una secuencia de datos, es posible (hasta cierto punto)
detectar errores en la recepción, y eventualmente corregirlos.
Todo código de detección y corrección de errores tiene limitaciones de acuerdo al tipo y
cantidad de errores detectables y/o corregibles.
Existe un compromiso técnico entre el volumen de la información redundante y la capacidad
de corrección.
Otras limitaciones pueden ser:
No siempre los errores son aislados (errores de ráfaga)
Puede haber errores en la misma información redundante.
* Códigos detectores:
+ De paridad simple
+ De redundancia cíclica (CRC)
* Control de errores:
Los protocolos de esta capa contienen reglas precisas que indican cuando es posible enviar un
frame. Con frecuencia el receptor autoriza implícita o explícitamente la transmisión. Algunos de los
protocolos implementados son:
Parada y Espera: es el protocolo más sencillo, el transmisor envía las tramas y no puede enviar una
siguiente hasta recibir una confirmación del receptor que le indique que ya recibió el paquete, de
esta manera el receptor controla el flujo reteniendo las confirmaciones. Este sistema es eficiente si
se envían pocas tramas de gran tamaño. Pero las tramas suelen ser pequeñas debido a: tamaño
limitado de la memoria del receptor, probabilidad de error mayor en tramas largas, y para evitar
retardos excesivos a los demás nodos si el medio es compartido.
Si el protocolo esperase una validación por cada trama enviada, no se enviarían más paquetes hasta
recibir el reconocimiento del último paquete enviado. El concepto de ventana deslizante hace que
exista una continua transmisión de información, mejorando el desempeño de la red. El transmisor
deberá guardar en un buffer todas aquellas tramas enviadas y no validadas (Un acknowledge
packets), por si necesitase retransmitirlas. Sólo puede borrarlas del buffer al recibir su validación
procedente del receptor, y deslizar así la ventana una unidad más. El número más pequeño de la
ventana deslizante corresponde al primer paquete de la secuencia que no ha sido validado.
El tamaño del buffer debe ser igual o mayor al tamaño de la ventana. El número máximo de tramas
enviadas sin validar es igual al ancho de la ventana. De esta forma el buffer podrá almacenar
temporalmente todas las tramas enviadas sin validar. A cada uno de los paquetes pertenecientes al
buffer (aquellos enviados y no validados), se les asigna un temporizador. El temporizador es el límite
de tiempo de espera para recibir la validación de un determinado paquete. Si el paquete se pierde
en el envío, el emisor nunca recibiría validación. El paquete nunca llegaría al receptor, este
continuaría a la espera de recibir el paquete perdido. De esta manera el temporizador expiraría,
tomando la decisión de reenviar la trama asignada al temporizador consumido.
Un error de bit altera el significado del dato. Son el tipo de error menos probable en una
transmisión de datos serie, puesto que el intervalo de bit es muy breve (1/frecuencia) el ruido
tiene que tener una duración muy breve. Sin embargo si puede ocurrir en una transmisión
paralela, en que un cable puede sufrir una perturbación y alterar un bit de cada byte.
Error de ráfaga.
El error de ráfaga significa que dos o más bits de la unidad de datos han cambiado. Los errores de
ráfaga no significan necesariamente que los errores se produzcan en bits consecutivos. La longitud
de la ráfaga se mide desde el primero hasta el último bit correcto, algunos bits intermedios
pueden estar bien.
Códigos de corrección de errores
Analizaremos cuatro códigos de corrección de errores:
1. Códigos de Hamming.
2. Códigos convolucionales binarios.
3. Códigos de Reed-Solomon.
4. Códigos de verificación de paridad de baja densidad.
Todos estos códigos agregan redundancia a la información que se envía. Una trama consiste en m
bits de datos (mensaje) y r bits redundantes (verificación). En un código de bloque, los r bits de
verificación se calculan únicamente en función de los m bits de datos con los que se asocian, como
si los m bits se buscaran en una gran tabla para encontrar sus correspondientes r bits de
verificación. En un código sistemático, los m bits de datos se envían directamente, junto con los
bits de verificación, en vez de que se codifiquen por sí mismos antes de enviarlos. En un código
lineal, los r bits de verificación se calculan como una función lineal de los m bits de datos. El OR
exclusivo (XOR) o la suma de módulo 2 es una elección popular. Esto significa que la codificación
se puede llevar a cabo con operaciones como multiplicaciones de matrices o circuitos lógicos
simples. Los códigos que analizaremos en esta sección son códigos de bloque lineales sistemáticos,
a menos que se indique otra cosa.
Sea la longitud total de un bloque n (es decir, n 5 m 1 r). Describiremos esto como un código (n,
m). Una unidad de n bits que contiene bits de datos y de verificación se conoce como palabra
codificada de n bits. La tasa de código, o simplemente tasa, es la fracción de la palabra codificada
que lleva información no redundante, o m/n. Las tasas que se utilizan en la práctica varían mucho.
Podrían ser 1/2 para un canal ruidoso, en cuyo caso la mitad de la información recibida es
redundante, o podrían estar cerca de 1 para un canal de alta calidad, en donde sólo se agrega un
pequeño número de bits de verificación a un mensaje extenso.
Para entender la manera en que pueden manejarse los errores, es necesario estudiar de cerca lo
que es en realidad un error. Dadas dos palabras codificadas cualesquiera que se pueden transmitir
o recibir, digamos 10001001 y 10110001, es posible determinar cuántos bits correspondientes
difieren. En este caso, difieren 3 bits. Para determinar la cantidad de bits diferentes, basta aplicar
un XOR a las dos palabras codificadas y contar la cantidad de bits 1 en el resultado, por ejemplo:
10001001
10110001
00111000
La cantidad de posiciones de bits en la que difieren dos palabras codificadas se llama distancia de
Hamming (Hamming, 1950). Su significado es que, si dos palabras codificadas están separadas una
distancia de Hamming d, se requerirán d errores de un solo bit para convertir una en la otra.
Dado el algoritmo para calcular los bits de verificación, es posible construir una lista completa de las
palabras codificadas válidas, y a partir de esta lista se pueden encontrar las dos palabras codificadas
con la menor distancia de Hamming. Esta distancia es la distancia de Hamming del código completo.
En la mayoría de las aplicaciones de transmisión de datos, todos los 2m mensajes de datos posibles
son válidos, pero debido a la manera en que se calculan los bits de verificación no se usan todas las
2n palabras codificadas posibles. De hecho, cuando hay r bits de verificación sólo la pequeña
fracción de 2m/2n o 1/2r de los posibles mensajes serán palabras codificadas válidas. Esta dispersión
con la que se incrusta el mensaje en el espacio de las palabras codificadas es la que permite que el
receptor detecte y corrija los errores.
Como ejemplo sencillo de un código de corrección de errores, considere un código con sólo cuatro
palabras codificadas válidas:
Las distancias de Hamming son valiosas para comprender los códigos de bloque, y los códigos de
Hamming se utilizan en la memoria de corrección de errores. Sin embargo, la mayoría de las redes
utilizan códigos más robustos.
Los códigos de Reed-Solomon se basan en el hecho de que todo polinomio de n grados se determina
en forma única mediante n 1 1 puntos. Por ejemplo, una línea con la forma ax 1 b se determina
mediante dos puntos. Los puntos extra en la misma línea son redundantes, lo cual es útil para la
corrección de errores. Imagine que tenemos dos puntos de datos que representan una línea y que
enviamos esos dos puntos de datos junto con dos puntos de verificación seleccionados sobre la
misma línea. Si uno de los puntos se recibe con error, de todas formas, podemos recuperar los
puntos de datos si ajustamos una línea a los puntos recibidos. Tres de los puntos estarán en la línea
y el otro punto (el del error) no. Al encontrar la línea hemos corregido el error.
El último código de corrección de errores que estudiaremos es el código LDPC (Verificación de
Paridad de Baja Densidad, del inglés Low-Density Parity Check). Los códigos LDPC son códigos de
bloques lineales inventados por Robert Gallagher en su tesis para doctorado (Gallagher, 1962). Al
igual que la mayoría de las tesis, estos códigos pronto fueron olvidados, y no fue sino hasta 1995
que se reinventaron gracias a los avances en el poder de las computadoras, pues ya era práctico
utilizarlos.
En un código LDPC, cada bit de salida se forma sólo a partir de una fracción de los bits de entrada.
Esto conduce a una representación matricial del código con una densidad baja de 1s, razón por la
cual tiene ese nombre. Las palabras codificadas recibidas se decodifican con un algoritmo de
aproximación que mejora de manera reiterativa con base en el mejor ajuste de los datos recibidos
con una palabra codificada válida. Esto corrige los errores.
Los códigos LDPC son prácticos para tamaños grandes de bloques y tienen excelentes habilidades
de corrección de errores que superan a las de muchos otros códigos (incluyendo los que vimos
antes) en la práctica. Por esta razón se están incluyendo rápidamente en los nuevos protocolos.
Forman parte del estándar para la difusión de video digital, la Ethernet de 10 Gbps, las redes de
líneas eléctricas y la versión más reciente de 802.11. Es muy probable que veamos más sobre estos
códigos en las futuras redes.
Códigos de detección de errores
Los códigos de corrección de errores se utilizan de manera amplia en los enlaces inalámbricos, que
son notoriamente más ruidosos y propensos a errores si se les compara con la fibra óptica. Sin los
códigos de corrección de errores sería difícil hacer pasar cualquier cosa. Sin embargo, a través de
la fibra óptica o del cable de cobre de alta calidad, la tasa de error es mucho más baja, por lo que
la detección de errores y la retransmisión por lo general son más eficientes para manejar un error
ocasional.
En esta sección examinaremos tres códigos de detección de errores distintos. Todos son códigos
de bloques sistemáticos lineales:
1. Paridad.
2. Sumas de verificación.
3. Pruebas de Redundancia Cíclica (CRC)
Para ver cómo pueden ser más eficientes que los códigos de corrección de errores, considere el
primer código de detección de errores en el que se adjunta un solo bit de paridad a los datos. El bit
de paridad se elige de manera que el número de bits 1 en la palabra codificada sea par (o impar).
Hacer esto es equivalente a calcular el bit de paridad (par) como la suma módulo 2 o el resultado de
un XOR en los bits de datos. Por ejemplo, cuando se envía la secuencia 1011010 en paridad par, se
agrega un bit al final para convertirla en 10110100. Con paridad impar, 1011010 se convierte en
10110101. Un código con un solo bit de paridad tiene una distancia de 2, ya que cualquier error de
un solo bit produce una palabra codificada con la paridad incorrecta. Esto significa que puede
detectar errores de un solo bit.
Considere un canal en el que los errores son aislados y la tasa de error es de 10-6 por bit. Ésta puede
parecer una tasa de error pequeña, pero a lo más es una tasa equitativa para un cable de cobre
extenso que desafía a la detección de errores. Los enlaces de LAN comunes proveen tasas de error
de bits de 10-10. Sea el tamaño de bloque 1000 bits. Para proporcionar corrección de errores en
bloques de 1000 bits, sabemos por la ecuación (3-1) que se requieren 10 bits de verificación. Así, un
megabit de datos requeriría 10000 bits de verificación. Para detectar un solo bloque con 1 bit de
error, basta con un bit de paridad por bloque. Por cada 1000 bloques se encontrará un bloque con
error y se tendrá que transmitir un bloque extra (1001 bits) para reparar ese error. La sobrecarga
total del método de detección de errores y retransmisión es de sólo 2001 bits por megabit de datos,
en comparación con los 10 000 bits en un código de Hamming.
El segundo tipo de código de detección de errores, la suma de verificación, está muy relacionado
con los grupos de bits de paridad. La palabra “suma de verificación” se utiliza con frecuencia para
indicar un grupo de bits de verificación asociados con un mensaje, sin importar cómo se calculen.
Un grupo de bits de paridad es un ejemplo de una suma de verificación. Sin embargo, hay otras
sumas de verificación más poderosas basadas en la suma acumulada de los bits de datos del
mensaje. Por lo general la suma de verificación se coloca al final del mensaje, como el complemento
de la función de suma. De esta forma, los errores se pueden detectar al sumar toda la palabra
codificada recibida, tanto los bits de datos como la suma de verificación. Si el resultado es cero, no
se ha detectado ningún error.
Un ejemplo es la suma de verificación de Internet de 16 bits que se utiliza en todos los paquetes de
Internet como parte del protocolo IP (Braden y colaboradores, 1988). Esta suma de verificación es
una suma de los bits del mensaje divididos en palabras de 16 bits. Como este método opera sobre
palabras en vez de bits, como en la paridad, los errores que no modifican la paridad de todas formas
pueden alterar la suma y ser detectados. Por ejemplo, si el bit de menor orden en dos palabras
distintas se voltea de 0 a 1, una verificación de paridad a lo largo de estos bits no podría detectar un
error. Sin embargo, se agregarán dos 1s a la suma de verificación de 16 bits para producir un
resultado distinto. Entonces se podrá detectar el error.
Hay una mejor opción: la suma de verificación de Fletcher (Fletcher, 1982). Ésta incluye un
componente posicional, en donde se suma el producto de los datos y su posición con la suma
acumulada. Este método ofrece una detección más poderosa de los cambios en la posición de los
datos.
Aunque los dos esquemas anteriores pueden ser adecuados algunas veces en capas
superiores, en la práctica se utiliza mucho un tercer tipo de código de detección de errores
más potente en la capa de enlace: el CRC (Comprobación de Redundancia Cíclica, del inglés
Cyclic Redundancy Check), también conocido como código polinomial. Los códigos
polinomiales se basan en el tratamiento de cadenas de bits como representaciones de
polinomios con coeficientes de 0 y 1 solamente. Una trama de k bits se considera como la
lista de coeficientes de un polinomio con k términos que van de x k-1a x0. Se dice que tal
polinomio es de grado k - 1. El bit de orden mayor (que se encuentra más a la izquierda) es
el coeficiente de x k-1, el siguiente bit es el coeficiente de x k-2 y así sucesivamente. Por
ejemplo, 110001 tiene 6 bits y, por lo tanto, representa un polinomio de seis términos con
coeficientes 1, 1, 0, 0, 0 y 1: 1x5 + 1x4 + 0x3 + 0x2 + 0x1 + 1x0.
La aritmética polinomial se hace mediante una operación módulo 2, de acuerdo con las
reglas de la teoría de campos algebraicos. No hay acarreos para la suma, ni préstamos para
la resta. Tanto la suma como la resta son idénticas a un OR exclusivo. Por ejemplo:
La división larga se lleva a cabo de la misma manera que en binario, excepto que la
resta es módulo 2, igual que antes. Se dice que un divisor “cabe” en un dividendo si éste
tiene tantos bits como el divisor. Cuando se emplea el método de código polinomial, el
emisor y el receptor deben acordar por adelantado un polinomio generador, G(x). Tanto los
bits de orden mayor y menor del generador deben ser 1. Para calcular el CRC para una trama
con m bits, correspondiente al polinomio M(x), la trama debe ser más larga que el polinomio
generador. La idea es incluir un CRC al final de la trama de tal manera que el polinomio
representado por la trama con suma de verificación sea divisible entre G(x). Cuando el
receptor recibe la trama con la suma de verificación, intenta dividirla entre G(x). Si hay un
residuo, ha ocurrido un error de transmisión.
Sin embargo, ésta es una solución para el peor de los casos. Requiere hardware dedicado y se
pueden desperdiciar recursos si el enlace se usa poco. Una solución más general para este dilema
es hacer que el receptor proporcione retroalimentación al emisor. Tras haber pasado un paquete a
su capa de red, el receptor regresa al emisor una pequeña trama ficticia que, de hecho, autoriza al
emisor para que transmita la siguiente trama. Los protocolos en los que el emisor envía una trama
y luego espera una confirmación de recepción antes de continuar se denominan de parada y espera.
Aunque el tráfico de datos en este ejemplo es simplex, y va sólo desde el emisor al receptor, las
tramas viajan en ambas direcciones. En consecuencia, el canal de comunicación entre las dos capas
de enlace de datos necesita tener capacidad de transferencia de información bidireccional. Sin
embargo, este protocolo implica una alternancia estricta de flujo: primero el emisor envía una
trama, después el receptor envía una trama, después el emisor envía otra trama, luego el receptor
envía otra, y así sucesivamente.
Aquí sería suficiente un canal físico semi-dúplex. Puesto que sólo es importante la llegada de la
trama al emisor y no su contenido, el receptor no necesita poner ninguna información específica en
la trama.
Para ver lo que puede resultar mal, recuerde que el objetivo de la capa de enlace de datos es
proporcionar una comunicación transparente y libre de errores entre los procesos de las capas de
red. La capa de red de la máquina A pasa una serie de paquetes a su capa de enlace de datos, la cual
debe asegurar que se entregue una serie de paquetes idénticos a la capa de red de la máquina B a
través de su capa de enlace de datos. En particular, la capa de red en B no tiene manera de saber si
el paquete se perdió o duplicó, por lo que la capa de enlace de datos debe garantizar que ninguna
combinación de errores de transmisión, por improbables que sean, pudiera causar la entrega de un
paquete duplicado a la capa de red.
Sin duda, lo que se necesita es alguna manera de que el receptor sea capaz de distinguir entre una
trama que está viendo por primera vez y una retransmisión. La forma evidente de lograr esto es
hacer que el emisor ponga un número de secuencia en el encabezado de cada trama que envía. A
continuación, el receptor puede verificar el número de secuencia de cada trama que llega para ver
si es una trama nueva o un duplicado que debe descartarse.
Como el protocolo debe ser correcto y es probable que el campo de número de secuencia en el
encabezado sea pequeño como para poder usar el enlace en forma eficiente, ¿Cuál es la cantidad
mínima de bits necesarios para el número de secuencia?
El punto importante es que debe transportar números de secuencia que sean lo bastante grandes
como para que el protocolo funcione de manera correcta, o de lo contrario no se podrá considerar
un verdadero protocolo.
Basta con un número de secuencia de 1 bit (0 o 1). En cada instante, el receptor espera un número
de secuencia en particular. Cuando llega una trama que contiene el número de secuencia correcto,
se acepta y se pasa a la capa de red, para después confirmar su recepción.