RC Clase4

Descargar como pdf o txt
Descargar como pdf o txt
Está en la página 1de 16

REDES Y COMUNICACIONES

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:

1. Caracterizar los principios fundamentales de los protocolos de punto a punto. Estas


ideas son permanentes y no han cambiado durante décadas.
2. Definir los protocolos que no han sufrido cambios durante los últimos tiempos.
Elaborado por:
Ing. Alvin López.
DISEÑO DE LA CAPA DE ENLACE DE DATOS
La capa de enlace de datos utiliza los servicios de la capa física para enviar y recibir bits a través de
los canales de comunicación. Tiene varias funciones específicas, entre las que se incluyen:

1. Proporcionar a la capa de red una interfaz de servicio bien definida.


2. Manejar los errores de transmisión.
3. Tramado de secuencias de bytes como segmentos autónomos.
4. Regular el flujo de datos para que los emisores rápidos no saturen a los receptores lentos.

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.

Si el canal es ruidoso, como en la mayoría de los enlaces inalámbricos y en algunos alámbricos, la


capa física agregará cierta redundancia a sus señales para reducir la tasa de error de bits a un nivel
tolerable. Sin embargo, no se garantiza que el flujo de bits recibido por la capa de enlace de datos
esté libre de errores. Algunos bits pueden tener distintos valores y la cantidad de bits recibidos
puede ser menor, igual o mayor que la cantidad de bits transmitidos. Es responsabilidad de la capa
de enlace de datos detectar y, de ser necesario, corregir los errores.

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.

2. Bytes bandera con relleno de bytes.

3. Bits bandera con relleno de bits.

4. Violaciones de codificación de la capa física

El primer método de entramado se vale de un campo en el encabezado para especificar el número


de bytes en la trama. Cuando la capa de enlace de datos del destino ve el conteo de bytes, sabe
cuántos bytes siguen y, por lo tanto, dónde concluye la trama. Esta técnica se muestra en la figura
3-3(a) para cuatro tramas pequeñas de ejemplo con 5, 5, 8 y 8 bytes de longitud respectivamente.

El segundo método de entramado evita el problema de volver a sincronizar nuevamente después


de un error al hacer que cada trama inicie y termine con bytes especiales. Con frecuencia se utiliza
el mismo byte, denominado byte bandera, como delimitador inicial y final. Este byte se muestra en
la figura 3-4(a) como FLAG. Dos bytes bandera consecutivos señalan el final de una trama y el inicio
de la siguiente. De esta forma, si el receptor pierde alguna vez la sincronización, todo lo que tiene
que hacer es buscar dos bytes bandera para encontrar el fin de la trama actual y el inicio de la
siguiente.
El tercer método de delimitar el flujo de bits resuelve una desventaja del relleno de bytes: que está
obligado a usar bytes de 8 bits. También se puede realizar el entramado a nivel de bit, de modo que
las tramas puedan contener un número arbitrario de bits compuesto por unidades de cualquier
tamaño. Esto se desarrolló para el protocolo HDLC (Control de Enlace de Datos de Alto Nivel, del
inglés High-level Data Link Control), que alguna vez fue muy popular.

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

* En el orden correcto de las tramas

* 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:

Problema Efecto Observado Posible solución


Error de bit, trama No se sabe si la recepción Código de Redundancia
incompleta fue correcta Cíclica (CRC)
La trama se recibe mal La trama no sirve Solicitar re-envío
(ACK,NACK)
La trama no se recibe Espera indefinida Temporizadores
La trama se recibe tras Duplicidad de la trama Numerar tramas y
haber enviado un NACK recomponer destino

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.

Los métodos de control de errores pueden dividirse en dos etapas:

* Códigos detectores:

 + De paridad simple
 + De redundancia cíclica (CRC)

* Control de errores:

 + Códigos correctores: FEC (Forward Error Correction) Distancia Hamming


 + Retransmisión de tramas: ARQ (Automatic Repeat Request)
Control de Flujo
Es muy posible que el transmisor genere tramas a mayor velocidad que las puede procesar el
receptor, si no se controla se corre el riesgo de saturar el receptor. Por lo que es necesario entonces
generar un mecanismo que sea capaz de frenar al transmisor, el cual está basado en una
realimentación al transmisor sobre el estado del receptor, de manera que el transmisor puede
enterarse si el receptor es capaz de mantener el ritmo

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.

Ventana deslizante: es un protocolo con comunicación full dúplex (A es el transmisor y B es el


receptor), en este protocolo A puede enviar n tramas sin recibir confirmación y B puede aceptar y
almacenar n tramas, las cuales están numeradas para identificar las confirmaciones, de esta manera
B confirma las tramas enviando el número de tramas que espera recibir. Y a la vez informa que está
listo para recibir las n siguientes. Por ejemplo, en una ventana deslizante de tamaño 8, el emisor
puede transmitir hasta 8 paquetes sin recibir validación de ninguno de ellos. Entonces esperará una
confirmación de recepción procedente del receptor sin enviar ningún paquete más. Una vez el
emisor reciba una validación del primer paquete que envió, perteneciente al número 1 de 8 de la
ventana deslizante, la ventana se deslizará abarcando 8 posiciones (su ancho de ventana definido),
pero en este caso desde la 2 hasta la 9 y enviará la trama número 9 continuando a la espera de
recibir más confirmaciones para poder seguir deslizándose y enviando las tramas siguientes.

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.

DETECCIÓN Y CORRECCIÓN DE ERRORES


Error de bit

Únicamente un bit de una unidad de datos determinada cambia de 1 a 0 o viceversa.

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.

Las propiedades de detección y corrección de errores de un código de bloque dependen de su


distancia de Hamming. Para detectar d errores de manera confiable se necesita un código con
distancia d 1 1, pues con tal código no hay manera de que d errores de un bit puedan cambiar una
palabra codificada válida a otra. Cuando el receptor ve una palabra codificada inválida, sabe que ha
ocurrido un error de transmisión.
De manera similar, para corregir d errores se necesita un código de distancia 2d 1 1, pues así las
palabras codificadas válidas están tan separadas que, aun con d cambios, la palabra codificada
original sigue estando más cercana que cualquier otra. Esto significa que la palabra codificada
original se puede determinar en forma única con base en la suposición de que es menos probable
un mayor número de 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:

0000000000, 0000011111, 1111100000 y 1111111111

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.

En el código convolucional es el único que analizaremos que no es código de bloque. En un código


convolucional, un codificador procesa una secuencia de bits de entrada y genera una secuencia de
bits de salida. No hay un tamaño de mensaje natural, o límite de codificación, como en un código
de bloque. La salida depende de los bits de entrada actual y previa.
Es decir, el codificador tiene memoria. El número de bits previos de los que depende la salida se
denomina longitud de restricción del código. Los códigos convolucionales se especifican en términos
de su tasa de transmisión y su longitud de restricción.
Los códigos convolucionales se utilizan mucho en las redes implementadas; por ejemplo, como
parte del sistema de telefonía móvil GSM, en las comunicaciones de satélite y en 802.11. Como
ejemplo, en la figura 3-7 se muestra un código convolucional popular. Este código se conoce como
código convolucional NASA de r 5 1/2 y k 5 7, ya que se utilizó por primera vez en las misiones
espaciales del Voyager a partir de 1977. Desde entonces se ha reutilizado libremente, por ejemplo,
como parte de las redes 802.11.
En la figura 3-7, cada bit de entrada del lado izquierdo produce dos bits de salida del lado derecho,
los cuales son las sumas XOR de la entrada y el estado interno. Ya que se trata con bits y se realizan
operaciones lineales, es un código convolucional binario lineal. Puesto que 1 bit de entrada produce
2 bits de salida, la tasa de código es de 1/2. No es sistemático, ya que ninguno de los bits de salida
es simplemente el bit de entrada.
El estado interno se mantiene en seis registros de memoria. Cada vez que se introduce otro bit, los
valores de los registros se desplazan a la derecha. Por ejemplo, si se introduce 111 como entrada y
el estado inicial está compuesto sólo de ceros, entonces el estado interno (que se escribe de
izquierda a derecha) se convertirá en 100000, 110000 y 111000 después de haber introducido el
primer, segundo y tercer bits, respectivamente. Los bits de salida serán 11, seguidos de 10 y después
de 01. Se requieren siete desplazamientos para vaciar una entrada por completo, de modo que no
afecte la salida. Por lo tanto, la longitud de restricción de este código es k 5=7.

El tercer tipo de código de corrección de errores que describiremos es el código de Reed-Solomon.


Al igual que los códigos de Hamming, los códigos de Reed-Solomon son códigos de bloques lineales
y con frecuencia también son sistemáticos. A diferencia de los códigos de Hamming, que operan
sobre bits individuales, los códigos de Reed-Solomon operan sobre símbolos de m bits.
Naturalmente las matemáticas son más complejas, por lo que describiremos su operación mediante
una analogía.

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:

10011011 00110011 11110000 01010101

+ 11001010 + 11001101 - 10100110 - 10101111


________ ________ ________ ________
01010001 11111110 01010110 11111010

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.

PROTOCOLOS ELEMENTALES DE ENLACE DE DATOS


Comenzaremos por estudiar tres protocolos de complejidad creciente. el proceso de la capa física y
una parte del proceso de la capa de enlace de datos se ejecutan en hardware dedicado, conocido
como NIC (Tarjeta de Interfaz de Red, del inglés Network Interface Card). El resto del proceso de la
capa de enlace y el proceso de la capa de red se ejecutan en la CPU principal como parte del sistema
operativo, en donde el software para el proceso de la capa de enlace a menudo toma la forma de
un controlador de dispositivo. Sin embargo, también puede haber otras implementaciones (por
ejemplo, tres procesos descargados a un dispositivo de hardware dedicado, conocido como
acelerador de red, o tres procesos ejecutándose en la CPU principal en un radio definido por
software). En realidad, la implementación preferida cambia de una década a otra con las
concesiones tecnológicas. En cualquier caso, el hecho de tratar las tres capas como procesos
independientes hace más nítido el análisis en el terreno conceptual y también sirve para enfatizar
la independencia de las capas.
Un protocolo simplex utópico.
Como ejemplo inicial se considera un protocolo que es lo más sencillo posible, por la posibilidad de
que algo salga mal. Los datos son transmitidos en una sola dirección; las capas de red tanto del
emisor como del receptor siempre están listas. Podemos ignorar el tiempo de procesamiento. Hay
un espacio infinito de búfer disponible. Y lo mejor de todo, el canal de comunicación entre las capas
de enlace de datos nunca daña ni pierde las tramas. Este protocolo completamente irreal, al que
apodaremos “utopía”.

El protocolo consiste en dos procedimientos diferentes, un emisor y un receptor. El emisor se


ejecuta en la capa de enlace de datos de la máquina de origen y el receptor se ejecuta en la capa de
enlace de datos de la máquina de destino. El emisor está en un ciclo while infinito que sólo envía
datos a la línea tan rápido como puede. El cuerpo del ciclo consiste en tres acciones: obtener un
paquete de la (siempre dispuesta) capa de red, construir una trama de salida usando la variable s y
enviar la trama a su destino. Este protocolo sólo utiliza el campo info de la trama, pues los demás
campos tienen que ver con el control de errores y de flujo, y aquí no hay restricciones de este tipo.
El receptor también es sencillo. Al principio espera que algo ocurra, siendo la única posibilidad la
llegada de una trama sin daños. En algún momento llega la trama, el procedimiento wait_for_event
regresa y event contiene el valor frame_arrival (que de todos modos se ignora). La llamada a
from_physical_layer elimina la trama recién llegada del búfer de hardware y la coloca en la variable
r, en donde el código receptor pueda obtenerla. Por último, la parte de los datos se pasa a la capa
de red y la capa de enlace de datos se retira para esperar la siguiente trama, para lo cual se suspende
efectivamente hasta que ésta llega. El protocolo utópico es irreal, ya que no maneja el control de
flujo ni la corrección de errores. Su procesamiento se asemeja al de un servicio sin conexión ni
confirmación de recepción que depende de las capas más altas para resolver estos problemas, aun
cuando un servicio sin conexión ni confirmación de recepción realizaría cierta detección de errores.

Protocolo simplex de parada y espera para un canal libre de errores


Ahora debemos lidiar con el problema principal de evitar que el emisor sature al receptor enviando
tramas a una mayor velocidad de la que este último puede procesarlas. Esta situación puede ocurrir
con facilidad en la práctica, por lo que es de extrema importancia evitarla. Una solución es construir
un receptor lo suficientemente poderoso como para procesar un flujo continuo de tramas, una tras
otra sin interrupció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.

Protocolo simplex de parada y espera para un canal ruidoso


Ahora consideremos la situación normal de un canal de comunicación que comete errores. Las
tramas pueden llegar dañadas o se pueden perder por completo. Sin embargo, suponemos que si
una trama se daña en tránsito, el hardware del receptor detectará esto cuando calcule la suma de
verificación. Si la trama está dañada de tal manera que pese a ello la suma de verificación sea
correcta (una ocurrencia muy poco probable), este protocolo (y todos los demás) puede fallar (es
decir, tal vez entregue un paquete incorrecto a la capa de red).

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.

También podría gustarte