Análisis Práctico del Protocolo OpenFlow en Redes Definidas por Software

Introducción

OpenFlow es un protocolo esencial en la arquitectura de redes definidas por software (SDN), que permite la comunicación entre controladores y conmutadores. Este aálisis se enfoca en la implementación práctica de sus mecanismos y estructuras de datos.

Requisitos Básicos

Configuración de la Topología

Para iniciar el aálisis, se establece una topología de red básica que incluye un controlador y un comutador compatible con OpenFlow, permitiendo la interceptación del tráfico de protocolo.

Resultados de Captura de Paquetes

Al monitorear la comunicación, se identifican varios tipos de mensajes OpenFlow clave durante el establecimiento de la sesión y operaciones subsecuentes.

Mensaje HELLO: El controlador envía un paquete desde su puerto 6633 al puerto del conmutador, indicando soporte máximo para OpenFlow 1.0. El conmutador responde desde su puerto al puerto del controlador, declarando soporte para OpenFlow 1.3. Se negocia el uso de la versión 1.0 para la conexión.

Mensaje FEATURES_REQUEST: El controlador solicita información detallada sobre las capacidades del conmutador mediante un mensaje enviado al puerto del conmutador.

Mensaje SET_CONFIG: El controlador envía parámetros de configuración, como flags y longitud máxima de paquete, al conmutador para ajustar su comportamiento.

Mensaje PORT_STATUS: Cuando ocurren cambios en los puertos del conmutador, se notifica al controlador con el estado actualizado del puerto.

Mensaje FEATURES_REPLY: El conmutador responde con sus características, incluyendo identificador de ruta de datos, buffers disponibles y capacidades de puertos.

Mensaje PACKET_IN: El conmutador envía un paquete recibido al controlador para instrucciones de reenvío, indicando que requiere decisión de manejo.

Mensaje Flow_mod: El controlador envía instrucciones al conmutador para modificar la tabla de flujo, definiendo reglas para el procesamiento de paquetes. Esto ocurre después de eventos como pingall para establecer rutas.

Mensaje PACKET_OUT: El controlador instruye al conmutador para procesar un paquete con acciones específicas, como reenviarlo por un puerto designado.

Diagrama de Interacción: La secuencia típica incluye intercambio inicial de HELLO, solicitud y respuesta de características, configuración y mensajes operativos como PACKET_IN y FLOW_MOD para gestionar el tráfico.

Protocolo de Comunicación: El intercambio inicial entre conmutador y controlador utiliza TCP para establecer una conexión confiable, como se observa en los paquetes capturados.

Requisitos Avanzados: Estructuras de Datos en el Código Fuente de OpenFlow

Encabezado de Datagrama OpenFlow


/* Encabezado base para todos los paquetes OpenFlow. */
struct encabezado_opf {
    uint8_t version;        /* Versión del protocolo. */
    uint8_t tipo;           /* Tipo de mensaje, constante OFPT_*. */
    uint16_t tamano;        /* Longitud total incluyendo este encabezado. */
    uint32_t xid;           /* Identificador de transacción, usado para emparejar solicitudes y respuestas. */
};
ASSERT_OPF(sizeof(struct encabezado_opf) == 8);

Resumen de Tipos de Mensaje


enum tipo_opf {
    /* Mensajes inmutables. */
    OFPT_SALUDO,                  /* Mensaje simétrico */
    OFPT_ERROR,                   /* Mensaje simétrico */
    OFPT_ECO_SOLICITUD,           /* Mensaje simétrico */
    OFPT_ECO_RESPUESTA,           /* Mensaje simétrico */
    OFPT_PROVEEDOR,               /* Mensaje simétrico */

    /* Mensajes de configuración de conmutador. */
    OFPT_SOLICITUD_CARACT,        /* Mensaje controlador/conmutador */
    OFPT_RESPUESTA_CARACT,        /* Mensaje controlador/conmutador */
    OFPT_SOLICITUD_CONFIG_OBT,    /* Mensaje controlador/conmutador */
    OFPT_RESPUESTA_CONFIG_OBT,    /* Mensaje controlador/conmutador */
    OFPT_CONFIG_ESTABLECER,       /* Mensaje controlador/conmutador */

    /* Mensajes asíncronos. */
    OFPT_PAQUETE_ENTRADA,         /* Mensaje asíncrono */
    OFPT_FLUJO_ELIMINADO,         /* Mensaje asíncrono */
    OFPT_ESTADO_PUERTO,           /* Mensaje asíncrono */

    /* Mensajes de comando del controlador. */
    OFPT_PAQUETE_SALIDA,          /* Mensaje controlador/conmutador */
    OFPT_MODIFICACION_FLUJO,      /* Mensaje controlador/conmutador */
    OFPT_MODIFICACION_PUERTO,     /* Mensaje controlador/conmutador */

    /* Mensajes de estadísticas. */
    OFPT_SOLICITUD_ESTADISTICAS,  /* Mensaje controlador/conmutador */
    OFPT_RESPUESTA_ESTADISTICAS,  /* Mensaje controlador/conmutador */

    /* Mensajes de barrera. */
    OFPT_SOLICITUD_BARRERA,       /* Mensaje controlador/conmutador */
    OFPT_RESPUESTA_BARRERA,       /* Mensaje controlador/conmutador */

    /* Mensajes de configuración de cola. */
    OFPT_SOLICITUD_CONFIG_COLA,   /* Mensaje controlador/conmutador */
    OFPT_RESPUESTA_CONFIG_COLA    /* Mensaje controlador/conmutador */
};

/* Códigos de error de mensaje fallido. */
enum tipo_error_opf {
    ERROR_SALUDO_FALLIDO,        /* Fallo en el protocolo de saludo. */
    ERROR_SOLICITUD_INVALIDA,    /* Solicitud no comprendida. */
    ERROR_ACCION_INCORRECTA,     /* Error en descripción de acción. */
    ERROR_MOD_FLUJO_FALLIDO,     /* Problema al modificar entrada de flujo. */
    ERROR_MOD_PUERTO_FALLIDO,    /* Fallo en solicitud de modificación de puerto. */
    ERROR_OP_COLA_FALLIDA        /* Fallo en operación de cola. */
};

Detalles de Mensajes Específicos

Mensaje SALUDO (HELLO)


struct mensaje_saludo {
    struct encabezado_opf encabezado;
    /* El cuerpo puede estar vacío, pero se ignoran datos adicionales para extensiones futuras. */
};

/* Códigos de error por saludo fallido. */
enum codigo_error_saludo {
    ERROR_SALUDO_INCOMPATIBLE,   /* Sin versión compatible. */
    ERROR_SALUDO_PERMISOS        /* Error de permisos. */
};

Mensaje SOLICITUD_CARACT (FEATURES_REQUEST)


struct puerto_fisico {
    uint16_t num_puerto;
    uint8_t direccion_hw[6];
    char nombre[16];
    uint32_t config;          /* Flags de configuración del puerto. */
    uint32_t estado;          /* Flags de estado del puerto. */
    uint32_t caracteristicas_actuales;
    uint32_t caracteristicas_anunciadas;
    uint32_t caracteristicas_soportadas;
    uint32_t caracteristicas_par;
};
ASSERT_OPF(sizeof(struct puerto_fisico) == 48);

struct caracteristicas_conmutador {
    struct encabezado_opf encabezado;
    uint64_t id_ruta_datos;
    uint32_t num_buffers;
    uint8_t num_tablas;
    uint8_t relleno[3];
    uint32_t capacidades;
    uint32_t acciones_soportadas;
    struct puerto_fisico puertos[0];
};
ASSERT_OPF(sizeof(struct caracteristicas_conmutador) == 32);

Mensaje CONFIG_ESTABLECER (SET_CONFIG)


struct config_conmutador {
    struct encabezado_opf encabezado;
    uint16_t flags;
    uint16_t longitud_max_paquete;
};

Mensaje ESTADO_PUERTO (PORT_STATUS)


struct estado_puerto {
    struct encabezado_opf encabezado;
    uint8_t razon;
    uint8_t relleno[7];
    struct puerto_fisico descripcion;
};

Mensaje RESPUESTA_CARACT (FEATURES_REPLY)


/* Similar a la estructura de caracteristicas_conmutador, usada para la respuesta. */

Mensaje PAQUETE_ENTRADA (PACKET_IN)


struct paquete_entrada {
    struct encabezado_opf encabezado;
    uint32_t id_buffer;
    uint16_t longitud_total;
    uint16_t puerto_entrada;
    uint8_t razon;
    uint8_t relleno;
    uint8_t datos[0];
};

Mensaje PAQUETE_SALIDA (PACKET_OUT)


struct paquete_salida {
    struct encabezado_opf encabezado;
    uint32_t id_buffer;
    uint16_t puerto_entrada;
    uint16_t tamano_acciones;
    struct encabezado_accion_opf acciones[0];
};

Mensaje MODIFICACION_FLUJO (FLOW_MOD)


struct modificacion_flujo {
    struct encabezado_opf encabezado;
    struct coincidencia_opf coincidencia;
    uint64_t cookie;
    uint16_t comando;
    uint16_t timeout_inactividad;
    uint16_t timeout_maximo;
    uint16_t prioridad;
    uint32_t id_buffer;
    uint16_t puerto_salida;
    uint16_t flags;
    struct encabezado_accion_opf acciones[0];
};

Etiquetas: OpenFlow SDN Controladores de Red Análisis de Protocolos estructuras de datos

Publicado el 6-26 05:50