fsc tema3 recortado
Post on 23-Jan-2016
251 Views
Preview:
DESCRIPTION
TRANSCRIPT
Fundamentos de Software de Comunicaciones
Tema 3
Fundamentos de Fundamentos de diseño de capas de protocolos (1ª parte)
Elementos de diseño e implementación
� Flujo de datos entre capas
2
Elementos de diseño e implementación
� El mecanismo de funcionamiento de cada protocolo normalmente se encuentra descrito en un estándar (ITU, ETSI, RFC, IEEE)
� Aspectos de implementación de capas:
o Clasificación en función del procesado que realiza el protocolo:
• procesado de datos (trabajo sobre payload, por ejemplo • procesado de datos (trabajo sobre payload, por ejemplo segmentación, reensamblado)
• procesado de control (de la cabecera y de la evolución del estado del protocolo en función del PCI)
• funciones de soporte: procesado de buffers y gestión de temporizadores
3
Comunicación entre capas (I) PRIMITIVAS OSI/3GPP
� Modelo de comunicación que garantiza la independencia espacial entre capaso No hace suposiciones sobre dónde se ejecuta
cada capa (distintos procesos, nodos...)
N
N-1
N
N-1
REQUEST CONFIRM INDICATION RESPONSE
12
Diseño e implementación de arquitecturas de protocolos
� A pesar de los estándares de protocolos, hay muchas cuestiones de diseño e implementación que se dejan a los programadores
� Por ejemplo: ¿cómo implemento cada capa? ¿En � Por ejemplo: ¿cómo implemento cada capa? ¿En software? ¿En hardware dedicado?
14
Capas en software
� Mapeo 1-a-1o Cada capa es una unidad funcional (por ejemplo
un proceso)
Necesidades: colas de mensajes y distinción demensajes que van en sentido "downlink" o "uplink"
Atender a un mensaje se realiza de forma asíncrona:la capa que envía el mensaje sigue su ejecución, lacapa que lo recibe, lo atiende cuando lo desencola.Algoritmo:
while(1){espera_evento(&evento);procesa_evento(evento);
}
15
Gestión de mensajes entre capas
� El mismo buffer se utiliza para guardar todas las cabeceras y payload
� El tamaño máximo del buffer es el MTU de la red
� Ejemplo de uso para PDUs en sentido descendente:
19
Gestión de mensajes entre capas (II)
char * pduN
char * pduN_1
char * pduN_2
20
Elementos de soporte
gestor detemporizadores
BUFFERCIRCULAR
ZONA DE DMA
NIC
Inserta trama ygenera interrrupción
Atiende a la interrupción y crea un buffer donde copia la trama
22
Diseño e implementación de la parte de control
� Se utilizan máquinas de estados finitoso Se implementa un autómata que decide las funciones a
realizar en el protocolo, a partir de
• el estado actual del autómata
• la información de control del protocolo recibida en un paquete
• el resultado de procesar los datos
o Se pasa de un estado a otro cuando se reciben eventoso Se pasa de un estado a otro cuando se reciben eventos
• llegada de paquetes o eventos de tiempo (timeouts)
o Se verán varias técnicas de implementación de una máquina de estados:
• basada en código (con dos bucles anidados IF o SWITCH/CASE)
• basada en tablas (array dos dimensiones: [estado][evento])
7
Protocolos y máquinas de estados� Cuando un protocolo tiene estado, se necesita implementar
su comportamiento mediante una máquina de estados
� En programación imperativa existen dos aproximaciones:1. Lineal: a través de sentencias anidadas
• switch(estado)/case { switch(evento)/case}• rápido, poco modular
2. Tabla de punteros a función manejadora• protocolo[estado][evento](argumentos)• costoso en memoria, pero modular30
Máquinas de estado (I)� Implementación con doble anidamiento
const int estadoA = 0; const int estadoB = 1;const int evento0 = 0; const int evento1 = 1;
int estado = estadoA; /*estado inicial*/bool fin=false;while(!fin){
int evento;espera_evento(&evento); /*bloquea*/switch(estado){
case estadoA: switch(evento){
case evento0: cout << "conmutaA->B\n";cout << "conmutaA->B\n";estado = estadoB;break;
case evento1:cout << "fin\n";fin=true;break;
}break;
case estadoB:switch(evento){
case evento0: cout << "fin\n";fin=true;break;
case evento1:cout << "conmutaB->A\n";estado = estadoA;break;
}break;
default: cerr << "Estado no esperado\n"; fin=true; break;}
}31
Máquinas de estado (II)
� Implementación con tabla de punteros a funciones
const int estadoA = 0; const int estadoB = 1;const int evento0 = 0; const int evento1 = 1;
int estado = estadoA; /*estado inicial ¡es global!*/
int transita_A_B(){cout << "conmutaA->B\n";estado = estadoB;return 0;return 0;
}int transita_B_A(){
cout << "conmutaB->A\n";estado = estadoA;return 0;
}int maquina_fin(){
return 1;}
int (*maquina_de_estados[2][2]) (void) = { &transita_A_B, /* [estadoA][evento0] */&maquina_fin, /* [estadoA][evento1] */&maquina_fin, /* [estadoB][evento0] */&transita_B_A, /* [estadoB][evento1] */
};32
Máquinas de estado (III)
� Implementación con tabla de punteros a funciones (cont.)
int estado; /*variable global que modifican las funciones*/
int main(){
/* ... *//* ... */
estado = estadoA; /*estado inicial*/
bool fin=false;
while(!fin){
int evento;
espera_evento(&evento); /*bloquea*/
fin = maquina_de_estados[estado][evento]();
}
return 0;
}
33
Fundamentos de Software de Comunicaciones
Tema 3Fundamentos de Fundamentos de diseño de capas de protocolos (2ª parte)
Tipos de enteros (estándar C99)� Para evitar problemas de compatibilidad, cuando se migra un
código a distintas plataformas, se debe evitar dependencias con int, short, long, etc.
� #include <stdint.h>o Define tipos de enteros independientes de la plataformauint8_t/int8_tuint8_t/int8_tuint16_t/int16_tuint32_t/int32_tuint64_t/int64_t
� #include <inttypes.h>o Para imprimir de forma correcta estos valores:uint64_t v = 6148914690091192593;printf("valor = %"PRIu64" \n", v);
5
Representación de datos en PDUs� Arquitecturas big-endian o little-endian
o La tabla muestra la representación en memoria del valor hexadecimal 0x0A0B0C0D en dos máquinas con distintas arquitecturas (se han utilizado las direcciones de memoria de la 0x1100 a la 0x1103)
� Si no se especifica lo contrario, los datos de control de más de un byte se transmiten en formato big-endian
6
Representación de datos en PDUs� Normalmente, antes de transmitir por la red, los datos se pasan a
formato big-endian y luego, en recepción, se reconvierten si es necesario (si la arquitectura del receptor es little-endian)
uint16_t cambia_endiannes(uin16_t in){ /*Ejemplo no optimizado para 16 bits*/uint16_t out; uint8_t *p_in = (uint8_t *) ∈ uint8_t *p_out = (uint8_t *) &out; p_out[0] = p_in[1]; p_out[1] = p_in[0]; return out; return out;
}/*Detección del tipo de arquitectura de la maquina para saber si hay que convertir el dato al enviar y/o recibir*/uint16_t valor = 0xFF00;uint8_t *puntero= (uint8_t *)&valor;if(*puntero!=0){
/*es big endian*/else
/*es little endian*/
/*NOTA: este algoritmo no se utiliza así realmente, el S.O. tiene un #define con el tipo de arquitectura y la biblioteca de sockets tiene unas funciones para hacer la conversión*/
uint16_t convierte_de_formato_interno_a_big_endian(uint16_t value){#if defined(__LITTLE_ENDIAN_)
return cambia_endiannes(value);#else
return value;#endif} /* en la biblioteca de sockets esta función se llama htons() -conversión de formato host (h) a formato network (n)*/
7
Representación de datos en PDUs� Es tentador organizar una PDU (cabecera+payload) en una
estructura de datos y mandarla como si fuera un array de caracteres:
/*funcion parte del driver de la tarjeta de red que coloca la trama en el buffer circular de DMA*/
int envia_trama(uint8_t * buffer, size_t longitud);
struct Trama_Ethernet{
uint8_t dir_destino[6];
uint8_t dir_origen[6];
uint16_t tipo_protocolo;
uint8_t payload[1500];
};
struct Trama_Ethernet trama = {{0xFF,0xFF,0xFF,0xFF,0xFF,0xFF},{0x01,0x01,0x01,0x01,0x01,0x01},0x0800,0};
envia_trama((uint8_t *)&trama,14+46); /*46 es la longitud minima del payload en Ethernet*/
/*puede funcionar pero, como se verá a continuación, en otros casos podría ser erróneo!!!*/
8
Alineamiento de bytes en estructuras� Cada compilador elige cómo representar una estructura en memoria
o Si el compilador del programa emisor elige una representación distinta al del receptor se producirá una incompatibilidad al serializar/deserializar los datos
o Cada compilador se adapta a la arquitectura del ordenador para el que genera código
� La mayor parte de procesadores de 16, 32 y 64 bits no permiten almacenar palabras en cualquier offset de memoriaalmacenar palabras en cualquier offset de memoria
o Por ejemplo, en procesadores de 32 bits la memoria se accede realizando ciclos de bus de 32 bits (alineando datos de tipo uint32_t sólo en direcciones de memoria divisibles entre cuatro).
9
X0X1X2X3: bien alineadolectura en un ciclo
Y0Y1Y2Y3: mal alineado(necesitaría dos ciclos paraser leído)
Alineamiento de bytes en estructuras� El compilador debe respetar las restricciones de alineamiento del
procesador, por lo que tendrá que añadir bytes de relleno a las estructuras definidas por el programador para cumplir dichas restricciones
struct Mensaje{ /*Estructura definida por el programador*/uint16_t opcode; uint8_t subfield; uint32_t length; uint8_t version; uint8_t version; uint16_t destino;
};
� El compilador internamente cambia a esta estructurastruct Mensaje{ /*Estructura que se compila en realidad*/
uint16_t opcode; uint8_t subfield; uint8_t relleno1; /*relleno para alinear el siguiente campo a 4 bytes*/uint32_t length; uint8_t version; uint8_t relleno2; /*relleno para alinear el siguiente campo a 2 bytes*/uint16_t destino; uint8_t relleno3[4]; /*relleno para alinear la estructura completa en 16 bytes*/
};10
Transmisión de otros tipos complejos
� ¿Qué pasa si el tipo a transmitir no es de tipo entero?
o O se crean reglas a medida
o O se usan estándares (en C/C++ son típicos, pero requieren de librerías y herramientas externas):• ASN.1 + reglas de codificación (ITU-T)• Common Data Representation (OMG)• Otros estándares dentro de una organización:
• Protocol Buffers (Google)
12
Control de errores
� Información redundante para detección de errores que es parte de la parte de control de una PDU
� Habituales en protocolos:� Habituales en protocolos:o checksum: suma de comprobación (típica en
software, eficacia parcial)o CRC: códigos de redundancia cíclica (típica en
hardware, detecta más tipos de errores)
13
Checksum en trailers
comienzode trama
fin de trama
cksumDLE STX datos de usuario DLE ETX
� Típico en PDUs de nivel de enlace
14
de trama trama
DLE(0x10): Data Link EscapeSTX(0x02): Start of TeXtETX(0x03): End of TeXt
Checksums en cabeceras
15
Checksums en TCP/IP
Tareas del emisor: Tareas del receptor:
Objetivo: detectar errores en las cabeceras (caso de IP) o en la PDU completa (caso de ICMP, UDP y TCP)
� manipular la PDU como una secuencia de enteros de 16-bits
� Calcular el campo checksum de la secuencia considerada y añadirlo a la PDU
� calcular el checksum de la secuencia recibida
� Si el checksum calculado es igual al recibido:o NO: hay un erroro SÍ: no se ha detectado
error
16
Cálculo de checksums
� Complemento a uno de la suma de todas las palabras de la secuencia
a. Suma de comprobación en el sitio emisor b. Suma de comprobación en el sitio receptor17
Implementación en C (I)
� Complementos a 1:
c_1 _de_valor = ~ valor;
� Suma en complemento a 1 (ejemplo checksum8):
uint8_t x, y, checksum;
uint16_t suma_parcial, suma; /*...*/
suma_parcial = ((uint16_t)x) + ((uint16_t)y);
suma = (suma_parcial & 0xFF) + (suma_parcial>>8);
checksum = ~suma & 0xFF;
18
Implementación en C (II)� Implementación estándar del checksum 16 bits para IP
19
top related