Sesión de Laboratorio 7: Simulación CSMA/CD

 

.

Objetivo del laboratorio: Conicimiento detallado del protocolo CSMA/CD de Ethernet.

Duración: 2 horas

Breve descripción: El alumno completara la programación del protocolo CSMA/CD a partir de un programa que se encuentra casi acabado..
 
 .

Documentación para el alumno

.

1. Objetivo de la práctica

Se trata de proporcionar al alumno una herramienta para el estudio del protocolo CSMA/CD. Mediante la implementación de ese protocolo sobre una red simulada, se pretende que el alumno alcance una perfecta comprensión de los aspectos fundamentales del mismo.

2. Labor del alumno

Ha de programar una función C que implemente el protocolo CSMA/CD. Para ello dispone de una serie de funciones de ayuda que le facilitan el interfaz con los elementos del sistema.

Esa programación ha de hacerse sobre el fichero 'protocolo.c', presente en el directorio de trabajo del alumno. Otros ficheros que hay en ese directorio son:

'configuración': Configuración de la red simulada

'principal.o': Monitor del sistema

'ayudas.o': Interfaces de ayuda al alumno

'parametros.h': Constantes del sistema

'e1','e2',’e3’,'s1','s2',’s3’: Ficheros asociados a las estaciones, según la definición de la red contenida en 'configuración'

'compila': Comando de compilación

'demo': Ejecutable con una demostración

3. Descripción del sistema

3.1 Protocolo y máquina de estados

El protocolo a implementar por el alumno será el mecanismo de acceso al medio descrito en el estándar IEEE 802.3. De momento no se implementan otros aspectos del referido estándar, como entramado o uso de polinomios cíclicos.

Fig 1. Máquina de estados del protocolo a implementar por el alumno

 

El alumno deberá escribir una función C que sea utilizada por las estaciones de la red cada vez que entren en actividad, ya sea para emitir o para recibir información de la red. Para la programación de esa función se seguirá el modelo de comportamiento descrito en el autómata de la figura 1.

En el estado REPOSO la estación no tiene nada que emitir, aunque sí que puede (y debe) recibir aquello que viaje por la línea. Sale de este estado cuando recibe una solicitud de emisión de datos, momento en que pasa al estado CONTIENDA. En este estado la estación espera a encontrar la línea libre para transmitir, momento en que pasará al estado TRANSMITIR. Mientras esto no ocurra la estación debe permanecer recogiendo todo lo que circula por la línea. En estado TRANSMITIR la estación va poniendo sus datos en la línea hasta que, o bien detecta una colisión y pasa a CONTIENDA de nuevo, o bien termina exitosamente su transmisión, en cuyo caso pasa al estado inicial de reposo.

La recuperación de los errores físicos de transmisión, aquellos detectados con el cálculo del CRC, no está considerada, puesto que esa es una función de niveles superiores.

3.2 Organización de ficheros y datos

Desde el punto de vista del diseñador, el sistema presenta la siguiente estructura de ficheros:

Fig. 2 Estructura de ficheros del sistema

 

En la figura quedan patentes las tres partes funcionales de que consta el sistema: un monitor o gestor, programado en el fichero 'principal.c', el protocolo de acceso a programar por el alumno en 'protocolo.c', y las funciones de apoyo necesario a esa programación contenidas en 'ayudas.c'. Los ficheros 'parametros.h' y 'sistema.h' contienen las definiciones de constantes, estructuras de datos y variables globales a todo el sistema. El fichero de configuración, al que sólo tiene acceso para su lectura durante la simulación el programa monitor, contiene la definición de la red. Este fichero puede (y debería) ser modificado por el alumno para probar su función bajo diferentes configuraciones de red.

Para simular el nivel superior, usuario de los servicios MAC implementados por el alumno, y que es proveedor y receptor de las tramas emitidas hacia y recibidas desde la línea, se utilizan parejas de ficheros, para entrada y salida, asociadas a cada estación de la red. En la configuración inicial dada al alumno estos ficheros son, como se extrae del contenido de 'configuración', 'e1' y 's1' para entrada y salida de datos de la primera estación, 'e2' y 's2' para la segunda, y ‘e3’ y ‘s3’ para la tercera. Los ficheros de entrada contienen las tramas que habrán de enviarse por la línea, mientras que los de salida deberán contener al final de la simulación aquellas tramas que han sido recogidas por la estación. Estas tramas no siguen la estructura definida en el estándar IEEE 802.3, sino que pueden contener cualquier texto, atendiendo a las limitaciones expuestas en el último apartado de esta documentación.

3.3 Monitor del sistema

Es la función desarrollada en el fichero 'principal.c'. Se encarga de crear la red a partir de la configuración proporcionada, ordenar los turnos de activación de las estaciones en el tiempo, desplazar la información por la línea, y controlar la terminación de la actividad de las estaciones de la red.

El corazón de su actividad y de toda la simulación es el siguiente bucle:

do

{

for (nodo=0;nodo<num_est;nodo++)

csma_cd(nodo,NODO.estado);

actualizar_linea();

}

while (!han_acabado_todos());

La función 'csma_cd' que se ejecuta sucesivamente sobre todas las estaciones de la red, es la programada por el alumno. La otra función fundamental en el bucle es 'actualizar_linea', que registra el desplazamiento de la información por la línea, haciendo visibles las posibles colisiones.

3.4 Parametrización del sistema

La definición de la red a simular es totalmente flexible. Esa es la función del fichero configuración, cuya estructura es la siguiente:

l --> Tamaño de la línea, expresado en metros.

x --> Número de estaciones de la red.

a --> Mbps requeridos por esta estación.

b --> Nombre del fichero de entrada asociado a la estación.

c --> " " " " salida " " "

. . . ( x instanciaciones, una por estación, de las lineas a, b y c)

a

b

c

.

La definición de este fichero queda en manos del alumno, de manera que pueda definir diferentes redes sobre las que hacer pruebas. Jugando con el número de estaciones de la red y el nivel de actividad de éstas (a mayor tasa de actividad de una estación, más frecuentemente quiere transmitir), podrá comprobar la inconveniencia del protocolo CSMA/CD en configuraciones muy cargadas.

3.5 Interfaces

Se les proporcionan al alumno a través de las funciones contenidas en el fichero 'ayudas.c'. Estas funciones las agrupamos en:

- Interfaz con la línea

- Interfaz con el nivel superior

- Interfaz con el sistema

A continuación vemos cada una de ellas.

Interfaz con la línea

Las funciones disponibles son dos, para emitir y recibir de la línea:

char escuchar(nodo)

int nodo;

Devuelve el carácter contenido en el punto de la red donde está conectada la estación 'nodo'.

.

void transmitir(nodo)

int nodo;

Toma el siguiente carácter del buffer de emisión asociado a la estación 'nodo' y lo pone en la línea.

Interfaz con el nivel superior

Permiten entregar y recibir información para ser enviada o que ha llegado a través de la red.

void guardar(nodo,x)

int nodo;

char x;

Guarda el carácter 'x' en el buffer de recepción asociado a la estación 'nodo'. Detecta cuándo se ha recibido una trama completa y la guarda en el fichero de salida asociado a la estación 'nodo'.

int emitir(nodo)

int nodo;

Interroga al nivel superior acerca de la existencia de datos para emitir. En caso afirmativo carga el buffer de emisión asociado a la estación 'nodo' con una trama leída del fichero de emisión asociado a 'nodo', y devuelve cierto. En caso contrario devuelve falso.

Interfaz con el sistema

Interaccionan con el sistema para realizar tareas auxiliares. Implementan las acciones que el alumno necesitará para su función. Son siete:

.

void cambiar_estado(nodo,estado)

int nodo, estado;

Pasa la estación 'nodo' al estado 'estado', que debe ser uno de los 3 contemplados en el autómata y definidos en 'parametros.h': REPOSO, CONTIENDA o TRANSMITIR.

.

.

int transmision_completa(nodo)

int nodo;

Devuelve cierto cuando el buffer de transmisión de la estación 'nodo' está vacío, y por tanto se ha concluído la transmisión de esa trama con éxito. Falso en caso contrario.

.

void vaciar_buffer(nodo)

int nodo;

Reinicializa el buffer de recepción asociado a la estación 'nodo'.

.

void retardo_aleatorio(nodo)

int nodo;

Genera un entero aleatorio según el algoritmo de retardo aleatorio (truncated exponential binary backoff). Ese número queda asociado a la estación que ha ejecutado la función, que lo actualizará mediante ‘no_bloqueado’.

.

int no_bloqueado(nodo)

int nodo;

Devuelve ‘1’ cuando la estación no tiene ningún retardo pendiente para intentar emitir. En caso contrario devuelve cero y decrementa en uno el número de rondas de retardo asociadas a la estación.

.

void inc_retransmisiones(nodo)

int nodo;

Incrementa en uno el número de retransmisiones que hay asociado a cada estación.

.

void reset_retransmisiones(nodo)

int nodo;

Inicializa a cero el mismo número anterior.

La figura 3 resume estas funciones y su utilidad.

Figura 3. Funciones de interfaz y auxiliares.

 

4. Ejecución

Los ficheros de trabajo están en el directorio /users/alumnos/soft/acaz/ether/cast. Uno de ellos se llama LEEME. Como podéis suponer, su lectura es muy conveniente para facilitar el trabajo.

Antes de iniciar su trabajo, el alumno debería ejecutar la demostración puesta a su disposición. Para ello basta con invocar el fichero 'demo' y el sistema pedirá al alumno el tipo de ejecución que quiere llevar a cabo, a elegir entre dos posibilidades:

- Simulación incontrolada, en la que es impredecible el comportamiento de las estaciones.

- Simulación controlada, en la que el alumno determina cuál va ser el comportamiento de las estaciones, sin saber de antemano cuál va a ser ese comportamiento.

La utilidad de la primera es simplemente la de poder ejecutar pruebas aleatorias sobre un sistema ya diseñado, intentando detectar situaciones anómalas.

La de la segunda está en permitir al alumno la repetición de una ejecución que tenga algún interés. Lo normal será trabajar con esta segunda modalidad, la única con la que se puede verificar la corrección de comportamientos erróneos detectados.

Seleccionado el tipo de simulación a llevar a cabo, se visualizará en pantalla la línea con sus estaciones conectadas numeradas a partir de cero y de izquierda a derecha, uniformemente espaciadas y acompañadas de una letra que identifica el estado en que se encuentra la estación (R=REPOSO, T=TRANSMITIR, C=CONTIENDA). Sobre esa representación se irán reflejando las transmisiones de tramas hechas por las estaciones, el desplazamiento de las mismas por la línea, y las colisiones que se produzcan.

Una vez en marcha la red, la simulación sólo se detiene cada vez que una estación cambia de estado, de forma que sirva al alumno de punto de referencia para seguir las evoluciones de la red. La ejecución se reanuda pulsando return.

Los caracteres que aparecen en pantalla son los que componen las tramas que envía cada estación. Además, aparecen otros caracteres de significado especial y que no deben aparecer en los ficheros asociados a las estaciones. Estos caracteres son:

'-' --> linea libre

'@' --> colisión (señal de jamming)

'#' --> carácter de relleno de trama

Además, tampoco deben usarse:

'~' --> sustituye a las marcas de fin de línea en el fichero de entrada asociado a la estación

'\0' --> marca de fin de trama

Hay que tener en cuenta el sentido del desplazamiento de las tramas para poder leer el texto que contienen: cuando ese desplazamiento es de derecha a izquierda no hay problema, pero si es a la inversa las letras aparecen al revés del sentido de lectura en la escritura latina.

Al final de una ejecución, en los ficheros de salida asociados a cada una de las estaciones, deberán aparecer las tramas que han sido recogidas de la línea por la estación. Conviene asegurarse de que al principio de la ejecución esos ficheros están vacíos, pues de otro modo se acumularán las tramas recogidas en distintas ejecuciones, pudiendo inducir a confusiones en la interpretación de los resultados de la simulación.

Cuando el alumno haya programado su función, debe ejecutar el fichero de comandos 'compila', que toma el fichero 'protocolo.c' y lo compila con el resto del sistema. Si no hay errores, puede pasar a ejecutarlo invocando el fichero 'main', donde estará el ejecutable generado por la compilación anterior.

.

Anexo: Programa protocolo.c a desarrollar por el alumno

#include "parametros.h"

void csma_cd(nodo,estado)

int nodo,estado;

{

char x;

.

if (estado==REPOSO)

{

}

else if (estado==CONTIENDA)

{

}

else if (estado==TRANSMITIENDO)

{

}

}

.