Universidad Nacional del Nordeste Facultad de Ciencias Exactas, Naturales y Agrimensura Trabajo Final de Aplicación MPLS MULTI PROTOCOL LABEL SWITCHING Una Arquitectura de Backbone para la Internet del Siglo XXI por María Sol Canalis Prof. Coordinador: Agr. Castor Herrmann Prof. Orientador: Lic. Ricardo Monzón Licenciatura en Sistemas Corrientes Argentina Corrientes 2003 A mis padres, por el apoyo incondicional, y a la luz que hoy ilumina mi vida. Prefacio El protocolo TCP / IP es hoy día una solución clásica y estándar al transporte de información en las redes. Aceptado por toda la comunidad de Internet, ha sido hasta hoy una solución aceptable para el envío de información, utilizando Routing de paquetes con ciertas garantías de entrega. A su vez, los avances en el hardware y en las metodologías de ingeniería del trá…co están dando lugar al empleo creciente de las tecnologías de Conmutación, encabezadas por la tecnología ATM. Aportando velocidad, calidad de servicio y facilitando la gestión de los recursos en la red. El principal objetivo de este Trabajo es analizar y dar a conocer las soluciones que existen actualmente al problema de integrar trá…co IP dentro de la tecnología ATM. Para ello, se comienza estudiando el protocolo IP, la tecnología ATM y las diferencias entre ellos. También se verán las necesidades crecientes por parte de proveedores y administradores de redes de mantener un control sobre el trá…co, gestión de recursos, ancho de banda disponible y calidad de servicio (QoS). Comprobando cómo el protocolo de Internet actual, IP, puede bene…ciarse de las características que aportan las nuevas tecnologías, principalmente ATM. Tras esto, se estudian a fondo las soluciones IP - ATM más destacadas, y se desarrolla una simulación sobre MPLS, la solución más sólida de todas las estudiadas, a mi parecer. Este simulador nos proporcionará una idea más clara de las ventajas, inconvenientes, costes de implantación del nuevo sistema, etc. El Simulador utilizado fue desarrollado en el Área Telemática del Departamento de Informática de la Universidad de Extremadura, agradeciéndose muy especialmente a Miguel Ángel Martín Tardío, Miguel Gaspar Rodríguez y José Luis Gonzalez Sánchez. Sobre el mismo se ha desarrollado una Interfaz de Captura de Datos de Entrada. Se ha optado por el lenguaje Java para realizar la implementación. Los motivos: su orientación a objetos, la posibilidad de manejar hilos de ejecución y la ejecución multiplataforma. A continuación pasamos a describir cada uno de los capítulos de los que consta este texto: ² Lenguaje Java. Debido a que se utilizó este lenguaje en la elaboración del Simulador de Redes MPLS y de la interfaz de Captura de Datos de Entrada, se dedicó vi este capítulo a Java, lenguaje orientado a objetos (OO)y multiparadigma. ² Preparación de Documentos con Latex. Esta sección explica como se hace un libro con Latex; un sistema de composición profesional que consiste en un conjunto de macrocomandos creado por Donald Knuth de la Universidad de Stanford en los años 1970s. También se utilizó para confeccionar este libro el editor Scienti…c WorkPlace, que utiliza Latex como lenguaje de composición del texto. ² Introducción a MPLS. Esta sección nos introduce a la esencia misma del MPLS, explicando el porqué esta arquitectura es apta para la convergencia de las redes de altas prestaciones. También en este apartado se describen las diferentes alternativas que existen para mejorar la perfomance de las grandes redes, conluyendo que MPLS es la mejor opción. ² MPLS Multi Protocol Label Switching. Nos sumergidos por completo en el MPLS, explicando en detalle su tecnología, arquitectura, principales aplicaciones, etc. ² Simulador de Redes MPLS. Esta sección explica el desarrollo completo del Simulador de Redes MPLS, haciendo un estudio del sistema actual y del sistema propuesto aplicando MPLS. Se divide en las siguientes fases: Análisis, Diseño e Implementación. ² Interfaz de Captura de Datos de Entrada. Se desarrolló esta herramienta para hacer una interfaz más amigable con el usuario a la hora de cargar los datos del archivo de con…guración que necesita el Simulador de Redes MPLS para su correcta ejecución. ² Ampliaciones y Conclusiones. Y por último, este apartado se re…ere a las ampliaciones del Simulador de Redes MPLS, y de la Interfaz de Captura de Datos, …nalizando con las conclusiones acerca de esta arquitectura. María Sol Canalis Licenciatura en Sistemas Universidad Nacional del Nordeste Índice General 1 Java 1.1 Introducción al Lenguaje . . . . . . . . . . . . . . 1.1.1 Bibliotecas de Clases Estándares de Java 1.1.2 Java es Multiplataforma . . . . . . . . . . 1.1.3 Características del Lenguaje Java . . . . . 1.2 Estructura General de un Programa Java . . . . 1.3 Conceptos Básicos . . . . . . . . . . . . . . . . . 1.3.1 Clase . . . . . . . . . . . . . . . . . . . . 1.3.2 Herencia . . . . . . . . . . . . . . . . . . . 1.3.3 1.3.4 . . . . . . . . 1 1 3 3 4 6 7 7 8 Interface . . . . . . . . . . . . . . . . . . . . . . . . . . . Package . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 9 1.3.5 La jerarquía de clases de Java (API) 1.4 Variables dentro del Lenguaje Java . . . . . 1.4.1 Visibilidad y vida de las variables . . 1.5 Operadores en Java . . . . . . . . . . . . . . . . . 1.5.1 Operadores aritméticos . . . . . . . . 1.5.2 Operadores de asignación . . . . . . . 1.5.3 Operadores unarios . . . . . . . . . . . 1.5.4 Operadores incrementales . . . . . . . 1.5.5 Operadores relacionales . . . . . . . . 1.5.6 Operador de concatenación de cadenas 1.5.7 Precedencia de operadores . . . . . . . 1.6 Estructuras de Programación . . . . . . . . . 1.6.1 Sentencias o expresiones . . . . . . . . 1.6.2 Comentarios . . . . . . . . . . . . . . 1.6.3 Bifurcaciones . . . . . . . . . . . . . . 1.6.4 Bucles . . . . . . . . . . . . . . . . . . 1.7 Clases en Java . . . . . . . . . . . . . . . . . vii . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 10 13 14 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . de caracteres (+) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 14 15 15 15 17 17 17 18 19 20 21 24 viii ÍNDICE GENERAL 1.7.1 Características importantes de las clases . . . . . . . . 24 1.7.2 Métodos o Funciones Miembros . . . . . . . . . . . . . . Algunas Clases de Utilidad . . . . . . . . . . . . . . . . . . . . 1.8.1 Clase Arrays . . . . . . . . . . . . . . . . . . . . . . . . 1.8.2 Clases String y StringBu¤er . . . . . . . . . . . . . . . . 1.8.3 Clase Double . . . . . . . . . . . . . . . . . . . . . . . . 1.8.4 Clase Integer . . . . . . . . . . . . . . . . . . . . . . . . 1.9 El AWT (Abstract Windows Toolkit) . . . . . . . . . . . . . . . 1.9.1 Qué es el AWT . . . . . . . . . . . . . . . . . . . . . . . 1.9.2 Creación de una Interface Grá…ca de Usuario . . . . . . 1.9.3 Objetos “event source” y objetos “event listener” . . . . 1.9.4 Proceso a seguir para crear una aplicación interactiva (orientada a eventos) . . . . . . . . . . . . . . . . . . . . 1.10 Errores Frecuentes de Programación . . . . . . . . . . . . . . . 1.10.1 Scheduling de Hilos de Ejecución . . . . . . . . . . . . . 1.10.2 Errores en el Uso de las Características de Portabilidad de Java . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.10.3 Uso de directorios de…nidos . . . . . . . . . . . . . . . . 1.10.4 Carga de Drivers JDBC . . . . . . . . . . . . . . . . . . 1.10.5 Terminación de Líneas . . . . . . . . . . . . . . . . . . . 1.10.6 Entrada/Salida por Archivo . . . . . . . . . . . . . . . . 1.10.7 Fuentes de Caracteres . . . . . . . . . . . . . . . . . . . 25 27 27 28 29 30 30 30 30 31 1.8 2 Preparación de documentos con LATEX 2.1 Introducción . . . . . . . . . . . . . . . . . . . . 2.1.1 Forma de trabajo con LATEX . . . . . . . 2.1.2 Modo de trabajo en LATEX . . . . . . . . 2.2 Documentos en LATEX . . . . . . . . . . . . . . 2.2.1 El Preámbulo . . . . . . . . . . . . . . . 2.2.2 Especi…cación y Estilo de Documento . 2.2.3 Estilo de Página . . . . . . . . . . . . . 2.2.4 La página del Título . . . . . . . . . . . 2.2.5 El Documento Propiamente Dicho . . . 2.2.6 División de un documento en partes . . 2.2.7 Documento Tipo Libro . . . . . . . . . . 2.2.8 Trabajo en Modo Texto . . . . . . . . . 2.3 Partes Flotantes . . . . . . . . . . . . . . . . . 2.3.1 Referencia Cruzada e Índice de Palabras 2.3.2 Bibliografía . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32 33 33 35 35 38 39 40 40 41 41 42 46 46 47 47 50 53 55 57 58 63 67 71 74 ix ÍNDICE GENERAL 3 Introducción al MPLS 3.1 Presentación de una Nueva Arquitectura . 3.2 Estudio del Sistema Actual . . . . . . . . 3.2.1 Protocolo IP . . . . . . . . . . . . 3.2.2 Tecnología ATM . . . . . . . . . . 3.2.3 El Protocolo IP sobre la estructura 3.2.4 Modelo lógico del sistema existente 3.3 Evaluación de alternativas . . . . . . . . . 3.3.1 LANE . . . . . . . . . . . . . . . . 3.3.2 IP clásico sobre ATM . . . . . . . 3.3.3 NHRP . . . . . . . . . . . . . . . . 3.3.4 MPOA . . . . . . . . . . . . . . . . 3.3.5 Arequipa . . . . . . . . . . . . . . 3.3.6 IP Switching . . . . . . . . . . . . 3.3.7 Tag Switching . . . . . . . . . . . . 3.3.8 MPLS . . . . . . . . . . . . . . . . 3.4 Selección de una alternativa . . . . . . . . 3.4.1 Viabilidad técnica . . . . . . . . . 3.4.2 Viabilidad operacional . . . . . . . 3.4.3 Viabilidad económica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77 77 78 79 82 84 86 88 89 90 90 92 92 93 94 94 96 96 96 97 4 MPLS Multi Protocol Label Switching 4.1 Introducción a MPLS . . . . . . . . . . . . . . . . . 4.1.1 Objetivos . . . . . . . . . . . . . . . . . . . . 4.2 Arquitectura . . . . . . . . . . . . . . . . . . . . . . 4.2.1 Visión general . . . . . . . . . . . . . . . . . . 4.2.2 Protocolo de Intercambio de Etiquetas LDP 4.3 Aplicaciones MPLS . . . . . . . . . . . . . . . . . . . 4.3.1 Ingienería de Trá…co . . . . . . . . . . . . . . 4.3.2 Clases de Servicios (CoS) . . . . . . . . . . . 4.3.3 Redes Virtuales Privadas (VPNs) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99 99 100 102 102 133 139 139 141 142 . . . . . . . . . . . . . . . . ATM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 Simulador de Redes MPLS 147 5.1 Fase de Análisis . . . . . . . . . . . . . . . . . . . . . . . . . . . 147 5.1.1 5.1.2 5.1.3 5.1.4 5.1.5 5.1.6 Diagrama de Contexto . . . . . . . . Descripción de las entidades externas . Descripción de los almacenes de datos Descripción de los procesos . . . . . . Descripción de los ‡ujos de datos . . . Componentes de un LSR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 149 151 151 152 153 154 x ÍNDICE GENERAL 5.1.7 Diccionario de Datos . . . . . . . . . . . . . . . . . . . . 5.2 Diseño del Sistema . . . . . . . . . . . . . . . . . . . . . . . . . 5.2.1 Diseño de las salidas. . . . . . . . . . . . . . . . . . . . 5.3 Implementación . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.3.1 Creación de las Clases en Java . . . . . . . . . . . . . . 5.3.2 Implementación de los Procedimientos . . . . . . . . . . 5.4 Ejemplos de Funcionamiento . . . . . . . . . . . . . . . . . . . 5.4.1 Ejemplo 1. Entrada de datos IP sin clasi…car. . . . . . . 5.4.2 Ejemplo 2. Dos ‡ujos de datos en la red. . . . . . . . . 5.4.3 Ejemplo 3. Dos tipos de datagramas asociados a un ‡ujo 155 162 162 166 167 169 181 181 189 de datos . . . . . . . . . . . . . . . . . . . . . . . . . . . 196 6 Captura de Datos de Entrada 6.1 Reglas de codi…cación del Archivo de Con…guración 6.2 Bloques del Archivo de Con…guración . . . . . . . . 6.2.1 Datos Generales de la Red. . . . . . . . . . . 6.2.2 Datos Especí…cos para cada Nodo . . . . . . 6.3 Interfaz con el Usuario . . . . . . . . . . . . . . . . . 6.4 Código Fuente . . . . . . . . . . . . . . . . . . . . . 6.4.1 Clase principal “MPLS.java” . . . . . . . . . 6.4.2 Clase “FrPosiciones.java” . . . . . . . . . . . 6.4.3 Clase “FrEnlaces.java” . . . . . . . . . . . . . 6.4.4 Clase “FrLIB.java” . . . . . . . . . . . . . . . 6.4.5 Clase “FrRuteo.java” . . . . . . . . . . . . . . 6.4.6 Clase “FrameConsola.java” . . . . . . . . . . 6.4.7 Clase “FiltroCFG.java” . . . . . . . . . . . . 6.4.8 Clase “FrAyuda.java” . . . . . . . . . . . . . 6.4.9 Clase “FrAcerca.java” . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 209 209 209 210 211 215 225 225 234 246 255 271 280 282 283 285 7 Ampliaciones y Conclusiones 7.1 Ampliaciones y mejoras para el Simulador de Redes MPLS 7.2 Mejoras para la Interfaz de Captura de datos de Entrada . 7.3 Mejoras sobre la arquitectura MPLS . . . . . . . . . . . . . 7.4 Conclusiones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 289 289 290 290 291 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Bibliografía 293 Índice de Materias 295 Índice de Figuras 2.1 Algunos de los …cheros resultantes del proceso de edición y composición de un documento con LATEX. . . . . . . . . . . . . . 2.2 Niveles y comportamiento por defecto de las distintas unidades de seccionamiento, y según las clases de documento (se ha tomado art. y rep. como abreviatura de article y report). . 2.3 Esquema de un …chero para preparar libros. . . . . . . . . . . . 57 62 3.1 Formato del Datagrama IP. . . . . . . . . . 3.2 Cabecera de una célula ATM. . . . . . . . . 3.3 Diagrama de Contexto del Sistema Actual. 3.4 DFD de Primer Nivel. . . . . . . . . . . . . . . . . 80 82 87 88 Esquema funcional de MPLS. . . . . . . . . . . . . . . . . . . . Componente de Control y Envío de Etiquetas. . . . . . . . . . . Detalle de la tabla de envío de un LSR. . . . . . . . . . . . . . Ejemplo de envío de un paquete por un LSP. . . . . . . . . . . Estructura de la cabecera genérica MPLS. . . . . . . . . . . . Ejemplo de las distribución de etiquetas. . . . . . . . . . . . . . Distribución DownStream bajo demanda. . . . . . . . . . . . . DownStream sin Solicitar . . . . . . . . . . . . . . . . . . . . . Funcionamiento de los LSP. . . . . . . . . . . . . . . . . . . . . Comparación entre camino más corto IGP con Ingienería de Trá…co. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.11 Modelo “superpuesto” (túneles/PVCs) vs. modelo “acoplado” (MPLS). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103 105 106 107 107 116 117 117 122 145 5.1 Diagrama de Contexto del Nuevo 5.2 Diagrama de Nivel Superior. . . . 5.3 Entrada de Datos Genéricos. . . 5.4 Datos de la tabla NHLFE. . . . . 149 150 164 164 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.1 4.2 4.3 4.4 4.5 4.6 4.7 4.8 4.9 4.10 xi Sistema. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44 140 xii ÍNDICE DE FIGURAS 5.5 Disposición de la red del Ejemplo 1. . . . . . . . . . . . . . . . 185 5.6 Disposición de la red del Ejemplo 2. . . . . . . . . . . . . . . . 195 5.7 Disposición de la red del Ejemplo 3. . . . . . . . . . . . . . . . 202 6.1 6.2 6.3 6.4 6.5 6.6 6.7 6.8 6.9 6.10 6.11 6.12 6.13 6.14 6.15 Disposición de las ventanas. . . . . Menú Archivo. . . . . . . . . . . . Submenú Guardar. . . . . . . . . . Submenú Posiciones. . . . . . . . . Mensaje de Error. . . . . . . . . . Datos de los nodos internos. . . . . Datos de los nodos externos. . . . . Submenú Enlaces. . . . . . . . . . Ventana de Enlaces. . . . . . . . . Submenú Tabla LIB. . . . . . . . . Datos de Entrada de la LIB: . . . . Información de Salida. . . . . . . . Información general. . . . . . . . . Submenú Tabla de Ruteo. . . . . . Información de la Tabla de Ruteo. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 216 216 217 218 219 219 220 221 221 222 223 224 224 225 226 Índice de Tablas 1.1 1.2 1.3 1.4 1.5 1.6 2.1 Tipos de Variables. . . . . . . . Categorías de Variables. . . . . Tipos Primitivos de Variables. . Operadores de asignación. . . . Operadores relacionales. . . . . Precedencia de Operadores. . . Programas LaTeX. . 2.2 Programas LaTeX. . 5.1 5.2 5.3 5.4 5.5 5.6 5.7 5.8 5.9 5.10 5.11 5.12 5.13 5.14 5.15 5.16 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . implicados en la preparación de un documento . . . . . . . . . . . . . . . . . . . . . . . . . . . implicados en la preparación de un documento . . . . . . . . . . . . . . . . . . . . . . . . . . . Dirección IP. . . . . . . . . . Pre…jo de Dirección. . . . . . Siguiente Salto. . . . . . . . . Etiqueta de Entrada. . . . . . Etiqueta de Salida. . . . . . . Clase de Envio Equivalente. . Número Interfaz Salida. . . . Número Interfaz Entrada. . . Interfaz de Entrada. . . . . . Interfaz de Salida. . . . . . . Número Interfaz de Salida. . Número Interfaz de Entrada. Interfaz de Entrada. . . . . . Interfaz de Salida. . . . . . . Etiqueta de Entrada. . . . . . Etiqueta de Salida. . . . . . . . . . . . . . . . . . . . . . . xiii . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . con . . . con . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 12 12 14 16 18 42 52 156 156 156 156 157 157 157 157 158 158 158 158 159 159 159 159 Capítulo 1 Java 1.1 Introducción al Lenguaje Java es un lenguaje orientado a objetos. Esto signi…ca que posee ciertas características que hoy día se consideran estándares en los lenguajes OO: ² Objetos ² Clases ² Métodos ² Subclases ² Herencia simple ² Enlace dinámico ² Encapsulamiento Para programar orientado a objetos es necesario primero diseñar un conjunto de clases. La claridad, e…ciencia y mantenibilidad del programa resultante dependerá principalmente de la calidad del diseño de clases. Un buen diseño de clases signi…cará una gran economía en tiempo de desarrollo y mantención. Lamentablemente se necesita mucha habilidad y experiencia para lograr diseños de clases de calidad. Un mal diseño de clases puede llevar a programas OO de peor calidad y de más alto costo que el programa equivalente no OO. 1 2 CAPÍTULO 1. JAVA Por qué entonces la ventaja de programar en un lenguaje OO, si se requiere una experiencia que probablemente una persona nunca tendrá el tiempo de práctica para llegar a obtenerla. La respuesta a este interrogante es que Java es un lenguaje multiparadigma (como muchos otros lenguajes de programación). No se necesita hacer un diseño de clases para programar una aplicación de mil líneas. Entonces otro interrogante podrá ser porque no programar con otro lenguaje más simples, como puede ser Visual Basic, si no se necesita que sea OO. La respuesta a ésto es la gran ventaja de un lenguaje OO, que son las bibliotecas de clases que se pueden construir para la aplicación. Una biblioteca de clases cumple el mismo objetivo de una biblioteca de procedimientos en una lenguaje como C. Sin embargo: Una biblioteca de clases es mucho más fácil de usar que una biblioteca de procedimientos, incluso para programadores sin experiencia en orientación a objetos. Esto se debe a que las clases ofrecen mecanismos de abstracción más e…caces que los procedimientos. Se puede distinguir entre varios tipos de programadores en Java: – El diseñador de clases: Es el encargado de de…nir qué clases ofrece una biblioteca y cuál es la funcionalidad que se espera de estas clases. Esta persona tiene que ser muy hábil y de mucha experiencia. Un diseño equivocado puede conducir a clases que son incomprensibles para los clientes de la biblioteca. – El programador de clases de biblioteca: Sólo programa la clases especi…cadas por el diseñador de clases. Esta persona debe entender orientación a objetos, pero no requiere mayor experiencia en diseño de clases. – El cliente de bibliotecas: Es el programador de aplicaciones. Él sólo usa las clases que otros han diseñado y programado. Como en el caso anterior necesita entender orientación a objetos y conocer la biblioteca que va usar, pero no necesita mayor experiencia. Tanto programadores de clases como clientes de bibliotecas pueden llegar a convertirse en buenos diseñadores de clases en la medida que adquieran experiencia, comparando los diseños de las bibliotecas que utilicen. Por lo tanto es importante destacar que no se necesita gran experiencia en diseño orientado a objetos para poder aprovechar las ventajas de la orientación 1.1. INTRODUCCIÓN AL LENGUAJE 3 a objetos. 1.1.1 Bibliotecas de Clases Estándares de Java Toda implementación de Java debe tener las siguientes bibliotecas de clases: ² Manejo de archivos ² Comunicación de datos ² Acceso a la red internet ² Acceso a bases de datos ² Interfaces grá…cas La interfaz de programación de estas clases es estándar, es decir en todas ellas las operaciones se invocan con el mismo nombre y los mismos argumentos. 1.1.2 Java es Multiplataforma Los programas en Java pueden ejecutarse en cualquiera de las siguientes plataformas, sin necesidad de hacer cambios: Windows/95 y /NT. Power/Mac. Unix (Solaris, Silicon Graphics, ...). La compatibilidad es total: A nivel de fuentes: El lenguaje es exactamente el mismo en todas las plataformas. A nivel de bibliotecas: En todas las plataformas están presentes las mismas bibliotecas estándares. A nivel del código compilado: el código intermedio que genera el compilador es el mismo para todas las plataformas. Lo que cambia es el intérprete del código intermedio. 4 CAPÍTULO 1. JAVA 1.1.3 Características del Lenguaje Java ² Robustez En Java no se pueden cometer los 4 errores que se mencionarán a continuación: Java siempre chequea los índices al acceder a un arreglo. Java realiza chequeo de tipos durante la compilación (al igual que C). En una asignación entre punteros el compilador veri…ca que los tipos sean compatibles. Además, Java realiza chequeo de tipos durante la ejecución (cosa que C y C++ no hacen). Cuando un programa usa un cast para acceder a un objeto como si fuese de un tipo especí…co, se veri…ca durante la ejecución que el objeto en cuestión sea compatible con el cast que se le aplica. Si el objeto no es compatible, entonces se levanta una excepción que informa al programador la línea exacta en donde está la fuente del error. Java posee un recolector de basuras que administra automáticamente la memoria. Es el recolector el que determina cuando se puede liberar el espacio ocupado por un objeto. El programador no puede liberar explícitamente el espacio ocupado por un objeto. Java no posee aritmética de punteros, porque es una propiedad que no se necesita para programar aplicaciones. En C sólo se necesita la aritmética de punteros para programa malloc/free o para programar el núcleo del sistema operativo. Por lo tanto Java no es un lenguaje para hacer sistemas operativos o administradores de memoria, pero sí es un excelente lenguaje para programar aplicaciones. ² Flexibilidad Java combina ‡exibilidad, robustez y legibilidad gracias a una mezcla de chequeo de tipos durante la compilación y durante la ejecución. En Java se pueden tener punteros a objetos de un tipo especí…co y también se pueden tener punteros a objetos de cualquier tipo. Estos punteros se pueden convertir 1.1. INTRODUCCIÓN AL LENGUAJE 5 a punteros de un tipo especí…co aplicando un cast, en cuyo caso se chequea en tiempo de ejecución de que el objeto sea de un tipo compatible. El programador usa entonces punteros de tipo especí…co en la mayoría de los casos con el …n de ganar legibilidad y en unos pocos casos usa punteros a tipos desconocidos cuando necesita tener ‡exibilidad. Por lo tanto Java combina la robustez de Pascal con la ‡exibilidad de Lisp, sin que lo programas pierdan legibilidad en ningún caso. ² Administración Automática de la Memoria En Java los programadores no necesitan preocuparse de liberar un trozo de memoria cuando ya no lo necesitan. Es el recolector de basuras el que determina cuando se puede liberar la memoria ocupada por un objeto. Un recolector de basuras es un gran aporte a la productividad. Se ha estudiado en casos concretos que los programadores han dedicado un 40% del tiempo de desarrollo a determinar en qué momento se puede liberar un trozo de memoria. Además este porcentaje de tiempo aumenta a medida que aumenta la complejidad del software en desarrollo. Es relativamente sencillo liberar correctamente la memoria en un programa de 1000 líneas. Sin embargo, es difícil hacerlo en un programa de 10000 líneas. Y se puede postular que es imposible liberar correctamente la memoria en un programa de 100000 líneas. Para entender mejor esta a…rmación, se podría suponer que se realizó un programa de 1000 líneas hace un par de meses y ahora se necesita hacer algunas modi…caciones. Ahora, para esta altura ya se habrán olvidado gran parte de los detalles de la lógica de ese programa y no será sencillo determinar si un puntero referencia un objeto que todavía existe, o si ya fue liberado. Peor aún, supóngase que el programa fue hecho por otra persona y evalúe cuán probable es cometer errores de memoria al tratar de modi…car ese programa. Volviendo al caso de un programa de 100000 líneas. Este tipo de programas los desarrolla un grupo de programadores que pueden tomar años en terminarlo. Cada programador desarrolla un módulo que eventualmente utiliza objetos de otros módulos desarrollados por otros programadores. Entonces, quién libera la memoria de estos objetos, cómo se ponen de acuerdo los programadores sobre cuándo y quién libera un objeto compartido, o cómo probar el programa completo ante las in…nitas condiciones de borde que pueden existir 6 CAPÍTULO 1. JAVA en un programa de 100000 líneas. Es inevitable que la fase de prueba dejará pasar errores en el manejo de memoria que sólo serán detectados más tarde por el usuario …nal. Probablemente se incorporan otros errores en la fase de mantención. Resumiendo, se puede concluir que: todo programa de 100000 líneas que libera explícitamente la memoria tiene errores latentes, sin un recolector de basuras no hay verdadera modularidad y un recolector de basuras resuelve todos los problemas de manejo de memoria en forma trivial. El interrogante sería cuál es el impacto de un recolector de basura en el desempeño de un programa. El sobrecosto de la recolección de basuras no es superior al 100%. Es decir si se tiene un programa que libera explícitamente la memoria y que toma tiempo X, el mismo programa modi…cado de modo que utilice un recolector de basuras para liberar la memoria tomará un tiempo no superior a 2X. Este sobrecosto no es importante si se considera el periódico incremento en la velocidad de los procesadores. El impacto que un recolector de basura en el tiempo de desarrollo y en la con…abilidad del software. 1.2 Estructura General de un Programa Java En el siguiente ejemplo se presenta la estructura habitual de un programa realizado en cualquier lenguaje orientado a objetos u OOP (Object Oriented Programming), y en particular en el lenguaje Java. import java.awt.*; import java.lang.String; import java.lang.Integer; import java.awt.event.WindowEvent; import java.util.*; import java.awt.TextField; public class Simu extends Frame implements ActionListener,ItemListener{ MenuBar barra; 1.3. CONCEPTOS BÁSICOS 7 m1 =new Menu(“Archivo”); barra.add(m1); m2 =new Menu(“Ver”); barra.add(m2); .... public static void main(String argv [ ]){ Simu menus = new Simu(); menus.setTitle(“Simulación de Redes Neuronales”); menus.setVisible(true); } } Aparece una clase que contiene el programa principal Simu (aquel que contiene la función main()) y algunas clases de usuario (las especí…cas de la aplicación que se está desarrollando) que son utilizadas por el programa principal. La aplicación se ejecuta por medio del nombre de la lase que contiene la función main(). Las clases de Java se agrupan en packages, que son librerías de clases. Si las clases no se de…nen como pertenecientes a un package, se utiliza un package por defecto (default) que es el directorio activo. 1.3 1.3.1 Conceptos Básicos Clase Una clase es una agrupación de datos (variables o campos) y de funciones (métodos) que operan sobre esos datos. A estos datos y funciones pertenecientes a una clase se les denomina variables y métodos o funciones miembro. La programación orientada a objetos se basa en la programación de clases. Un programa se construye a partir de un conjunto de clases. Una vez de…nida e implementada una clase, es posible declarar elementos de esta clase de modo similar a como se declaran las variables del lenguaje (int, double, String). Los elementos declarados de una clase se denominan objetos de la clase. De una única clase se pueden declarar o crear numerosos objetos. La clase es lo genérico: es el patrón o modelo para crear objetos. Cada objeto 8 CAPÍTULO 1. JAVA tiene sus propias copias de las variables miembro, con sus propios valores, en general distintos de los demás objetos de la clase. Las clases pueden tener variables static, que son propias de la clase y no de cada objeto. Ejemplo: public abstract class FuncionActivacion implements Cloneable,Serializable{ /*constructor sin argumentos que permite la herencia */ public FuncionActivacion () { } } 1.3.2 Herencia La herencia permite que se puedan de…nir nuevas clases basadas en clases existentes, lo cual facilita reutilizar código previamente desarrollado. Si una clase deriva de otra (extends) hereda todas sus variables y métodos. La clase derivada puede añadir nuevas variables y métodos y/o rede…nir las variables y métodos heredados. En Java, a diferencia de otros lenguajes orientados a objetos, una clase sólo puede derivar de una única clase, con lo cual no es posible realizar herencia múltiple en base a clases. Sin embargo es posible “simular” la herencia múltiple en base a las interfaces. 1.3.3 Interface Una interface es un conjunto de declaraciones de funciones. Si una clase implementa (implements) una interface, debe de…nir todas las funciones especi…cadas por la interface. Una clase puede implementar más de una interface, representando una forma alternativa de la herencia múltiple. Una interface puede derivar de otra o incluso de varias interfaces, en cuyo caso incorpora todos los métodos de las interfaces de las que deriva. 1.3. CONCEPTOS BÁSICOS 9 Ejemplo: La clase TangenteHiperbolica se extiende de la clase FuncionActivacion que implementa la interface Serializable. /*función de activación tangente hiperbólica */ public class TangenteHiperbolica extends FuncionActivacion implements Serializable{ /*constructor sin argumentos */ public TangenteHiperbolica () { } } 1.3.4 Package Un package es una agrupación de clases. Existen una serie de packages incluidos en el lenguaje. Además el programador puede crear sus propios packages. Todas las clases que formen parte de un package deben estar en el mismo directorio. Los packages se utilizan con las siguientes …nalidades: 1. Para agrupar clases relacionadas. 2. Para evitar con‡ictos de nombres. En caso de con‡icto de nombres entre clases importadas, el compilador obliga a cuali…car en el código los nombres de dichas clases con el nombre del package. 3. Para ayudar en el control de la accesibilidad de clases y miembros. Por las razones citadas, durante la etapa de Diseño del Software desarrollado, se ha decido crear dos paquetes, calculos e interfase, utilizando la sentencia package. package myprojects.simu; import myprojects.calculos.*; import myprojects.interfase.*; 10 CAPÍTULO 1. JAVA 1.3.5 La jerarquía de clases de Java (API) Durante la generación de código en Java, es recomendable y casi necesario tener siempre a la vista la documentación on-line del API de Java 1.1 ó Java 1.2. En dicha documentación es posible ver tanto la jerarquía de clases, es decir la relación de herencia entre clases, como la información de los distintos packages que componen las librerías base de Java. Es importante distinguir entre lo que signi…ca herencia y package. Un package es una agrupación arbitraria de clases, una forma de organizar las clases. La sin embargo consiste en crear nuevas clases en base a otras ya existentes. Las clases incluidas en un package no derivan en general de la misma clase. En la documentación on-line se presentan ambas visiones: “Package Index ” y “Class Hierarchy”. La primera presenta la estructura del API de Java agrupada por packages, mientras que en la segunda aparece la jerarquía de clases. Hay que resaltar el hecho de que todas las clases en Java son derivadas de la clase java.lang.Object, por lo que heredan todos los métodos y variables de ésta. Si se selecciona una clase en particular, la documentación muestra una descripción detallada de todos los métodos y variables de la clase. A su vez muestra su herencia completa (partiendo de la clase java.lang.Object). 1.4 Variables dentro del Lenguaje Java Una variable en Java es un identi…cador que representa una palabra de memoria que contiene información. El tipo de información almacenado en una variable sólo puede ser del tipo con que se declaró esa variable. En Java hay dos tipos principales de variables: 1. Variables de tipos primitivos. Están de…nidas mediante un valor único y almacenan directamente ese valor siempre que pertenezca al rango de ese tipo. Por ejemplo una variable int almacena un valor entero como 1, 2, 0, -1, etc. Esto signi…ca que al asignar una variable entera a otra variable entera, se copia el valor de la primera en el espacio que ocupa la segunda variable. 1.4. VARIABLES DENTRO DEL LENGUAJE JAVA 11 2. Variables referencia. Las variables referencia son referencias o nombres de una información más compleja: arrays u objetos de una determinada clase. Una referencia a un objeto es la dirección de un área en memoria destinada a representar ese objeto. El área de memoria se solicita con el operador new. Al asignar una variable de tipo referencia a objeto a otra variable se asigna la dirección y no el objeto referenciado por esa dirección. Esto signi…ca que ambas variables quedan refenciando el mismo objeto. En Java una variable no puede almacenar directamente un objeto, como ocurre en C y C++. Por lo tanto cuando se dice en Java que una variable es un string, lo que se quiere decir en realidad es que la variable es una referencia a un string. Desde el punto de vista de su papel dentro del programa, las variables pueden ser: 1. Variables miembro de una clase: Se de…nen en una clase, fuera de cualquier método; pueden ser tipos primitivos o referencias. 2. Variables locales: Se de…nen dentro de un método o más en general dentro de cualquier bloque entre llaves {}. Se crean en el interior del bloque y se destruyen al …nalizar dicho bloque. Pueden ser también tipos primitivos o referencias. En la Tabla 1.1 de la pág. 11 se muestra una declaración, el nombre de la variable introducida y el tipo de información que almacena la variable: Declaración int i; String s; int a []; int[]b; Identi…cador i s a b Tipo entero referencia a string referencia a arreglo de enteros referencia a arreglo de enteros Tabla 1.1: Tipos de Variables. En la Tabla 1.2 de la pág. 12 se muestran las dos grandes categorías de tipos para las variables en Java: 12 CAPÍTULO 1. JAVA Tipos Primitivos int, short, byte, long char, boolean ‡oat, double Referencias a Objetos Strings Arreglos otros objetos Tabla 1.2: Categorías de Variables. En la Tabla 1.3de la pág. 12 se indica para cada tipo primitivo el número de bits que se emplea en su representación y el rango de valores que se puede almacenar en las variables de estos tipos. Tipo int short byte long boolean char ‡oat double Bits 32 16 8 64 1 16 32 64 Rango ¡231 ..231 ¡ 1 ¡215 ::215 ¡ 1 ¡27 ::27 ¡ 1 ¡263 ::263 ¡ 1 n/a n/a IEEE IEEE Ejemplos 0,1,5,-120,... 0,1,5,-120,... 0,1,5,-120,... 0,1,5,-120,... false, true ‘a’,‘A’,‘0’,‘*’,... 1.2 1.2 Tabla 1.3: Tipos Primitivos de Variables. Se dice que un tipo A es de mayor rango que un tipo B si A es un superconjunto de B. Esto quiere decir que las variables de tipo B siempre se pueden asignar a variables de tipo A (eventualmente con pérdida de signi…cancia). Por ejemplo int es de mayor rango que short, que a su vez es de mayor rango que byte. Float y double son de mayor rango que int. Double es de mayor rango que ‡oat. Esto se puede quedar resumido de la siguiente manera: double > ‡oat > long > int > short > byte 1.4. VARIABLES DENTRO DEL LENGUAJE JAVA 1.4.1 13 Visibilidad y vida de las variables Se entiende por visibilidad, ámbito o scope de una variable, la parte de la aplicación donde dicha variable es accesible y por lo tanto puede ser utilizada en cualquier expresión. En Java todos las variables deben estar incluidas en una clase. En general las variables declaradas dentro de unas llaves {}, es decir dentro de un bloque, son visibles y existen dentro de estas llaves. Por ejemplo las variables declaradas al principio de una función existen mientras se ejecute la función; las variables declaradas dentro de un bloque if no serán válidas al …nalizar las sentencias correspondientes a dicho if y las variables miembro de una clase (es decir declaradas entre las llaves {} de la clase pero fuera de cualquier método) son válidas mientras existe el objeto de la clase. Las variables miembro de una clase declaradas como public son accesibles a través de una referencia a un objeto de dicha clase utilizando el operador punto (.). Las variables miembro declaradas como private no son accesibles directamente desde otras clases. Las funciones miembro de una clase tienen acceso directo a todas las variables miembro de la clase sin necesidad de anteponer el nombre de un objeto de la clase. Sin embargo las funciones miembro de una clase B derivada de otra A, tienen acceso a todas las variables miembro de A declaradas como public o protected, pero no a las declaradas como private. Una clase derivada sólo puede acceder directamente a las variables y funciones miembro de su clase base declaradas como public o protected. Otra característica del lenguaje es que es posible declarar una variable dentro de un bloque con el mismo nombre que una variable miembro, pero no con el nombre de otra variable local. La variable declarada dentro del bloque oculta a la variable miembro en ese bloque. Para acceder a la variable miembro oculta será preciso utilizar el operador this. Uno de los aspectos más importantes en la programación orientada a objetos (OOP) es la forma en la cual son creados y eliminados los objetos. La forma de crear nuevos objetos es utilizar el operador new. Cuando se utiliza el operador new, la variable de tipo referencia guarda la posición de memoria donde está almacenado este nuevo objeto. Para cada objeto se lleva cuenta de por cuántas variables de tipo referencia es apuntado. La eliminación de los objetos la realiza el denominado garbage collector, quien automáticamente libera o borra la memoria ocupada por un objeto cuando no existe ninguna referencia apuntando a ese objeto. Lo anterior signi…ca que aunque una variable de tipo referencia deje de existir, el objeto al cual apunta no es eliminado si hay otras referencias apuntando a ese mismo objeto. 14 CAPÍTULO 1. JAVA 1.5 Operadores en Java Java es un lenguaje rico en operadores, que son casi idénticos a los de C/C++. Estos operadores se describen brevemente a continuación. 1.5.1 Operadores aritméticos Son operadores binarios (requieren siempre dos operandos) que realizan las operaciones aritméticas habituales: suma (+), resta (-), multiplicación (*), división (/) y resto de la división (%). 1.5.2 Operadores de asignación Los operadores de asignación permiten asignar un valor a una variable. El operador de asignación por excelencia es el operador igual (=). La forma general de las sentencias de asignación con este operador es: variable = expression; Java dispone de otros operadores de asignación. Se trata de versiones abreviadas del operador (=) que realizan operaciones “acumulativas” sobre una variable. La siguiente Tabla 1.4 de la pág. 14, muestra estos operadores y su equivalencia con el uso del operador igual (=). Operador += -= =* =/ %= Utilización op1 + = op2 op1 - = op2 op1 * = op2 op1 / = op2 op1% = op2 ExpresiónEquivalente op1 = op1 + op2 op1 = op1 - op2 op1 = op1 * op2 op1 = op1 / op2 op1 = op1 % op2 Tabla 1.4: Operadores de asignación. 1.5. OPERADORES EN JAVA 1.5.3 15 Operadores unarios Los operadores más (+) y menos (-) unarios sirven para mantener o cambiar el signo de una variable, constante o expresión numérica. Su uso en Java es el estándar de estos operadores. 1.5.4 Operadores incrementales Java dispone del operador incremento (++) y decremento (–). El operador (++) incrementa en una unidad la variable a la que se aplica, mientras que (–) la reduce en una unidad. Estos operadores se pueden utilizar de dos formas: 1. Precediendo a la variable (por ejemplo: ++i). En este caso primero se incrementa la variable y luego se utiliza (ya incrementada) en la expresión en la que aparece. 2. Siguiendo a la variable (por ejemplo: i++). En este caso primero se utiliza la variable en la expresión (con el valor anterior) y luego se incrementa. En muchas ocasiones estos operadores se utilizan para incrementar una variable fuera de una expresión. En este caso ambos operadores son equivalente. Si se utilizan en una expresión más complicada, el resultado de utilizar estos operadores en una u otra de sus formas será diferente. La actualización de contadores en bucles for es una de las aplicaciones más frecuentes de estos operadores. 1.5.5 Operadores relacionales Los operadores relacionales sirven para realizar comparaciones de igualdad, desigualdad y relación de menor o mayor. El resultado de estos operadores es siempre un valor boolean (true o false) según se cumpla o no la relación considerada. La siguiente Tabla 1.5 de la pág. 16 muestra los operadores relacionales de Java. 16 CAPÍTULO 1. JAVA Operador > >= < <= == ! = Utilización op1 > op2 op1 >= op2 op1 < op2 op1 <= op2 op1 == op2 op1 != op2 El resultado es true si op1 es mayor que op2 si op1 es mayor o igual que op2 si op1 es menor que op 2 si op1 es menor o igual que op2 si op1 y op2 son iguales sio p1 y op2 son diferentes Tabla 1.5: Operadores relacionales. Estos operadores se utilizan con mucha frecuencia en las bifurcaciones y en los bucles, que se verán luego. Ejemplo de Operadores Incrementales y Operadores Relacionales en un método. public void cambiarParesEntrenamiento(double[ ] paresEntrenamiento){ /* inicialización de sus valores a partir de los valores pasados como argumentos */ for(int i = 0; i< paresEntrenamiento.length; i++) {for(int j = 0; j< numeroNeuronasEntrada; j++) {entradaEntrenamiento[i][j] = paresEntrenamiento[i][j]; } for(int j = 0; j< numeroSalidas; j++) {salidaEntrenamiento[i][j] = paresEntrenamiento[i][j+numeroNeuronasEntrada]; } } } 1.6. ESTRUCTURAS DE PROGRAMACIÓN 1.5.6 17 Operador de concatenación de cadenas de caracteres (+) El operador más (+) se utiliza también para concatenar cadenas de caracteres. Por ejemplo, para escribir una cantidad con un rótulo puede utilizarse la sentencia: editor.append(“Error Obtenido:” + String.valueOf(imprimoError) + “nn”); editor.append(“Iteraciones:”+ String.valueOf(imprimoIteraciones) + “nn”); editor.append(“Inicio: ” + horaInicial.toString() + “nn”); editor.append(“Final: ” + horaFinal.toString() + “nn”); donde el operador de concatenación se utiliza dos veces para construir la cadena de caracteres que se desea imprimir. Las variables imprimoErrror, imprimoIteraciones, horaInicial, horaFinal son convertidas en cadena de caracteres para poder concatenarlas. 1.5.7 Precedencia de operadores El orden en que se realizan las operaciones es fundamental para determinar el resultado de una expresión. Por ejemplo, el resultado de x/y*z depende de qué operación (la división o el producto) se realice primero. La Tabla 1.6 de la pág. 18 muestra el orden en que se ejecutan los distintos operadores en una sentencia, de mayor a menor precedencia: En Java, todos los operadores binarios, excepto los operadores de asignación, se evalúan de izquierda a derecha. Los operadores de asignación se evalúan de derecha a izquierda, lo que signi…ca que el valor de la izquierda se copia sobre la variable de la derecha. 1.6 Estructuras de Programación Las estructuras de programación o estructuras de control permiten tomar decisiones y realizar un proceso repetidas veces. Son los denominados bifurcaciones y bucles. En la mayoría de los lenguajes de programación, este tipo de 18 CAPÍTULO 1. JAVA Nombre Post…jos Unarios De creación Multiplicativo Adición Shift Relacional Igualdad AND Or Excluyente Or Incluyente Logico AND Logico OR Condicional Asignación Sintáxis [ ] .(params) expr++ expr++expr –expr +expr -expr ! (type) expr */% +<< >> >>> <> <= >= instanceof == ! = & ^ j && jj ?: = += -= *= /= %= &= ^= j= <<= >>= >>>= Tabla 1.6: Precedencia de Operadores. estructuras son comunes en cuanto a concepto, aunque su sintaxis varía de un lenguaje a otro. La sintaxis de Java coincide prácticamente con la utilizada en C/C++, lo que hace que para un programador de C/C++ no suponga ninguna di…cultad adicional. 1.6.1 Sentencias o expresiones Una expresión es un conjunto variables unidos por operadores. Son órdenes que se le dan al computador para que realice una tarea determinada. Una sentencia es una expresión que acaba en punto y coma (;). Se permite incluir varias sentencias en una línea, aunque lo habitual es utilizar una línea para cada sentencia. A continuación se muestra un ejemplo de una línea compuesta de tres sentencias: i = 0; j = 5; x = i + j; 1.6. ESTRUCTURAS DE PROGRAMACIÓN 1.6.2 19 Comentarios Existen dos formas diferentes de introducir comentarios entre el código de Java (en realidad son tres, como pronto se verá). Son similares a la forma de realizar comentarios en el lenguaje . Los comentarios son tremendamente útiles para poder entender el código utilizado, facilitando de ese modo futuras revisiones y correcciones. Además permite que cualquier persona distinta al programador original pueda comprender el código escrito de una forma más rápida. Se recomienda acostumbrarse a comentar el código desarrollado. De esta forma se simpli…ca también la tarea de estudio y revisión posteriores. Java interpreta que todo lo que aparece a la derecha de dos barras “// ” en una línea cualquiera del código es un comentario del programador y no lo tiene en cuenta. El comentario puede empezar al comienzo de la línea o a continuación de una instrucción que debe ser ejecutada. La segunda forma de incluir comentarios consiste en escribir el texto entre los símbolos “ /* */ ”. Este segundo método es válido para comentar más de una línea de código. Por ejemplo: // Esta línea es un comentario int a=1; // Comentario a la derecha de una sentencia // Esta es la forma de comentar más de una línea utilizando // las dos barras. Requiere incluir dos barras al comienzo de cada línea /* Esta segunda forma es mucho más cómoda para comentar un número elevado de líneas ya que sólo requiere modi…car el comienzo y el …nal. */ En Java existe además una forma especial de introducir los comentarios (utilizando /***/ más algunos caracteres especiales) que permite generar automáticamente la documentación sobre las clases y packages desarrollados por el programador. Una vez introducidos los comentarios, el programa javadoc.exe (incluido en el JDK) genera de forma automática la información de forma similar a la presentada en la propia documentación del JDK. La sintaxis de estos comentarios y la forma de utilizar el programa javadoc.exe se puede encontrar en la información que viene con el JDK. 20 CAPÍTULO 1. JAVA 1.6.3 Bifurcaciones Las bifurcaciones permiten ejecutar una de entre varias acciones en función del valor de una expresión lógica o relacional. Se tratan de estructuras muy importantes ya que son las encargadas de controlar el ‡ujo de ejecución de un programa. Se exponen dos variantes del de tipo if. Bifurcación if Esta estructura permite ejecutar un conjunto de sentencias en función del valor que tenga la expresión de comparación. Ejemplo: se ejecuta si la expresión de comparación (error < errorMinimo) tiene valor true: protected void comprobarNuevoMinimo() { if (error < errorMinimo) {errorMinimo = error; vectorDisMinimo = (double[ ])(vectorDis.clone()); } /* …n del if */ } Las llaves {} sirven para agrupar en un bloque las sentencias que se han de ejecutar, y no son necesarias si sólo hay una sentencia dentro del if. Bifurcación if else Análoga a la anterior, de la cual es una ampliación. Las sentencias incluidas en el else se ejecutan en el caso de no cumplirse la expresión de comparación (false), Ejemplo: public double decirSalidaActual(int indiceEtapa) { if(pila != null) {return pila[indiceEtapa];} 1.6. ESTRUCTURAS DE PROGRAMACIÓN 21 else {System.out.println(“Fallo: Pila no creada”); return 0; } } 1.6.4 Bucles Un bucle se utiliza para realizar un proceso repetidas veces. Se denomina también lazo o loop. El código incluido entre las llaves {} (opcionales si el proceso repetitivo consta de una sola línea), se ejecutará mientras se cumpla unas determinadas condiciones. Hay que prestar especial atención a los bucles in…nitos, hecho que ocurre cuando la condición de …nalizar el bucle (booleanExpression) no se llega a cumplir nunca. Se trata de un fallo muy típico, habitual sobre todo entre programadores poco experimentados. Bucle while En el siguiente ejemplo se muestra que se ejecutará la sentencia …n++ mientras la expresión (capas.charAt(…n)!=‘,’ && capas.charAt(…n)!=-1) sea verdadera. for (int j=0; j < numeroCapas; j++) {int …n = principio; try { while (capas.charAt(…n) != ‘,’ && capas.charAt(…n) != -1) {…n++; } } } Bucle for A continuación se podrá apreciar la utilización del bucle for: 22 CAPÍTULO 1. JAVA /* calcular el nuevo vector de diseño */ for (int i = 0; i < vectorDis.length; i++) {vectorDis[i] = vectorDis[i] + learningRate * S[i]; } La sentencia int i = 0 (inicialización) se ejecuta al comienzo del for, e i++ (incremento) después de vectorDis[i] = vectorDis[i] + learningRate * S[i] (sentencia). La expresión booleana (vectorDis.length) se evalúa al comienzo de cada iteración; el bucle termina cuando la expresión de comparación toma el valor false. Bucle do while Es similar al bucle while pero con la particularidad de que el control está al …nal del bucle (lo que hace que el bucle se ejecute al menos una vez, independientemente de que la condición se cumpla o no). Una vez ejecutados las sentencias, se evalúa la condición: si resulta true se vuelven a ejecutar las sentencias incluidas en el bucle, mientras que si la condición se evalúa a false …naliza el bucle. do{ /* calcular el gradiente del vector …jar el vector de diseño */ problema.…joVector(vectorDis); /* incrementar el contador de iteraciones*/ step++; } while (error > errorDeseado && step < iteracionesMaximas); /* ... hasta que el error sea menor o igual que el deseado o */ /* se alcance el número de iteraciones pasado como argumento */ problema.…joVector(vectorDis); 1.6. ESTRUCTURAS DE PROGRAMACIÓN 23 Sentencia return Una forma de salir de un bucle es utilizar la sentencia return. Esta sentencia sale también de un método o de una función. En el caso de que la función devuelva alguna variable, este valor se deberá poner a continuación del return. public double devuelveErrorMinimo() {return errorMinimo; } Bloque try{...} catch{...} …nally{...} Java incorpora en el propio lenguaje la gestión de errores. El mejor momento para detectar los errores es durante la compilación. Sin embargo prácticamente sólo los errores de sintaxis son detectados en esta operación. El resto de problemas surgen durante la ejecución de los programas. En el lenguaje Java, una Exception es un cierto tipo de error o una condición anormal que se ha producido durante la ejecución de un programa. Algunas excepciones son fatales y provocan que se deba …nalizar la ejecución del programa. En este caso conviene terminar ordenadamente y dar un mensaje explicando el tipo de error que se ha producido. Otras excepciones, como por ejemplo no encontrar un …chero en el que hay que leer o escribir algo, pueden ser recuperables. En este caso el programa debe dar al usuario la oportunidad de corregir el error (dando por ejemplo un nuevo path del …chero no encontrado). Los errores se representan mediante clases derivadas de la clase Throwable, pero los que tiene que chequear un programador derivan de Exception (java.lang.Exception que a su vez deriva de Throwable). Existen algunos tipos de excepciones que Java obliga a tener en cuenta. Esto se hace mediante el uso de bloques try ,catch y …nally. El código dentro del bloque try está “vigilado”: Si se produce una situación anormal y se lanza como consecuencia una excepción, el control pasa al bloque catch que se hace cargo de la situación y decide lo que hay que hacer. Se pueden incluir tantos bloques catch como se desee, cada uno de los cuales tratará un tipo de excepción. Finalmente, si está presente, se ejecuta el bloque …nally, 24 CAPÍTULO 1. JAVA que es opcional, pero que en caso de existir se ejecuta siempre, sea cual sea el tipo de error. En el caso en que el código de un método pueda generar una Exception y no se desee incluir en dicho método la gestión del error (es decir los bucles try /catch correspondientes), es necesario que el método pase la Exception al método desde el que ha sido llamado. Esto se consigue mediante la adición de la palabra throws seguida del nombre de la Exception concreta, después de la lista de argumentos del método. A su vez el método superior deberá incluir los bloques try/catch o volver a pasar la Exception. De esta forma se puede ir pasando la Exception de un método a otro hasta llegar al último método del programa, el método main(). 1.7 Clases en Java Las clases son el centro de la Programación Orientada a Objetos (OOP Object Oriented Programming). Algunos conceptos importantes de la POO son los siguientes: 1. Encapsulación: Las clases pueden ser declaradas como públicas (public) y como package (accesibles sólo para otras clases del package). Las variables miembro y los métodos pueden ser public, private, protected y package. De esta forma se puede controlar el acceso y evitar un uso inadecuado. 2. Herencia: Una clase puede derivar de otra (extends), y en ese caso hereda todas sus variables y métodos. Una clase derivada puede añadir nuevas variables y métodos y/o rede…nir las variables y métodos heredados. 3. Polimor…smo: Los objetos de distintas clases pertenecientes a una misma jerarquía o que implementan una misma interface pueden tratarse de una forma general e individualizada, al mismo tiempo. Esto facilita la programación y el mantenimiento del código. 1.7.1 Características importantes de las clases A continuación se enumeran algunas características importantes de las clases: 1.7. CLASES EN JAVA 25 1. Todas las variables y funciones de Java deben pertenecer a una clase. No hay variables y funciones globales. 2. Si una clase deriva de otra (extends), hereda todas sus variables y métodos. 3. Java tiene una jerarquía de clases estándar de la que pueden derivar las clases que crean los usuarios. 4. Una clase sólo puede heredar de una única clase (en Java no hay herencia múltiple). Si al de…nir una clase no se especi…ca de qué clase deriva, por defecto la clase deriva de Object. La clase Object es la base de toda la jerarquía de clases de Java. 5. En un …chero se pueden de…nir varias clases, pero en un …chero no puede haber más que una clase public. Este …chero se debe llamar como la clase public que contiene con extensión *.java. Con algunas excepciones, lo habitual es escribir una sola clase por …chero. 6. Si una clase contenida en un …chero no es public, no es necesario que el …chero se llame como la clase. 7. Los métodos de una clase pueden referirse de modo global al objeto de esa clase al que se aplican por medio de la referencia this. 8. Las clases se pueden agrupar en packages, introduciendo una línea al comienzo del …chero (package packageName;). Esta agrupación en packages está relacionada con la jerarquía de directorios y …cheros en la que se guardan las clases. 1.7.2 Métodos o Funciones Miembros Métodos de objeto Los métodos son funciones de…nidas dentro de una clase. Salvo los métodos static o de clase, se aplican siempre a un objeto de la clase por medio del operador punto (.). Dicho objeto es su argumento implícito. Los métodos pueden además tener otros argumentos explícitos que van entre paréntesis, a continuación del nombre del método. 26 CAPÍTULO 1. JAVA La primera línea de la de…nición de un método se llama declaración o header; el código comprendido entre las llaves {} es el cuerpo o body del método. Considérese el siguiente ejemplo: imprimoError=algor.devuelveErrorMinimo(); public double devuelveErrorMinimo() {return errorMinimo; } La clase Object Como ya se ha dicho, la clase Object es la raíz de toda la jerarquía de clases de Java. Todas las clases de Java derivan de Object. La clase Object tiene métodos interesantes para cualquier objeto que son heredados por cualquier clase. Entre ellos se pueden citar los siguientes: 1. Métodos que pueden ser rede…nidos por el programador: ² clone(): Crea un objeto a partir de otro objeto de la misma clase. El método original heredado de Object lanza una CloneNotSupportedException. Si se desea poder clonar una clase hay que implementar la interface Cloneable y rede…nir el método clone(). Este método debe hacer una copia miembro a miembro del objeto original. No debería llamar al operador new ni a los constructores. ² equals(): Indica si dos objetos son o no iguales. Devuelve true si son iguales, tanto si son referencias al mismo objeto como si son objetos distintos con iguales valores de las variables miembro. ² toString(): Devuelve un String que contiene una representación del objeto como cadena de caracteres, por ejemplo para imprimirlo o exportarlo. ² …nalize(): Este método ya se ha visto al hablar de los …nalizadores. 2. Métodos que no pueden ser rede…nidos (son métodos …nal): ² getClass(): Devuelve un objeto de la clase Class, al cual se le pueden aplicar métodos para determinar el nombre de la clase, su 1.8. ALGUNAS CLASES DE UTILIDAD 27 super-clase, las interfaces implementadas, etc. Se puede crear un objeto de la misma clase que otro sin saber de qué clase es. ² notify(), notifyAll() y wait(): Son métodos relacionados con los threads (hilos). 1.8 1.8.1 Algunas Clases de Utilidad Clase Arrays Los arrays de Java (vectores, matrices, hiper-matrices de más de dos dimensiones) se tratan como objetos de una clase prede…nida. Los arrays son objetos, pero con algunas características propias. Los arrays pueden ser asignados a objetos de la clase Object y los métodos de Object pueden ser utilizados con arrays. Algunas de sus características más importantes de los arrays son las siguientes: 1. Los arrays se crean con el operador new seguido del tipo y número de elementos. 2. Se puede acceder al número de elementos de un array con la variable miembro implícita length (por ejemplo, vect.length). 3. Se accede a los elementos de un array con los corchetes [ ] y un índice que varía de 0 a length-1. 4. Se pueden crear arrays de objetos de cualquier tipo. En principio un array de objetos es un array de referencias que hay que completar llamando al operador new. 5. Los elementos de un array se inicializan al valor por defecto del tipo correspondiente (cero para valores numéricos, la cadena vacía para Strings, false para boolean, null para referencias). 6. Como todos los objetos, los arrays se pasan como argumentos a los métodos por referencia. 7. Se pueden crear arrays anónimos (por ejemplo, crear un nuevo array como argumento actual en la llamada a un método). 28 CAPÍTULO 1. JAVA Inicialización de arrays Los arrays se pueden inicializar con valores entre llaves {...} separados por comas. También los arrays de objetos se pueden inicializar con varias llamadas a new dentro de unas llaves {...}. Si se igualan dos referencias a un array no se copia el array, sino que se tiene un array con dos nombres, apuntando al mismo y único objeto. Ejemplo de creación de una referencia a un array: /*vector de pesos */ public double[ ] pesos; También existen arrays bidimensionales, que se crean de un modo muy similar al de C++ (con reserva dinámica de memoria). En Java una matriz es un vector de vectores …la, o más en concreto un vector de referencias a los vectores …la. Con este esquema, cada …la podría tener un número de elementos diferente. Una matriz se puede crear directamente en la siguiente forma: /*vector de las entradas de los pares de entrenamiento*/ protected double[ ][ ] entradaEntrenamiento; 1.8.2 Clases String y StringBu¤er Las clases String y StringBu¤er están orientadas a manejar cadenas de caracteres. La clase String está orientada a manejar cadenas de caracteres constantes, es decir, que no pueden cambiar. La clase StringBu¤er permite que el programador cambie la cadena insertando, borrando, etc. La primera es más e…ciente, mientras que la segunda permite más posibilidades. Ambas clases pertenecen al package java.lang, y por lo tanto no hay que importarlas. Hay que indicar que el operador de concatenación (+) entre objetos de tipo String utiliza internamente objetos de la clase StringBu¤er y el método append(). 1.8. ALGUNAS CLASES DE UTILIDAD 29 Los métodos de String se pueden utilizar directamente sobre literals (cadenas entre comillas), como por ejemplo: “Hola”.length(). Métodos de la clase String Algunos métodos de String y la función que realizan: ² String(...): Constructores para crear Strings a partir de arrays de bytes o de caracteres. ² String(String str) yString(StringBu¤er sb): Costructores a partir de un objeto String o StringBu¤er. ² charAt(int): Devuelve el carácter en la posición especi…cada. ² getChars(int, int, char[ ], int): Copia los caracteres indicados en la posición indicada de un array de caracteres. ² length(): Devuelve el número de caracteres de la cadena. ² toLowerCase(): Convierte en minúsculas (puede tener en cuenta el locale). ² toUpperCase(): Convierte en mayúsculas (puede tener en cuenta el locale). ² valueOf(): Devuelve la representación como String de sus argumento. Admite Object, arrays de caracteres y los tipos primitivos. 1.8.3 Clase Double La clase java.lang.Double deriva de Number, que a su vez deriva de Object. Esta clase contiene un valor primitivo de tipo double. Algunos métodos de la clase Double ² Double(double) y Double(String): Los constructores de esta clase. ² doubleValue(), ‡oatValue(), longValue(), intValue(), shortValue(), byteValue(): Métodos para obtener el valor del tipo primitivo. 30 CAPÍTULO 1. JAVA ² String toString(), Double valueOf(String): Conversores con la clase String. ² isIn…nite(), isNaN(): Métodos de chequear condiciones. ² equals(Object): Compara con otro objeto. 1.8.4 Clase Integer La clase java.lang.Integer tiene como variable miembro un valor de tipo int. Algunos métodos de la clase Integer ² Integer(int) y Integer(String): Constructores de la clase. ² doubleValue(), ‡oatValue(), longValue(),intValue(), shortValue(), byteValue(): Conversores con otros tipos primitivos. ² Integer decode(String), Integer parseInt(String), String toString(), Integer ValueOf(String): Conversores con String del sistema a partir del nombre de dicha propiedad. 1.9 1.9.1 El AWT (Abstract Windows Toolkit) Qué es el AWT El AWT (Abstract Windows Toolkit) es la parte de Java que se ocupa de construir interfaces grá…cas de usuario. Aunque el AWT ha estado presente en Java desde la versión 1.0, la versión 1.1 representó un cambio notable, sobre todo en lo que respecta al modelo de eventos. La versión 1.2 ha incorporado un modelo distinto de componentes llamado Swing, que también está disponible en la versión 1.1 como package adicional. 1.9.2 Creación de una Interface Grá…ca de Usuario Para construir una interface grá…ca de usuario hace falta: 1.9. EL AWT (ABSTRACT WINDOWS TOOLKIT) 31 1. Un “contenedor” o container, que es la ventana o parte de la ventana donde se situarán los componentes (botones, barras de desplazamiento, etc.) y donde se realizarán los dibujos. Se correspondería con un formulario o una picture box de Visual Basic. 2. Los componentes: menús, botones de comando, barras de desplazamiento, cajas y áreas de texto, botones de opción y selección, etc. Se corresponderían con los controles de Visual Basic. 3. El modelo de eventos. El usuario controla la aplicación actuando sobre los componentes, de ordinario con el ratón o con el teclado. Cada vez que el usuario realiza una determinada acción, se produce el evento correspondiente, que el sistema operativo transmite al AWT. El AWT crea un objeto de una determinada clase de evento, derivada de AWTEvent. Este evento es transmitido a un determinado método para que lo gestione. En Visual Basic el entorno de desarrollo crea automáticamente el procedimiento que va a gestionar el evento (uniendo el nombre del control con el tipo del evento mediante el carácter _ ) y el usuario no tiene más que introducir el código. En Java esto es un poco más complicado: el componente u objeto que recibe el evento debe “registrar” o indicar previamente qué objeto se va a hacer cargo de gestionar ese evento. 1.9.3 Objetos “event source” y objetos “event listener” El modelo de eventos de Java está basado en que los objetos sobre los que se producen los eventos (event sources) “registran” los objetos que habrán de gestionarlos (event listeners), para lo cual los event listeners habrán de disponer de los métodos adecuados. Estos métodos se llamarán automáticamente cuando se produzca el evento. La forma de garantizar que los event listeners disponen de los métodos apropiados para gestionar los eventos es obligarles a implementar una determinada interface Listener. Las interfaces Listener se corresponden con los tipos de eventos que se pueden producir. Las capacidades grá…cas del AWT resultan pobres y complicadas en comparación con lo que se puede conseguir con Visual Basic, pero tienen la ventaja de poder ser ejecutadas casi en cualquier ordenador y con cualquier sistema operativo. 32 CAPÍTULO 1. JAVA 1.9.4 Proceso a seguir para crear una aplicación interactiva (orientada a eventos) Pasos que se pueden seguir para construir una aplicación orientada a eventos sencilla, con interface grá…ca de usuario: 1. Determinar los componentes que van a constituir la interface de usuario (botones, cajas de texto, menús, etc.). 2. Crear una clase para la aplicación que contenga la función main(). 3. Crear una clase Ventana, sub-clase de Frame, que responda al evento WindowClosing(). 4. La función main() deberá crear un objeto de la clase Ventana (en el que se van a introducir las componentes seleccionadas) y mostrarla por pantalla con el tamaño y posición adecuados. 5. Añadir al objeto Ventana todos los componentes y menús que deba contener. 6. De…nir los objetos Listener (objetos que se ocuparán de responder a los eventos, cuyas clases implementan las distintas interfaces Listener) para cada uno de los eventos que deban estar soportados. En aplicaciones pequeñas, el propio objeto Ventana se puede ocupar de responder a los eventos de sus componentes. En programas más grandes se puede crear uno o más objetos de clases especiales para ocuparse de los eventos. 7. Finalmente, se deben implementar los métodos de las interfaces Listener que se vayan a hacer cargo de la gestión de los eventos. En la aplicación se podrá observar la gran variedad de componentes de AWT que se utilizaron. También se acudió a los paquetes de Swing , por ejemplo para la implementación de un hilo en la presentación de la aplicación. El objetivo de este capítulo ha sido brindar nociones leves sobre este lenguaje de programación, mostrando algunos ejemplos que se pueden encontrar en el código fuente de la aplicación. 1.10. ERRORES FRECUENTES DE PROGRAMACIÓN 1.10 33 Errores más Frecuentes en la Programación con Java A continuación se presenta una varios ejemplos de errores, vistos desde el punto de vista de la portabilidad, porque quizá el sine qua non de Java, en última instancia sea perseguir una verdadera independencia de plataforma. Los errores no tienen ningún orden de di…cultad, no son más que algunos de ellos en los que puede caer cualquier programador. Hay muchísimas formas cometer fallos a la hora de programar en Java; algunas se deben simplemente a malos hábitos y son muy difíciles de encontrar, mientras que otros saltan a la vista al instante. Los errores de programación más obvios, también son los que con más frecuencia cometen los programadores. Quizás muchos de los fallos se evitarían si los programadores intentarán aplicar calidad a sus programas desde el momento mismo de concebir el programa, y no la tendencia de aplicar pureza a la aplicación en el último momento. 1.10.1 Scheduling de Hilos de Ejecución El scheduling de los hilos de ejecución, es decir, el tiempo que el sistema destina a la ejecución de cada uno de los hilos de ejecución, puede ser distinto en diferentes plataformas. Si no se tienen en cuenta las prioridades o se deja al azar la prevención de que dos hilos de ejecución accedan a un mismo objeto al mismo tiempo, el programa no será portable. El siguiente programa, por ejemplo, no es portable. class Contador implements Runnable { static long valor = 0; public void run() { valor += 1; 34 CAPÍTULO 1. JAVA } public static void main( String args[] ) { try { Thread hilo1 = new Thread( new Contador() ); hilo1.setPriority( 1 ); Thread hilo2 = new Thread( new Contador() ); hilo2.setPriority( 2 ); hilo1.start(); hilo2.start(); hilo1.join(); hilo2.join(); Systtem.out.println( valor ); } catch( Exception e ) { e.printStackTrace(); } } } Este programa puede no imprimir “2” en todas las plataformas, porque los dos hilos de ejecución no están sincronizados y, desgraciadamente, este es un problema muy profundo y no hay forma de detectar su presencia ni adivinar el momento en que va a ocurrir. Una solución simple, y drástica, es hacer todos los métodos sincronizados. Pero esto también tiene problemas porque puede presentar como puntos sin retorno obvios, lo que en realidad es una corrupción de datos. El scheduling de los hilos de ejecución es uno de los aspectos más problemáticos de la programación Java, porque la naturaleza del problema se vuelve global, al intervenir varios hilos de ejecución. No se puede buscar el problema 1.10. ERRORES FRECUENTES DE PROGRAMACIÓN 35 en una parte del programa, es imprescindible entender y tratar el programa en su globalidad. Además, hay ejemplos de contención de hilos que no serán detectados. Por ejemplo, en la clase Contador anterior no se detectará el problema ya que la contención está en el acceso al campo, en lugar de en el acceso al método. 1.10.2 Errores en el Uso de las Características de Portabilidad de Java Hay características de portabilidad en el API de Java. Es posible, pero menos portable, escribir código que no haga uso de estas características. Muchas de las propiedades del sistema proporcionan información sobre la portabilidad; por ejemplo, se pueden utilizar las propiedades del sistema para conocer cuál es el carácter de…nido como …n de línea o el que se emplea como terminador del archivo, para emplear el adecuado a la plataforma en que se está ejecutando el programa. Java proporciona dos métodos para facilitar la escritura de programas portables en este sentido. Por un lado, utilizar el método println() en vez de imprimir las cadenas seguidas del terminador de cadena embebido; o también, utilizar la expresión System.getProperty(“line.separator”) para conocer cuál es el terminado de línea que se utiliza en la plataforma en que se está ejecutando el programa. En general, el uso de las propiedades facilita en gran modo la portabilidad y debería extenderse su uso siempre que fuese aplicable. 1.10.3 Uso de directorios de…nidos Un error muy común y fácil de cometer entre los programadores, aunque igual de fácil de corregir es la designación en el código de nombre de los archivos, que pueden dar lugar a problemas de portabilidad, pero cuando se añade el directorio en que se sitúan, seguro que estos problemas aparecerán. Estos fallos son más comunes entre programadores con viejos hábitos, que eran dependientes del sistema operativo, y que son difíciles de olvidar. La forma más portable de construir un File para un …chero en un directorio es utilizar el constructor File(File,String). Otra forma sería utilizar las 36 CAPÍTULO 1. JAVA propiedades para conocer cuál es el separador de …cheros y el directorio inicial; o también, preguntarle al operador a través de una caja de diálogo. Otro problema es la noción de camino absoluto, que es dependiente del sistema. En Unix los caminos absolutos empiezan por /, mientras que en Windows pueden empezar por cualquier letra. Por esta razón, el uso de caminos absolutos que no sean dependientes de una entrada por operador o de la consulta de las propiedades del sistema no será portable. El ejemplo siguiente proporciona una clase útil para la construcción de nombres de archivos. La última versión del JDK es mucho más exhaustiva, y detecta más fácilmente los errores cometidos en los directorios y nombres de …cheros. import java.io.File; import java.util.StringTokenizer; public class UtilFichero { /* Crea un nuevo …chero con el nombre de otros. Si la base inicial es * nula, parte del directorio actual */ public static File dirInicial( File base,String path[] ) { File valor = base; int i=0; if( valor == null && path.length == 0 ) { valor = new File( path[i++] ); } for( ; i < path.length; i++ ) { valor = new File( valor,path[i] ); } return( valor ); } 1.10. ERRORES FRECUENTES DE PROGRAMACIÓN public static File desdeOrigen( String path[] ) { return( dirInicial( null,path ) ); } public static File desdeProp( String nombrePropiedad ) { String pd = System.getProperty( nombrePropiedad ); return( new File( pd ) ); } // Utilizando la propiedad del sistema “user.dir” public static File userDir() { return( desdeProp( “user.dir” ) ); } // Utilizando la propiedad del sistema “java.home” public static File javaHome() { return( desdeProp( “java.home” ) ); } // Utilizando la propiedad del sistema “user.home” public static File userHome() { return( desdeProp( “user.home” ) ); } 37 38 CAPÍTULO 1. JAVA /* Separa el primer argumento, utilizando el segundo argumetno como * carácter separador. * Es muy útil a la hora de crear caminos de …cheros portables */ public static String[] split( String p,String sep ) { StringTokenizer st = new StringTokenizer( p,sep ); String valor[] = new String[st.countTokens()]; for( int i=0; i < valor.length; i++ ) { valor[i] = st.nextToken(); } return( valor ); } } 1.10.4 Carga de Drivers JDBC El interfaz JDBC, de…nido por el paquete java.sql, proporciona gran ‡exibilidad a la hora de codi…car la carga del driver JDBC a utilizar. Esta ‡exibilidad permite la sustitución de diferentes drivers sin que haya que modi…car el código, a través de la clase DriverManager, que selecciona entre los drivers disponibles en el momento de establecer la conexión. Los drivers se pueden poner a disposición de DriverManager a través de la propiedad del sistema jdbc.drivers o cargándolos explícitamente usando el método java.lang.Class.forName(). También es posible la carga de una selección de drivers, dejando que el mecanismo de selección de DriverManager encuentre el adecuado en el momento de establecer la conexión con la base de datos. Hay que tener siempre en cuenta los siguientes puntos: 1.10. ERRORES FRECUENTES DE PROGRAMACIÓN 39 ² La prueba de drivers se intenta siempre en el orden en que se han registrado, por lo que los primeros drivers tienen prioridad sobre los últimos cargados, con la máxima prioridad para los drivers listados en jdbc.drivers. ² Un driver que incluya código nativo fallará al cargarlo sobre cualquier plataforma diferente de la que fue diseñado; por lo que el programa deberá recoger la excepción ClassNotFoundException. ² Un driver con código nativo no debe registrarse con DriverManager hasta que no se sepa que la carga ha tenido éxito. ² Un driver con código nativo no está protegido por la caja negra de Java, así que puede presentar potenciales problemas de seguridad. 1.10.5 Terminación de Líneas Las distintas plataformas de sistemas operativos tienen distintas convenciones para la terminación de líneas en un …chero de texto. Por esto debería utilizarse el método println(), o la propiedad del sistema line.separator, para la salida; y para la entrada utilizar los métodos readLine(). Java internamente utiliza Unicode, que al ser un está ndar internacional, soluciona el problema a la hora de codi…car; pero el problema persiste al leer o escribir texto en un archivo. En el JDK 1.1 se utilizan las clases java.io.Reader y java.io.Writer para manejar la conversión del set de caracteres, pero el problema puede surgir cuando se leen o escriben archivos ASCII planos, porque en el ASCII estándar no hay un carácter especí…co para la terminación de líneas; algunas máquinas utilizan nn, otras usan nr, y otras emplean la secuencia nrnn. Enarbolando la bandera de la portabilidad, deberían utilizarse los métodos println() para escribir una línea de texto, o colocar un marcador de …n de línea. También, usar el método readLine() de la clase java.io.Bu¤eredReader para recoger una línea completa de texto. Los otros métodos readLine() son igualmente útiles, pero el de la clase Bu¤eredReader proporciona al código también la traslación. 40 1.10.6 CAPÍTULO 1. JAVA Entrada/Salida por Archivo Las clases de entrada y salida del JDK 1.0 no son protables a plataformas que no soporten formatos nativos de archivos no-ASCII. Es fácil para el programador suponer alegremente que todo el mundo es ASCII. Pero la realidad no es esa, los chinos y los japoneses, por ejemplo, no puedes escribir nada con los caracteres ASCII. Hay que tener esto en cuenta si se quiere que los programas viajen fuera del país propio. 1.10.7 Fuentes de Caracteres El tamaño y disponibilidad de varios tipos de fuentes varía de pantalla a pantalla, incluso en una misma plataforma hardware, dependiendo de la instalación que se haya hecho. Esto es algo que no descali…ca totalmente el programa, porque se verá defectuosamente, pero el programa podrá seguir usándose; pero debería prevenisre, porque se presupone que el programador desea que su software aparezca de la mejor manera posible en cualquier plataforma. El modo mejor de evitar todo esto es no codi…car directamente el tamaño de los textos, dejar que los textos asuman su tamaño en relación al layout, y utilizar los métodos de la clase FontMetrics para encontrar el tamaño en que aparecen los caracteres de una cadena sobre un Canvas. Cuando se coloca una fuente que no se encuentra entre las de defecto, hay que asegurarse siempre de colocar alguna de respaldo en el bloque catch. Cuando se crea un menú para seleccionar fuentes de caracteres, se debería utilizar el método java.awt.Toolkit.getFontList(), en lugar de especi…car una lista de fuentes. Cuando se actualice un programa del JDK 1.0 al JDK 1.1, hay que tener en cuenta que los nombre de las fuentes de caracteres se han actualizado, tal como se indica en la documentación del método getFontList(). Capítulo 2 Preparación de documentos con LATEX 2.1 Introducción El LATEXes un sistema de composición profesional ideado especialmente para trabajo con fórmulas matemáticas que da una altísima calidad de edición [Cas98, Castillo]. LATEXconsiste en un conjunto de macrocomandos construidos a partir de EX, un lenguaje de composición de texto creado por Donald Knuth de la Universidad de Stanford en los años 1970s. El LATEXoriginal fue creado por Leslie Lamport en Digital Equipment Corporation a mitad de los años 1980s. Un versión más reciente, llamada LATEX2e, es una parte del proyecto LATEX3 liderado por Frank Mittelbach. AMS-LaTeX, un conjunto de mejoras de LATEXrealizado por la American Mathematical Society, suministra una mejora de las posibilidades de composición matemática, incluyendo tres nuevas clases de documentos LATEX2e y cuatro nuevos alfabetos matemáticos. LAT Los artículos escritos mediante AMS-LATEXson de la misma calidad que los que se encuentran en las revistas de la AMS. 41 42 CAPÍTULO 2. PREPARACIÓN DE DOCUMENTOS CON LATEX 2.1.1 Forma de trabajo con LATEX La primera característica del LATEXcon la que el usuario ha de enfrentarse es el hecho, a veces ciertamente mal recibido, de que no sea un procesador de texto visual, sino de diseño lógico. Es decir, lo que el usuario escribe en el teclado no es lo que después ve en el documento …nal. La preparación de un documento con LATEXconsta de tres pasos: ² Edición del documento. ² Composición o compilación. ² Impresión. Por tanto, va a existir un …chero de entrada, que es el que se edita, y un …chero de salida, que es el que se imprime. El proceso de ejecución que convierte el …chero de entrada (sin formatear) en el …chero de salida es la composición o compilación. Proceso Edición Composición Visualización Impresión Programa Editor TEX DVI Driver Fichero entrada .tex .tex .aux Fichero resultado .dvi .aux .log .dvi Tabla 2.1: Programas implicados en la preparación de un documento con LaTeX. La Tabla 2.1 de la Página 42 esquematiza los programas implicados en la preparación de un documento con LATEXasí como las extensiones de los …cheros que intervienen. La Figura 2.1 de la Página 44 muestra un esquema de la mayor parte de los diferentes …cheros que intervendrán en el proceso de edición y composición de un documento LATEX. 2.1. INTRODUCCIÓN 43 A continuación, se describe el papel que juegan en ese proceso los diferentes…cheros de…nidos por su extensión: ² tex: …chero de entrada para LATEXo …chero que se incluye en éste con ninclude. ² bib: …chero preparado por el usuario, conteniendo una base de datos bibliográ…ca. ² cls: contiene las de…niciones estándar propias de una clase de documento; por ejemplo, book.cls. ² clo: asociado a algún .cls, contiene más opciones para la clase; por ejemplo, bk10.clo. ² sty: contiene de…niciones sobre la estructura y el aspecto; generalmente se guarda en un directorio estándar1 ; por ejemplo, babel.sty. ² ist: contiene información sobre el estilo del índice alfabético. ² bst: contiene información sobre el estilo de la bibliografía. ² dvi: contiene la representación del texto formateado, resultado de la composición; guarda únicamente los nombres de las fuentes y no las imágenes reales de los caracteres, por lo que para poder visualizarlo es necesario servirse de un dvi driver. ² log: …chero generado en la composición; guarda información de ella, como puede ser los nombres de los …cheros que han intervenido, las páginas que han sido procesadas, los mensajes de aviso y error, etc. ² aux: …chero auxiliar generado en la composición; guarda información de contadores, etiquetas, etc. que permiten las referencias cruzadas y las citas bibliográ…cas. Hay un …chero .aux para cada .tex que intervenga en la composición. ² toc: …chero generado en la composición si se ha pedido tabla de contenidos; contiene toda la información necesaria para elaborarla, tal como los nombres de las unidades de seccionamiento, la página donde comienzan, etc. 1 También tienen esta extención los …cheros de clase de la versión LATEX 2.09. 44 CAPÍTULO 2. PREPARACIÓN DE DOCUMENTOS CON LATEX Figura 2.1: Algunos de los …cheros resultantes del proceso de edición y composición de un documento con LATEX. 45 2.1. INTRODUCCIÓN ² lof: …chero generado en la composición si se ha pedido lista de …guras; contiene los pies de cada …gura, su numeración, su página, etc. ² lot: igual que el anterior, pero referido a tablas. ² idx: …chero generado en la composición si se ha pedido índice alfabético; contiene una lista de las entradas para el índice. ² ind: generado por el programa MakeIndex a partir del .idx, contiene una lista ordenada y uni…cada de entradas y páginas, para la elaboración del índice alfabético. ² ilg: contiene los mensajes de aviso y error ocurridos en la ejecución de MakeIndex. ² bbl: generado por BibTeX a partir de .bib y .aux, contiene la lista ordenada de las entradas bibliográ…cas requeridas en el texto. ² blg: contiene los mensajes de aviso y error ocurridos en la ejecución de BibTEX. ² tfm: contiene la información (dimensiones, ...) de cada carácter de una fuente. ² fd: …chero de de…nición de fuentes, que guarda la correspondencia entre los nombres de las fuentes internas y de las fuentes externas. ² fmt: especi…ca los patrones de guionado. Para enviar electrónicamente un trabajo (por correo electrónico o en un disquete), debemos mandar no sólo el …chero principal, sino también acompañar los …cheros que se incluyen en el principal con ninclude, los …cheros .bbl de bibliografía, los …cheros conteniendo paquetes no estándar o especi…caciones propias del usuario. Una forma de saber cuáles son los …cheros que deben ser enviados, es poner en el preámbulo el comando nlistfiles con el que LATEXlista todos los …cheros utilizados. 46 CAPÍTULO 2. PREPARACIÓN DE DOCUMENTOS CON LATEX 2.1.2 Modo de trabajo en LATEX El contenido de un documento LATEXpuede estar en uno de estos tres modos: ² Modo párrafo: modo normal, por defecto. Texto ordinario: considera la entrada como una sucesión de palabras divididas en líneas, párrafos y páginas. ² Modo matemático: fórmulas; para entrar en este modo: $, $$, n[,n(,nbegin{equation},nbegin{displaymath} y para salir, respectivamente $, $$, n], n), nend{equation}, nend{displaymath} ² Modo izquierda-derecha (LR): como el modo párrafo pero sin cortar entre líneas. Para entrar en este modo se usa el comando: nmbox{ } El modo LR puede utilizarse para evitar cortes de palabras entre líneas. El cambio de modo se realiza muy fácilmente y es usual en fórmulas que incluyan texto, para pasar de modo matemático a modo LR El compilador LATEXactúa por defecto interrumpiendo la compilación cuando encuentra un error y preguntando al usuario qué hacer. Con la opción nbatchmode avisa cuando se usa un comando incorrectamente y, si puede, evita la parada. 2.2 Documentos en LATEX En LATEXhay muchos tipos de documentos y se pueden de…nir muchos más. 2.2. DOCUMENTOS EN LATEX 47 Entre los más corrientes destacan los de carta, artículo, libro e informe, que se describen en este capítulo. La información que recibe el programa LATEXpara su tratamiento es un …chero de texto. Este …chero debe tener la extensión .tex y estará compuesto de dos partes: un preámbulo y el documento propiamente dicho. El documento propiamente dicho comienza con el comando nbegin{document} y termina con el comando nend{document}. En medio se encuentra todo el texto y …guras del documento. Todo lo que siga es ignorado por LATEX. Lo que precede a nbegin{document} es el preámbulo, que sólo contiene declaraciones. 2.2.1 El Preámbulo El preámbulo contiene aquellas órdenes que afectan a todo el documento y comienza generalmente con ndocumentclass con la especi…cación del estilo del texto. 2.2.2 Especi…cación y Estilo de Documento El tipo y el estilo del documento se especi…can mediante el comando: n documentclass[opciones ] {clase } que especi…ca la clase del documento y sus opciones. La clase …jada, así como todas las especi…caciones que se hagan en el preámbulo, serán comunes a todo el texto. En el argumento clase puede ponerse una de las siguientes clases estándar: article report book letter slides También puede usarse como argumento una clase diseñada por el usuario. El comando ndocumentclass lee el correspondiente …chero clase.cls. 48 CAPÍTULO 2. PREPARACIÓN DE DOCUMENTOS CON LATEX En el argumento opciones, puede ponerse una lista de opciones de estilo, separadas por comas. Se listan a continuación las opciones de clase, separando con punto y coma las distintas alternativas: ² letterpaper; legalpaper; executivepaper; a4paper; a5paper; b5paper: tamaño del papel; las medidas correspondientes pueden verse en los …cheros de clase .cls. ² 10pt; 11pt; 12pt: tamaño del texto normal. El valor por defecto es 10pt, los siguientes aumentan un 10% y un 20%, respectivamente. ² landscape: intercambia ancho y alto. ² …nal;draft: la primera es para la versión de…nitiva del documento, y la última para un borrador. El valor por defecto es …nal. ² oneside; twoside: formatea la salida para ser impresa por una o dos caras, respectivamente. El valor por defecto es twoside con book, oneside con el resto. Con slides no es posible la opción twoside. ² openright; openany: permite a los capítulos comenzar en una página de la mano izquierda (openany) o lo prohibe (openright). Se aplican sólo con book (valor por defecto: openright) y con report (valor por defecto: openany). ² onecolumn; twocolumn: especi…ca formato a una o dos columnas. El valor por defecto es onecolumn. Con slides no es posible la opción twocolumn. ² notitlepage; titlepage: con la segunda es posible hacer páginas separadas para el título y el abstract. El valor por defecto es notitlepage con article, titlepage con el resto. No son posibles con letter. ² openbib: formatea la bibliografía en estilo “abierto” (es decir, cada información como autor, título, ..., en una línea distinta). Esta opción no es posible con letter y slides. ² leqno: numera las fórmulas a la izquierda. ² eqn: alinea las fórmulas a la izquierda. Las opciones que pueden ponerse como argumento en ndocumentclass dependen de cuál sea la clase especi…cada en ese comando, ya que no todas las 2.2. DOCUMENTOS EN LATEX 49 opciones son posibles en todas ellas. Además, hay opciones que vienen dadas por defecto en una clase y no en otras. Por ejemplo, la opción maketitle no se acepta en la clase letter y es la opción por defecto en todas las otras excepto en article. Las opciones se especi…can colocándolas entre corchetes y separándolas por comas. Por ejemplo, el comando: ndocumentclass[twoside,twocolumns,12pt]{article} especi…ca que se trata de un documento tipo artículo, con escritura por las dos caras, en dos columnas y un tamaño de letra de 12 puntos. Se dispone también de parámetros de estilo del documento: ² bibindent: sangrado extra de las líneas de una misma entrada bibliográ…cacon la opción openbib. ² columnsep: distancia entre las columnas con la opción twocolumn. ² columnseprule: anchura de la línea vertical de separación entre las columnas con la opción twocolumn. El valor por defecto es 0pt. ² mathindent: sangrado de las fórmulas respecto al margen izquierdo con la opción ‡eqn. El estilo del documento de…ne su formato completo, que incluye entre otras cosas la anchura y altura del texto en la página, el tamaño de las letras de cada una de sus partes, la numeración de las secciones, los títulos de capítulos, secciones, subsecciones, etc., las cabeceras y los piés de página, etc. Sin embargo, a este estilo base se le pueden añadir o cambiar diferentes aspectos de su formato sin más que añadir los comandos correspondientes. Por ejemplo, si se quiere cambiar la anchura, la altura del texto o el espaciamiento entre líneas se utilizan los comandos: ntextwidth 13cm ntextheight 21cm nrenewcommand{nbaselinestretch}{2} 50 CAPÍTULO 2. PREPARACIÓN DE DOCUMENTOS CON LATEX El estilo del documento viene determinado mediante el uso de las clases y los paquetes. La mayoría de los comandos de LATEXson válidos con todas las clases, no existiendo gran número de ellos que sean especí…cos de alguna clase en particular. Con los paquetes se añadirán especi…caciones de estilo a las contenidas en la clase, permitiendo también cargar nuestras propias macros y de…niciones. Existen además las opciones sobre clases y paquetes, que modi…can el formato de algunos elementos. Las de…niciones propias de cada clase se guardan en el …chero de extensión .cls (por ejemplo article.cls); las propias de cada paquete en uno de extensión .sty (por ejemplo amstex.sty). Además, a las opciones de clase les corresponden normalmente los …cheros .clo (por ejemplo art11.clo). 2.2.3 Estilo de Página Una página del texto de salida tiene tres partes: ² Encabezamiento ² Cuerpo ² Pié Diseñar una página consiste en determinar la altura y anchura de esas tres partes y los márgenes, el contenido del encabezamiento y del pié, así como el formato del cuerpo del texto. Para determinar cuál será el contenido del encabezamiento y del pié, se dispone de la declaración npagestyle{estilo} donde el estilo puede ser plain: número de página en el pié y el encabezamiento vacío empty: pié y encabezamiento vacíos 51 2.2. DOCUMENTOS EN LATEX headings: encabezamiento diseñado en el documento de estilo y pié vacío myheadings: como headings, pero encabezamiento diseñado por el usuario. Para especi…car el contenido del encabezamiento cuando se trabaja con headings y myheadings se utilizan los comandos: nmarkboth{enc. pag. izq}{enc.pag. nmarkright{enc. pag. dcha.} dcha.} de manera que para una página ² de la mano izquierda: se toma enc. pag. izq del último nmarkboth ocurrido hasta el …nal de la página ² de la mano derecha: se toma enc. pag. dcha del primer nmarkright o nmarkboth de la página y si no hay ninguno, del último ocurrido antes del principio de la página. Con el estilo headings, estos comandos van a especi…car marcas para las unidades de seccionamiento según se recoge en la Tabla 2.2 de la Página 52. Para ser utilizadas con el estilo myheadings es conveniente tener en cuenta que: ² debe ponerse nmarkboth justo después de un comando de seccionamiento ² debe ponerse nmarkright justo antes y justo después del comando de seccionamiento y debe omitirse cuando la unidad de seccionamiento comienceuna nueva página ² no hay información en el encabezamiento de la primera página del documento. Se dispone también de la declaración 52 CAPÍTULO 2. PREPARACIÓN DE DOCUMENTOS CON LATEX Estilo Comando twoside nmarkboth nmarkright nmarkright oneside Clase de Documento book, report article nchapter nsection nsection nsubsection nchapter nsection Tabla 2.2: Programas implicados en la preparación de un documento con LaTeX. nthispagestyle{estilo} en todo análoga a la anterior salvo en que únicamente determina el estilo de una página. La declaración npagenumbering{estilo numeración} especi…ca el estilo de numeración de las páginas. Además rede…ne el comando nthepage para que sea nestilo numeración {page} donde page es el contador de página. Por defecto la numeración se hace en arabic, pero puede cambiarse fácilmente. Para determinar los tamaños del encabezamiento, el cuerpo y el pié de la página y las magnitudes de los márgenes, se dispone de los parámetros de estilo, cuyos valores por defecto están especi…cados por la clase de documento. Pueden clasi…carse en horizontales: textwidth: anchura normal del cuerpo del texto. linewidth: anchura de la línea de texto; varía en ciertos entornos que modi…can los márgenes. 2.2. DOCUMENTOS EN LATEX 53 evensidemargin: en páginas de la mano izquierda, el margen izquierdo es este valor más una pulgada. oddsidemargin: en páginas de la mano derecha, el margen izquierdo es este valor más una pulgada. y en verticales: textheight: altura normal del cuerpo del texto. footskip: distancia entre la base de la última línea de texto y la base del pié. headheight: altura del encabezamiento. headsep: distancia entre el encabezamiento y el cuerpo del texto. topmargin: distancia entre el borde superior del papel y el borde superior del encabezamiento es ese valor más una pulgada. topskip: longitud elástica que determina la distancia de la parte superior del cuerpo del texto a la base de la primera línea. 2.2.4 La página del Título Todo documento suele tener una página en la que …gura su título, el nombre del autor y posiblemente la fecha de publicación. La información necesaria para construir el título se le da a través de los comandos siguientes del preámbulo: nauthor{nombres}:los posibles distintos autores se separan por nand; admite nn para incluir más informaciones. ndate{fecha}:este comando es opcional; el defecto es la fecha actual. ntitle{título}: admite nn para dividir un título largo. Además, dentro de los argumentos de estos tres comandos puede incluirse nthanks{texto}: produce un pié de página, conteniendo posibles agradecimientos, direcciones, etc. Para generar el título de un documento se cuenta con el comando 54 CAPÍTULO 2. PREPARACIÓN DE DOCUMENTOS CON LATEX nmaketitle Con la opción de clase notitlepage colocará el título en la parte superior de la nueva página. Con la opción titlepage genera el título en una hoja separada. El comando nmaketitle va tras el comando nbegin{document}, y los ntitle y nauthor deben ir en el preámbulo, es decir, antes que aquél. Si se omite el comando ndate, LATEXpone la fecha del día en que se imprime, lo cual también puede hacerse de forma explícita utilizando el comando ntoday. Estos comandos sirven sólo para de…nir los autores, la fecha y el título, pero no, para escribirlos. Como se verá, el título se escribe dentro del documento mediante el comando nmaketitle. Otra posible herramienta para generar una página de título es el entorno titlepage, que además restablece el número de página a 1. Los comandos que siguen generan la portada de este trabajo. TEXTO DE ENTRADA nbegin{titlepage} nbegin{center} nvspace*{.15in} {nlarge CURSO DE MASTER}nn nvspace{2in} {nHuge nbf Preparacin’on de documentos}nn[12pt] {nHuge nbf con nLaTeX}nn nvspace{.7in} {nLarge PAUTAS DEL CURSO}nn nvspace{0.3in} nrule{3in}{2pt}nn 2.2. DOCUMENTOS EN LATEX 55 nvspace{1.2in} {nlarge Enrique Castillo}nn ynn {nlarge M}$^{nb{a}}$ {nlarge Reyes Ruiz Cobo}nn nvspace{.3in} {nlarge Departamento de Matemn’atica Aplicada y nn Ciencias de la Computacin’onnn nvspace{.1in} UNIVERSIDAD DE CANTABRIA} nn nend{center} nend{titlepage} 2.2.5 El Documento Propiamente Dicho El documento propiamente dicho es la parte del …chero entre los comandos nbegin{document} y nend{document}. Consta de texto y opcionalmente de …guras. Resumen Para generar un “abstract” se dispone del entorno abstract, no de…nido en la clase book. Con la opción de clase notitlepage, por defecto en la clase article, eltítulo y el “abstract” se disponen al comienzo de la primera página; la opción titlepage genera dos páginas iniciales distintas con esos contenidos. Tabla de Contenidos. Lista de Figuras y Tablas La tabla de contenidos es el listado de las unidades de seccionamiento del documento, con diferentes aspectos (estilo, sangría, . . . ) para cada tipo de unidad y, por supuesto, acompañados del número de página en que comienzan. Se incluye aquí información sobre la generación de listas de …guras y tablas por ser análoga a la de la tabla de contenidos. Para generar la tabla de contenidos, la lista de …guras y la lista de tablas 56 CAPÍTULO 2. PREPARACIÓN DE DOCUMENTOS CON LATEX se utilizarán los tres comandos ntableofcontents nlistoffigures nlistoftables que además generan tres …cheros de extensiones .toc, .lof y .lot, respectivamente, que contienen la información necesaria para confeccionar esas listas. Las entradas se producen de dos formas ² en .toc mediante los comandos de seccionamiento de tipo nsection para la tabla de contenidos y ² en .lof y .lot con el comando ncaption presente en los entornos …gure y table para las listas de …guras y tablas, respectivamente. Como puede verse, una entrada del …chero .toc tiene la forma ncontentsline{tipo}{texto}{página} es decir, contiene el tipo de entrada (tipo), qué debe aparecer en el resultado anunciando esa entrada (texto) y el número de página que debe aparecer(página). Para generar una de esas entradas directamente, podemos utilizar el comando naddcontentsline{fichero}{unidad}{entrada} donde …chero: es la extensión del …chero al que se quiere añadir: .toc, .lot o .lof, unidad: es el nombre de una unidad de seccionamiento (si …chero es .toc), table (si …chero es .lot) y …gure (si …chero es .lof ), entrada: es el texto de la entrada que quiere incluirse y para incluir cualquier texto (texto) directamente, el comando 57 2.2. DOCUMENTOS EN LATEX Figura 2.2: Niveles y comportamiento por defecto de las distintas unidades de seccionamiento, y según las clases de documento (se ha tomado art. y rep. como abreviatura de article y report). naddtocontents{fichero}{texto} donde …chero es como antes. Para controlar hasta qué nivel de profundidad debe aparecer reseñado en la tabla de contenidos, existe el contador tocdepth Su valor por defecto está re‡ejado en la Figura 2.2 de la Página 57, y puede cambiarse a nuestra conveniencia utilizando el comando nsetcounter. 2.2.6 División de un documento en partes Cuando el documento es largo, es más conveniente tener el texto de entrada repartido en distintos…cheros; podríamos tener, por ejemplo, cada capítulo de un libro de apuntes en su propio …chero (chap1.tex, chap2.tex, . . . ). Siempre, por supuesto, debemos mantener un…chero principal que constituya la entrada para LATEXy que contenga: nbegin{document} ninclude{chap1} 58 CAPÍTULO 2. PREPARACIÓN DE DOCUMENTOS CON LATEX ninclude{chap2} nend{document} Con el comando ninclude{fichero} se incluye todo el texto de…chero tal y como si estuviera escrito en el…chero principal. Sin embargo, sí existe una diferencia, que puede ser importante tener en cuenta: cada ninclude comienza una nueva página. Es importante no olvidar que los…cheros de entrada tienen que ser siempre no formateados (formateados sólo texto). La composición o inclusión de…cheros formateados producirá un error grave que interrumpirá el proceso. Para ejecutar LATEXúnicamente sobre una parte del documento, el preámbulo debe contener la orden: nincludeonly{…cheros} que hace que sólo se componga el texto de esos…cheros pero se tenga en cuenta los incluídos con ninclude para las cuestiones de paginación, tablas de contenidos, etc. La manera más simple de descomponer nuestro documento en…cheros más pequeños, es haciendo uso del comando: ninput{…chero} que no permite componer sólo una parte del texto como ninclude{…chero}. 2.2.7 Documento Tipo Libro Este estilo está diseñado para escribir libros. Normalmente consta de: 2.2. DOCUMENTOS EN LATEX 59 1. Un título, con los nombres de los autores. 2. Un prefacio, con una introducción del libro, una sucinta descripción de los capítulos, una descripción de a quién va dirigido, y aspectos varios generales sobre el libro. 3. Una tabla de contenidos, con el índice de secciones y subsecciones indi cando páginas en las que se encuentran. 4. Capítulos con una introducción, secciones y subsecciones y, opcionalmente, algún apéndice al capítulo. 5. Unos apéndices generales al libro, conteniendo material auxiliar que puede cortar el ritmo del libro de incluirlo en los capítulos. 6. Un apéndice de notación, con la notación utilizada en el libro, incluyendo los acrónimos. Ésta puede ser global o por capítulos. 7. Una bibliografía, incluyendo todas las referencias citadas en el libro en uno de los formatos estándar. 8. Un índice de palabras, para poder localizar fácilmente material tratado en el libro. La Figura 2.3 de la Página 62 muestra un ejemplo de la organización de un libro. Para escribir una obra con las características de un libro, se utiliza la clase de documento book, que se declara con: ndocumentclass{book} A continuación se recogen las particularidades por defecto de un documento de esta clase: Comandos para las distintas partes del libro los comandos: nfrontmatter nmainmatter nbackmatter 60 CAPÍTULO 2. PREPARACIÓN DE DOCUMENTOS CON LATEX indicarán, respectivamente, el comienzo de la parte inicial del libro (página del título, tabla de contenidos, prefacio, . . . ),delaparte principal (capítulos) y de la parte…nal (bibliografía, índices, . . . ). Imprime a dos caras: por estar activa la opción twoside la situación y contenidos de la cabecera, el pié y el cuerpo de todas las páginas serán distintos según que la hoja sea de numeración impar o de numeración par. Paginación: está activa la opción n‡ushbottom, por lo que el espacio entre los párrafos será elástico, intentando que no haya variaciones en la longitud de las páginas. Título y abstract: una hoja separada para el título; no admite abstract. Estilo de página: headings, esto es, en la página de numeración par la cabecera contiene el nombre del capítulo y el número de página; en la de numeración impar contendrá la sección y la página. Comandos de seccionamiento: permitidos con esta clase son: npart nchapter nsection nsubsection nsubsection nparagraph nsubparagraph Los contadores secnumdepth y tocdepth valen 2, por lo que resultarán numeradas y reseñadas en la tabla de contenidos hasta las subsecciones. Numeración: consecutiva a lo largo de cada capítulo tanto para ecuaciones como para…guras y tablas; numera con dos dígitos (el primero para el número de capítulo). Si no ha encontrado un nchapter, y encuentra algo que numerar, pondrá 0.1. ndocumentclass[]{book} % Dar lista de opciones entre los corchetes nusepackage{} % listar los paquetes entre llaves ninput{preamble} % incluir los comandos definidos por el usuario nbegin{document} 2.2. DOCUMENTOS EN LATEX 61 nfrontmatter ninclude{titulo} % incluir pn’agina con tn’{ni}tulo ninclude{prefacio} % incluir prefacio ntableofcontents % generar la tabla de contenidos nlistoffigures % generar la lista de figuras nlistoftables % generar la lista de tablas nmainmatter ninclude{chapter1} % incluir primer capitulo ninclude{chapter2} % incluir capitulo segundo ninclude{chapter3} % incluir capitulo tercero nappendix ninclude{appendice1} % incluir primer apendice ninclude{appendice2} % incluir segundo apendice nbackmatter ninclude{notacion} ninclude{bibliography} % incluir bibliografia ninclude{index} % incluir indice nend{document} Bibliografía: mediante el entorno thebibliography, que genera la lista dereferencias en un capítulo sin numerar. 62 CAPÍTULO 2. PREPARACIÓN DE DOCUMENTOS CON LATEX Figura 2.3: Esquema de un …chero para preparar libros. 2.2. DOCUMENTOS EN LATEX 2.2.8 63 Trabajo en Modo Texto Comandos para Fraccionamiento de Documentos Un documento puede ser fraccionado de muchas formas, tales como partes, capítulos, secciones, subsecciones, párrafos, subpárrafos, etc. Las clases de LATEXde…nen comandos y entornos destinados a seccionar el documento dotándole así de estructura lógica. Los comandos que sirven para seccionar efectúan además otros importantes procesos: ² Producen la numeración de los rótulos, que normalmente re‡eja la jerarquía de las distintas secciones. ² Almacenan el rótulo (en el …chero de extensión .toc) como una entrada para poder elaborar después la tabla de contenidos. ² Guardan el rótulo para que pueda ser usado en el encabezamiento o en el pié de las páginas. ² Generan el formato del rótulo. La sintaxis de estos comandos de seccionamiento es la siguiente: nsección[entrada] {rótulo} nsección¤ {rótulo} donde sección: es una de las unidades de seccionamiento estándar o bien una de…nida en algún paquete. Las estándar son: npart nchapter nsection nsubsection nsubsubsection nparagraph nsubparagraph La clase letter no puede seccionarse en modo alguno. rótulo: Es el nombre de la sección tal como debe aparecer en el texto del documento. 64 CAPÍTULO 2. PREPARACIÓN DE DOCUMENTOS CON LATEX entrada: es un argumento opcional. Si no aparece, se tomará rótulo para la entrada de esta sección en la tabla de contenidos y como posible encabezamiento de página. Si está presente un argumento entrada, éste será el recogido en la tabla anunciando esta sección y como posible encabezamiento de página. La forma *: tiene el único efecto de comenzar la sección; es decir, no numera el rótulo, no incrementa el contador de n sección, no afecta al encabezamiento de la página y no produce entrada en la tabla de contenidos. El estilo narticle no permite el comando nchapter, lo que hace más fácil convertir varios artículos en sus correspondientes capítulos de un libro. Salvo el caso de npart, que es opcional, las demás opciones deben ir encadenadas, de forma que no puede utilizarse una subsección sin haber creado antesuna sección. La declaración nappendix cambia la forma de numerar las unidades de seccionamiento, sin generar ningún rótulo ni encabezamiento como hace n section. Hay que tener en cuenta que lo que va entre llaves es en realidad un argumento y que no todos los comandos de LATEXestán soportados como partes de argumentos. Cuando esto sucede se usa el comando nprotect, que debe anteceder a los comandos no soportados. Por ejemplo: nsection{Solucin’on del Problema nprotectnref{prob1}} Rótulos La generación de los rótulos o títulos de las diferentes unidades de seccionamiento está encargada a la clase del documento. La numeración de estos rótulos es automática; para cualquier numeración que gestiona LATEXdebe existir un contador, así, cada unidad de seccionamiento tiene su contador (del mismo nombre pero sin n ) correspondiente. Una cuestión a plantear es hasta qué categoría de rótulo va a estar numerada. Para controlar esto, LATEXasocia un nivel a cada unidad de seccionamiento; 2.2. DOCUMENTOS EN LATEX 65 cada clase de documento (book, report, article) conoce hasta qué nivel debe numerar (ver tabla 2.2) a través del contador secnumdepth Si quisiéramos modi…car ese valor por defecto, pondríamos nsetcounter{secnumdepth}{n} con lo que los rótulos aparecerían numerados hasta los de nivel n. El tipo de numeración también puede modi…carse fácilmente: El aspecto de los rótulos está también de…nido en las clases, por lo que el diseño de un documento con partes enlazadas, rótulos de distintos tamaños y aspecto, etc., será un proceso totalmente automático: Si esa generación automática no nos satisfaciera, podemos cambiar las especi…caciones por defecto para el aspecto del rótulo de sección poniendo 2 n@startsection{sección}{nivel}{sangría}{ esp. ant.}{esp. post.}{estilo} donde sección: nombre de la unidad de seccionamiento: section, etc. nivel: nivel de la unidad de seccionamiento sección sangría: valor del sangrado del rótulo esp. ant: distancia entre el texto anterior y el rótulo esp. post: distancia entre el rótulo y el texto que le sigue; si es un valor positivo comenzará en unalínea distinta pero si es negativo lo hará en la misma que el rótulo. estilo: estilo deseado para el rótulo. 66 CAPÍTULO 2. PREPARACIÓN DE DOCUMENTOS CON LATEX Cambios del Estilo de la Letra Para cambiar el estilo de la letra del texto hay varios comandos que se ilustran, a continuación, con unos ejemplos. {nbf Estilo negrita} Estilo negrita {nsf Estilo sans serif}Estilo sans serif {nsl Estilo slanted} Estilo slanted {nsc Estilo mayusculas reducidas} Estilo mayusculas reducidas {ntt Estilo mn’aquina de escribir}Estilo máquina de escribir Como puede verse, se trata de meter entre llaves el texto que desea cambiarse e incluir al comienzo un comando que indica el tipo de letra. Párrafos Un párrafo es un grupo de frases que termina con una línea en blanco. A menos que estemos en un entorno especial, un nuevo párrafo se sangrará un espacio igual al valor de nparindent, si por alguna razón queremos evitar la sangría al comienzo de la primera línea en blanco de un párrafo, pondremos nnoindent, comando de efecto opuesto al también existente nindent. Para cambiar de párrafo es equivalente dejar una línea en blanco a poner el comando npar, aunque esto último es más frecuente en de…niciones de comandos y entornos que en texto común. Además del valor de la sangría (nparindent), otros parámetros de estilo referentes a párrafos son el ancho del texto (ntextwidth), el ancho de línea (nlinewith), el espacio entre líneas (que se regula con nbaselineskip y nbaselinestretch) y el espacio vertical extra entre párrafos (nparskip). Notas al Pié Para confeccionar notas al pié de página, se utiliza generalmente el comando nfootnote[num] {texto} 2.3. PARTES FLOTANTES 67 que en modo párrafo, escribe texto en el pié y, si no ponemos el argumentonum, lo numera automáticamente incrementando en una unidad el contador footnote. Como se ha podido observar en el ejemplo anterior, la marca utilizada es pordefecto un número en caracteres arábigos. Con nrenewcommand puede pasarsea otras representaciones. Las notas al pié también se pueden construir más directamente (por ejemplo,si estamos en un modo incompatible con nfootnote) utilizando conjuntamentelos comandos nfootnotemark[num] nfootnotetext[num]{texto} el de la izquierda produce la marca e incrementa el contador si no está presente num y el de la derecha produce el texto del pié, sin incrementar el contador ni producir marca. Los parámetros de estilo que controlan la apariencia de las notas al pié son los siguientes: footnotesize tamaño de letra de los piés de página, footnoterule comando que dibuja la línea de separación entre el texto principal y la nota; puede modi…carse con nrenewcommand, footnotesep distancia entre dos notas consecutivas o entre la línea de separación y la primera nota. 2.3 Partes Flotantes Los documentos serían mucho más fáciles de leer si no se cortaran sus diferentes partes y estuvieran colocadas en el lugar adecuado. Sin embargo, esto no es posible y hay que desplazar algunos elementos del mismo, tales como …guras y tablas, a otras páginas, por no caber en el lugar más conveniente. Puesto que la solución óptima no es posible, no cabe otro remedio que contentarse con menos. Sin embargo, tienen que satisfacerse unas condiciones mínimas de calidad en cuanto a la ordenación de estos elementos en el texto. Esto requiere un gran esfuerzo, para el que LATEXestá muy bien preparado. Éste se encarga de gestionar el posicionamiento de este material, que recibe el 68 CAPÍTULO 2. PREPARACIÓN DE DOCUMENTOS CON LATEX nombre de ‡otante. Por ejemplo, en una página se pueden citar cinco …guras y tres tablas, que como es natural, no cabrán en la misma página. LATEXse encarga de controlar qué …guras o tablas quedan por colocar y las coloca según ciertos criterios de calidad (por ejemplo, no coloca …guras o tablas en páginas anteriores a su citación) procede a colocarlas en determinados lugares (en la misma página en que se citan, si esto es posible, o en la parte superior o inferior de una página, etc.). De esta manera se consigue rellenar las páginas con el texto, notas de pié de página, etc. necesarios, hasta conseguir un buen equilibrio entre páginas y un grado de llenado uniforme.Ésta es una de las características de calidad que diferencia el LATEXde otros procesadores de texto menos profesionales. Los entornos ‡otantes más conocidos y utilizados son los table y …gure que, como sus nombres indican, se utilizan para tablas y …guras, respectivamente. Cuerpos Flotantes Se entiende por “cuerpo ‡otante” aquel que, por no poder ser dividido entre páginas, no está sujeto al lugar del texto en el que se incluyó. Así, para evitar huecos en blanco, pueden desplazarse dentro de la página e incluso a distintas páginas del documento. Existen dos entornos que producen cuerpos ‡otantes: nbegin {figure}[loc] cuerpo n end {figure} nbegin {table}[loc] cuerpo nend {table} y sus versiones …gure* y table*, que generan …guras y tablas a dos columnas trabajando con la opción twoside, pero que trabajan igual a las anteriores con la opción oneside. Estos dos entornos sirven para colocar cuerpo y para ponerle un pié y un número. No sirven para dibujar ni para confeccionar tablas: el argumento cuerpo se les da totalmente de…nido. El signi…cado de sus argumentos es como sigue: cuerpo: Es el contenido de la tabla o…gura. El cuerpo de estos entornos se escribe en modo párrafo, en una caja “parbox” de anchura igual a la del texto (ntextwidth). 2.3. PARTES FLOTANTES 69 loc: El argumento opcional loc indica dónde se quiere que se sitúe preferentemente la…gura o tabla. Es una sucesiónde 1 a 4 letras, que la situarán en: t la parte superior de una página b la parte inferior h el punto donde se pone el entorno p una hoja separada quie contiene solo …guras y tablas ! para que se sitúa lo mas cerca posible. Se cuenta además con el comando nsuppress‡oats[sit ] que impide la colocación de más tablas o…guras en la página actual: ² en la parte superior si sit es t, ² en la parte inferior si sit es b, ² en ambas si sit no aparece. Un ejemplo de situación que puede ser evitada así, es que una sección comience después de que haya aparecido, en la parte superior de la página, una…gura o tabla perteneciente a ella. La colocación de…guras y tablas se rige por unas ciertas normas: 1. Se imprimirá en el primer lugar que no viole las reglas que siguen, excepto si en loc h precede a t. 2. No se imprimirá en una página anterior a aquella que contiene el entorno que la introduce en el texto. 3. No se imprimirá antes de otra…gura o tabla cuyo entorno sea anterior. 4. Aparecerá sólo en una posición permitida por el argumento loc; en su defecto, seguirá la norma tbp. 5. Una…gura o tabla nunca producirá una página demasiado larga. 70 CAPÍTULO 2. PREPARACIÓN DE DOCUMENTOS CON LATEX 6. Existen unos límites marcados por los parámetros de estilo que se comentarán más adelante; estos límites no se respetan con la opción !, 7. que sólo conserva los referentes a páginas de cuerpos ‡otantes (que son n‡oatpagefraction y ndblpagefraction). En cuerpo, puede aparecer el comando ncaption[entradas]{título}, que produce un pié a la…gura o tabla con la correspondiente leyenda, donde: título: es el título de la leyenda a poner en la tabla o…gura. Si el comando se pone antes que la tabla o…gura la leyenda se situada en cabeza de las mismas. Si fuera detrás se situaría en el pié de las mismas. entradas: El argumento opcional entradas será lo que aparezca en la lista de…guras o lista de tablas referente a esta…gura o tabla; si no, la entrada en esas listas será título. Si se quiere etiquetar esta…gura o tabla, se pone nlabel{etiqueta} dentro de título. Existe un buen número de parámetros de estilo que intervienen en la colocación de estos cuerpos ‡otantes (…guras y tablas). Unos son contadores, que por tanto podrán ser modi…cados con nsetcounter: bottomnumber: máximo número permitido de ‡otantes en la parte inferior de la página; defecto: 1. totalnumber: máximo número permitido de ‡otantes en una página normal; defecto: 3. topnumber: máximo número permitido de ‡otantes en la parte superior de una página; defecto: 2. dbltopnumber: igual que el anterior pero para texto a dos columnas; defecto: 2. Otros son valores reales entre 0 y 1 y portantopodrán modi…carse con nrenewcommand: topfraction: proporción de una página de texto que puede ser ocupada por ‡otantes en la parte superior; defecto: 0.7. 2.3. PARTES FLOTANTES 71 bottomfraction: igual que el anterior pero para la parte inferior; defecto: 0.3. textfraction: mínima parte de una página de texto que debe ser ocupada por éste, defecto: 0.2. ‡oatpagefratcion: mínima parte de una página de ‡otantes que debe ser ocupada por éstos; defecto: 0.5. dbltopfraction: análogo a ntopfraction pero para formato de texto a dos columnas. dbl‡oatpagefraction: análogo a n‡oatpagefraction pero para formato de texto a dos columnas. Y…nalmente, otros son los parámetros de longitud, cuyo valor puede ser alterado con nsetlength. ‡oatsep: espacio vertical añadido entre ‡otantes de la parte superior o inferior de un página de texto; defecto para tamaño 11pt: 12pt plus 2pt minus 2pt; defecto para tamaño 12pt: 14pt plus 2pt minus 4pt. text‡oatsep: espacio vertical añadido entre ‡otantes, de la parte superior o inferior, y el texto en una página de texto; defecto: 20pt plus 2pt minus 4pt. intextsep: espacio vertical sobre y bajo un ‡otante situado entre el texto cuando está activa la opción h; defecto:n‡oatsep. dbl‡oatsep para formato a dos columnas, el análogo a n‡oatsep. dbl‡oatsep: para formato a dos columnas, el análogo a n‡oatsep. dbltext‡oatsep: para formato a dos columnas, el análogo a ntext‡oatsep. Si el resultado…nal no nos convence, se puede intervenir modi…cando el valor de alguno de ellos; seguramente será su…ciente con tocar alguno de los marcardos con o . Debe tenerse en cuenta que los cambios efectuados en el preámbulo afectarán desde la primera página, pero los introducidos después tendrán efecto a partir de la siguiente a la actual. 2.3.1 Referencia Cruzada e Índice de Palabras Referencia Cruzada LATEXpermite referenciar cualquier elemento (entorno, item, sección, página, ...) que esté numerado, es decir, que tenga asociado un contador. 72 CAPÍTULO 2. PREPARACIÓN DE DOCUMENTOS CON LATEX Por ejemplo, para citar una ecuación hay que indicar la señal que debió asignársele en su momento. El programa guardó, en un …chero de extensión .aux, qué valor del contador de ecuaciones se correspondió con esa señal y lo colocará en el lugar deseado. Por tanto, podemos poner una señal en: ² Las unidades de seccionamiento: chapter, section, etc. ² En los entornos que pueden numerarse: equation, eqnarray, …gure, table, así como en los de…nidos mediante nnewtheorem. ² En los items del entorno enumerate. ² En las páginas. Para poner etiquetas, se utiliza el comando nlabel{etiqueta} que debe incluirse dentro del elemento a etiquetar y se encarga de escribir una entrada en el …chero auxiliar, que consta de la señal, el valor del contador que se trate (entorno, item, sección, ...) y el valor del contador de página. Para hacer referencia a un bloque etiquetado, se pone: nref{etiqueta} que debe sustituir a la referencia concreta. También es posible referirse a la página en que se encuentra el elemento. Para ello se utiliza: pageref{etiqueta} 2.3. PARTES FLOTANTES 73 La posibilidad de utilizar referencias cruzadas es una gran ventaja que ofrece LATEX. Ello permite no tener que preocuparse de cambiar la numeración de partes, capítulos, secciones, subsecciones, tablas, theoremas, etc. Si se suprime un capítulo, tres secciones y cuatro fórmulas, las referencias cruzadas permiten que LATEX2e se encargue de la renumeración correspondiente. Para ello hay que poner etiquetas en los elementos referidos y utilizar las mismas al hacer referencias. Índice de Palabras Para incluir en el documento un índice alfabético de palabras a dos columnas, se debe tener todas las palabras o expresiones que se quieran reseñar agrupadas en un entorno theindex: nbegin{theindex} texto nend {theindex} donde texto es una lista de entradas, cada una de ellas encabezada por el comando nitem; a su vez, cada entrada puede tener “subentradas” (encabezadas por nsubitem) y “subsubentradas” (encabezadas por subsubitem); para un espacio extra separando bloques de palabras, se pondrá nindexspace. Para generarlo hay que hacer lo siguiente: ² colocar nindex{expresión} al lado de cada expresión que se quiera para el índice; este comando no “imprime” nada ni deja un blanco ² poner en el preámbulo nusepackage{makeidx } 74 CAPÍTULO 2. PREPARACIÓN DE DOCUMENTOS CON LATEX para cargar el paquete y nmakeindex que se encargará de ir leyendo cada nindex que se haya colocado y escribir para él una entrada nindexentry{expresión}{página} en un …chero auxliliar de extensión .idx. ² a partir de ese …chero .idx, generar el entorno theindex y llamarlo a componer; este proceso puede hacerse de dos formas: (a) Haciendo uso del programa MakeIndex: ² que genera el entorno theindex automáticamente ² lo guarda en un …chero de extensión .ind ² tal …chero se compone poniendo En el punto del documento donde se quiera que aparezca el índice (normalmente al …nal). nprintindex (b) Modi…cando el …chero de extensión .idx se puede generar directamente el entorno theindex y colocarlo luego donde se desee. 2.3.2 Bibliografía Referencias Bibliográ…cas Para referencias bibliográ…cas el funcionamiento es bastante parecido. Las referencias o entradas bibliográ…cas estarán todas agrupadas, formando el cuerpodel entorno thebibliography. Irá colocado o bien en uno de los …cheros que se incluyan en el principal o bien en un …chero aparte. En este último caso, el …chero deberá tener extensión .bbl y será incluido en la composición mediante el comando nbibliography{…chero} Este entorno (thebibliography) está de…nido como una lista y como tal se escribirá, en la salida, precedida cada entrada de una etiqueta. La estructura es 75 2.3. PARTES FLOTANTES nbegin {thebibliography}{ancho-max } entradas nend {thebibliography} donde el argumento ancho-max indica cuál es la mayor anchura de las etiquetas de las entradas. Cada una de esas entradas, viene dada por el comando nbibitem[etiqueta] {señal} Si el argumento opcional etiqueta está presente, este comando asocia la entrada con etiqueta, activándose en caso contrario el contador enumi y etiquetándose las entradas por orden. El argumento obligatorio señal será el que se utilice para referenciar esa entrada en el texto, poniendo ncite{señal} El …chero con extensión .bbl que contiene la lista de referencias bibliográ…cas puede ser generado por nosotros mismos, o de forma mucho más automatizada, aplicando el programa BibTEX. Este programa lee un …chero de extensión .bib, donde se encuentra recogida toda la información sobre las referencias bibliográ…cas que se utilizan en el trabajo, escogiendo de entre ellas sólo aquellas que aparezcan citadas (con ncite) en el documento actual. De esta forma, el proceso de incluir citas bibliográ…cas y una lista de las referencias citadas, si se dispone del programa BibTEX, será: 1. Disponer de la base de referencias bibliográ…cas guardada en un …chero .bib. 2. Para cada referencia bibliográ…ca, colocar ncite{señal} donde se quiera citar la referencia señalada con señal. 3. Indicar en el …chero a componer (por ejemplo prin.tex) el estilo en que se escribirá la lista, con: nbibliographystyle{estilo} 76 CAPÍTULO 2. PREPARACIÓN DE DOCUMENTOS CON LATEX así como el nombre del …chero .bib, con nbibliography{…chero}. 4. Componer con LATEXel …chero prin.tex; por cada ncite se genera una entrada en el …chero auxiliar prin.aux. 5. Correr BibTEXsobre prin.tex; a partir del .aux se genera un nuevo …chero .bbl que contiene las referencias formateadas según el estilo elegido (este estilo se guarda en un …chero .bst). Los errores de este proceso se guardan en un …chero .blg. 6. Componer prin.tex con LATEX, para que lea las referencias del .bbl. 7. Componer otra vez para que escriba la etiqueta adecuada en cada ncite. Capítulo 3 Introducción al MPLS 3.1 Presentación de una Nueva Arquitectura El presente trabajo estudia las diferentes soluciones que se pueden encontrar hoy día para adaptar el protocolo IP a las nuevas redes de banda ancha que emplean la tecnología ATM1 . Puede decirse que el protocolo TCP / IP es hoy día una solución clásica y estándar al transporte de información en las redes. Aceptado por toda la comunidad de Internet, ha sido hasta hoy una solución aceptable para el envío de información, utilizando Routing de paquetes con ciertas garantías de entrega. A su vez, los avances en el hardware y una nueva visión a la hora de manejar las redes, están dando lugar al empleo creciente de las tecnologías de Conmutación, encabezadas por la tecnología ATM. Aportando velocidad, calidad de servicio y facilitando la gestión de los recursos en la red. De aquí derivan los siguientes problemas: el paradigma del Routing está muy extendido en todos los entornos, tanto empresariales como académicos, etc. El rediseño total del software existente hacia la Conmutación supondría un enorme gasto de tiempo y dinero. Igualmente sucede con el hardware que está funcionando hoy día. Existen ciertas funcionalidades hoy día en las que sigue interesando emplear 1 ATM: Modo de Transferencia Asíncrono. 77 78 CAPÍTULO 3. INTRODUCCIÓN AL MPLS IP, esto no quita que las tramas IP estén siendo transportadas por paquetes ATM. Debido al diseño de Internet, cualquier red deberá tener métodos que le permitan unirse al resto de las redes que la rodean. El ancho de banda de las redes que emplean ATM es desaprovechado cuando portan paquetes IP debido a los altos tiempos de proceso que necesita el Routing que se está ejecutando sobre ellas. En sí, se debe encontrar una solución puente entre ambas tecnologías para permitir: ² Adaptación de las tramas IP sobre las redes y protocolos ATM sin que por ello se pierdan las características de ATM, estas son: velocidad, garantías de calidad de servicio y gestión de trá…co en la red. ² Convivencia de ambas soluciones sobre un mismo escenario, permitiendo así una migración gradual hacia las nuevas tecnologías. ² Reutilización: se debe aprovechar lo ya existente y evitar en la medida de lo posible la alteración de la programación y del hardware ATM. 3.2 Estudio del Sistema Actual Es aquí cuando tenemos que analizar las dos tecnologías existentes por separado, y encontrar los campos comunes y las diferencias fundamentales. Así como las primeras soluciones que se han encontrado para integrarlas. En esta parte del proyecto se realizó la mayor parte de la recopilación de información. Proveniente en un alto porcentaje de Internet, esto es en parte debido a la naturaleza mutable de las soluciones, la mayor parte de ellas en fase de pruebas o RFCs2 . 2 RFC: Request For Coments: Documento publicado en Internet , normalmente con una fecha de caducidad, que se encuentra abierto al estudio por parte de los lectores, que pueden aportar su opinión en listas de correo o en foros de noticias 3.2. ESTUDIO DEL SISTEMA ACTUAL 3.2.1 79 Protocolo IP El Protocolo Internet (Internet Protocol), o Ipv4 es la parte central del paquete de protocolos de Internet. IP (RFC 791, RFC 1122) es un protocolo de red que ofrece un servicio de envío de paquetes no orientado a conexión. Sobre éste trabajan los protocolos de transporte, siendo el más común de ellos el protocolo TCP. Por esto en la terminología habitual nos encontremos con el término TCP/IP en referencias al funcionamiento conjunto de ambos protocolos. IP es un protocolo orientado a datagramas que trata cada paquete de manera independiente, de modo que cada paquete deberá contener toda la información necesaria para ser direccionado de manera correcta.. No tiene garantías de entrega de paquetes ni garantías de integridad en la información recibida ya que ni emplea el checksum para comprobar el contenido del paquete, ni posee mecanismos de con…rmación para determinar si el paquete ha alcanzado su destino. El protocolo IP junto con protocolos como ARP3 , RARP4 o ICMP5 de…ne el formato del datagrama , direccionamiento, procesamiento de paquetes, routing y mecanismos para mostrar errores en Internet. Tal y como se describe en el RFC 1122, un host que esté ejecutando el protocolo IP , normalmente también admitirá ARP y ICMP. IP es un protocolo orientado a datagramas que trata cada paquete de manera independiente, de modo que cada paquete deberá contener toda la información necesaria para ser direccionado de manera correcta. No tiene garantías de entrega de paquetes ni garantías de integridad en la información recibida ya que ni emplea el checksum para comprobar el contenido del paquete, ni posee mecanismos de con…rmación para determinar si el paquete ha alcanzado su destino. En lo referente a las capas sobre las que se puede ejecutar IP, podemos encontrar una gran variedad de posibilidades, debido a que IP, en teoría, oculta la tecnología subyacente a sus usuarios (capas superiores) . Por esto podemos ver a IP ejecutándose sobre ATM bajo un amplio número de posibilidades, las cuales intentaremos estudiar con detalle. 3 ARP: Addres Resolution Protocol RARP: Reverse Addres Resolution Protocol 5 ICMP: Internet Control Message Protocol 4 80 CAPÍTULO 3. INTRODUCCIÓN AL MPLS Figura 3.1: Formato del Datagrama IP. Estructura del Datagrama IP Obsérvese en la Figura 3.1 de la Página 80 los campos del datagrama IP: ² Version: identi…ca la versión del protocolo, ejemplo : 4 en el caso de Ipv4 ² IHL (Internet Header Length) ó longitud de la cabecera: es un campo de 32 bits. ² TOS (Type Of Service): indica la posible prioridad y el tipo de transporte que se desea utilizar. ² Total Length ó Longitud Total: la longitud del datagrama en octetos. Este valor puede ser hasta 65.535 octetos. ² Identi…cation ó Identi…cación: un valor asignado por la capa de transporte para permitir el ensamblado de los fragmentos . ² Flag bits: controlan las opciones de la fragmentación ² Fragment O¤set ó Compensación del Fragmento: indica el lugar donde se encuentra este fragmento en el datagrama original. ² TTL (Time to Live) ó Tiempo de Vida: indica el mayor número de saltos que el datagrama puede realizar a lo largo de la red. ² Protocolo: indica el protocolo de la capa superior , ej : TCP ó UDP 3.2. ESTUDIO DEL SISTEMA ACTUAL 81 ² Header Checksum: un Checksum de 16 bits de la cabecera del datagrama. ² Source / Destination address: direcciones origen y destino, valores de 32 bits que indican el emisor y el receptor del paquete. ² Options: información para control de la red, routing y gestión. ² Padding: Campo de relleno para adaptar la longitud de la cabecera a 20 bytes. ² User Data: los datos de la capa de transporte. Direccionamiento y Routing IP En la versión 4 de IP , el espacio de direcciones está limitado a 32 bits. Una dirección comienza con un número de red , empleado para el routing, seguido de una dirección local, para la red interna. Las direcciones IP se clasi…can en esta versión en 4 tipos, en función del tamaño que corresponda a la parte de red en la dirección. ² Clase A : el bit de orden más alto es “0” , los siguientes 7 son para la red, y el resto para la dirección local. ² Clase B : los dos bits de orden más alto son “10”, los siguientes 14 son para la red y el resto para la dirección local. ² Clase C : los tres bits de orden más alto son “110”,los siguientes 21 son para la red y el resto para la dirección local. ² Clase D : Los cuatro bits de orden más alto son “1110”, seguidos de la dirección multicast. Como se observa, IP admite Multicasting. También soporta Broadcasting. 82 CAPÍTULO 3. INTRODUCCIÓN AL MPLS Figura 3.2: Cabecera de una célula ATM. 3.2.2 Tecnología ATM La tecnología ATM fue de…nida en un principio por la ITU-T6 , organización compuesta principalmente por los operadores de redes públicas. Posteriormente se fundó el ATM forum (en 1991), que aceleró el desarrollo de los estándares relacionados con esta tecnología. El ATM forum está compuesto por compañías que trabajan sobre redes privadas y comunicaciones de datos. El Modo de Transferencia Asíncrono (Asynchronous Transfer Mode) ó ATM es una tecnología de conmutación orientada a conexión y basada en el envío de células. Soporta una amplia variedad de servicios, tales como cell relay, frame relay, o emulación de circuitos. ATM transmite toda la información empleando células de una longitud …ja. Exactamente, una longitud de 53 bytes. Como puede observarse, este valor es muy pequeño en comparación con el tamaño de los datagramas IP. 3.2. ESTUDIO DEL SISTEMA ACTUAL 83 Estructura de una célula ATM Obsérvese en la Figura 3.2 de la Página 82 la estructura de la cabecera de una célula ATM: ² (4 bit) GFC : generic ‡ow control. Parámetro de QoS. Normalmente no usado, (por defecto 0000) ² (8,12 bit) VPI : identi…cador del camino virtual. En nuestro caso este valor se utilizará tambien para identi…car las etiquetas. ² (16 bit) VCI : identi…cador del canal virtual. En nuestro caso este valor se utilizará también para identi…car las etiquetas. ² (3 bit) PT : payload type. Dedicados a describir el tipo de carga que transporta la celda. El primer bit indica si los datos de la celda son de usuario o mensajes de la red. En el plano del usuario los dos bits consecutivos determinan la existencia de congestión y tipo de información. En celdas de mantenimiento los dos últimos bits indican el tipo de mensaje ² (1 bit) Res : reservado. ² (1 bit) CLP : cell loss priority. Parámetro de calidad de servicio. La celda podrá ser descartada si se encuentra congestión. ² (8 bit) HEC : header error control. Empleado para realizar algoritmos de checksum en la cabecera. Corrige un bit erróneo, y detecta más de un bit erróneo. ² (48 bytes) DATOS ATM es asíncrono, esto signi…ca que las células que contienen información de usuario no necesitan ser enviadas de manera periódica. Esta característica, junto con las llamadas características multimedia7 son las que hacen posible transportar tanto trá…co orientado a circuitos, como orientado a paquetes, con una transparencia completa para las aplicaciones. ATM ha sido diseñado para 6 ITU-T: Sector de normalización de la Unión Internacional de las Telecomunicaciones (antiguamente el Comité Consultivo Internacional Telegrá…co y Telefónico CCITT. Organización Internacional que desarrolla estándares de comunicaciones. 7 multimedia: : nos estamos re…riendo a la transmisión en la red , de imagen y voz de una manera ‡uida y con garantías de calidad de servicio. 84 CAPÍTULO 3. INTRODUCCIÓN AL MPLS dar grandes anchos de banda bajo demanda. Cuando un usuario no necesita acceder a una conexión de red, el ancho de banda de esta conexión se hace accesible para otra conexión que la necesite. El término ATM puede ser interpretado de maneras diferentes. Puede encontrarse tanto en el ámbito del hardware como en el de software. Puede funcionar sobre diferentes tipos de medios de transmisión. Podemos referirnos a un interface físico (las células de 53 octetos), una tecnología de conmutación, ó un concepto de red que da acceso a múltiples servicios. En este estudio, trataremos de englobar todos los conceptos, aproximándonos más al concepto general de ATM, esto es, visto como un conjunto de tecnología de red y protocolo ATM. Existe una opinión coincidente en muchos de los investigadores sobre ATM en la que se espera que ATM sea implementado sobre redes de área extensa, en un principio como tecnología de conmutación, dando soporte a los servicios actuales en WANs privadas y de servicio público, tal y como ya está sucediendo. También está implementándose ATM sobre LANs, empleando LANE8 o sus sucesores, como veremos más adelante. Con el paso del tiempo, ATM espera ser, al igual que ha venido siendo IP, una tecnología vital en el ámbito de redes de área extensa, redes campus o corporativas y redes de área local. Aportando mucho mayor control y garantías de QoS sobre los elementos de red. 3.2.3 El Protocolo IP sobre la estructura ATM La tecnología basada en el Modo de Transferencia Asíncrono (ATM) está jugando un papel muy importante en la evolución de las redes locales, campus y backbones. ATM aporta ventajas importantes sobre las tecnologías existentes para redes de área local y redes de área extensa, incluyendo escalabilidad y garantías de QoS9 . Estas ventajas, sin embargo, tienen un precio. ATM es una tecnología muy compleja, quizás, según opinan algunos expertos, la tecnología de red más compleja desarrollada hasta ahora : la estructura de células ATM y el empleo de la conmutación de células facilitan el desarrollo del hardware. Por el contrario, el alto rendimiento de los conmutadores ATM y el desarrollo de 8 9 LANE: LAN Emulation QoS: Quality Of Service: Calidad de Servicio 3.2. ESTUDIO DEL SISTEMA ACTUAL 85 estas redes requieren una estructura de protocolo muy compleja. Además, es lógico pensar que para llevar a cabo la implantación de ATM en todos sus ámbitos, si esta llega a realizarse, deberá seguirse un proceso de migración a partir las tecnologías de red actuales. En de…nitiva, ATM deberá convivir con el protocolo más utilizado hoy día en todas las redes privadas y públicas, Internet Protocol. Esta convivencia, tiene visos de ser obligada y existirá durante un largo plazo. A continuación se enumeran las cuestiones que esta convivencia plantea. A corto plazo : Debido a su amplia difusión, IP sigue en la cabeza de los protocolos de red, ATM se emplea en mayor medida como transporte de éste, debido a que: ² Existe multitud de hardware para IP en Internet desarrollado para WANs y LANs. ² El desarrollo de ATM actualmente está principalmente concentrado en las redes campus y backbones / WAN. ² Existen muchas y muy heterogéneas aplicaciones basadas en IP. ² Existen pocas aplicaciones que hacen un uso exhaustivo de las funcionalidades de ATM. En concreto, para los usuarios, (empresas, proveedores de Internet, universidades, etc.) los costes en tiempo y dinero que suponen la migración son muy importantes. De modo que las soluciones del tipo superpuestas (IP clásico sobre ATM y LANE) están jugando un papel muy importante en el desarrollo de ATM en LANs y backbones. El empleo de este tipo de soluciones supone, como se estudiará más adelante, el no poder emplear QoS en la capa de aplicación. De todas maneras, el Internet actual no ofrece ningún protocolo que permita obtener QoS, aunque protocolos como RSVP10 están ya plenamente desarrollados. La única solución para el empleo de QoS por parte de las aplicaciones es emplear soluciones propietarias, como Arequipa que estudiaremos más adelante. A medio / largo plazo: 10 RSVP: Protocolo de Reserva de Recursos 86 CAPÍTULO 3. INTRODUCCIÓN AL MPLS Parece ser que actualmente se ha descartado la idea de que ATM se convierta en una solución integral que abarque toda la pila de protocolos, debido a varias razones: ² IP está muy extendido (tanto en hardware como en software). ² El software empleado para el signalling11 , routing y gestión de ATM se está haciendo complejo y costoso. ² Existe demasiada sobrecarga cuando se establecen conexiones para ‡ujos de datos de corta duración. ² Las aplicaciones deben ser modi…cadas considerablemente para emplear ATM nativo. ² La sustitución completa de equipos LAN necesitarían correr ATM en toda la pila de protocolos. Estas cuestiones a…rman la idea de emplear un modo de adaptar estos dos paradigmas tan dispares en algunos campos. Este proyecto estudia las soluciones más importantes que se han propuesto para tratar de integrar el protocolo IP sobre el protocolo ATM . Para los entornos privados, el ATM Forum ha especi…cado MPOA12 . La IETF13 ha especi…cado IP sobre ATM clásico, NHRP14 y MPLS. También existen multitud de propuestas realizadas por organismos privados, como Arequipa, ARIS de IBM , o CSR15 desarrollado por miembros del Instituto Tecnológico de Tokio. 3.2.4 Modelo lógico del sistema existente A continuación estudiaremos el sistema actual, diseñando el diagrama de contexto y el DFD de nivel superior. A partir de aquí, podremos hacernos una idea de las necesidades que no se cubren con este método. 11 Signalling: Señalamiento MPOA: Multi Protocol Over ATM 13 IETF: Internet Engineering Task Force 14 NHRP: Next Hop Resolution Protocol 15 CSR: Cell Switch Router 12 87 3.2. ESTUDIO DEL SISTEMA ACTUAL Fuente Externa de datos Datos Datos Subred Lógica IP Datos Fuente Interna de datos Datos Figura 3.3: Diagrama de Contexto del Sistema Actual. Diagrama de Contexto Si tomamos como referencia el modelo clásico de IP sobre ATM para diseñar la solución más inmediata, deberemos tener en cuenta que esta solución considera la red estructurada en varias Subredes Lógicas IP, dentro de las cuales, los datos se direccionan mediante conmutación, aprovechando las cualidades de ATM. En cambio, si se desean enviar datos fuera de estas Subredes Lógicas, deberá emplearse el routing convencional, incluso aunque todo el camino entre origen y destino sea ATM nativo. Esta solución, como se estudiará más adelante, no podrá ser una propuesta óptima a la hora de adaptar IP sobre ATM, debido a las limitaciones que impone en el funcionamiento ATM.Observesé dicho diagrama en la Figura 3.3 de la Página 87. DFD de Nivel Superior En el DFD de nivel superior, que se observa en la Figura 3.3 de la Página 87, siguen existiendo dos entidades, que representan a los equipos internos y externos al LIS16 . Los equipos que pertenezcan a la misma red lógica deberán enviar todos sus datos al conmutador. En esta operación, el conmutador comprobará si el destino corresponde a un equipo interno a la red, procediendo a enviar las células directamente al destino. O si por el contrario corresponde a un equipo externo, pasando entonces la célula al adaptador, para pasar las células ATM a datagramas IP, y al router para que proceda a buscar el siguiente salto. El proceso de conmutación busca la información de los VP17 y VC18 en la tabla de switching. 16 LIS: Logical IP Subnet: Red Lógica IP VP: Virtual Path 18 VC: Virtual Connection 17 88 CAPÍTULO 3. INTRODUCCIÓN AL MPLS Datagrama s IP dirigidos al exterior Fuente de datos interna (equipos en este LIS) Células ATM internas Fuente de datos externa (equipos en Enrutar y adaptar otro LIS) Células ATM Dirigidas al exterior Datagramas IP externos Células ATM internas Células ATM Conmutar Externas Tabla switching Tabla routing Figura 3.4: DFD de Primer Nivel. El proceso de enrutado ó routing busca el siguiente salto en la tabla de routing. 3.3 Evaluación de alternativas En este apartado se van a describir las propuestas más destacadas que intentan solucionar el problema ya mencionado de IP - ATM . Dado el carácter investigador de muchas de las soluciones aquí descritas, es difícil a priori realizar una evaluación precisa del rendimiento que aportan, o del coste tanto en tiempo como en recursos que su implantación supone. Por el contrario, al tener de…nidos los modelos teóricos, la arquitectura y los protocolos, resulta más efectivo realizar evaluaciones de puntos tales como si admiten Multicast, IP nativo, ATM nativo, complejidad de los procedimientos, necesidad de modi…caciones en el hardware existente, etc. Y lo más importante, habrá que evaluar la ‡exibilidad de las soluciones para admitir modi…caciones en el diseño sobre la marcha para, una vez realizada la implementación, admitir el mayor número de cambios en los parámetros de la red (QoS, enrutado, tari…cación, ancho de banda, etc), ya que no hay que 3.3. EVALUACIÓN DE ALTERNATIVAS 89 olvidar que estamos hablando de proyectos en fase Beta, sujetos a continuos cambios. 3.3.1 LANE LANE es una buena solución para interconectar equipos LAN en una red privada, aprovechando al máximo la alta velocidad de transmisión ATM con cambios mínimos en los equipos. Además, no se necesita modi…car ninguna aplicación ni protocolo de las capas superiores a IP. Es una solución rápida que ya está operativa . Además, supone una buena opción para una integración progresiva de LAN a ATM en una red corporativa. Las mejoras que LANE aporta el concepto de LAN Virtual, aportando una ‡exibilidad mejorada a la hora de con…gurar parámetros de la red y una manipulación de estos mucho más sencilla que las LAN clásicas. Sin embargo, se le pueden encontrar ciertas limitaciones: ² Oculta por completo las funcionalidades en QoS que aporta ATM, esto es debido a cómo está concebida su arquitectura, emulando la tecnología de medio compartido de ciertas LANs clásicas. ² No puede correr protocolos en modo nativo. ² Su alcance está limitado a una subred lógica (LAN virtual o VLAN19 ). ² Todo el trá…co entre VLANs debe pasar a través de routers, incluso si pudiera darse una conexión directa mediante ATM. Como consecuencia los routers pueden dar lugar a cuellos de botella en el ‡ujo de datos. ² La conversión de direcciones LANE es ine…ciente debido a que las direcciones se convierten de direcciones de la capa 3 a direcciones MAC y posteriormente direcciones ATM, empleando dos mecanismos de resolución de direcciones. ² El funcionamiento de LANE requiere muchas conexiones, limitando el número de equipos que pueden pertenecer a una LAN Emulada. ² No dispone de mecanismos de recuperación en el servidor, de modo que no admite la posibilidad de de…nir LES y BUS de “seguridad” para actuar en situaciones de emergencia. 19 VLAN: Virtual LAN, LAN Virtual. 90 CAPÍTULO 3. INTRODUCCIÓN AL MPLS ² Posee límites en el tamaño de la MTU. 3.3.2 IP clásico sobre ATM La principal ventaja que aporta es su compatibilidad total con IP estándar. Permitiendo a la gran mayoría de protocolos y aplicaciones que se encuentran por encima de éste ejecutarse de manera transparente sobre ATM , aprovechando el gran ancho de banda de ATM. Otra ventaja que aporta es la facilidad de integrar servicios basados en IP con servicios basados en ATM. ( por ejemplo, servicios de voz). El principal problema de esta solución es que no puede utilizar las funcionalidades en garantías de QoS de ATM debido a los siguientes motivos: ² Las conexiones ATM directas solo se pueden establecer dentro de un LIS, pero no a lo largo de los extremos. Debido que la resolución de direcciones está limitada a un solo LIS, el trá…co IP entre nodos en diferentes LIS, siempre circulará por algún router intermedio, que sólo puede emplear el paradigma IP del best e¤ort20 en garantías deQoS. ² Todos los ‡ujos de datos IP entre dos hosts comparten el ancho de banda de un solo Circuito Virtual. De modo que resulta imposible a una aplicación individual conseguir una garantía de QoS para su ‡ujo de datos concreto. Otro problema de IP clásico sobre ATM es la imposibilidad de realizar multicast (ni unicast). Además no existe un camino por defecto para enviar datagramas IP antes de que se establezca una conexión, provocando un retraso alto al circular el primer datagrama. Aunque esta solución no permite aprovechar muchos de los equipos LAN clásicos, ofrece un tamaño mayor, y más apropiado de MTU. 3.3.3 NHRP La ventaja principal de esta solución es que puede resolver el problema de múltiples saltos a través de distintas subredes ofreciendo la Resolución de 20 Best E¤ort: mejor esfuerzo 3.3. EVALUACIÓN DE ALTERNATIVAS 91 Direcciones inter - LIS. Permitiendo así el establecimiento de una conexión directa entre las redes NBMA, si éstas son ATM, se establece un Circuito Virtual directo entre varios LIS, empleando QoS para el ‡ujo de datos IP entre los extremos del Circuito Virtual. Pero NHRP21 sólo podrá realizar esto si el camino de la ruta es abarcado por completo por subredes NBMA22 , y sólo bajo las condiciones que admite NHRP. Además, al igual que IP cásico sobre ATM, una conexión IP directa será compartida por el trá…co generado por todas las aplicaciones comunes entre los dos extremos, de modo que resulta imposible dar QoS a una aplicación especí…ca. Otro problema con NHRP es que se pueden dar bucles en el routing, si las estaciones de inicio y de respuesta NHRP son routers, que estén conectados además a otra red. Evitar estos bucles supone imponer restricciones en la con…guración de la red. Otro problema que puede aparecer es el efecto dominó. Se da cuando un router crea una petición de resolución NHRP para un paquete que llegue sobre uno de sus interfaces NHRP. Si éste envía los paquetes de datos sin esperar a que se establezca un nuevo camino, el siguiente router que reciba el paquete puede crear su propia petición de resolución y reenviar el paquete, y así sucesivamente. El empleo de NHRP requiere la introducción de software especí…co en todos los hosts y routers conectados a la red NBMA. Además, la especi…cación actual sólo está pensada para comunicaciones unicast, no se adapta a broadcast o multicast. NHRP es un draft23 y es poco probable que sea admitido de manera genérica. 21 NHRP: Next Hop Resolution Protocol NMBA: Non Broadcast Multi Access Networks 23 Draft: propuesta 22 92 CAPÍTULO 3. INTRODUCCIÓN AL MPLS 3.3.4 MPOA Se trata de una tecnología muy compleja. Hasta la aparición de MPLS era la tecnología más prometedora aportando los siguentes bene…cios : ² Da conectividad a un entrorno que emplee routing. Admitiendo tanto multicast como broadcast en la capa 3. ² Aprovecha al máximo las ventajas de ATM, ofreciendo conexiones ATM directas entre dispositivos MPOA, sin saltos intermedios. Además admite ATM nativo, adaptando la QoS en la pila de protocolos. ² Reduce los costes en la infraestructura de…niendo una nueva arquitectura de red. Aprovechando al máximo la funcionalidad de conmutación, que es muy barata y puede realizarse en hardware. Y dejando el routing, más caro y con más necesidades de rendimiento, en los Dispositivos Frontera. ² Da una solución universal para cualquier protocolo de la capa 3 sobre ATM. ² Se integra fácilmente con LANE. Las principales desventajas, son su complejidad, debiendo desarrollar mucho código sobre las máquinas. Y la necesidad de cambiar la pila de protocolos en los hosts. 3.3.5 Arequipa Como principales ventajas que aporta podemos indicar: ² Mejora el IP clásico sobre ATM para que las aplicaciones basadas en IP empleen todas las características de garantías de QoS de ATM permitiéndoles establecer y controlar sus propios Circuitos Virtuales. ² Es un software bastante sencillo que solo necesita estar ejecutándose sobre los hosts sin necesidad de NHRP o RSVP. ² Se pueden evitar los cuellos de botella de los routers estableciendo conexiones directas punto a punto. 3.3. EVALUACIÓN DE ALTERNATIVAS 93 ² No es sólo una propuesta teórica, ya existen aplicaciones que la utilizan. ² Coexiste con la pila normal de IP sobre ATM permitiendo que aplicaciones normales y mejoradas por Arequipa corran simultáneamente. La mayor desventaja es el factor de que las aplicaciones actuales IP deben ser modi…cadas para aprovechar al máximo sus funcionalidades. Aunque estos cambios resulten mínimos. Además no deja de ser una propuesta privada, con pocas posibilidades de convertirse en un estándar. 3.3.6 IP Switching IP switching se describe como una manera optima y escalable de soportar IP sobre ATM. Emplea las partes fuertes tanto de IP como de ATM para aumentar el rendimiento de Internet: ² El hardware ATM aporta alta velocidad a un precio aceptable. ² El routing IP es mucho más sencillo que el los protocolos de direccionamiento, routing y signalling para ATM (UNI24 , P-NNI). Los ‡ujos de datos duraderos, por ejemplo la transferencia de …cheros, se comportan de manera óptima en ATM, ya que una vez establecido el Circuito Virtual, no es necesario volver a analizar los datagramas IP para realizar routing. Por el contrario, las conexiones cortas se comportan de manera más e…ciente empleando el routing de IP, sin tener que esperar a establecer conexiones …jas ATM. La QoS punto a punto puede en un principio llevarse a cabo en una red totalmente equipada con IP switching. Sin embargo, esta QoS se expresa en términos de prioridad para un ‡ujo de datos, y no en los términos comunes de ATM. Además, no es la aplicación en sí, sino la red, la que inicia el establecimiento de la sesión, haciendo imposible a las aplicaciones establecer sus necesidades de QoS. 24 UNI: interfaz usuario - red. 94 CAPÍTULO 3. INTRODUCCIÓN AL MPLS 3.3.7 Tag Switching Tag Switching, creada por Cisco Systems es una manera potente de integrar la conmutación de células con el direccionamiento y el routing simple de tecnologías de conmutación de frames. Mejora el rendimiento del reenvío con una buena relación coste/rendimiento. Asociando un rango amplio de granularidad de envío con una tag (etiqueta), se puede soportar una gran variedad de funciones de routing (routing basado en el destino, multicast, basarse en la QoS, o jerarquías). Se diferencia de IP Switching en que las etiquetas nunca se asocian basándose en el análisis del ‡ujo de datos, sino en la topología de la red. Debido a que esta topología es bastante estática, se adquieren mejoras en el rendimiento respecto a IP switching. Otra diferencia es que Tag Switching es una tecnología multiprotocolo. Si se emplea Tag Switching con IP y ATM ,se puede sustituir todo el plano de control de ATM /UNI, PNNI) por la componente de control de IP Switching, que es mucho más sencilla de implementar. Una desventaja de Tag Switching al utilizarlo con ATM es que los conmutadores ATM que lo emplean deben participar como pares en el protocolo IP y necesitarán soportar envío de la capa de red. Si se emplea junto con un protocolo de reserva, como RSVP, es posible dar conexiones tipo Circuito Virtual con garantías de QoS extremo a extremo para ‡ujos IP. Tag switching es principalmente una tecnología de backbones, que se adapta bien al enrutado del trá…co en Internet de los proveedores de servicio a través de una tecnología ATM. Los temas de seguridad y facturación no se han tenido en cuenta, dejando a los protocolos que corran por encima estas tareas. 3.3.8 MPLS El bene…cio más importante de MPLS, según críticos y mi opinión personal, es que aporta una base que permite a los proveedores de Internet (ISPs25 ) llevar nuevos servicios que no pueden ser tan fácilmente soportados por el routing IP. Con MPLS es factible controlar el coste, dar mejores niveles de servicios, 25 ISP: Internet Service Provider, Proveedor de Servicios de Internet. 3.3. EVALUACIÓN DE ALTERNATIVAS 95 asignar rutas, y QoS. Otras ventajas : ² Simpli…ca el paradigma de envío. Aumentando las prestaciones precio/rendimiento y el tiempo de vida en el mercado. ² Permite a los switches ATM ser reutilizados como routers (LSR26 ). ² El envío es independiente de : – La capa de red. – Capas inferiores: ATM, Frame Relay, ethernet, Sonet, etc. – Los criterios empleados para asociar paquetes en clases de equivalencia (FEC27 ). Además , los cambios en estos criterios son transparentes, aportando robustez en los posibles cambios en las decisiones futuras. ² El criterio de envío no está basado exclusivamente en la cabecera del paquete (por ejemplo, podría estar basado en el puerto de entrada, asociando cada puerto con un FEC). Estos criterios pueden llegar a ser tan complejos como se desee, sin que tengan ningún efecto negativo en los LSRs internos de la red. ² El etiquetado es un mecanismo más e…ciente que el encapsulado para emplear túneles. ² El envío MPLS puede emplear switches que no puedan analizar las cabeceras de la capa de red, basta con que puedan sustituir las etiquetas de los paquetes. ² Un paquete que entre en la red por un router concreto puede ser etiquetada de manera distinta que en el caso de haber entrado por otro router, como resultado, las decisiones den envío que dependen del router de entrada pueden realizarse fácilmente. 26 27 LSR: Label Switch Router. FEC: Forwarding Equivalance Class, Clase Equivalente de Envío. 96 CAPÍTULO 3. INTRODUCCIÓN AL MPLS 3.4 Selección de una alternativa Tras el estudio de alternativas llevado a cabo, decidimos optar por MPLS, queda claro el gran número de ventajas que aporta sin encontrar grandes puntos débiles en su diseño. Además es una arquitectura muy actual, aún en fase de diseño y desarrollada por un grupo de trabajo especí…co, el MPLS Work Group, que trabaja para la IEEE28 . De modo que las posibilidades de convertirse en un estándar son muy grandes. 3.4.1 Viabilidad técnica La arquitectura MPLS precisa de dos elementos de red propios: El Router Conmutador de Etiquetas LSR y El Router Frontera entre Capas LER. Para contar con estos elementos habrá que sustituir el software propio del switch ATM por un software compatible con MPLS: ² En el caso de un LSR: añadiendo la posibilidad de utilizar reenvío IP (IP forwarding). ² En el caso de un LER: además deberá poder mantener tablas que asocien parámetros de IP con Clases de Envío Equivalentes (FECs), además de una componente que asocie estas clases de Envío con Etiquetas. Como se observa, las modi…caciones son sólo en el software, facilitando la modi…cación y permitiendo así una viabilidad técnica. En lo que respecta al harware, los switches ATM son fáciles de encontrar e instalar, así como las conexiones entre ellos. 3.4.2 Viabilidad operacional En lo que respecta a la convivencia con la estructura ATM existente existen dos posibilidades para realizar estas modi…caciones : 28 IEEE: Instituto de Ingienería Eléctrica y Electrónica. Organización profesional cuyas actividades incluyen el desarrollo de estándares de comunicaciones y redes. 3.4. SELECCIÓN DE UNA ALTERNATIVA 97 ² Crear una nueva componente de control en el software del switch ATM: esta opción es la más estricta, ya que supone trabajar exclusivamente con IP y MPLS, no pudiendo convivir el switch con otros switches vecinos que trabajen con ATM nativo. ² La opción “barcos en la noche” ó ships in the night : en este caso, se añade a la componente de control ATM la componente MPLS, de tal manera que el espacio de direcciones vpi29 / vci30 queda dividido, pudiendo trabajar así tanto con ATM nativo en un espacio de direcciones y con MPLS en otro espacio de direcciones diferente. Con el protocolo IP no existe ningún tipo de inconveniente, ya que MPLS resulta transparente a las capas superiores (en este caso IP). Las características de MPLS, como ya se comentó, lo hacen muy ‡exible a la hora de modi…car políticas de envío, o realizar ingeniería del trá…co en la red. Pudiendo realizar modi…caciones en el software sin tener que tocar el harware para nada. 3.4.3 Viabilidad económica Los costes de la implantación del nuevo sistema pueden llegar a ser muy pequeños si ya contamos con el harware ATM necesario. Ya que cualquier switch podrá ser modi…cado para funcionar como un LSR MPLS. Así mismo, podrá convivir el nuevo sistema con el ATM clásico si así se desea. En de…nitiva, si una empresa puede costearse la compra de un switch ATM, el coste del cambio del software del equipo resultará muy pequeño en comparación. En lo que respecta a los bene…cios a medio plazo, queda claro que la posibilidad de adoptar políticas de trá…co en la red, tari…cación, asignación de calidad de servicio, etc. supone un valor añadido en la empresa, ya sean proveedores de servicio, universidades o empresas corporativas. 29 30 VPI: Virtual Path Identi…er, Indeti…cador del camino virtual. VCI: Virtual Connection Identi…er, Identi…cador de conección virtual. Capítulo 4 MPLS Multi Protocol Label Switching 4.1 Introducción a MPLS La arquitectura MPLS es la solución más reciente de todas las estudiadas hasta ahora. Diseñada originalmente por un pequeño grupo de trabajo: Ross Callon (Ascend), Arun Viswanathan (IBM), Eric Rosen (Cisco). Ha asimilado los puntos fuertes de soluciones como MPOA o IP Switching para conseguir una solución sólida y con muchas posibilidades de convertirse en un estándar de la industria, avalado por la IEEE. En sí, trata de emplear los switches como Routers de Label Switching o Routers de conmutación de etiquetas. Los switches ATM ejecutan algoritmos de routing de la capa de red, y el envío de sus datos se basa en los resultados de esos algoritmos de routing. No se necesita direccionamiento ni routing especí…co para ATM. Los switches ATM que se emplean de esta manera son conocidos como ATM-LSRs. Los puntos principales de MPLS son : ² Etiqueta: clasi…cación de paquetes que se enviarán por el mismo camino. ² Las etiquetas se asocian en la entrada de la red MPLS. ² El envío de paquetes se basa en la etiqueta. 99 100 CAPÍTULO 4. MPLS MULTI PROTOCOL LABEL SWITCHING ² Las etiquetas se eliminan en la salida de la red MPLS. ² El criterio empleado para clasi…car los paquetes en etiquetas se puede basar en una decisión local, al entrar en la red MPLS o en base a decisiones preestablecidas. ² Las etiquetas asignadas deben comunicarse a todos los nodos a lo largo del camino de la clase de paquetes asociados con la etiqueta. ² Las etiquetas puede apilarse: un paquete puede tener varias etiquetas. ² LSR : router - conmutador que soporta MPLS. Una de las características que aporta MPLS es que no tiene como base una sola tecnología (como es ATM para las soluciones anteriores), el funcionamiento de MPLS es independiente de la capa que corra bajo este, ya sea ATM o cualquier otra tecnología de red. 4.1.1 Objetivos El propósito del grupo de trabajo de MPLS es estandarizar una tecnología que sirva de base y que combine el empleo de la conmutación de paquetes con el routing .Para ello, se necesita integrar este módulo en la componente de control (que utiliza routing) en la capa de red. Para llevarlo a cabo, se desarrolló esta propuesta, con el propósito de satisfacer los siguientes requerimientos: ² MPLS podrá ejecutarse sobre cualquier tecnología en la capa de red, como puede ser, ATM. ² Deberá soportar ‡ujos de trá…co tanto unicast como multicast. ² Deberá ser compatible con el modelo de Servicios Integrados de la IETF, incluyendo RSVP. ² Deberá ser escalable, para soportar el crecimiento constante de las estructuras corporativas, y, más globalmente, la expansión de Internet. ² Deberá admitir herramientas de soporte, administración y mantenimiento al menos tan ‡exibles como las que soportan las redes actuales IP4. 4.1. INTRODUCCIÓN A MPLS 101 Conceptos erróneos sobre MPLS Según Chuck Semeria, Ingeniero de Juniper Networks, muchos miembros de la comunidad Internet piensan que MPLS fue desarrollado para dar un estándar que permitiese a los fabricantes transformar los Switches ATM en routers backbone de altas prestaciones. Puede que esta solución fuese uno de los objetivos iniciales en el paradigma de la conmutación Multicapa, abanderado por MPOA a mediados de los 90, pero actualmente, los avances en la tecnología estan consiguiendo que motores de búsqueda de rutas IP basados en ASIC1 sean tan rápidos como MPLS o motores de búsqueda ATM vpi / vci. De modo que la ventaja que MPLS aporta al rendimiento del envío de paquetes no es la primera ventaja. Otras personas piensan que MPLS fue diseñado para eliminar por completo el routing IP. Esto no ha sido nunca un objetivo del Grupo de Trabajo de MPLS, porque sus miembros entienden que el routing tradicional en la capa 3 siempre será necesario en Internet: ² El …ltrado de paquetes en los cortafuegos y los ISPs es un componente fundamental para la seguridad y administración en la red. Ya que el …ltrado de paquetes requiere un examen detallado de las cabeceras de los paquetes, en enrutado de la capa 3 sigue siendo necesario. ² Es improbable que un gran número de hosts implementen MPLS. Esto signi…ca que cada paquete transmitido por un host todavía necesita ser enviado por un dispositivo en la capa 3, donde la cabecera del paquete pueda ser examinada antes de ser enviado hacia su destino. Este router puede tanto enviar el paquete empleando el routing convencional o asignarle una etiqueta y enviar el paquete por un camino etiquetado conmutado (LSP). ² Si un dispositivo de la capa 3 a lo largo del camino examina la cabecera IP y asigna una etiqueta, la etiqueta representa una ruta agregada porque es imposible mantener enlaces de etiquetas para cada host en Internet. Esto signi…ca que, en algún punto del camino, la cabecera IP debe ser examinada por otro dispositivo en la capa 3 para determinar una granularidad más …na para seguir enviando el paquete. Este router puede optar por enviar el paquete empleando routing o crear un nuevo camino de etiquetas conmutadas y enviar este paquete por el. 1 ASIC: Application Speci…c Integrated Circuits. 102 CAPÍTULO 4. MPLS MULTI PROTOCOL LABEL SWITCHING ² En el último salto anterior al host de destino, el paquete debe ser enviado empleando routing porque no resulta práctico asignar una etiqueta por separado para cada host en la subred de destino. 4.2 Arquitectura 4.2.1 Visión general Cada router analiza la cabecera del paquete y ejecuta un algoritmo de routing, basándose en la información de esta cabecera. Las cabeceras de los paquetes contienen mucha más información que la necesaria para elegir el siguiente salto. Elegir el siguiente salto puede ser visto como la composición de dos funciones: ² 1o : Particionar el conjunto de posibles paquetes en clases de envío equivalentes (FECs). ² 2o : Asociar cada uno de estos FECs con algún destino. En lo que respecta a la decisión de reenvío, diferentes paquetes clasi…cados dentro de un mismo FEC son considerados idénticos. Todos los paquetes pertenecientes a un mismo FEC seguirán el mismo camino. En el envío IP, un router considerará a dos paquetes dentro del mismo FEC si hay algún pre…jo de dirección X en la tabla de routing del router el cuál sea la mayor concordancia para la dirección de destino de los paquetes. A medida que el paquete sigue circulando por la red, cada router realiza la misma operación de asignación en un FEC. En MPLS, esta asignación se efectúa solamente cuando el paquete entra en la red, como se observa en la Figura 4.1 de la Página 103. Tras esto, el FEC al que el paquete ha sido asignado se codi…ca en un valor llamado Etiqueta. Cuando un paquete va a ser enviado al siguiente nodo, se le añade la etiqueta. En el resto de los nodos del camino, no se necesitará realizar análisis de la cabecera del paquete. La etiqueta que acompaña al paquete servirá para encontrar el siguiente salto y una nueva etiqueta, procediendo así a repetir el proceso de envío. 4.2. ARQUITECTURA 103 Figura 4.1: Esquema funcional de MPLS. A veces se desea forzar un paquete a seguir un camino determinado. Esto puede hacerse para llevar a cabo políticas de envío, o porque se está llevando a cabo ingeniería del trá…co. Para llevarlo a cabo, basta con que una etiqueta represente la ruta, todos los paquetes clasi…cados según nuestro criterio, seguirán la ruta que hemos creado con la etiqueta. Un router que soporta MPLS es denominado Router Conmutador de Etiquetas ó LSR ( Label Switched Router). De…niciones ² LSR: Label Switch Router. Router Conmutador de Etiquetas: (LSR) es un dispositivo que realiza el envío de paquetes basándose en la información de la etiqueta del paquete recibido. Los LSR Para realizar esto, poseen la componente de envío. ² ATM - LSR: es un switch ATM modi…cado para actuar como Router Conmutador de etiquetas. En este caso, los valores de campos vpi - vci en los paquetes ATM se emplearán como etiquetas. ² FEC: Forwarding Equivalence Class. Clase de Envío Equivalente: Es un subconjunto de paquetes IP que son tratados de la misma manera por un router. Podemos decir que en el routing convencional, cada paquete 104 CAPÍTULO 4. MPLS MULTI PROTOCOL LABEL SWITCHING está asociado a un nuevo FEC en cada salto. En MPLS esta operación sólo se realiza la primera vez que el paquete entra en la red. ² LER: Layer Edge Router. Router Frontera entre Capas: Es el dispositivo LSR Frontera entre IP y MPLS. Los LER deben poseer todas las funcionalidades de un LSR y además capacidad para asociar FECs y nuevas Etiquetas con los datagramas IP que entren en la red. O para asignar direcciones IP a los FEC de los paquetes etiquetados que salen de la red. Para ello dispone junto con la componente de envío, una componente de control, que se encarga de asignar el trá…co a un FEC y de asociar el FEC con etiquetas. ² Etiqueta: un identi…cador de longitud corta y constante que se emplea para identi…car una Clase de Envío Equivalente (FEC), normalmente con carácter local. En el caso de ATM, las etiquetas se codi…carán dentro de los campos vpi - vci de los paquetes ATM. ² LSP: Label Switched Path. Camino Conmutado de Etiquetas: el camino compuesto por uno o más LSRs dentro de un nivel jerárquico por el que un paquete perteneciente a un determinado FEC circula. Todos los paquetes pertenecientes a un mismo FEC circularán siempre por el mismo camino LSP. ² Pila de etiquetas: un conjunto apilado de etiquetas que pueden circular con el paquete. Componente de Control de Conmutación de etiquetas en ATM Para soportar conmutación de etiquetas, [Swa99] un switch ATM debe implementar la componente de control de conmutación de etiquetas, como se observa en la Figura 4.2 de la Página 107. Esta trabaja básicamente sobre la localización, distribución y procedimientos de mantenimiento de las etiquetas. La información de enlace de etiquetas es comunicada mediante varios mecanismos, destacando el Protocolo de Distribución de Etiquetas (Label Distribution Protocol) o LDP. En muchos casos, se emplean otros protocolos diferentes para este cometido, como pueden ser: RSVP, PIM o BGP . Siendo necesaria la participación de un LSR-ATM para llevarlos a cabo. 4.2. ARQUITECTURA 105 Figura 4.2: Componente de Control y Envío de Etiquetas. Componente de Envío de Etiquetas Esta tabla se construye a partir de la información de encaminamiento que proporciona la componente de control, según se verá más adelante. Cada entrada de la tabla contiene un par de etiquetas entrada/salida correspondientes a cada interfaz de entrada, que se utilizan para acompañar a cada paquete que llega por esa interfaz y con la misma etiqueta (en los LSR exteriores sólo hay una etiqueta, de salida en el de cabecera y de entrada en el de cola). En la Figura 4.3de la Página 106, se ilustra un ejemplo del funcionamiento de un LRS del núcleo MPLS. A un paquete que llega al LSR por la interfaz 3 de entrada con la etiqueta 45 el LSR le asigna la etiqueta 22 y lo envía por el interfaz 4 de salida al siguiente LSR, de acuerdo con la información de la tabla. El algoritmo de intercambio de etiquetas requiere la clasi…cación de los paquetes a la entrada del dominio MPLS para poder hacer la asignación por el LSR de cabecera. En la Figura 4.4 de la Página 107, el LSR de entrada recibe un paquete normal (sin etiquetar) cuya dirección de destino es 212.95.193.1. El LSR consulta la tabla de encaminamiento y asigna el paquete a la clase FEC de…nida por el grupo 212.95/16. Asimismo, este LSR le asigna una etiqueta (con valor 5 en el ejemplo) y envía el paquete al siguiente LSR del LSP. Dentro del dominio MPLS los LSR ignoran la cabecera IP; solamente analizan la etiqueta de entrada, consultan la tabla correspondiente (tabla de conmutación de etiquetas) y la reemplazan por otra nueva, de acuerdo con el algoritmo de intercambio de etiquetas. Al llegar el paquete al LSR de cola 106 CAPÍTULO 4. MPLS MULTI PROTOCOL LABEL SWITCHING Figura 4.3: Detalle de la tabla de envío de un LSR. (salida), ve que el siguiente salto lo saca de la red MPLS; al consultar ahora la tabla de conmutación de etiquetas quita ésta y envía el paquete por routing convencional. Como se ve, la identidad del paquete original IP queda enmascarada durante el transporte por la red MPLS, que no “mira” sino las etiquetas que necesita para su envío por los diferentes saltos LSR que con…guran los caminos LSP. Las etiquetas se insertan en cabeceras MPLS, entre los niveles 2 y 3. Según las especi…caciones del IETF, MPLS debía funcionar sobre cualquier tipo de transporte: PPP, LAN, ATM, Frame Relay, etc. Por ello, si el protocolo de transporte de datos contiene ya un campo para etiquetas (como ocurre con los campos VPI/VCI de ATM y DLCI de Frame Relay), se utilizan esos campos nativo para las etiquetas. Sin embargo, si la tecnología de nivel 2 empleada no soporta un campo para etiquetas p. ej. enlaces PPP o LAN), entonces se emplea una cabecera genérica MPLS de 4 octetos, que contiene un campo especí…co para la etiqueta y que se inserta entre la cabecera del nivel 2 y la del paquete (nivel 3). Empleo de Etiquetas En la Figura 4.5 de la Página 107, se representa el esquema de los campos de la cabecera genérica MPLS y su relación con las cabeceras de los otros niveles. Según se muestra en la …gura, los 32 bits de la cabecera MPLS se reparten en: 20 bits para la etiqueta MPLS, 3 bits para identi…car la clase de servicio en el campo EXP (experimental, anteriormente llamado CoS), 1 107 4.2. ARQUITECTURA Figura 4.4: Ejemplo de envío de un paquete por un LSP. bit de stack para poder apilar etiquetas de forma jerárquica (S) y 8 bits para indicar el TTL (time-to-live) que sustenta la funcionalidad estándar TTL de las redes IP. De este modo, las cabeceras MPLS permiten cualquier tecnología o combinación de tecnologías de transporte, con la ‡exibilidad que esto supone para un proveedor IP a la hora de extender su red. La conmutación de etiquetas es llevada a cabo asociando etiquetas con Clases de Envío Equivalentes (FEC), y empleando el valor de estas para enviar paquetes, incluyendo la determinación del valor de cualquier etiqueta de reemplazo. En un ATM-LSR, la etiqueta se transporta en el campo VPI/VCI, TTL Datos de Usuario S EXP Cabecera IP ETIQUETA Cabecera MPLS Cabecera Nivel 2 Figura 4.5: Estructura de la cabecera genérica MPLS. 108 CAPÍTULO 4. MPLS MULTI PROTOCOL LABEL SWITCHING o, en el campo VPI, cuando dos ATM-LSRs están conectados vía un camino virtual ATM. Además, si dos LDPs extremos están conectados mediante un interface LC-ATM2 , deberá ser posible llevar a cabo una conexión no-MPLS capaz de transportar paquetes IP sin etiquetar. Esta conexión se emplea para llevar paquetes LDP entre los dos extremos, y puede también ser empleada para transportar otros paquetes sin etiquetar (como OSPF3 , por ejemplo). En estas conexiones deberá ser empleado el encapsulado LLC/SNAP. Conexiones directas Se dice que dos LSRs están conectados directamente sobre un interface ATM, si todas las células transmitidas por ese interface desde uno de los LSRs alcanzan el otro LSR, y no existen switches ATM entre ellos dos. Cuando dos LSRs están conectados directamente, ambos controlan la licalización de los VPIs/VCIs en la interface que los conecta.Estos Pueden ponerse de acuerdo para emplear el campo VPI/VCI para codi…car una etiqueta. El valor por defecto para conexiones no MPLS es VPI = 0, VCI = 32. Se pueden con…gurar otros valores, así como ambas partes deben están pendientes del valor con…gurado. Con la excepción de estos valores reservados, los valores de VPI / VCI empleados en las dos direcciones del enlace deben ser tratados como espacios independientes. Los rangos permitidos de los VCIs son comunicados a través de LDP. Conexiones a través de un camino virtual ATM A veces puede ser útil tratar dos LSRs como adyacentes (en algunos LSP) a través de un interface LC-ATM, incluso aunque la conexión entre ellos sea a través de una nube ATM, mediante un camino virtual. En este caso, el campo VPI no puede ser empleado por MPLS, y la etiqueta debe ser codi…cada completamente dentro del campo VCI. En este caso, el valor por defecto en el campo VPI para las conexiones no MPLS es de 32. El valor del campo VPI será modi…cado para hacer uso del camino virtual. 2 LC-ATM: es una interface de un router o un swicht ATM en donde el valor del campo VPI/VCI es asignado por los protocolos de control de MPSLS (LDP o TDP). 3 OSPF: Primero la ruta libre más corta. Algoritmo de enrutamiento IGP jerárquico de estado enlace propuesto como sucesor de RIP en la comunidad de Internet. 4.2. ARQUITECTURA 109 Un valor VPI / VCI cuya parte VCI se encuentre en el rango de 0 ¡ 32 no puede ser empleada como la codi…cación de una etiqueta. Con la excepción de esos valores reservados, los valores VPI/VCI empleados en ambas direcciones del enlace pueden ser tratados como espacios independientes. Los rangos permitidos para los VPIs/VCIs son comunicados a través de LDP. Si se están empleando más de un VPI para label switching. Los rangos permitidos para VCIs deben ser diferentes para cada VPI, y cada rango será comunicado a través de LDP. Conexiones vía un SVC ATM A veces puede ser útil tratar dos LSRs como adyacentes (en algunos LSP) a través de un interface LC-ATM, incluso aunque la conexión entre ellos sea a través de una nube ATM, vía un conjunto de Circuitos Virtuales Conmutados ATM. En este caso, los procedimientos deben ser empleados para asignar un VCID para cada uno de los VCs, y LDP será empleado para asociar un VCID a un FEC. La etiqueta de un paquete recibido es entonces deducida (vía un mapeo uno a uno) del circuito virtual de donde proviene ese paquete. En este caso no hay un valor por defecto para la conexión no MPLS. La pila de etiquetas Es útil tener un modelo más general en el que un paquete etiquetado transporte cierto número de etiquetas, organizadas en una estructura de pila. A esta estructura se le denomina Pila de etiquetas. Aunque MPLS soporta una estructura jerarquizada, el procesamiento de un paquete etiquetado es completamente independiente del nivel jerárquico. El procesamiento está siempre basado en la etiqueta de la cima, sin tener en cuenta que cierto número de etiquetas puedan haber estado sobre ella en la pila, anteriormente. O que otras tantas estén bajo ella actualmente. Un paquete sin etiquetar se puede ver como un paquete con la pila de etiquetas vacía. Si la profundidad de la pila de etiquetas es de profundidad m, nos referiremos a la etiqueta del fondo como 1, y a la de la cima como m. (nivel 1, nivel m, ...). 110 CAPÍTULO 4. MPLS MULTI PROTOCOL LABEL SWITCHING Entrada de Envío de Etiquetas al Siguiente Salto (NHLFE) Esta entrada ( Next Hop Label Forwarding Entry) se emplea cuando enviamos un paquete etiquetado. Contiene la siguiente información: 1. El siguiente salto del paquete. 2. La operación de manejar la pila de etiquetas del paquete; esta consiste en una de las siguientes operaciones: – Sustitución de la etiqueta de la cima con una nueva etiqueta especi…ca. – Extraer de la pila. – Sustituir la etiqueta de la cima con una nueva etiqueta y colocar una o más etiquetas nuevas en la pila. También contiene: 1. El encapsulado del enlace de datos a emplear cuando se transmita el paquete. 2. El método para codi…car la pila de etiquetas cuando se transmita el paquete. 3. Alguna otra información necesaria para manejar el paquete adecuadamente. Hay que tener en cuenta que en un LSR dado, el siguiente salto del paquete puede ser él mismo. En este caso, el LSR necesitaría extraer la etiqueta de la cima y enviarse el paquete resultante a él mismo. Tendría entonces que realizar otra decisión de envío, basada en la información que permanezca tras haber extraído la etiqueta de la pila. Puede haber quedado otro paquete etiquetado, o puede ser el paquete IP nativo. Esto conlleva a que en ciertos casos el LSR puede necesitar operar con la cabecera IP para poder reenviar el paquete. Si el siguiente salto del paquete es el LSR actual, entonces la operación sobre la pila será extraer. 4.2. ARQUITECTURA 111 Mapa de Etiquetas Entrantes (ILM) Este mapa ( Incoming Label Map) mapea cada etiqueta que entre a un conjunto de NHLFEs (Entrada de Envío de Etiquetas al Siguiente Salto). Es empleado cuando se reenvían paquetes que lleguen etiquetados. Si este ILM mapea una etiqueta particular a un conjunto de NHLFEs que contiene más de un elemento, exactamente uno de los elementos de ese conjunto debe ser elegido antes de que se reenvíe el paquete. Los procedimientos de elección de un elemento del conjunto no se han de…nido aún. El mapeado de una etiqueta hacia un conjunto que contenga más de un NHLFE puede ser útil si, por ejemplo, se desea balancear la carga de la red sobre múltiples caminos con el mismo coste. Mapa de FEC a NHFLE (FTN) Este mapa ( FEC-to-NLFE) asocia cada FEC con un conjunto de NHLFEs. Se emplea para reenviar paquetes que lleguen sin etiquetar, pero que deben ser etiquetados antes de ser reenviados. El comportamiento es análogo al mapa de etiqueta entrante (ILM). Distribución de etiquetas y procedimientos de mantenimiento En esta sección se discute el empleo de la distribución de etiquetas bajo demanda por los LSR-ATM. Estos procedimientos de distribución de etiquetas deben ser empleados tanto por los LSRs-ATM que no soporten la mezcla de circuitos virtuales, como por aquellos que sí la soporten. Los procedimientos di…eren en ambos casos. A continuación serán descritos los dos escenarios en turnos. Comenzamos describiendo el comportamiento de los miembros del conjunto frontera de un dominio ATM-LSR: estos no son LSRs-ATM como tales, y su comportamiento es el mismo, independientemente de si el dominio contiene LSRs con capacidad para mezcla de circuitos o no. Comportamiento de los LSRs frontera Al considerar un miembro del conjunto frontera de un dominio ATM-LSR. Se asume que, como resultado de sus cálculos de routing, éste selecciona a un LSR-ATM como el salto siguiente de un cierto FEC, y que el siguiente salto 112 CAPÍTULO 4. MPLS MULTI PROTOCOL LABEL SWITCHING se alcanza por un interface LC-ATM. El LSR frontera emplea LDP para pedir información de la etiqueta para el FEC desde el siguiente salto. El campo que lleva el contador de saltos se pone a 1. una vez que el LSR frontera recibe la información de enlace, puede emplear los procedimientos de envío MPLS para transmitir paquetes por el FEC especi…co, empleado la etiqueta especi…cada como etiqueta de salida (o empleando el VPI/VCI que corresponda al VCID especi…cado como la etiqueta de salida, caso que se estén empleando VCIDs). El enlace recibido por el LSR frontera puede contener un contador de saltos, el cual , representa el número de saltos que un paquete necesita para cruzar el dominio ATM-LSR cuando emplea esta etiqueta. Si existe un contador de saltos asociado con el enlace, el LSR-ATM debe ajustar el TTL de un paquete de datos en esa cantidad antes de transmitir el paquete. En cualquier evento, debe ajustar el TTL de un paquete de datos como mínimo a 1, antes de transmitirlo. Cuando un miembro del conjunto Frontera recibe una petición de enlace de etiqueta desde un LSR-ATM ,éste localiza una etiqueta, y retorna, vía LDP, un enlace conteniendo la etiqueta localizada de vuelta al extremo que originó la respuesta. Este pone el contador de saltos en el enlace a 1. Cuando el cálculo de una ruta causa a un LSR frontera el cambiar el siguiente salto para un FEC particular, y el siguiente salto original estaba en el dominio ATM-LSR, el LSR frontera debe noti…car al original por medio de LDP que el enlace de la etiqueta asociado al FEC ya no es necesario. Switches ATM convencionales ( sin mezcla de circuitos virtuales) Cuando un LSR-ATM recibe mediante LDP una petición de enlace de etiqueta para un cierto FEC desde un punto conectado al LSR-ATM sobre un interface LC-ATM, el LSR-ATM realiza las siguientes acciones: ² Localiza una etiqueta. ² Pide un enlace de la etiqueta vía LDP desde el siguiente salto para ese FEC. ² Devuelve vía LDP un enlace conteniendo la etiqueta de vuelta al punto que originó la petición. El campo contador de saltos en la petición que envía el LSR-ATM debe ser puesto a uno más que el contador de la petición que recibe. Si este valor 4.2. ARQUITECTURA 113 excede del valor máximo, la petición no puede ser enviada al siguiente salto, y el LSR-ATM debe comunicar al vecino que envió la petición que esta no puede realizarse. Una vez que el LSR-ATM recibe el enlace desde el siguiente salto, éste comienza a utilizar esa etiqueta. El LSR-ATM puede elegir esperar a que la petición sea satisfecha antes de retornar el enlace de vuelta. Esta es una manera de control ordenado, en concreto “control ordenado por ingreso iniciado”. En este caso, en tanto que el LSR-ATM recibe un contador de salto que es mayor que 0 y menor que un valor máximo con…gurado, éste debe incrementar el contador de saltos e incluir el resultado en el enlace que devuelva. Caso que el valor exceda del máximo con…gurado, no podrá retornar el enlace y deberá comunicar este caso al punto que hizo la petición. Si el contador que llega es 0, el enlace que retorne también deberá ser 0 (esto indica que la cuenta de saltos es desconocida). De manera alternativa, el LSR-ATM puede retornar el enlace sin esperar el enlace pedido a su vez por él mismo. A este método se le denomina control independiente. Y especi…ca como contador de saltos a 0 en el enlace, indicando que la cuenta de saltos es desconocida. El valor correcto de este contador puede ser enviado cuando se conozca. Cuando el cálculo de routing haga cambiar a un LSR-ATM el siguiente salto para un FEC, éste deberá comunicar al primer punto (del siguiente salto) que el enlace asociado al FEC no va a necesitarse más. Cuando un LSR recibe la noti…cación de que no se necesita un enlace concreto, éste debe quitar el enlace. Cuando cambia una ruta, los enlaces de las etiquetas son re-establecidos desde el punto donde la nueva ruta diverge de la anterior. Los LSRs-ATM sin capacidades de mezcla de circuitos virtuales deben emplear el modo de retención de etiquetas conservador. Switches ATM con capacidades de mezcla de circuitos virtuales Se necesitan cambios pequeños para adaptar estos switches. La principal diferencia es que éstos necesitan una sola etiqueta por cada FEC, incluso si se reciben múltiples peticiones para enlazar etiquetas con ese FEC desde los vecinos. 114 CAPÍTULO 4. MPLS MULTI PROTOCOL LABEL SWITCHING Cuando uno de estos switches recibe una petición de enlace de etiquetas desde un LSR para un cierto FEC, y no tiene un enlace aún, debe realizar una petición de enlace a su siguiente vecino tal y como lo realizan los switches sin capacidad para mezcla de circuitos. En el caso de que ya tenga este enlace para ese FEC, no necesita realizar la petición. En su lugar, simplemente coloca la etiqueta que le llegue y devolverla en un enlace al punto que la pidió. Cuando lleguen paquetes con esa etiqueta como cabecera, el valor de la etiqueta será sustituido con la etiqueta de salida existente que corresponda al mismo FEC. Si el LSR-ATM no tiene un enlace de la etiqueta de salida para el FEC, pero tiene una petición para uno, no necesita efectuar otra petición. Encapsulado Los procedimientos descritos en esta sección sólo afectan a los LSRs frontera del domino LSR-ATM. Los LSRs-ATM no modi…can por sí mismos el encapsulado de ninguna manera. Excepto bajo ciertas circunstancias, cuando un paquete etiquetado es transmitido sobre un interface LC-ATM, donde el VPI/VCI es interpretado (o VCID) como la etiqueta de cabecera en la pila de etiquetas, el paquete también debe contener una cabecera re‡ejada . Si el paquete tiene una pila de etiquetas con n entradas, debe portar una copia con n entradas. El valor actual de la etiqueta de la cima es codi…cado en el campo VPI/VCI. El valor de la etiqueta en la cima de la copia debe ser puesto a 0 sobre la transmisión, y debe ser ignorado sobre la recepción. Manipulación del TTL Los procedimientos descritos en esta sección sólo afectan a los LSRs frontera del domino LSR-ATM. Los LSRs-ATM no modi…can por sí mismos el encapsulado de ninguna manera. Si un paquete ha sido recibido por el LSR frontera como un paquete sin etiquetar, el TTL entrante se obtiene de la cabecera IP. Si un paquete fue recibido por el LSR frontera como un paquete etiquetado, el TTL entrante se obtiene de la entrada en la cima de la pila de etiquetas. Si se ha asociado un contador de saltos con el enlace de las etiquetas, el 4.2. ARQUITECTURA 115 TTL saliente se pone como el mayor de 0 ó la diferencia entre el TTL entrante y la cuenta de saltos. Si no se ha asociado un contador de saltos, el TTL saliente se pone como el mayor de 0 ó uno menos que el TTL entrante. Si esto provoca que el valor del TTL es 0, el paquete no debe ser transmitido como un paquete etiquetado con esa etiqueta y será tratado de una de estas dos maneras: ² Como expirado, esto puede provocar un mensaje ICMP al ser enviado. ² Puede ser enviado como un paquete sin etiquetar con un TTL menor que el TTL entrante. Este envío debe realizarse sobre una conexión no MPLS. Si el valor del TTL entrante es 1, sólo se puede aplicar el primero de estos casos. Cuando un LSR frontera recibe un paquete etiquetado sobre un interface LC-ATM, éste obtiene el TTL entrante de la etiqueta en la cima de la pila del encapusulado genérico, o si ese encapsulado no está presente, de la cabecera IP. Los procedimientos en esta sección están pensados para ser aplicados sólo a paquetes unicast. Atributos propios de un enlace de etiquetas Un enlace particular de la etiqueta L al FEC F, distribuido de Rd a Ru, puede tener atributos asociados. Si Ru , actuando como un LSR downstream, también distribuye un enlace de la etiqueta con el FEC F, entonces y bajo ciertas condiciones, puede ser requerido para distribuir también el atributo corresopondiente que recibió de Rd. Protocolo de Distribución de Etiquetas Un protocolo de distribución de etiquetas es un conjunto de procedimientos por los que un LSR informa a otro de que ha enlazado cierto FEC con una etiqueta. Dos LSRs que emplean un protocolo de distribución de etiquetas para 116 CAPÍTULO 4. MPLS MULTI PROTOCOL LABEL SWITCHING Figura 4.6: Ejemplo de las distribución de etiquetas. intercambiar estos enlaces FEC/etiqueta se denominan puntos de distribución de etiquetas con respecto a la información de enlace que ellos intercambian. Si dos LSRs son puntos de distribución de etiquetas, se dice que existe una adyacencia de distribución de etiquetas entre ellos. Estos protocolos también deberán ocuparse de la negociación o del envío de información de aprendizaje de enlaces entre los puntos. La arquitectura MPLS no asume que existe sólo un protocolo de distribución de etiquetas, existiendo hoy en día más de un protocolo que está siendo estandarizado o extendido para soportar este cometido. Casos como: BGP , RSVP, RSVP-TUNEL. También se han creado protocolos especí…cos: LDP, CR-LDP. Siendo el LDP el protocolo que más aceptación está teniendo. Métodos de Solicitud de Etiquetas ² Downstream bajo demanda: La arquitectura MPLS permite a un LSR pedir de forma explícita, a su siguiente punto, una etiqueta para un FEC; como se observa en la Figura 4.7 de la Página 117. Puede observarse un ejemplo en la Figura 4.6 de la Página 116. ² Downstream sin solicitar: también está permitido distribuir los enlaces ya efectuados FEC/etiqueta a LSRs que no lo han pedido de forma explícita; como se observa en la Figura 4.8 de la Página 117. 4.2. ARQUITECTURA Figura 4.7: Distribución DownStream bajo demanda. Figura 4.8: DownStream sin Solicitar 117 118 CAPÍTULO 4. MPLS MULTI PROTOCOL LABEL SWITCHING Es de esperar, que algunas implementaciones MPLS lleven a cabo uno de los dos procedimientos, o permitan optar por ambos. Esto vendrá dado por las características de los interfaces. Sin embargo, también podrá darse el caso de que convivan ambas técnicas dentro de la misma red MPLS al mismo tiempo, eso sí, los puntos adyacentes entre sí deberán ponerse de acuerdo en cuál de los métodos utilizar. Modo de Retención de Etiquetas Un LSR Ru puede recibir un enlace FEC/etiqueta desde otro LSR Rd, incluso aunque Rd no sea consecutivo a Ru para ese FEC concreto. Ru tiene la opción de mantener la pista de esos enlaces o desecharlos: ² Modo de retención liberal: Si Ru decide conservarlos podrá entonces usar los enlaces de nuevo si Rd se convierte en consecutivo para el FEC en cuestión. ² Modo de retención conservador: Si, por el contrario, los descarta, éste tendrá que volver a adquirirlos en el caso de que Rd se convierta en consecutivo para el FEC que necesite. El modo liberal con…ere una adaptación más rápida a los cambios de routing . El modo conservativo no necesita LSRs con mucha memoria, ya que mantiene muchas menos etiquetas. Intercambio de Etiquetas Para reenviar un paquete etiquetado: 1. Un LSR examina la etiqueta de la cima de la pila de etiquetas del paquete. 2. Emplea el ILM (Mapa de Etiqueta Entrante) para asociar esta etiqueta con un NHLFE. 4.2. ARQUITECTURA 119 3. Empleando la información del NHLFE, determina hacia dónde reenviar el paquete. 4. Efectua la operación que corresponda sobre la cima de la pila de etiquetas del paquete. 5. Codi…ca la nueva cima de la pila en el paquete. 6. Reenvía el paquete. Para reenviar un paquete sin etiquetar: 1. Un LSR analiza la cabecera del paquete proveniente de la capa de red para determinar el FEC del paquete. 2. Emplea el FTN (Mapa de FEC a NHLFE) para asociarlo con un NHLFE. 3. Empleando la información del NHLFE, determina hacia dónde reenviar el paquete. 4. Efectua la operación que corresponda sobre la cima de la pila de etiquetas del paquete. 5. Codi…ca la nueva cima de la pila en el paquete 6. Reenvía el paquete. Es importante tener en cuenta que cuando está empleándose el intercambio de etiquetas, el siguiente salto va a venir dado siempre de la NHLFE; esta información podrá ser diferente de la que se obtendría si no se estuviese empleando MPLS. Alcance y unicidad de las Etiquetas Un LSR dado Rd puede asociar la etiqueta L con el FEC F, y distribuir ese enlace al punto Ru1. Rd puede tambien asociar la etiqueta L con el FEC F, y distribuir ese enlace con el punto Ru2. Un LSR dado Rd puede asociar la etiqueta L con el FEC F1, y distribuir ese enlace al punto Ru1. Rd puede tambien asociar la etiqueta L con el FEC F2, y distribuir ese enlace con el punto Ru2. 120 CAPÍTULO 4. MPLS MULTI PROTOCOL LABEL SWITCHING Si, y solo sí, Rd puede decir, al recibir un paquete cuya etiqueta en la cima sea L, si fue puesta por Ru1 o por Ru2, entonces la arquitectura no requiere que F1 = F2. En estos casos, podemos decir que el espacio de etiquetas que Rd está empleando para las etiquetas que distribuye en Ru1 es diferente al de Ru2. En general, Rd sólo puede decir si fue Ru1 o Ru2 el que puso esa etiqueta en concreto si se dan estas condiciones: ² Ru1 y Ru2 son los únicos puntos de distribución de etiquetas a los que Rd distribuyó la etiqueta L. ² Ru1 y Ru2 están conectados directamente a Rd via un interface punto a punto. “Espacio de etiquetas por interface”: Cuando estas dos condiciones se dan, un LSR podrá emplear etiquetas que posean alcance por interface, por ejemplo: que sean sólo únicas por interface. “Espacio de etiquetas por plataforma”: Cuando no se dan estas dos condiciones, las etiquetas deberán ser únicas sobre el LSR que las ha asignado. Si un LSR Ru particular está unido a un LSR Ru sobre dos interfaces punto a punto, entonces, Rd podrá distribuir a Ru un enlace de la etiqueta L con el FEC F1 y un enlace de la etiqueta L con el FEC F2, siendo F1 diferente de F2, si y solo sí, cada enlace es válido sólo para paquetes que Ru envía a Rd sobre uno de los dos interfaces en particular. En el resto de los casos, Rd no puede distribuir a Ru enlaces con el mismo valor de etiquetas que posean el mismo FEC. Esta prohibición se mantiene incluso si los enlaces son tratados como si estuviesen en diferentes niveles jerárquicos. En MPLS no existe el concepto de tener un espacio de etiquetas diferente para diferentes niveles jerárquicos. La cuestión surge cuando deseamos saber si es posible que un LSR emplee diferentes espacios de etiqueta por plataforma, o que emplee diferentes espacios de etiquetas por interface para el mismo interface. Esto no está prohibido por la arquitectura. Sin embargo, en estos casos el LSR debe tener ciertas formas de determinar para cada etiqueta que llegue qué espacio de etiquetas corresponde a esta etiqueta. Por ejemplo, MPLS-SHIM especi…ca que dos diferentes espacios de etiquetas: para paquetes unicast y para paquetes multicast. 4.2. ARQUITECTURA 121 Empleando un código a nivel de enlace, para distinguir estos dos espacios de etiquetas. Camino de Etiquetas Conmutadas (LSP) Un camino de etiquetas conmutadas (Label Switched Path LSP) de nivel m para cierto paquete P es una secuencia de Routers R1,...,Rn con las siguientes propiedades : 1. R1 es el LSP de ingreso , pone una etiqueta en la pila de etiquetas de P, dando como resultado una pila de etiquetas de profundidad m 2. Para todos los puntos i 1<i<n , P posee una pila de etiquetas con profundidad m cuando es recibido por el LSR Ri 3. En ningún momento durante el tránsito de P desde R1 a R[n¡1] la pila de etiquetas tiene una profundidad menor que m 4. Para todos los puntos i 1<i<n , Ri tranmite P a R[i +1] mediante MPLS, por ejemplo, empleando la etiqueta de la cima de la pila como un índice en un ILM ( Mapa de Etiquetas Entrante). 5. Para todos los i 1<i<n : si un sistema S recibe un reenvía P, tras haber sido transmitido por Ri pero antes de haber sido recibido por R[i +1] , entonces la decisión de reenvío de S no estará basada en la etiqueta de nivel m, o en la etiqueta de la cabecera de la capa de red. Esto puede ser debido a : – La decisión no está basada en la pila de etiquetas de la cabecera de la capa de red. – La decisión está basada en una pila de etiquetas sobre la que se han añadido etiquetas adicionales (por ejemplo: en una etiqueta de nivel m+k ). Es decir, podemos hablar de un paquete P de nivel m LSP como a la secuencia de Routers : 1. Que comienzan con un LSR (de ingreso) que añade sobre una etiqueta de nivel m. 122 CAPÍTULO 4. MPLS MULTI PROTOCOL LABEL SWITCHING Figura 4.9: Funcionamiento de los LSP. 2. Todos aquellos LSR que toman las decisiones de reenvío en un nivel de etiquetas m. 3. Que acaban (de salida) cuando se realice una decisión de reenvío sobre una etiqueta de nivel m¡k, o cuando la decisión de reenvío es efectuada de forma común , con procedimientos no MPLS. Como consecuencia, cuando un LSR pone una etiqueta en la pila deberá asegurarse de que la nueva etiqueta corresponda con un FEC cuyo LSP de salida sea el LSR que asignó la etiqueta que está ahora en el segundo lugar de la pila. Llamaremos a una secuencia de LSRs el LSP para ese FEC F particular si es un LSP de nivel M para un paquete P en particular cuando el nivel de P es M. La Figura 4.9 de la Página 122 nos muestra cómo funcionan los LSPs. Extracción de Etiquetas en el penúltimo paso Si R1 ... Rn es un LSP de nivel m para el paquete P, P puede ser transmitido de R[n-1] a Rn con una pila de etiquetas de profundidad m¡1. Es decir, de 4.2. ARQUITECTURA 123 la pila de etiquetas se puede realizar la extracción en el penúltimo LSR del camino, en lugar de realizarse en el LSP de salida. Desde el punto de vista de la arquitectura, esto es muy apropiado. El objetivo de la etiqueta de nivel m es llevar el paquete a Rn. Una vez que R[n¡1] ha decidido enviar en paquete a Rn, la etiqueta ya no tiene ninguna función, y no necesita ser llevada más. También se da una ventaja práctica al realizar la extracción en el penúltimo salto. Si no se realiza, entonces cuando el LSP de salida recibe un paquete mira primero la etiqueta de la cima de la pila, y determina tras esa búsqueda que él es el LSP de salida. Entonces deberá extraer de la pila y examinar lo que queda en el paquete. Si hay otra etiqueta en la pila, deberá buscarla y reenviar el paquete resultado de esta búsqueda (en este caso el LSP de salida para el LSP de nivel m del paquete es también un nodo intermedio para su LSP de nivel m¡1 ). Si no existen más etiquetas en la pila, el paquete será reenviado en función de la cabecera de la capa de red. De modo que el LSR de salida debe realizar dos búsquedas, bien dos búsquedas de etiquetas, bien una búsqueda de etiqueta seguida de otra búsqueda de dirección. Si, por otro lado, se emplea la extracción por parte del penúltimo salto, entonces cuando éste penúltimo busque la etiqueta determinará: ² Qué es el penúltimo salto. ² Quién es el siguiente salto. El penúltimo, entonces extrae de la pila y reenvía el paquete basándose en la información de la etiqueta extraída. Cuando el LSP …nal recibe el paquete, la etiqueta que es ahora cima, será la necesaria para buscar y realizar la decisión de reenvío. Realizándose entonces una única búsqueda en el LSP …nal. Mejorando así la simplicidad de código. Sin embargo, existen conmutadores que no pueden extraer de la cima de la pila, de modo que este método no puedes ser utilizado de forma universal y exclusiva. Un LSR con capacidades para extraer de la cima de la pila deberá hacerlo cuando sea requerido por su extremo en la distribución downstream de la etiqueta. 124 CAPÍTULO 4. MPLS MULTI PROTOCOL LABEL SWITCHING Las negociaciones iniciales del protocolo de distribución de etiquetas deberán permitir a cada LSR el conocer cuál de sus vecinos admiten extracción de la pila. Siguiente Salto del LSP El siguiente salto para un paquete etiquetado corresponde al LSR que es el siguiente salto, obtenido de la entrada NHLFE para reenviar el paquete. En siguiente salto para un FEC será el siguiente salto obtenido de la entrada NHLFE indexada por una etiqueta que corresponde a ese FEC. Recepción de Etiquetas no válidas Para evitar bucles, las etiquetas que no posean una entrada en la tabla de cierto LSR deberán ser descartadas. Control de LSP: Ordenado o Independiente Independiente: cada LSR realiza decisiones independientes para asociar una etiqueta a un FEC y para distribuir posteriormente esta asociación al resto de los puntos. Funcionando de manera similar a los Routers IP. Ordenado: un LSR podrá realizar estas asociaciones si se trata del LSR de salida de ese FEC, o si ya había recibido una asociación de etiqueta para ese FEC desde su siguiente salto. Este modo de control deberá ser empleado si se desea asegurar que el trá…co en un FEC particular siga un camino con ciertas propiedades especi…cadas: que el tra…co no pase por algún nodo dos veces, asignar ciertos recursos a ese camino, o que el trá…co pase por un camino concreto. Ambos métodos pueden operar entre sí. Sin embargo, a no ser que todos los LSRs estén empleando el control ordenado, el comportamiento en general de la red será el de control independiente. 4.2. ARQUITECTURA 125 Agregación Una manera de particionar el trá…co en FECs es creando un FEC diferente para cada pre…jo de direcciones que aparezcan en la tabla de routing. Sin embargo, dentro de un dominio MPLS, esto puede dar lugar a un conjunto de FECs de tal forma que todo el trá…co de esos FECs siga la misma ruta. En este caso, dentro del dominio MPLS, la unión de esos FECs es en sí un solo FEC. Esto crea diferentes cuestiones: ² ¿ debería asociarse una etiqueta diferente para cada FEC componente? ² ¿ debería asociarse una sola etiqueta con la unión de todos? Se denomina agregación a este proceso de asociar una sola etiqueta con un conjunto de FECs. La principal ventaja de la agregación es la reducción en el número de etiquetas necesarias y del número de mensajes de control necesarios para la distribución de estas etiquetas. Granularidad Dado un conjunto de FECs con características similares, es posible que se den 3 casos: ² Que se asocie con un solo FEC. ² Que se creen varios subconjuntos, cada uno de ellos asociado a un FEC. ² Que no se agreguen. Cuando se emplea el control ordenado, cada LSR podría heredar la granularidad de su siguiente salto. Selección de ruta Es el método empleado para seleccionar el camino (LSP) para un FEC en concreto. Existen dos opciones para seleccionar una ruta: Routing salto a salto: cada nodo puede elegir el siguiente salto para cada FEC. Esta es la manera de funcionamiento en las redes IP. 126 CAPÍTULO 4. MPLS MULTI PROTOCOL LABEL SWITCHING Routing explícito: el LSP de entrada o el LSP de salida especi…ca varios (o todos) los LSRs del camino. Este método puede ser útil para llevar a cabo políticas de routing, ingeniería de trá…co. En MPLS, el routing explícito debe ser especi…cado en el momento en que son asignadas las etiquetas, pero no con cada paquete IP. Lo que lo hace mucho más e…ciente que el routing por IP. La secuencia de LSRs puede ser elegida por con…guración o de forma dinámica por un nodo (por ejemplo, el nodo de salida puede emplear la información de la topología aprendida desde una base de datos de enlaces, para calcular el camino completo del árbol que …naliza en él mismo). La secuencia de LSRs puede ser elegida por con…guración o de forma dinámica por un nodo (por ejemplo, el nodo de salida puede emplear la información de la topología aprendida desde una base de datos de enlaces, para calcular el camino completo del árbol que …naliza en él mismo). Carencia de Etiqueta de Salida Un paquete etiquetado puede llegar a un LSR que no posea dentro de su mapa de etiquetas (ILM) la etiqueta de entrada del paquete . En estos casos, para evitar bucles o pérdidas de información más grave , el paquete tendrá que ser descartado. Tiempo de vida TTL MPLS debe tener en cuenta el campo TTL para: ² Eliminar posibles bucles. ² Realizar otro tipo de funciones, como limitar el alcance del paquete o dar funcionalidad a comandos del tipo traceroute. Cuando un paquete viaja por un camino LSP, debería salir con el mismo valor de TTL que tendría si hubiera pasado por la misma secuencia de Routers. Si el paquete viaja por una jerarquía de LSPs, el número total de saltos se debería ver re‡ejado en el TTL. 4.2. ARQUITECTURA 127 La manera de controlar este TTL varía según la codi…cación del paquete: ² Si la etiqueta está codi…cada en una cabecera re‡ejo entre las cabeceras de enlace y red, esta etiqueta deberá tener un campo TTL que se inicializa a la cabecera de la capa de red y va siendo decrementado en cada salto LSR. También deberá copiarse de nuevo en la cabecera de la capa de red al acabar el recorrido del camino LSP. ² Si se están utilizando las cabeceras de la capa ATM AAL5 para codi…car las etiquetas (campos VPI/VCI), y los paquetes etiquetados están siendo reenviados por switches ATM (la capa de enlace de datos no tiene campo TTL), entonces no se podrá emplear el campo TTL. A veces puede determinarse a partir del ingreso de un LSP sin capacidades para TTL que un paquete concreto expire antes de que este alcance el …nal del segmento no TTL. Para ello deberán desarrollarse procedimientos especiales, por ejemplo, los paquetes traceroute pueden ser reenviados empleando reenvío salto a salto convencional. Codi…cación de Etiquetas Para transmitir una pila de etiquetas junto con el paquete al que pertenecen, se necesita de…nir una codi…cación especí…ca para la pila de etiquetas. La arquitectura soporta varias codi…caciones diferentes: Hardware especí…co para MPLS, ATM, Frame Relay ... En lo que a nos concierne, concretaremos en la codi…cación MPLS-ATM, que consiste en combinar los campos VPI - VCI de las células ATM para transportar las etiquetas y tratar los switches ATM como LSRs: ATM - LSRs: Los procedimientos de envío de MPLS son similares a los switches ATM. Estos emplean el puerto de entrada y el VPI-VCI entrante como índice en una tabla, obteniendo un puerto de salida y un valor VPI-VCI de salida. De modo que si una o más etiquetas pueden codi…carse directamente en los campos a los que estos switches acceden, podremos hacer que los switches ATM se comporten como LSRs. Posibles codi…caciones de etiquetas sobre las células ATM : 128 CAPÍTULO 4. MPLS MULTI PROTOCOL LABEL SWITCHING 1. Codi…cación SVC: se emplea el campo VPI/VCI para codi…car la etiqueta de la cima de la pila. Esta técnica se puede emplear en cualquier red. Cada camino LSP se trata como un SVC ATM, y el protocolo de distribución de etiquetas será el protocolo de signalling ATM. Los LSRs ATM no pueden extraer ni poner etiquetas en la cima de la pila. 2. Codi…cación SVP: se emplea el campo VPI para codi…car la etiqueta de la cima de la pila, y el VCI para codi…car la segunda etiqueta de la pila, si existe. Esta técnica con…ere algunas ventajas sobre la anterior: permite el empleo de conmutación de VP ATM. El camino LSP se trata como un SVP ATM, y el protocolo de distribución de etiquetas será el protocolo de signalling ATM. Esta técnica no podrá ser empleada si la red incluye un VP ATM a través de una red ATM no MPLS, entoces, el campo VPI no estará libre para ser empleado por MPLS. 3. Codi…cación SVP Multipunto: Se emplea el campo VPI para codi…car la etiqueta de la cima de la pila, parte del campo VCI para codi…car la segunda etiqueta, si existe, y el resto del campo VCI para identi…car el LSP de entrada. Con esta técnica se puede emplear la conmutación de VPs ATM para tener VPs multipunto-a-punto. Células de diferentes paquetes llevarán así diferentes valores de VPI. Esto permite emplear mezcla de etiquetas, sin tener problemas de interleaving, en switches ATM que pueden dar VPs multipunto-a-punto pero que no tienen la capacidad de mezcla de VC. Esta técnica depende de la existencia de una capacidad de asignar VCIs de 16 bits a cada switch ATM de tal forma que no se asignen valores VCI iguales a dos switches diferentes. Si se necesitan más de dos etiquetas en la pila, la codi…cación ATM deberá combinarse con el encapsulado genérico. Interoperabilidad entre las técnicas de codi…cación: Es posible que dentro de un LSP existan diferentes técnicas de codi…cación: cuando llega un paquete a un LSR, este deberá: decodi…carlo para determinar el valor actual de la pila de etiquetas, entonces deberá operar sobre la pila para determinar el nuevo valor de esta y posteriormente codi…car el nuevo valor de forma apropiada antes de transmitir el paquete etiquetado a su siguiente salto. Por desgracia, los switches ATM no tienen capacidad de traducir de una técnica de codi…cación a otra. La arquitectura MPLS requiere que en cuan- 4.2. ARQUITECTURA 129 do sea posible para dos switches ATM consecutivos, estos empleen la misma técnica de codi…cación. Con las redes MPLS que contengan una combinación de switches ATM operando como LSRs y otros LSRs que estén empleando una cabecera re‡ejo, estos podrán intercambiar una pila de etiquetas codi…cada en ATM y sustituirla con una cabecera re‡ejo MPLS. Mezcla de Etiquetas Un LSR tiene capacidades de mezcla de etiquetas su puede recibir dos paquetes desde diferentes interfaces de entrada y/o con diferentes etiquetas y enviar ambos paquetes por el mismo interface de salida con la misma etiqueta. Una vez que los paquetes son transmitidos, la información que estos llevaban de los diferentes interfaces y/o de las etiquetas de entrada se pierde. Un LSR no tiene capacidades de mezcla de etiquetas si para cualquier pareja de paquetes que reciba desde diferentes interfaces, o con diferentes etiquetas, los paquetes deben ser transmitidos por diferentes interfaces, o deben tener etiquetas diferentes. Los LSRs-ATM que emplean codi…cación del SVC o el SVP no tienen capacidad de mezcla de etiquetas. Del mismo modo, si un LSR no puede mezclar etiquetas, entonces si llegan dos paquetes del mismo FEC con distintas etiquetas de entrada deberán ser reenviadas con etiquetas de salida diferentes. Con mezcla de etiquetas sólo se necesitaría una. Sin mezcla de etiquetas, el número de etiquetas necesario podría llegar a ser igual al númro de nodos en la red. LSRs sin capacidades de mezcla de etiquetas En ATM no se admite la mezcla de etiquetas, ya que se produce desorden en el envío de los paquetes, siendo imposible reensamblarlos. Para ello, se proponen dos soluciones a este problema: ² Procedimientos de MPLS para emplear LSRs sin mezcla de etiquetas. ² Procedimientos que permitan a ciertos switches ATM llevar a cabo la mezcla de etiquetas. Etiquetas para LSRs con o sin capacidades de mezcla 130 CAPÍTULO 4. MPLS MULTI PROTOCOL LABEL SWITCHING Un LSR upstream que admita mezcla de etiquetas necesita enviar sólo una etiqueta por FEC, si no admite mezcla de etiquetas, necesitará enviar varias etiquetas por FEC. Además no sabe, a priori, cuántas etiquetas va a necesitar, ya que depende del número de LSRs upstream a él con respecto al FEC. En MPLS, si un vecino upstream no admite mezcla de etiquetas, no envía ninguna etiqueta para un FEC a menos que sea solicitado de forma explícita. El vecino upstream podrá realizar varias peticiones, recibiendo nuevas etiquetas en cada ocasión. Cuando un vecino downstream recibe estas peticiones y no soporta mezcla de etiquetas, deberá preguntar en turnos a su vecino downstream por otra etiqueta para el FEC en cuestión. Mezcla sobre ATM Métodos para eliminar el desorden de células: 1. Mezcla de caminos virtuales, empleando la codi…cación de SVP multipunto: En este caso se mezclan varios caminos virtuales, pero los paquetes que vengan de diferentes fuentes se distinguirán empleando los distintos VCIs dentro del camino virtual. 2. Mezcla de circuitos virtuales: los switches tendrán que poner las células de un paquete en un bu¤er hasta que el paquete se reciba por completo (esto se podrá saber mirando en el indicador de …nal de frame de la capa AAL5). La mezcla de caminos tiene la ventaja de que es compatible con muchos switches ATM. Al contrario que la mezcla de circuitos, la mezcla de caminos no provoca delays en los puntos de mezcla y no necesitan bu¤ers. Sin embargo ésta requiere la coordinación del espacio del VCI dentro de cada camino virtual. Túneles y Jerarquías A veces un Router Ru realiza una acción que causa el llevar un paquete determinado a otro Router Rd, incluso aunque Ru y Rd no sean consecutivos en el camino para ese paquete, y Rd no es el último destino del paquete. Por ejemplo, esto puede suceder al encapsular el paquete en un paquete de la capa de red cuya dirección de destino sea la dirección de Rd. Esto crea un túnel desde Ru a Rd. 4.2. ARQUITECTURA 131 Túnel enrutado salto a salto Es el túnel por el que circula un paquete que siga el camino salto a salto desde Ru a Rd. Túnel enrutado explícitamente Es el túnel por el que circula un paquete que siga un camino diferente del camino salto a salto desde Ru a Rd. Por ejemplo, se podría enviar un paquete a través de este tipo de túneles, encapsulandolo dentro de un paquete que es enrutado mediante el origen (source routed). Túneles LSP Se puede implementar un túnel como un LSP, y emplear la conmutación de etiquetas en lugar del encapsulado de la capa de red para hacer viajar el paquete a través del túnel. El túnel sería un camino LSP <R1 , R2, ... Rn>, en donde R1 es el punto de transmisión del túnel y Rn el de recepción. A este tipo de túneles se les denomina túneles LSP. El conjunto de paquetes que van a ser enviados por el túnel LSP constituye un FEC, y cada LSR del túnel deberá asignar una etiqueta a ese FEC. El criterio para asignar un paquete con un túnel LSP se hace de manera local en el punto de transmisión R1. Para poner un paquete en el túnel, este deberá poner una etiqueta en la pila de etiquetas y enviar el paquete etiquetado al siguiente salto del túnel. Un Túnel LSP enrutado salto a salto es un túnel que ha sido implementado como un camino LSP enrutado salto a salto entre el punto de transmisión y el de recepción. Un Túnel LSP enrutado explícitamente es un túnel LSP que se comporta también como un LSP con enrutado explícito. Jerarquía : Túneles LSP dentro de los LSPs Consideremos un camino LSP <R1, R2, R3, R4 >. Supongamos que R1 recibe un paquete sin etiquetar P, y pone en su pila una etiqueta que le hace seguir este camino, siendo el camino salto a salto. Sin embargo, supongamos también que R2 y R3 no están conectados directamente, sino que son vecinos mediante un túnel LSP. De tal modo que la 132 CAPÍTULO 4. MPLS MULTI PROTOCOL LABEL SWITCHING secuencia real que segirá P será : R1, R2, R2-1, R2-2, R2-3, R3, R4. Cuando P viaja de R1 a R2, tendrá una pila de profundidad 1. R2, al conmutar el paquete, determina que debe entrar en el túnel. Para ello, sustituye la etiqueta de entrada con una etiqueta que R3 pueda entender. Luego pone encima de la pila una etiqueta nueva. Esta etiqueta de nivel 2 tendrá un valor que R2 ¡1 podrá entender. Los Routers R2 ¡1, R2 ¡2, R2-3 conmutarán esta última etiqueta de nivel 2. R2-3 , que es el penúltimo salto en el túnel R2 ¡R3, extrae de la pila la etiqueta antes de reenviar el paquete a R3. Cuando R3 comprueba el paquete P, este tendrá ya un solo nivel en la pila (ya ha salido del túnel). Igualmente, como R3 es el penúltimo salto en el LSP inicial, extraerá la etiqueta que queda en la pila, y R4 recibirá el paquete P sin etiquetar. Puntos …nales (peers) en la distribución de etiquetas y Jerarquía. Supongamos que el paquete P viaja por un LSP de nivel 1 <R1, R2, R3, R4 >, y pasando por R2 y R3 viaja por un LSP de nivel 2 <R2, R2-1, R2-2, R3 >. Desde la perspectiva del LSP de nivel 2, el extremo de distribución (peer) de la etiqueta en R2 es R2 ¡1. desde la perspectiva del LSP de nivel 1, los extremos de distribución de la etiqueta en R2 son R1 y R3. Se pueden tener extremos de distribución de etiquetas en cada capa de la jerarquía. La arquitectura MPLS soporta dos métodos para distribuir las etiquetas en las distintas capas de la jerarquía. Peering explícito y Peering implícito. 1. Peering explícito: se distribuyen las etiquetas a un extremo enviando mensajes de protocolo de distribución de etiquetas que son direccionados hacia el extremo, tal y como se haría para puntos locales de distribución de etiquetas. Esta técnica es más útil cuando: – El número de nodos de distribución de etiquetas es pequeño. – El número de enlaces de etiquetas de nivel superior es grande. – Los nodos de distribución de etiquetas se encuentran en distintas áreas de routing o dominios. 1. Peering implícito: en lugar de enviar mensajes de protocolo de distribución de etiquetas direccionados hacia el extremo. Se distribuyen etiquetas de nivel superior a los extremos de distribución de etiquetas, 4.2. ARQUITECTURA 133 la etiqueta de nivel más alto se codi…ca como un atributo de la etiqueta del nivel por debajo y se distribuye entonces esta última etiqueta juto con su atributo, a los puntos locales de distribución de etiquetas. Este proceso se repite hasta que la información alcanza el extremo remoto. Esta técnica es más útil : ² cuando el número de nodos de distribución de etiquetas es grande. Por el contrario, esta técnica requiere que los nodos intermedios almacenen información sobre la cuál no estén directamente interesados. Transporte del Protocolo de Distribución de Etiquetas Un protocolo de distribución es empleado entre los nodos de una red MPLS para establecer y mantener los enlaces con las etiquetas. Para que este sea correcto, la información deberá ser transmitida: ² De manera …able. ² Secuencialmente. ² Es deseable un control de ‡ujo. ² Es deseable poder transmitir varios mensajes en un solo datagrama. Una buena forma de conseguir estos objetivos es emplear TCP como la capa de transporte. Las soluciones MPLS-LDP y MPLS-BGP han optado por este método. 4.2.2 Protocolo de Intercambio de Etiquetas LDP De…nición La arquitectura MPLS de…ne un protocolo de distribución de etiquetas como un conjunto de procedimientos mediante los cuales un LSR comunica a otro LSR asignaciones de etiquetas, utilizadas para enviar trá…co entre ellos. 134 CAPÍTULO 4. MPLS MULTI PROTOCOL LABEL SWITCHING El protocolo LDP es uno, no el único, de estos protocolos de distribución de etiquetas, ha sido creado para cumplir éste propósito. Es el conjunto de procedimientos y mensajes mediante los cuales los LSRs crean Caminos de Conmutación de Etiquetas (LSP) a través de una red, mapeando la información de routing directamente a caminos conmutados. Estos caminos podrán acabar en vecinos conectados entre sí directamente (como si fuese IP salto a salto) o pueden acabar en un nodo de salida de cierta red, activando entonces la conmutación entre todos los nodos intermedios. Así mismo, los LDPs asocian una Clase de Envío Equivalente (FEC) con cada camino LSP que creen. Los FEC asociados con cierto camino, especi…can que paquetes IP van a ir por ese camino. Pares LDP Dos LSRs que emplean el protocolo LDP para intercambiar información de asociación etiqueta / FEC son llamados pares LDP con respecto a esa información , manteniéndose entre ellos una sesión LDP. Una sesión LDP permite a cada par aprender la información de las etiquetas del otro. El protocolo es bidireccional. Intercambio de mensajes LDP Existen cuatro categorías de mensajes : 1. Mensajes de descubrimiento: empleados para anunciar y mantener la presencia de un LSR en la red. 2. Mensajes de sesión: empleados para establece, mantener y …nalizar las sesiones entre los pares. 3. Mensajes de anuncio: empleados para crear, cambiar y borrar asociaciones de etiquetas con FECs. 4. Mensajes de noti…cación: empleados para da información de aviso o de error. Los mensajes de descubrimiento anuncian la presencia de un LSR en la red, estos se realizan enviando el mensaje Hello periódicamente. Éste es transmi- 4.2. ARQUITECTURA 135 tido como un paquete UDP por el puerto LDP en la dirección multicast del grupo todos los Routers de esta Subred. Cuando un LSR desea establecer una sesión con otro LSR, aprendido gracias al mensaje Hello, empleará el procedimiento de inicialización LDP sobre TCP. Si se lleva a cabo de forma correcta el procedimiento de inicialización LDP, los dos LSRs son ya pares LDP, y pueden intercambiar mensajes de anuncio. Cuándo pedir cierta etiqueta, o anunciarla a un par, será una decisión local a cada LSR. En general, el LSR pide una etiqueta a su vecino cuando la necesita, y la anuncia cuando desea que el vecino la comience a utilizar. El funcionamiento correcto del protocolo LDP requiere una recepción …able y ordenada de mensajes. Para ello, se emplea el protocolo TCP para mensajes de sesión, de anuncio y de noti…cación. Es decir, para todo el proceso, excepto para los mensajes de descubrimiento, que viajan sobre UDP. Estructura del mensaje LDP Todos los mensajes LDP tienen una estructura común que emplea una metodología de codi…cación Tipo - Longitud - Valor . La parte Valor de un objeto TLV puede a su vez contener uno o más TLVs. Modos de Operación Sesiones LDP entre LSRs no conectados directamente Para llevar a cabo sesiones LDP entre LSRs que no están conectados directamente en el nivel de enlace se deberían dar ciertas características. Por ejemplo, consideremos una aplicación en la que LSRa envía trá…co que cumple cierto criterio por un camino a un LSRb no conectado directamente a él. El camino entre LSRa y LSRb incluiría uno o más LSRs intermedios ( LSR1 , ... , LSRn). Se crearía una sesión LDP entre LSRa y LSRb, que permitiría a LSRb conmutar el trá…co etiquetado procedente del camino con LSRa, permitiendo a LSRb emplear métodos para anunciar a LSRa etiquetas para este propósito. En esta situación, LSRa aplicaría dos etiquetas para mandar los datos a 136 CAPÍTULO 4. MPLS MULTI PROTOCOL LABEL SWITCHING LSRb: ² Una etiqueta aprendida de LSR1 para enviar trá…co por el camino desde LSRa a LSRb. ² Una etiqueta aprendida de LSRb para permitir a LSRb conmutar el trá…co etiquetado que llegue por el camino. LSRa primero añade la etiqueta aprendida en su sesión LDP con LSRb a la pila de etiquetas del paquete y luego añadirá a esta la etiqueta aprendida de LSR1 para entrar en este camino. Descubrimiento LDP El descubrimiento es un mecanismo mediante el cual un LSR descubre los posibles pares. Gracias al descubrimiento, no es necesario con…gurar de manera explícita los pares LDP. Mecanismo de descubrimiento básico: Un LSR envía de forma periódica Hellos de enlace. Éstos, se envian como paquetes UDP dirigidos al puerto LDP de descubrimiento, con la dirección multicast del grupo todos los Routers de la Subred. Un mensaje Hello lleva el identi…cador LDP para el espacio de etiquetas que el LSR trata de usar, y alguna otra posible información adicional. La recepción de un mensaje Hello identi…ca una adyacencia con un posible par LDP accesible a nivel de enlace así como el posible espacio de etiquetas que el par trata de emplear. Mecanismo de descubrimiento extendido: Se emplea para realizar sesiones LDP entre LSRs que no están conectados directamente. Para ello, un LSR envía Hellos direccionados a una dirección IP especí…ca. Éstos son enviados como paquetes UDP direccionados al puerto de la dirección especí…ca. Un Hello Direccionado enviado por un LSR lleva el identi…cador LDP 4.2. ARQUITECTURA 137 para el espacio de etiquetas que el LSR trata de usar, y alguna otra posible información adicional. Igualmente, la recepción de un mensaje Hello identi…ca una adyacencia con un posible par LDP accesible a nivel de enlace así como el posible espacio de etiquetas que el par trata de emplear. Establecimiento y Mantenimiento de Sesiones LDP El establecimiento de una sesión sigue dos pasos: ² Establecimiento de la conexión de transporte. ² Inicialización de la sesión. A continuación se describe el establecimiento de una sesión LPD entre LSR1 y LSR2 desde el punto de vista de LSR1. Se asume el intercambio de Hellos especi…cando el espacio de etiquetas LSR1: a para LSR1 y LSR2 : b para LSR2. Establecimiento de la conexión de transporte Si LSR1 no posee una sesión LDP para el intercambio de los espacios de etiquetas LSR1:a y LSR2:b intentará abrir una conexión TCP para tener una nueva sesión LDP con LSR2. ² LSR1 determina las direcciones de transporte a emplear por el mismo (dirección A1) y por LSR2 (dirección A2). ² La dirección A1 se determinará de la siguiente forma: ² Si LSR1 emplea TLV en los Hellos que envía a LSR2 para anunciar una dirección, A1 será la dirección que LSR1 anuncia en estos Hellos. ² Si LSR1 no emplea TLV, A1 será la dirección IP de origen empleada en los Hellos. 138 CAPÍTULO 4. MPLS MULTI PROTOCOL LABEL SWITCHING ² De igual forma, la dirección A2 se determinará de manera análoga empleando los Hellos de LSR2. LSR1 determina si jugará el rol activo o pasivo en el establecimiento de sesión comparando el valor entero sin signo de las direcciones A1 y A2. Si A1 > A2 , LSR1 tendrá el papel activo, en otro caso, será el papel pasivo. Si LSR1 es activo, intentará establecer la conexión TCP LDP conectando con el puerto con…gurado LDP en la dirección A2. Si LSR1 es pasivo, esperará a que LSR2 establezca la conexión TCP con su puerto LDP. Inicialización de Sesión Tras haber establecido la conexión de Transporte, los pares negocian los parámetros de sesión intercambiando mensajes de inicialización LDP. Los parámetros negociados incluyen: versión del protocolo LDP, método de distribución de etiquetas, valores de los temporizadores, rangos VPI / VCI para ATM, ó rangos DLCI4 si se trata de Frame Relay la capa de enlace, etc. Si la negociación ha tenido éxito, se establece la sesión entre los dos pares. A continuación se describen los pasos que se dan en la inicialización de una sesión. Si LSR1 es el par activo, inicia la negociación de los parámetros de sesión enviando un mensaje de inicialización a LSR2. Si es el par pasivo, esperará a que LSR2 inicie la negociación. Mantenimiento de Sesiones LDP LDP emplea la recepción regular de PDUs LDP en la conexión de transporte de la sesión para monitorizar la integridad de la sesión. Un LSR mantiene un temportizador KeepAlive (sigo vivo) para cada par, si este temportizador expira sin haber recibido una PDU LDP del par, el LSR deduce que la conexión TCP está mal, o que el par ha fallado, y termina esta sesión cerrando la conexión TCP. Manejo y Distribución de Etiquetas La arquitectura MPLS permite a un LSR distribuir un enlace con un FEC respondiendo a una petición que le haga otro LSR. A esta acción se la denomina 4 DLCI: 4.3. APLICACIONES MPLS 139 Distribución de Etiquetas Downstream Bajo Demanda. También permite a un LSR distribuir sus enlaces con los FEC a LSRs que no se lo han solicitado. A esta acción se la denomina Distribución de Etiquetas Downstream sin Solicitar. Ambas técnicas se pueden emplear en la misma red al mismo tiempo. Sin embargo, para cada sesión LDP los pares deberán saber que método de distribución de etiquetas emplean. Asignación y Distribución de Etiquetas En la arquitectura MPLS , la decisión de enlazar cierta etiqueta L con un FEC F la realiza el LSR que es DOWNSTREAM con respecto a ese enlace. Así, el LSR downstream informa al LSR upstream del enlace. Estas etiquetas son asignadas de forma downstream y los enlaces de etiquetas se distribuyen en la dirección downstream hacia upstream. Si un LSR ha sido diseñado de tal manera que sólo pueda buscar etiquetas que se encuentren en cierto rango numérico, entonces necesitará asegurar que solo enlaza etiquetas que se encuentren dentro de ese rango. 4.3 Aplicaciones MPLS Las principales aplicaciones que hoy en día tiene MPLS son: ² Ingeniería de trá…co. ² Diferenciación de niveles de servicio mediante clases (CoS). ² Servicio de redes privadas virtuales (VPN). Veamos brevemente las características de estas aplicaciones y las ventajas que MPLS supone para ello frente a otras soluciones tradicionales. 4.3.1 Ingienería de Trá…co El objetivo básico de la ingeniería de trá…co es adaptar los ‡ujos de trá…co a los recursos físicos de la red. La idea es equilibrar de forma óptima la utilización 140 CAPÍTULO 4. MPLS MULTI PROTOCOL LABEL SWITCHING Figura 4.10: Comparación entre camino más corto IGP con Ingienería de Trá…co. de esos recursos, de manera que no haya algunos que estén suprautilizados, con posibles puntos calientes y cuellos de botella, mientras otros puedan estar infrautilizados. A comienzos de los 90 los esquemas para adaptar de forma efectiva los ‡ujos de trá…co a la topología física de las redes IP eran bastante rudimentarios. Los ‡ujos de trá…co siguen el camino más corto calculado por el algoritmo IGP correspondiente. En casos de congestión de algunos enlaces, el problema se resolvía a base de añadir más capacidad a los enlaces. La ingeniería de trá…co consiste en trasladar determinados ‡ujos seleccionados por el algoritmo IGP sobre enlaces más congestionados, a otros enlaces más descargados, aunque estén fuera de la ruta más corta (con menos saltos). En el esquema de la Figura 4.10de la página 140 se comparan estos dos tipos de rutas para el mismo par de nodos origen-destino. El camino más corto entre A y B según la métrica normal IGP es el que tiene sólo dos saltos, pero puede que el exceso de trá…co sobre esos enlaces o el esfuerzo de los routers correspondientes hagan aconsejable la utilización del camino alternativo indicado con un salto más. MPLS es una herramienta efectiva para esta aplicación en grandes backbones, ya que: 4.3. APLICACIONES MPLS 141 ² Permite al administrador de la red el establecimiento de rutas explícitas, especi…cando el camino físico exacto de un LSP. ² Permite obtener estadísticas de uso LSP, que se pueden utilizar en la plani…cación de la red y como herramientas de análisis de cuellos de botella y carga de los enlaces, lo que resulta bastante útil para planes de expansión futura. ² Permite hacer “encaminamiento restringido” (Constraint-based Routing, CBR), de modo que el administrador de la red pueda seleccionar determinadas rutas para servicios especiales (distintos niveles de calidad). Por ejemplo, con garantías explícitas de retardo, ancho de banda, ‡uctuación, pérdida de paquetes, etc. La ventaja de la ingeniería de trá…co MPLS es que se puede hacer directamente sobre una red IP, al margen de que haya o no una infraestructura ATM por debajo, todo ello de manera más ‡exible y con menores costes de plani…cación y gestión para el administrador, y con mayor calidad de servicio para los clientes. 4.3.2 Clases de Servicios (CoS) MPLS está diseñado para poder cursar servicios diferenciados, según el Modelo Di¤Serv del IETF. Este modelo de…ne una variedad de mecanismos para poder clasi…car el trá…co en un reducido número de clases de servicio, con diferentes prioridades. Según los requisitos de los usuarios, Di¤Serv permite diferenciar servicios tradicionales tales como el WWW, el correo electrónico o la transferencia de …cheros (para los que el retardo no es crítico), de otras aplicaciones mucho más dependientes del retardo y de la variación del mismo, como son las de video y voz interactiva. Para ello se emplea el campo ToS (Type of Service), rebautizado en Di¤Serv como el octeto DS. Esta es la técnica QoS de marcar los paquetes que se envían a la red. MPLS se adapta perfectamente a ese modelo, ya que las etiquetas MPLS tienen el campo EXP para poder propagar la clase de servicio CoS en el correspondiente LSP. De es te modo, una red MPLS puede transportar distintas clases de trá…co, ya que: ² El trá…co que ‡uye a través de un determinado LSP se puede asignar a 142 CAPÍTULO 4. MPLS MULTI PROTOCOL LABEL SWITCHING diferentes colas de salida en los diferentes saltos LSR, de acuerdo con la información contenida en los bits del campo EXP. ² Entre cada par de LSR exteriores se pueden provisionar múltiples LSPs, cada uno de ellos con distintas prestaciones y con diferentes garantías de ancho de banda. P. ej., un LSP puede ser para trá…co de máxima prioridad, otro para una prioridad media y un tercero para trá…co best-e¤ort, tres niveles de servicio, primera, preferente y turista, que, lógicamente, tendrán distintos precios. 4.3.3 Redes Virtuales Privadas (VPNs) Una red privada virtual (VPN) se construye a base de conexiones realizadas sobre una infraestructura compartida, con funcionalidades de red y de seguridad equivalentes a las que se obtienen con una red privada. El objetivo de las VPNs es el soporte de aplicaciones intra/extranet, integrando aplicaciones multimedia de voz, datos y video sobre infraestructuras de comunicaciones e…caces y rentables. La seguridad supone aislamiento, y “privada” indica que el usuario “cree” que posee los enlaces. Las IP VPNs son soluciones de comunicación VPN basada en el protocolo de red IP de la Internet. En esta sección se va a describir brevemente las ventajas que MPLS ofrece para este tipo de redes frente a otras soluciones tradicionales. Las VPNs tradicionales se han venido construyendo sobre infraestructuras de transmisión compartidas con características implícitas de seguridad y respuesta predeterminada. Tal es el caso de las redes de datos Frame Relay, que permiten establecer PCVs entre los diversos nodos que conforman la VPN. La seguridad y las garantías las proporcionan la separación de trá…cos por PVC y el caudal asegurado (CIR). Algo similar se puede hacer con ATM, con diversas clases de garantías. Los inconvenientes de este tipo de solución es que la con…guración de las rutas se basa en procedimientos más bien artesanales, al tener que establecer cada PVC entre nodos, con la complejidad que esto supone al proveedor en la gestión (y los mayores costes asociados). Si se quiere tener conectados a todos con todos, en una topología lógica totalmente mallada, añadir un nuevo emplazamiento supone retocar todos los CPEs del cliente y restablecer todos los PVCs. Además, la popularización de las aplicaciones TCP/IP, así como la expansión de las redes de los NSPs, ha llevado a tratar de utilizar estas infraestructuras IP para el soporte de VPNs, tratando de conseguir una mayor ‡exibilidad 4.3. APLICACIONES MPLS 143 en el diseño e implantación y unos menores costes de gestión y provisión de servicio. La forma de utilizar las infraestructuras IP para servicio VPN (IP VPN) ha sido la de construir túneles IP de diversos modos. El objetivo de un túnel sobre IP es crear una asociación permanente entre dos extremos, de modo que funcionalmente aparezcan conectados. Lo que se hace es utilizar una estructura no conectiva como IP para simular esas conexiones: una especie de tuberías privadas por las que no puede entrar nadie que no sea miembro de esa IP VPN. No es el objetivo de esta sección una exposición completa de IP VPNs sobre túneles; se pretende tan sólo resumir sus características para poder apreciar luego las ventajas que ofrece MPLS frente a esas soluciones. Se puede obtener más información sobre IP VPN con túneles en las referencias correspondientes a VPNs con MPLS. Los túneles IP en conexiones dedicadas (no se va a tratar aquí de las conexiones conmutadas de acceso) se pueden establecer de dos maneras: ² En el nivel 3, mediante el protocolo IPSec del IETF. ² En el nivel 2, mediante el encapsulamiento de paquetes privados (IP u otros) sobre una red IP pública de un NSP. En las VPNs basadas en tuneles IPSec, la seguridad requerida se garantiza mediante el cifrado de la información de los datos y de la cabecera de los paquetes IP, que se encapsulan con una nueva cabecera IP para su transporte por la red del proveedor. Es relativamente sencillo de implementar, bien sea en dispositivos especializados, tales como cortafuegos, como en los propios routers de acceso del NSP. Además, como es un estándar, IPSec permite crear VPNs a través de redes de distintos NSPs que sigan el estándar IPSec. Pero como el cifrado IPSec oculta las cabeceras de los paquetes originales, las opciones QoS son bastante limitadas, ya que la red no puede distinguir ‡ujos por aplicaciones para asignarles diferentes niveles de servicio. Además, sólo vale para paquetes IP nativos, IPSec no admite otros protocolos. En los túneles de nivel 2 se encapsulan paquetes multiprotocolo (no necesariamente IP), sobre los datagramas IP de la red del NSP. De este modo, la red del proveedor no pierde la visibilidad IP, por lo que hay mayores posibilidades de QoS para priorizar el trá…co por tipo de aplicación IP. Los clientes VPN pueden mantener su esquema privado de direcciones, estableciendo grupos cerrados de usuarios, si así lo desean. (Además de encapsular los paquetes, se 144 CAPÍTULO 4. MPLS MULTI PROTOCOL LABEL SWITCHING puede cifrar la información por mayor seguridad, pero en este caso limitando las opciones QoS). A diferencia de la opción anterior, la operación de túneles de nivel 2 está condicionada a un único proveedor. A pesar de las ventajas de los túneles IP sobre los PVCs, ambos enfoques tienen unas características comunes que las hacen menos e…cientes frente a la solución MPLS: ² Están basadas en conexiones punto a punto (PVCs o túneles). ² La con…guración es manual. ² La provisión y gestión son complicadas; una nueva conexión supone alterar todas las con…guraciones. ² Plantean problemas de crecimiento al añadir nuevos túneles o circuitos virtuales. ² La gestión de QoS es posible en cierta medida, pero no se puede mantener extremo a extremo a lo largo de la red, ya que no existen mecanismos que sustenten los parámetros de calidad durante el transporte. Realmente, el problema que plantean estas IP VPNs es que están basadas en un modelo topológico superpuesto sobre la topología física existente, a base de túneles extremos a extremo (o circuitos virtuales) entre cada par de routers de cliente en cada VPN. De ahí las desventajas en cuanto a la poca ‡exibilidad en la provisión y gestión del servicio, así como en el crecimiento cuando se quieren añadir nuevos emplazamientos. Con una arquitectura MPLS se obvian estos inconvenientes ya que el modelo topológico no se superpone sino que se acopla a la red del proveedor. En el modelo acoplado MPLS, en lugar de conexiones extremo a extremo entre los distintos emplazamientos de una VPN, lo que hay son conexiones IP a una “nube común” en las que solamente pueden entrar los miembros de la misma VPN. Las “nubes” que representan las distintas VPNs se implementan mediante los caminos LSPs creados por el mecanismo de intercambio de etiquetas MPLS. Los LSPs son similares a los túneles en cuanto a que la red transporta los paquetes del usuario (incluyendo las cabeceras) sin examinar el contenido, a base de encapsularlos sobre otro protocolo. Aquí está la diferencia: en los túneles se utiliza el encaminamiento convencional IP para transportar la información del usuario, mientras que en MPLS esta información se transporta sobre el mecanismo de intercambio de etiquetas, que no ve para nada el proceso de routing IP. Sin embargo, sí se 4.3. APLICACIONES MPLS 145 Figura 4.11: Modelo “superpuesto” (túneles/PVCs) vs. modelo “acoplado” (MPLS). mantiene en todo momento la visibilidad IP hacia el usuario, que no sabe nada rutas MPLS sino que ve una internet privada (intranet) entre los miembros de su VPN. De este modo, se pueden aplicar técnicas QoS basadas en el examen de la cabecera IP, que la red MPLS podrá propagar hasta el destino, pudiendo así reservar ancho de banda, priorizar aplicaciones, establecer CoS y optimizar los recursos de la red con técnicas de ingeniería de trá…co. En la …gura 4.11 de la página 145 se representa una comparación entre ambos modelos. La diferencia entre los túneles IP convencionales (o los circuitos virtuales) y los “túneles MPLS” (LSPs) está en que éstos se crean dentro de la red, a base de LSPs, y no de extremo a extremo a través de la red. Como resumen, las ventajas que MPLS ofrece para IP VPNs son: ² Proporcionan un modelo “acoplado” o “inteligente”, ya que la red MPLS “sabe” de la existencia de VPNs (lo que no ocurre con túneles ni PVCs). ² Evita la complejidad de los túneles y PVCs. ² La provisión de servicio es sencilla: una nueva conexión afecta a un solo router. ² Tiene mayores opciones de crecimiento modular. 146 CAPÍTULO 4. MPLS MULTI PROTOCOL LABEL SWITCHING ² Permiten mantener garantías QoS extremo a extremo, pudiendo separar ‡ujos de trá…co por aplicaciones en diferentes clases, gracias al vívculo que mantienen el campo EXP de las etiquetas MPLS con las clases de…nidas a la entrada. ² Permite aprovechar las posibilidades de ingeniería de trá…co para las poder garantizar los parámetros críticos y la respuesta global de la red (ancho banda, retardo, ‡uctuación...), lo que es necesario para un servicio completo VPN. Capítulo 5 Simulador de Redes MPLS 5.1 Fase de Análisis Para un mayor conocimiento de la solución elegida deberá diseñarse una aplicación que simule el comportamiento de la red interaccionando con entidades TCP /IP, de tal manera que se pueda estudiar el comportamiento del trá…co IP al circular por esta red. Por esto, deberá tenerse en cuenta esta simulación a lo largo de todas las fases del proyecto, dedicándole una mayor atención una vez elegida la solución a tomar y en la fase de implementación. Esta herramienta deberá ser: ² Con…gurable : deberá existir una manera de alterar los parámetros de la red y los parámetros del trá…co que circula por la red. ² Grá…ca : para poder sacar conclusiones en un golpe de vista. ² Rigurosa. ² Analizable : los resultados revelarán el comportamiento de la red y los posibles problemas que pueden surgir. ² Portable : a ser posible, deberá ser código abierto y fácil de ejecutar en varios sistemas operativos. Para dar pie a posibles colaboraciones en el futuro. 147 148 CAPÍTULO 5. SIMULADOR DE REDES MPLS La herramienta de simulación puede tener múltiples funcionalidades: ² Como análisis del comportamiento del trá…co y de la red. ² Como utilidad para explicar el funcionamiento de la adaptación IP ATM. ² Como escenario para probar cambios en la topología de la red, o en el comportamiento de los algoritmos de encaminamiento. Los elementos mas característicos que esta aplicación manejará serán : ² Entrada de trá…co IP. ² Circulación de datos IP. ² Circulación de datos ATM. ² Circulación de signalling ATM. ² Circulación de datos IP - ATM. ² Circulación de signalling IP - ATM. ² Modi…cación del número de Nodos de la red. ² Modi…cación de los enlaces entre los nodos de la red. ² Velocidad de envío de IP. ² Velocidad de conmutación ATM. ² Modi…cación de los parámetros especí…cos de IP en cada nodo (tabla de routing). ² Modi…cación de los parámetros especí…cos de ATM en cada nodo (tabla de Switching, calidad de servicio. ² Adaptación de datagramas IP en paquetes ATM, empleando la capa AAL5 entre ambos protocolos. ² Modi…cación de los parámetros especí…cos de la solución elegida para adaptar IP - ATM. 149 5.1. FASE DE ANÁLISIS Paquetes ATM Entidad Externa Tipo ATM Paquetes ATM Paq. Etiquetados Datos de control Nodo de Red MPLS Paq. Etiquetados Datos de control Solicitud información Nueva información de Tablas Datag IP Entidad Externa Tipo IP Nodo de la misma red MPLS Datag IP Información Administrador del Sistema Figura 5.1: Diagrama de Contexto del Nuevo Sistema. Esta fase se basa en el estudio del sistema que diseñaremos en las fases futuras. Este estudio se hace en dos vertientes: ² Los procesos que realizará el sistema MPLS. ² Los datos que manejaran estos procesos ( paquetes, datagramas y datos de control). 5.1.1 Diagrama de Contexto El diagrama de contexto, que se observa en la Figura 5.1 de la Página 149 representa toda la información que deberá circular entre un nodo de la red MPLS y cuatro tipos de entidades que pueden interaccionar con él: ² Entidad externa tipo IP: los nodos frontera interaccionan directamente con routers IP, de tal modo que deben manejar datagramas IP, clasi…carlos en Clases de Envío Equivalentes y asociarlas con etiquetas. ² Entidad externa tipo ATM: los datos procedentes de switches ATM que no soporten MPLS deberán llevarse por Caminos Virtuales especí…cos. 150 CAPÍTULO 5. SIMULADOR DE REDES MPLS Enviar paquete Células ATM Entidad ATM ATM Células ATM Consulta NHLFE Consulta Enviar paquete etiqueta do Datag IP Entidad IP Paq. etiquetados Recibir paquete Entidad ATM Datag IP Paq. etiquetados Paq. etiquetados Nodo Interno T.Routing Clasifi car paquete Enviar datag. IP Datag IP Datag IP Entidad IP Células ATM Petición FEC Nodo Interno Consulta T.Routing Consulta LIB Consulta Solicitar FEC NHLFE Modificación Modificación Consulta Modifi car tablas Usuario Petición FEC Información FEC Modificación Cónsultar FEC Consulta Recibir Petición FEC Petición FEC Nodo Interno Modificación Información FEC Actualizar Recibir nuevo FEC Figura 5.2: Diagrama de Nivel Superior. 5.1. FASE DE ANÁLISIS 151 DFD de Primer Nivel En la Figura 5.2 de la Página 150 podemos ver los procedimientos principales que pueden darse dentro de un Router Conmutador de Etiquetas, o LSR. 5.1.2 Descripción de las entidades externas Las entidades externas se detallan a continuación: ² Entidad IP: son las entidades con las que un router frontera recibe o envía datagramas IP. Estas serán routers externos a la red MPLS ² Entidad ATM: son las entidades con las que un nodo de la red recibe o envía células ATM nativas, es decir, sin etiquetar. ² Nodo Interno: nodos pertenecientes a la red MPLS que admiten el etiquetado de paquetes y su procesamiento. ² Usuario: el administrador de la red, que podrá en cualquier momento modi…car el contenido de las tablas de un nodo. 5.1.3 Descripción de los almacenes de datos Las tablas de datos principales que un nodo de la red debe poder manejar son las siguientes: ² Tabla de routing: tabla que permite direccionar los datos IP. En sí, la tabla de routing almacena tres campos: la dirección de destino, el pre…jo de dirección que se considera signi…cativo y el interface por el que se enviará el datagrama. La tabla de routing se utiliza, además de para el direcionamiento, como fuente de información a la hora de crear una Clase de Envío Equivalente (FEC). ² LIB: Label Information Base. O Base de Información de Etiquetas: es la tabla en la que se asocian las Clases de Envío Equivalentes con las Etiquetas que se van a asociar. Las LIB sólo se utilizan en los nodos Frontera. 152 CAPÍTULO 5. SIMULADOR DE REDES MPLS ² NHLFE: Next Hop Label Forwarding Entry. O Entrada de Envío de Etiquetas al Siguiente Salto. Esta tabla asocia cada etiqueta con el siguiente nodo a conmutar dentro de la red MPLS. Todos los nodos de la red deberán tenerla. 5.1.4 Descripción de los procesos ² Recibir paquete: este proceso engloba todas las acciones necesarias para recibir datos procedentes de todos los tipos de fuentes externas posibles: IP, ATM o un Nodo MPLS. En este proceso se hará una primera clasi…cación para decidir qué operación realizar con la información recibida. Así mismo deberá realizar todas las operaciones de reensamblado de la capa AAL5 si es necesario. ² Enviar paquete ATM: en el caso de tratar con paquetes cuyo vpi / vci sea especí…co para ATM nativo, este proceso sigue utilizando los vpi/ vci permitidos para enviar paquetes de manera compatible al sistema ATM nativo. Así mismo deberá realizar todas las operaciones de segmentación en la capa AAL5 si procede. ² Enviar paquete etiquetado: en este proceso se envía un paquete en función de la etiqueta que le acompaña a este. ² Enviar datagrama IP: este proceso realiza un envío similar al realizado por un router, en función de la dirección de destino comprueba en la tabla de routing cuál es el siguiente salto y procede a su envío. ² Clasi…car paquete: en función de la cabecera de un paquete IP, se procede a asociarlo con una Clase de Envío Equivalente para así poder etiquetarlo. También deberá realizar la operación inversa, es decir, al recibir un paquete etiquetado , encontrará la dirección IP destino original. ² Solicitar FEC: en este procedimiento un nodo solicita a otros nodos de la red información FEC para una dirección IP. ² Consultar FEC: consulta la Label Information Base buscando un FEC determinado para una dirección IP, o para una Etiqueta ² Recibir petición FEC: en este proceso se recibe, por parte de un nodo interno la petición de información de un FEC. Procediendo a realizar la consulta en la LIB. 5.1. FASE DE ANÁLISIS 153 ² Recibir nuevo FEC: se recibe, por parte de un nodo interno, un nuevo fec, o una nueva información FEC- Etiqueta. Procediendo a actualizar la LIB o no, en función de la política empleada. ² Modi…car tablas: en este proceso, se realizan las modi…caciones de las tablas del nodo a petición del usuario. 5.1.5 Descripción de los ‡ujos de datos ² Datagramas IP: el datagrama IP versión 4, incluida la cabecera. Este ‡ujo de datos es enviado por las entidades externas tipo IP y por los nodos de la red MPLS que son frontera. Los nodos internos de la red IP no reciben datagramas IP. Los procesos que manejan este ‡ujo de datos son : Recibir paquete y Enviar paquete IP. ² Células ATM: son células ATM procedentes de caminos o circuitos virtuales de…nidos expresamente para trá…co ATM nativo. Los procesos que manipulan este ‡ujo de datos son : Recibir paquete, Enviar paquete ATM. ² Paquetes etiquetados: son células ATM cuyo identi…cador vpi / vci hace las veces de etiqueta, de tal forma que son reconocidos por los nodos de la red MPLS como etiquetados. Los paquetes etiquetados son manipulados por: Recibir paquete, Enviar paquete etiquetado y Clasi…car paquete. ² Petición FEC: es información codi…cada dentro de un protocolo de distribución de etiquetas, es enviada entre los nodos de la red MPLS para solicitar información de una Clase de Envío Equivalente y así poder clasi…car cierto ‡ujo de datos IP. Esta petición es efectuada en: Clasi…car paquetes, Solicitar FEC, Recibir Petición FEC. ² Información FEC: al igual que el anterior, en este caso da información de cierto FEC. Es recibida en: Recibir nuevo FEC, Consultar FEC y Solicitar FEC. ² Consulta: en este ‡ujo de datos se engloban los resultados de las peticiones a las fuentes de datos. Una consulta podrá ser un registro de la tabla de routing, de la LIB, de la NHLFE. Las consultas se realizan en: Recibir paquete, Consultar FEC, Enviar paquete ATM, Enviar paquete Etiquetado, Enviar datagrama IP. 154 CAPÍTULO 5. SIMULADOR DE REDES MPLS ² Modi…cación: es una modi…cación de la información dentro de las fuentes de datos. Es realizada por el proceso Modi…car Tablas. ² Actualización: es una inserción de datos dentro de las fuentes de datos. Es realizada por: Clasi…car paquete, que modi…ca la LIB, y Recibir nuevo FEC, que modi…ca la LIB y la NHLFE. 5.1.6 Componentes de un LSR En un nodo LSR, de una arquitectura MPLS podemos encontrar 3 bases de datos, realmente 3 tablas que deberán estar en la memoria del conmutador: A continuación se muestran los atributos (campos) de las tablas: ² Tabla de Routing: – Dirección IP: es un array del tipo dirección IP, es decir un array de 32 bytes. – Pre…jo: entero que indica el número de bytes a tener en cuenta para asociar la dirección con el siguiente salto. – Siguiente salto: entero que indica el interface sobre el que habrá que enviar el paquete IP. ² Tabla NHLFE (Next Hop Label Forwading Entry): Tabla de Envío al Siguiente Salto en función de la Etiqueta. – Número Interface Entrada: entero que indica el número de interface por el que se recibe el paquete. – Interface Entrada: descripción del interface de entrada – Número Interface Salida: entero que indica el número de interface por el que se envía el paquete. – Interface Salida: descripción del interface de salida – Etiqueta Entrada: etiqueta que se recibe en el paquete entrante. – Etiqueta Salida: etiqueta que se asociará al paquete saliente. ² Tabla LIB (Label Information Base): Base de Información de Etiquetas 5.1. FASE DE ANÁLISIS 155 – Etiqueta entrada: etiqueta del paquete de entrada, si se usa la LIB para asociar etiqueta-dir IP. – Etiqueta salida: etiqueta del paquete de salida, si se usa la LIB para asociar etiqueta - paquete. – FEC: Clase de Envío Equivalente, contiene la información que asocia la etiqueta con el ‡ujo de datos IP. – Número Interface Entrada: entero que indica el número de interface por el que se recibe el paquete. – Interface Entrada: descripción del interface de entrada. – Número Interface Salida: entero que indica el número de interface por el que se envía el paquete. – Interface Salida: descripción del interface de salida. 5.1.7 Diccionario de Datos En este apartado se muestra el Diccionario de Datos, con todos los elementos de datos, correspondientes a atributos de las tablas, que existirán en el sistema: la Tabla 5.1 de la Página 156, nos muestra los datos de la Dirección IP; la Tabla 5.2 de la Página 156, nos muestra los datos del Pre…jo de Direcciones; la Tabla 5.3 de la Página 156, nos muestra los datos del Siguiente Salto; la Tabla 5.4 de la Página 5.4, nos muestra los datos de la Etiqueta de Entrada; la Tabla 5.5 de la Página 157, nos muestra los datos de la Etiqueta de Salida; la Tabla 5.6 de la Página 157, nos muestra los datos de las Clases de Envío; la Tabla 5.7 de la Página 157, nos muestra los datos del Número de la Interfaz de Salida; la Tabla 5.8 de la Página 157, nos muestra los datos de Número de la Interfaz de Entrada; la Tabla 5.9 de la Página 158 nos muestra la Interfaz de Entrada; la Tabla 5.10 de la Página 158 nos muestra la Interfaz de Salida; la Tabla 5.11de la Página 158 nos muestra los datos de Número de la Interfaz de Salida; la Tabla 5.12 de la Página 158 nos muestra los datos de Número de la Interfaz de Entrada; la Tabla 5.13 de la Página 159 nos muestra los datos la Interfaz de Entrada; la Tabla 5.14 de la Página 159 nos muestra los datos de la Interfaz de Salida; la Tabla 5.15 de la Página 159 nos muestra los datos de la Etiqueta de Entrada; la Tabla 5.16 de la Página 159 nos muestra los datos de la Etiqueta de Salida. 156 CAPÍTULO 5. SIMULADOR DE REDES MPLS Nombre Alias Tipo Tabla Descripción Dirección IP Dir_ip 4 Bytes Tabla de Routing Número de bytes a tener en cuenta para asociar la dirección con el siguiente salto Tabla 5.1: Dirección IP. Nombre Alias Tipo Tabla Descripción Pre…jo Pre…jo Int Tabla de Routing Tabla 5.2: Pre…jo de Dirección. Nombre Alias Tipo Tabla Descripción Siguiente Salto Sig_Salto Int Tabla de Routing Interfaz sobre el que habrá que enviar el paquete IP Tabla 5.3: Siguiente Salto. Nombre Alias Tipo Tabla Descripción Etiqueta de entrada Etiqueta_entrada Etiqueta LIB Etiqueta del paquete de entrada, si se usa la LIB para asociar etiqueta-dir IP. Tabla 5.4: Etiqueta de Entrada. 5.1. FASE DE ANÁLISIS Nombre Alias Tipo Tabla Descripción Etiqueta de Salida Etiqueta_salida Etiqueta LIB Etiqueta del paquete de salida, si se usa la LIB para asociar etiqueta-paquete. Tabla 5.5: Etiqueta de Salida. Nombre Alias Tipo Tabla Descripción Clase de envio equivalente FEC FEC LIB Clase de Env o Equivalente, contiene la informaci n que asocia la etiqueta con el ‡ujo de datos IP. Tabla 5.6: Clase de Envio Equivalente. Nombre Alias Tipo Tabla Descripción Numero Interfaz Salida Num_Int_Sal Int LIB entero que indica el n mero de interface por el que se env a el paquete. Tabla 5.7: Número Interfaz Salida. Nombre Alias Tipo Tabla Descripción Numero Interfaz Entrada Num_Int_Ent Int LIB entero que indica el n mero de interface por el que se recibe el paquete. Tabla 5.8: Número Interfaz Entrada. 157 158 CAPÍTULO 5. SIMULADOR DE REDES MPLS Nombre Alias Tipo Tabla Descripción Interface de Entrada Int_Ent String(8) LIB Identi…cador en formato texto del interface Tabla 5.9: Interfaz de Entrada. Nombre Alias Tipo Tabla Descripción Interface de Salida Int_Sal String(8) LIB Identi…cador en formato texto del interface Tabla 5.10: Interfaz de Salida. Nombre Alias Tipo Tabla Descripción Numero Interface Salida Num_Int_Sal Int NHLFE Entero que indica el n mero de interface por el que se envía el paquete Tabla 5.11: Número Interfaz de Salida. Nombre Alias Tipo Tabla Descripción Numero Interface Entrada Num_Int_Ent Int NHLFE Entero que indica el n mero de interface por el que se recibe el paquete Tabla 5.12: Número Interfaz de Entrada. 5.1. FASE DE ANÁLISIS Nombre Alias Tipo Tabla Descripción Interface Entrada Int_Ent String(8) NHLFE Identi…cador en formato texto del interface Tabla 5.13: Interfaz de Entrada. Nombre Alias Tipo Tabla Descripción Interface Salida Int_Ent String(8) NHLFE Identi…cador en formato texto del interface Tabla 5.14: Interfaz de Salida. Nombre Alias Tipo Tabla Descripción Etiqueta de Entrada Etiqueta_entrada Etiqueta NHLFE Etiqueta del paquete de entrada, si se usa la LIB para asociar etiqueta-Dir IP. Tabla 5.15: Etiqueta de Entrada. Nombre Alias Tipo Tabla Descripción Etiqueta de Salida Etiqueta_salida Etiqueta NHLFE Etiqueta del paquete de salida, si se usa la LIB para asociar etiqueta-paquete. Tabla 5.16: Etiqueta de Salida. 159 160 CAPÍTULO 5. SIMULADOR DE REDES MPLS Tipos Especiales de Datos Tipo Etiqueta: el tipo Etiqueta es un array con dos campos: ² vpi: originalmente , el identi…cador del camino virtual en las células ATM. ² vci: originalmente , el identi…cador del circuito virtual en las células ATM. Tipo FEC: el tipo fec es un registro con los siguientes campos: ² Tipo de FEC : existen varias maneras de clasi…car un ‡ujo de datos, de hecho, aún no se han de…nido estándares a este respecto. Podemos encontrar dos tipos de FEC actuales diferentes: 1. Host: los que clasi…can el ‡ujo de datos en función de la dirección IP de destino completa, es decir que para que un ‡ujo de datos sea clasi…cado en un fec A, éste deberá coincidir totalmente en su dirección IP de destino. 2. Dir: los que clasi…can el ‡ujo de datos en función de la coincidencia de un determinado número de bytes respecto la dirección IP. Esta clasi…cación es mucho más ‡exible, por ejemplo si tenemos como dirección del FEC 123.x.x.x, y pre…jo 4, todos los paquetes que lleguen con dirección destino del tipo 123.x.x.x serán clasi…cados en el. ² Dirección: dirección IP que se tomará como referencia para realizar las clasi…caciones. ² Longitud de pre…jo: caso de ser un fec de tipo dir, número de bytes en la dirección IP que han de tomarse en cuenta para realizar la clasi…cación. ² Familia de dirección: en este campo se indica si se trata de IP V6, V4, experimental... ² Reservado: campo reservado para futuras implementaciones. Tipo datagrama IP 5.1. FASE DE ANÁLISIS 161 ² Version: identi…ca la versión del protocolo, ejemplo: 4 en el caso de Ipv4. ² IHL (Internet Header Length) ó longitud de la cabecera: es un campo de 32 bits. ² TOS (Type Of Service): indica la posible prioridad y el tipo de transporte que se desea utilizar. ² Total Length ó Longitud Total: la longitud del datagrama en octetos. Este valor puede ser hasta 65.535 octetos. ² Identi…cation ó Identi…cación: un valor asignado por la capa de transporte para permitir el ensamblado de los fragmentos. ² Flag bits: controlan las opciones de la fragmentación. ² Fragment O¤set ó Compensación del Fragmento: indica el lugar donde se encuentra este fragmento en el datagrama original. ² TTL (Time to Live) ó Tiempo de Vida indica el mayor número de saltos que el datagrama puede realizar a lo largo de la red. ² Protocolo: indica el protocolo de la capa superior, ej: TCP ó UDP. ² Header Checksum: un Checksum de 16 bits de la cabecera del datagrama. ² Source / Destination address: direcciones origen y destino, valores de 32 bits que indican el emisor y el receptor del paquete. ² Options: información para control de la red, routing y gestión. ² Padding: Campo de relleno para adaptar la longitud de la cabecera a 20 bytes. ² User Data: los datos de la capa de transporte. Tipo célula ATM La célula ATM es un registro de longitud Fija con 53 bytes repartida de la siguiente manera: ² (4 bit) GFC: generic ‡ow control. Parámetro de QoS. Normalmente no usado, (por defecto 0000). 162 CAPÍTULO 5. SIMULADOR DE REDES MPLS ² (8,12 bit) VPI: identi…cador del camino virtual. En nuestro caso este valor se utilizará tambien para identi…car las etiquetas. ² (16 bit) VCI: identi…cador del canal virtual. En nuestro caso este valor se utilizará también para identi…car las etiquetas. ² (3 bit) PT: payload type. Dedicados a describir el tipo de carga que transporta la celda. El primer bit indica si los datos de la celda son de usuario o mensajes de la red. En el plano del usuario los dos bits consecutivos determinan la existencia de congestión y tipo de información. En celdas de mantenimiento los dos últimos bits indican el tipo de mensaje. ² (1 bit) Res: reservado. ² (1 bit) CLP: cell loss priority. Parámetro de calidad de servicio. La celda podrá ser descartada si se encuentra congestión. ² (8 bit) HEC: header error control. Empleado para realizar algoritmos de checksum en la cabecera. Corrige un bit erróneo, y detecta más de un bit erróneo. ² (48 bytes) DATOS. 5.2 Diseño del Sistema En esta etapa se realizará un Diseño de Alto Nivel del Sistema, sin entrar en detalles de implementación. Estudiaremos el sistema en función de: ² Los datos que entran y salen de él. ² La interfaz de usuario. 5.2.1 Diseño de las salidas. Este simulador cuenta con una salida de texto, que se graba cada vez que se cierra la ventana de simulación. Este archivo se llama logMPLS y se encuentra en la misma carpeta que el ejecutable del simulador, o sea en c:nnMPLSnnwin. En este archivo se pueden 5.2. DISEÑO DEL SISTEMA 163 apreciar todas las actividades que realizó la red a través de los nodos para el envío de los paquetes. En la sección de los ejemplos de con…guración se explicará con detalle el contenido del este archivo. Datos genéricos de la red Esta salida será una ventana, como de observa en la Figura 5.3 de la Página 164 que contendrá los datos relativos a la información que manejará la red al realizar la simulación: ² Número de nodos en la red: indicará cuantos LSR existen en la red. ² Velocidad de envío de datagramas IP: indicará la velocidad en paquetes/sec a la que serán enviados los datagramas IP a la red. ² Retardo de procesamiento de los nodos: cifra genérica que representa el tiempo que un nodo tarda en realizar un chequeo en todos sus interfaces de entrada sumado al tiempo que emplee en procesar un paquete ATM y enviarlo. ² Tamaño de datos de los datagramas IP: indicará el tamaño de datos, sin incluir la cabecera, que tendrán los datagramas IP, de tal manera que si el tamaño de datos, junto con la cabecera supera los 53 bytes del tamaño de célula ATM, será necesario realizar segmentación al entrar estos datos en la red. ² Debug: indicará si se desean mostrar todos los datos, cuando el simulador entre en funcionamiento, o sólo mostrar el modo grá…co. ² Nombre del …chero de entrada: indicará qué …chero se está utilizando para obtener los datos de la red, en el caso de que se esté utilizando alguno. Datos Especí…cos de cada Nodo Esta entrada aparecerá cuando se deseen visualizar los datos especí…cos de un LSR perteneciente a la red, como se observa en la Figura 5.4 de la Página 164. Los datos que se podrán observar serán : 164 CAPÍTULO 5. SIMULADOR DE REDES MPLS Figura 5.3: Entrada de Datos Genéricos. Figura 5.4: Datos de la tabla NHLFE. ² Tabla de Routing: los datos de la tabla de routing del nodo. ² LIB: los datos de la tabla Label Information Base del nodo. Esta tabla se mostrará en el caso de que el nodo no sea interno (los nodos internos no la necesitan). ² NHLFE: los datos de la tabla NHLFE, que asocia las etiquetas con las salidas de los datos. ² Enlaces de entrada: mostrará los nodos de entrada a él junto con los interfaces de entrada asociados. ² Enlaces de salida: mostrará los nodos de salida a él junto con los interfaces de salida asociados. ² Frontera: indicará si es un nodo frontera de la red ó interno. En el caso de los nodos frontera, estos podrán tener enlaces con entidades IP. 5.2. DISEÑO DEL SISTEMA 165 Disposición de la Red Esta información se visualizirá en forma grá…ca, y se podrán realizarse las modi…caciones en el …chero de con…guraciones, a travez de la in terfaz de entrada de datos. Se visualizarán : ² Localización de los nodos. ² Enlaces entre los nodos: además deberá indicarse de alguna manera si se trata de un enlace de entrada o de salida (o mixto). ² Localización de las entidades IP. ² Enlaces de los nodos frontera con las entidades IP. Lo que se pretende en esta entrada es que mediante el ratón, puedan cambiarse las posiciones de los nodos, así como enlazar unos nodos con otros. Funcionamiento de la Red Esta entrada dispondrá de los botones necesarios para controlar el funcionamiento de la red: ² Reset: recarga todos los datos originales de la red, respecto del …chero de con…guraciones. ² Activar: pone en funcionamiento la red. ² Traza: ejecuta paso a paso el funcionamiento de la red. ² Detener: pone en pausa el funcionamiento de la red. ² Salir: saldrá de la aplicación. Interfaz del Usuario El Interface de Usuario que se ha optado elegir para este sistema, es orientado a ventanas, como una aplicación típica de Windows, dispondrá de dos ventanas 166 CAPÍTULO 5. SIMULADOR DE REDES MPLS principales: la ventana de entrada de datos genéricos a la red y la ventana de simulación. Se intentará mostrar toda la información dentro de una sola ventana, para evitar la tarea de tener que abrir menus o más ventanas de las que sean innecesarias. Cuando un usuario arranca la aplicación sin el parámetro del …chero de con…guraciones, ésta buscará en el directorio en que se encuentra el …chero mpls.cfg cargando los datos automáticamente y mostrando los resultados de la carga a medida que ésta se va efectuando. En la ventana principal, el usuario podrá ahora realizar todos los cambios que crea conveniente acerca de la red, o de los parámetros del trá…co. En el capítulo “Interfaz con el Usuario” se explicará detalladamente la carga de los datos del …chero de con…guraciones. 5.3 Implementación En esta fase se procederá a desarrollar el simulador MPLS. El código empleado va a ser Java 2 SDK, Standard Edition, Version 1.2.2. Esta versión incluye librerías swing y awt que permiten emplear los entornos de ventanas de un modo similar a lenguajes visuales tipo Visual C o Visual Basic. Requerimientos del sistema de programación El software de Java 2 SDK puede obtenerse en tres plataformas: ² Versión Win32 para Windows 95, Windows 98 y Windows NT 4.0 corriendo sobre plataformas Intel. Necesita un procesador 486/DX o superior. 32 megabytes RAM mínimo, 48 megabytes RAM recomendados. ² Versión Solaris/SPARC.Sólo se admiten versiones Solaris 2.5.1, 2.6 y 7. 32 megabytes RAM requeridos, 48 megabytes RAM recommendados. ² Versión Solaris/Intel. Sólo versiones 2.5.1, 2.6 y 7. Necesario un procesador 486/DX o superior. 32 megabytes RAM mínimo, 48 megabytes RAM recomendados. En todos los sistemas se deben tener 64 megabytes de espacio libre en disco para instalar el software de desarrollo. 5.3. IMPLEMENTACIÓN 167 Para facilitar todo el proceso de debug, creación de ventanas, etc. Se han empleado dos herramientas de desarrollo, Borland Java Builder, y Symantec Visual Café Database Edition. La mayor parte de la programación acabó realizándose en Visual Café debido a las grandes necesidades de memoria de Java Builder. Además, Visual Café dispone de un compilador de código intel, siendo la única herramienta hasta el momento que puede crear un …chero ejecutable, compatible para los sistemas operativos windows 9X. A su vez, la compilación de Visual Café crea todas las clases dentro de un mismo directorio, de tal manera que basta con copiar el contenido del directorio para poder ejecutar la aplicación en cualquier plataforma que disponga de Java 1.2.2. 5.3.1 Creación de las Clases en Java Las clases que se emplearán para la codi…cación de la simulación son las siguientes: ² Paquete: clase genérica de la cual heredarán todos los tipos de paquetes empleados en la aplicación. Un paquete es una estructura del tipo matriz en la que se van insertando datos de tipo entero, short, string, etc. ² Paquete ATM: cuelga de paquete, con funciones y campos especí…cos de la célula ATM. ² Paquete IP: cuelga de paquete, con funciones y campos especí…cos del datagrama IP. ² General: clase empleada para contener todas las constantes de la aplicación y todos los procedimientos últiles: conversión de datos, etc. ² TCP: representa a las entidades productoras o receptoras de paquetes TCP / IP. ² MonitorBu¤er: estas clases son empleadas en todas las entidades que envían o reciben datos. Representan los bu¤ers de entrada de datos y los enlaces entre unas entidades y otras. Los bu¤ers almacenan paquetes genéricos, de tal manera que pueden instanciarse para tratar tanto con datos IP como con datos ATM. La estructura de estos es una cola, es decir, un sistema FIFO. 168 CAPÍTULO 5. SIMULADOR DE REDES MPLS ² Fichero: utiliza la clase File de Java, añadiendo funciones especí…cas de la aplicación para leer y escribir …cheros de texto. Tales como leer línea, leer cadena, leer número,etc. ² Ventana: representa el contenido de la ventana de datos genéricos. ² VentanaLSR: representa el contenido de la ventana de datos concretos del nodo. ² Sim: es la clase principal que llama a los procedimientos de inicialización del resto de clases. ² Notepad: ventana de edición de los …cheros de con…guraciones. ² Gra…co: representa a la ventana de simulación de la red. Esta clase utiliza objetos grá…cos, que representan a los nodos y a sus enlaces : – DibujoNodo: tiene todos los elementos necesarios para representar a un nodo de la red y sus enlaces. ² NodoMPLS: es la clase más amplia, representa a un nodo de la red. Contiene las variables locales y los procedimientos necesarios para simular el comportamiento de un nodo. Dentro de ella, existen las siguientes clases: – VectorPDUAAL5: estructura de datos necesaria para almacenar las células ATM fragmentadas en el formato AAL5. – TablaRouting: representa a la tabla de routing del nodo. – LIB: representa a la tabla de Label Information Base del nodo, caso que sea un nodo frontera . – TablaSwitching: representa a la NHLFE. Next Hop Label Forwarding Entry del nodo interno. – FEC: representa a las Clases de Envío Equivalentes. – TipoEtiqueta: representa a las etiquetas que se asocian con los paquetes. 5.3. IMPLEMENTACIÓN 5.3.2 169 Implementación de los Procedimientos MODULO: nodoMPLS DESCRIPCIÓN: Estructura de Datos y procedimientos que representa un nodo de la red. PROCEDIMIENTOS: CLASE VectorPDUAAL5. CLASE ElementoRouting: registros de las tablas de routing. CLASE TablaRouting: ² borrarPosición : elimina el registro de la posición indicada ‘posicion’ y desplaza el resto de los registros una posición para llenar el hueco. ² aniadirEntrada : introduce un nuevo registro con parámetros: ‘ent1’ dirección de entrada, ‘ent2’ longitud del pre…jo, ‘ent3’ interface por donde debe salir al siguiente salto. ² resumenTabla : muestra en forma de tabla todos los campos de la tabla. ² obtenerInterfaceSal : devuelve el interface de salida que corresponde al siguiente salto en la posición ‘posicion’. ² obtenerLongitudPre : devuelve la longitud del pre…jo en la posición ‘posicion’. ² buscarDireccionDestino : devuelve la entrada de mayor coincidencia con la direccion ‘dirDestino’, devuelve -1 si no encuentra coincidencia. ² inicializa : carga la tabla de routing con los datos del …chero de con…guraciones. CLASE ElementoSwitching : registro de la tabla de NHLFE. CLASE TablaSwitching : tabla Next Hop Label Forwarding Entry, asocia etiquetas con interfaces de entrada y salida. 170 CAPÍTULO 5. SIMULADOR DE REDES MPLS ² resumen : muestra en un string todos los registros de la tabla. ² resumenTabla : devuelve una matriz de string con los datos de la tabla adptados para ser visualizados en una tabla. ² inicializa : carga datos en la tabla en función del …chero de con…guraciones. ² aniadirEntrada : introduce un nuevo registro en la tabla, tomando los datos de un registro de la tabla de LIB ‘entradaLib’. ² aniadirEntrada : introduce un nuevo registro en la tabla, tomando los datos de 8 cadenas de entrada representando :1 interface entrada, 2 num int entrada, 3 vpi entrada, 4 vci entrada, 5 interface salida, 6 num int salida, 7 vpi salida y 8 vci salida. ² borrarPosicion : elimina el registro en la posición ‘posicion’. ² obtenerInterfaceSal : busca la posición de la tabla cuyo interfaz de salida corresponda con ‘interfaz’. ² posicionEnTabla : busca la posición en la tabla cuyos vpi, vci e interface de entrada coincidan con ‘vpi’, ‘vci’, ‘interfaceEnt’. ² obtenerInterfaceSal : busca el inteface de salida en la tabla cuyos vpi, vci e interface de entrada coincidan con ‘vpi’, ‘vci’, ‘interfaceEnt’. CLASE CabeceraLDP. CLASE FEC. CLASE TipoEtiqueta. ² setVacia : pone los valores por defecto de una etiqueta. ² esVacia : comprueba si la etiqueta no se ha inicializado con ningun valor. ² genera : genera el par VPI VCI en función de los valores disponibles en el nodo. ² generaVPI : genera el VPI en función de los valores disponibles en el nodo. 5.3. IMPLEMENTACIÓN 171 ² generaVCI : genera el VCI en función de los valores disponibles en el nodo. ² TipoEtiqueta : constructor de la CLASE. CLASE ElementoLib. CLASE Lib : Tabla de LIB. ² borrarPosición : borra un registro en la posición ‘posicion’. ² resumenTabla : muestra en forma de matriz todos los campos de la tabla para adaptarse a una tabla. ² buscarEntrada : devuelve la posición de la entrada cuyos valores vpi, vci e interface de entrada coinciden con los parámetros dados, si no encuentra coincidencia devuelve -1. ² nuevaEntrada : inserta una nueva entrada con datos : ‘numInterfaceEn’, ‘numInterfaceSal’, ‘longPre…jo’, dir_destino. ² aniadirEntrada : crea un nuevo registro convirtiendo las cadenas de entrada al formato de la LIB. ² aniadirEntrada : crea un nuevo registro con los datos dados: numInterfaceEn, numInterfaceSal, etiqueta, fec. ² buscarDireccionDestino: busca el fec que mejor se asocie a la dirección de destino dada. Retorna la posición en la LIB de ese FEC. ² buscarDireccionDestino: busca el fec que mejor se asocie a la dirección de destino dada en una interface de entrada dado. retorna la posición en la LIB de ese FEC. ² inicializa : carga los datos de la tabla LIB a partir del …chero de con…guraciones. CLASE NodoMPLS ² enlazar : crea un enlace de salida ATM desde este nodo hasta el nodo ‘nodoDestino’. 172 CAPÍTULO 5. SIMULADOR DE REDES MPLS ² obtenerInterfLibreATMOut : devuelve el primer interface ATM de salida que no se encuentre ocupado. ² obtenerInterfLibreATMIn : devuelve el primer interface ATM de entrada que no se encuentre ocupado. ² obtenerNodoSal : devuelve el número de nodo de salida que corresponde con el interface ‘interf’. ² obtenerNodoEnt : devuelve el número de nodo de entrada que corresponde con el interface ‘interf’. ² obtenerNodoSalIP : devuelve el número de nodo de salida que corresponde con el interface ‘interf’IP. ² obtenerNodoEntIP : devuelve el número de nodo de entrada que corresponde con el interface ‘interf’IP. ² obtenerEnlaceEntIP : devuelve la posición del bu¤er IP cuyo interface corresponda con ‘interf’. ² obtenerEnlaceSalIP : devuelve la posición del bu¤er ATM cuyo interface corresponda con ‘interfaceSal’. ² obtenerEnlaceEnt : devuelve la posición en el bu¤er ATM cuyo interface corresponda con ‘interfaceEnt’. ² obtenerEnlaceSalIP : devuelve la posición del bu¤er IP cuyo interface corresponda con ‘intefaceSal’. ² procesarPaquete : comprueba el destino de un paquete ATM en función de su localización en la tabla NHLFE y LIB. ² procesarPaqueteAAL5 : comprueba el destino de un paquete AAL5 en función de su localización en la tabla NHLFE y LIB. Reensambla Fragmentos AAL5 en el caso de que el paquete sea de este tipo. ² procesarIP : recoge un paqueteip ‘paqIpIn’ y realiza todas las operaciones necesarias para su envío al siguiente nodo. ² temporizador1_ActionPerformed: bucle básico de chequeo de entradas del switch. ² pedirEtiqueta : pide una etiqueta y la actualiza en la LIB, devuelve la nueva posición en la LIB. 5.3. IMPLEMENTACIÓN 173 ² encontrarEtiqueta : busca la etiqueta que pertenece a la CLASE de ‘dirIP’ que llega por ‘interfaceOrigen’, busca una posición en la LIB en el caso de no encontrar la etiqueta, realiza procesos de búsqueda. ² encontrarNumNodoSalida : devuelve el número del nodo asociado con este interface de salida. ² encontrarNumNodoEntrada : devuelve el número del nodo asociado con este interface de salida. ² encontrarEnlaceDestino : devuelve el número de enlace asociado con el interface ‘interf’. ² encontrarEnlaceOrigen : devuelve el número de enlace asociado con el interface ‘interf’. ² recoger_paquete_ATM : recoge un paquete ATM del bu¤er de entrada ‘num-bu¤er’. ² recoger_paquete_IP : recoge un paquete IP del bu¤er de entrada ‘numbu¤er’. ² borrarEnlaces : elimina el enlace ‘posición’ de tipo ‘tipo’ con otro nodo. ² resumenEnlaceTabla : crea una matriz de dos dimensiones alojando la información de los enlaces del nodo que sean de tipo ‘tipo’ y indicando si son de salida o entrada en función de ‘esDeSalida’, para ser introducidos en una tabla. ² crearEnlaceEntradaATM : asocia este nodo con el bu¤er de salida de otro nodo. ² crearEnlaceSalidaATM : asocia este nodo con el bu¤er de entrada de otro nodo. ² crearEnlaceEntradaIp: asocia este nodo con el bu¤er de salida de otro nodo. ² crearEnlaceSalidaIp : asocia este nodo con el bu¤er de entrada de otro nodo. ² NodoMPLS : constructor de la CLASE NodoMPLS a partir de una dirección ip ‘ip’ como indenti…cador. 174 CAPÍTULO 5. SIMULADOR DE REDES MPLS ² NodoMPLS : constructor de la CLASE NodoMPLS a partir de una dirección ip ‘ip’ como indenti…cador y los bu¤ers de entrada y salida ATM. ² NodoMPLS : constructor de la CLASE NodoMPLS a partir de una dirección ip ‘ip’ como indenti…cador y los bu¤ers de entrada y salida ATM e IP inicialización para los nodos frontera. ² asociaIpconFEC : devuelve un nuevo fec con dirección IP asociada ‘dirIP’. ² inicializa : inicializa las tablas y los temporizadores del nodo. ² obtenerNuevopId : comprueba que el identi…cador IP no sobrepasa el máximo. ² enviarMulticast : envía un paquete IP al puerto multicast. ² enviarMulticast : recibe un paquete IP del puerto multicast. ² enviar_paquete_IP : crea un paquete ip de salida y lo envía en función de los datos : numInterfaceSal, dir_origen, dir_destino,datos, tamanio, ttl. ² enviar_paquete_IP : crea un paquete ip de salida y lo envía en células ATM en función de los datos: numInterfaceSal, dir_origen, dir_destino, datos, tamanio, ttl si es necesario, realiza la segmentación. ² reensamblarPaqueteIp : reensambla los datos que llegan de paquetes AAL5 a datagramas IP. ² reensamblarPDUAAL5 : reensambla los datos que llegan de paquetes ATM a paquetes AAL5. ² segmentarPDUAAL5 : segmenta los datos de un paquete IP en la capa AAL5. ² segmentarPDUAAL5 : segmenta los datos de una pdu AAL5 en células ATM. ² segmentarPDUAAL5 : segmenta los datos de un paquete IP en células ATM. ² enviar_paquete_ATM: crea una célula ATM y la envía a ‘destinatario’ a partir de los datos de la etiqueta ‘etiqueta’. 5.3. IMPLEMENTACIÓN 175 ² enviar_paquete_ATM: crea una nueva célula ATM copia de ‘paquete’ y la envía a ‘destinatario’. ² detener : para los procesos del nodo. ² arrancar : reanuda los procesos del nodo. ² mostrarEvento : muestra por las ventanas de eventos en la ventana principal el texto ‘cadena’. ² buscarEspacio : encuentra el espacio a partir de ‘pos’ en el texto ‘cadena’. ² mostrarTexto : muestra por las ventanas de eventos en la ventana principal el texto ‘cadena’, también escribe los datos en un …chero de log. ² run : ejecución del hilo del Nodo. MODULO : sim DESCRIPCIÓN : métodos de inicialización y ejecución de la aplicación. PROCEDIMIENTOS : ² iniciaEnlaces : crea los enlaces entre los nodos a partir del …chero de con…guraciones. ² iniciaPosicionesIp : crea las entidades TCP IP y las coloca en el gráf en función de los datos del …chero de con…guraciones. ² iniciaPosiciones : inicia las posiciones de los nodos en el grá…co de simul en función de los datos del …chero de con…guraciones. ² inicializa : inicialización de todas las estructuras de datos y variables. ² main : ejecución del bucle principal. MODULO : TCP DESCRIPCIÓN : Estructura de Datos y procedimientos que representa una entidad tcp ip. 176 CAPÍTULO 5. SIMULADOR DE REDES MPLS PROCEDIMIENTOS : ² TCP : constructor de la entidad TCP con bu¤ers de entrada y salida, dirección IP y socket de origen. ² detener : detiene los procesos de la entidad. ² arrancar : reanuda los procesos de la entidad. ² enviarIp : crea un nuevo datagrama IP a partir de los datos ‘datos’ y lo envía por el bu¤er de salida. ² recoger_paqueteIp : chequea el bu¤er de entrada y recoge un paquete Ip. ² temporizador1_ActionPerformed: bucle de emisión - recepción. ² run : ejecución del hilo de la entidad TCP. MODULO : paquete DESCRIPCIÓN : Estructura de Datos que representa un paquete de datos básico. PROCEDIMIENTOS : ² Paquete : inicializa el paquete con un campo de datos = ‘datos’. ² Paquete : inicializa el paquete con un campo de datos vacio. ² TamanioDatos : retorna el tamaño del campo de datos del paquete. ² cogeString : devuelve los datos del paquete en formato String. ² agregaBytes : añade a los datos un array de bytes ‘cadena’. ² agregaBytes : añade a los datos un array de bytes ‘cadena’ de tamaño ‘tamanio’. ² CopiaBytes : pone el valor de los datos igual que ‘cadena’. ² CopiaBytes : pone el valor de los datos igual que ‘cadena’, con un tamaño ‘tamanio’. 5.3. IMPLEMENTACIÓN 177 ² AgregaString : añade un String ‘cadena’ a los datos del paquete. ² AgregaString : añade un String ‘cadena’ a los datos del paquete con tamaño ‘tamanio’. ² AgregaShort : añade un Short ‘numero’ a los datos del paquete. ² AgregaInt : añade un Int ‘numero’ a los datos del paquete. ² AgregaShort : añade un Short ‘numero’ a los datos del paquete de tamaño ‘tamanio’. ² AgregaInt : añade un Int ‘numero’ a los datos del paquete de tamaño ‘tamanio’. MODULO : PaqueteIp DESCRIPCIÓN : Estructura de Datos y procedimientos que representa un datagrama IP. PROCEDIMIENTOS : ² set_dir_origen : pone la dirección origen del paquete. ² set_dir_destino : pone la dirección destino del paquete. ² get_dir_origen : obtiene la dirección origen del paquete. ² get_dir_destino : obtiene la dirección destino del paquete. ² PaqueteIP : constructor del paquete poniendo en el campo data ‘datos’. ² PaqueteIP : constructor del paquete IP. ² cogeDatos : devuelve el campo de datos del paquete. ² ponDatos : pone el campo de datos con el valor ‘datos’. ² TamanioDatos : devuelve el tamaño del campo de datos del paquete. ² AgregaBytes ,Short ,Int ... : añade diversos tipos de datos al campo de datos del paquete. 178 CAPÍTULO 5. SIMULADOR DE REDES MPLS MODULO : PDUAAL5 DESCRIPCIÓN : estructura de datos de la PDU AAL5. PROCEDIMIENTOS : ² copiarIP : vuelca los datos de un paquete IP en el campo de datos. ² toIp : crea un paquete IP a partir del campo de datos. MODULO : ventana DESCRIPCIÓN : ventana principal, de datos genéricos de la red. MODULO : VentanaLSR DESCRIPCIÓN : Ventana de edición de datos del nodo LSR. PROCEDIMIENTOS : ² main : llamada principal a la ventana. ² llenarTabla : pone los datos en la matriz ‘cadenas’ dentro de una tabla ‘tabla’. ² llenarFila : pone en la tabla ‘tabla, …la ‘numFila’ los elementos ‘numElementos’ de la matriz ‘cadenas’. ² prepararTabla : adapta el tipo y la forma de la tabla a la ventana. ² mostrarLSR : llama a mostrar la ventana para el identi…cador de nodo ‘numNodo’. ² mensaje : muestra un mensaje en la ventana de estado muestra un error en la ventana de estado. ² BotonNHLFE_actionPerformed : cambios en los datos de la tabla NHLFE. 5.3. IMPLEMENTACIÓN 179 ² BotonLIB_actionPerformed : cambios en los datos de la tabla LIB. ² BotonTRouting_actionPerformed : cambios en los datos de la tabla de routing. ² BotonEnlaces_actionPerformed : cambios en los datos de la tabla de routing. ² BorrarNHLFE_actionPerformed : borra un registro en la tabla NHLFE. ² BorrarLIB_actionPerformed : borra un registro en la tabla LIB. ² BorrarRouting_actionPerformed : borra un registro en la tabla de routing. ² BorrarEnlaces_actionPerformed : borra un enlace en la tabla de routing. MODULO : gra…co DESCRIPCIÓN : ventana de simulación de la red. MODULO : general DESCRIPCIÓN : Constantes y utilidades empleadas en todas las CLASESs la red. PROCEDIMIENTOS : ² esNumero : indica si el texto ‘cadena’ es un número entero. ² esNumero : indica si el caracter ‘caracter’ es un número entero. ² cogeString : muestra en forma de string los datos ‘data’. ² cogeString : muestra en forma de string los datos ‘data’, a partir de la posición ‘pos’. ² ObtenerShort : extrae en la posición ‘pos’ de ‘datos’ un número Short. ² ObtenerInt : extrae en la posición ‘pos’ de ‘datos’ un número Int. ² compararDirecciones : comprueba si dos direcciones son iguales. 180 CAPÍTULO 5. SIMULADOR DE REDES MPLS ² compararDirecciones : comprueba si dos direcciones son iguales hasta la longitud ‘long’. ² StringToIp : convierte el texto ‘cadena’ a una dirección IP. ² IpToString : convierte una dirección IP a formato texto. ² StringToInt : extrae los enteros de un texto ‘cadena’ separados por espacios a un array de enteros. ² divideString : vuelca en un array de cadenas las subcadenas dentro de ‘cadena’ separadas por espacios ² ObtenerBytes : obtiene un array de bytes a partir de la posición ‘pos’ de un array de bytes ‘cadena’. ² toBytes: convierte un Short a array de bytes. ² toShort : convierte un array de bytes a Short. ² toBytes: convierte un Int a array de bytes. ² toInt : convierte un array de bytes a Int. ² toBinary: convierte un número a una cadena representando su valor en binario. ² potencia : eleva ‘número’ a la potencia ‘exponente’. ² BitSetToInt : convierte un BitSet a Entero. ² charToBitSet : convierte un caracter a BitSet. MODULO : …chero DESCRIPCIÓN : estructura de datos del …chero de texto. PROCEDIMIENTOS : ² …chero : abre un …chero de nombre ‘nombre’. ² ocupar : cierre del candado. 5.4. EJEMPLOS DE FUNCIONAMIENTO 181 ² desocupar : apertura del candado. ² leer : lee un bloque de 256 bytes, lo vuelca en ‘b’. ² leer : lee un bloque de tamaño ‘tamanioBloque’, lo vuelca en ‘b’. ² siguiente bloque : lee el siguente bloque. ² poslinea : retorna la posicion en la que comienza la linea “numlinea”. ² BuscaLinea : lee hasta el …nal de la linea a partir de POS. ² leeLinea : lee hasta el …nal de la linea a partir de POS. 5.4 5.4.1 Ejemplos de Funcionamiento Ejemplo 1. Entrada de datos IP sin clasi…car. Este ejemplo muestra cómo se realiza el procedimiento de clasi…cación de un ‡ujo de datos IP, y, posteriormente se procede a su etiquetado y envío : Para ello, contamos con 3 nodos LSR, los cuales actuarán como: ² Nodo 1 : de entrada. Actúa recibiendo los paquetes IP. ² Nodo 2 : interno. Al ser interno, sólo deberá reconocer las etiquetas y conmutar. ² Nodo 3 : de salida. Deberá extraer la etiqueta y convertir las células ATM a paquetes IP. También tendremos que contar con dos entidades TCP / IP una que estará conectada al nodo 1, funcionando como emisor y otra al nodo 3, funcionando como receptor. Archivo de Con…guración. POSICIONES; 10 100; Posición del Nodo 1 182 CAPÍTULO 5. SIMULADOR DE REDES MPLS 90 30; Posición del Nodo 2 190 100; Posición del Nodo 3 FIN; POSICIONES IP; 10 30 0.0.0.1 0.0.0.5; Posición del Nodo 1 - Dir. IP Origen - Dir.IP Destino 190 30 0.0.0.5 0.0.0.1; Posición del Nodo 2 - Dir. IP Origen - Dir.IP Destino FIN; ENLACES; // ”conexiones entre los nodos” : formato [nodo origen] [interface origen] [nodo destino] [interface destino]; -1 0 1 1; 2 1 1 2; 2 3 3 2; 1 2 2 1; 3 3 -2 0; FIN; LIB 123.0.0.3;Label Information Base del Nodo 3 1; ATM; Tipo Etiqueta de Entrada 0; Espacio Etiq de Entrada 20; VPI de Entrada 0; VCI de Entrada 4; IP; Tipo Etiqueta de Salida 0; Espacio Etiq de Salida 0; VPI de Salida 0; VCI de Salida 5.4. EJEMPLOS DE FUNCIONAMIENTO 0.0.0.3; Dirección del LSR 0; Tipo de FEC 0; Dirección ‡ia FEC 4; Longitud pre…jo FEC 0.0.0.5; Dirección del FEC 0; Reservado 1 0; Reservado 2 ATM33; Nombre Interfaz Entrada IP33; Nombre Interfaz Salida 2; Número Interfaz Entrada 3; Número Interfaz Salida FIN; TABLA ROUTING 123.0.0.1; 0.0.0.0 4 2; FIN; TABLA ROUTING 123.0.0.2; 1.0.0.0 4 3; 0.0.0.0 4 3; FIN; TABLA ROUTING 123.0.0.3; 1.0.0.0 4 3; 0.0.0.0 4 -3; 0.0.0.0 0 3; FIN; 183 184 CAPÍTULO 5. SIMULADOR DE REDES MPLS Con estos datos cargados, el simulador muestra los siguientes resultados: ENLACES creado enlace IP del nodo externo 1, interface 0, al nodo 1, interface 1 creado enlace ATM del nodo 2, interface 1, al nodo 1, interface 2 creado enlace ATM del nodo 2, interface 3, al nodo 3, interface 2 creado enlace ATM del nodo 3, interface 2, al nodo 2, interface 3 creado enlace ATM del nodo 1, interface 2, al nodo 2, interface 1 creado enlace IP del nodo 3, interface 3, al nodo externo 2, interface 0 LABEL INFORMATION BASE 123.0.0.3 etiqueta entrada tipo : 1 espacio etiquetas : 0 vpi : 20 vci : 0 etiqueta salida tipo : 4 espacio etiquetas : 0 vpi : 0 vci : 0 FEC tipo : 0 familia direccion : 0 longitud pre…jo : 4 5.4. EJEMPLOS DE FUNCIONAMIENTO 185 Figura 5.5: Disposición de la red del Ejemplo 1. direccion : 0.0.0.5 nombre inter. entr: ATM32 nombre inter. sal : IP33 num inter. entr : 2 num inter. sal : 3 Y la disposición en la red queda como lo muestra la Figura 5.5 de la Página 185. Donde los elementos en azul representan a los nodos de la red, y los elementos en rojo representan a las entidades TCP/IP. Ejecución. Al pulsar el botón de comienzo, la ventana de simulación va mostrando la siguiente información, que también es grabada en el archivo de salida “logM- 186 CAPÍTULO 5. SIMULADOR DE REDES MPLS PLS.cfg”. ² la entidad TCP 1 comenzará a enviar datagramas al nodo 1. 0.0.0.1 poniendo paquete IP 0 ² El nodo 1, al no reconocer ningún FEC asociado, deberá preguntar al nodo 2. -recogido paquete IP . dir. 0.0.0.1: 0.0.0.5 -ERROR: no se ha podido encontrar un FEC con direccion 0.0.0.5 e interf entrada -1 -posicion 0 con direccion 0.0.0.5 corresponde al sig salto 2 -Pidiendo etiqueta al nodo 2 para la dir : 0.0.0.5 ² El nodo 2 a su vez preguntará al nodo 3. -Recibida solicitud de etiqueta desde el nodo 1 para la dir : 0.0.0.5 -Etiqueta no encontrada para la dir : 0.0.0.5 -posicion 0 con direccion 0.0.0.0 corresponde al sig salto 3 -Pidiendo etiqueta al nodo 3 para la dir : 0.0.0.5 ² El nodo 3 al recibir la petición encuentra en su LIB un FEC que esté asociado con la dirección de destino.Crea una etiqueta de entrada para ese FEC y comunica el enlace al nodo 2, la nueva etiqueta unirá ahora a los nodos 2 y 3 en el nuevo camino etiquetado. -Recibida solicitud de etiqueta desde el nodo 2 para la dir : 0.0.0.5 -FEC en la posicion 0 con direccion 0.0.0.0 se envia a IP33 -Etiqueta encontrada para la dir : 0.0.0.5 5.4. EJEMPLOS DE FUNCIONAMIENTO 187 ² El nodo 2, al recibir la nueva etiqueta, introduce una nueva entrada en la tabla NHLFE con la etiqueta que une 2 y 3, y creando una etiqueta que una 1 y 2, que comunica al nodo 1. -introducida nueva etiqueta no 0 , vpi :20 vci : 0 -nueva entrada añadida en la NHLFE ² El nodo 1, al recibir la nueva etiqueta, ya puede crear un nuevo FEC asociando la dirección de entrada del datagrama recibido con la etiqueta que le une al nodo 2 en el camino etiquetado. -introducida nueva etiqueta no 0, vpi :20 vci : 0 ² A partir de este momento,deja de realizarse routing en la red MPLS. Todos los paquetes que le lleguen al nodo 1 de la entidad TCP/IP 1 con dirección destino 0.0.0.5 serán segmentados, etiquetados con 20:0 y enviados diréctamente al nodo 2. -segmentando PDU AAL5, cabecera -paquete ATM 20:0 enviado por el enlace 0 a 2 -segmentando PDU AAL5 , parte 1 de 2 ; completada pos 48 de 108 -paquete ATM 20:0 enviado por el enlace 0 a 2 -segmentando PDU AAL5 , parte 2 de 2 ; completada pos 96 de 108 -paquete ATM 20:0 enviado por el enlace 0 a 2 -segmentando PDU AAL5, ultima parte. ² El nodo 2 conmutará directamente al nodo 3. -...recogiendo paquete ATM 20:0 en enlace 1 con 1 -recibida PDU AAL5 0 -...recogiendo paquete ATM 20:0 en enlace 1 con 1 188 CAPÍTULO 5. SIMULADOR DE REDES MPLS -recogiendo fragmento20 0 num Fragm Recibidos: 1 de 2 -...recogiendo paquete ATM 20:0 en enlace 1 con 1 -recogiendo fragmento20 0 num Fragm Recibidos: 2 de 2 -...recogiendo paquete ATM 20:0 en enlace 1 con 1 -recogiendo fragmento20 0-padding 12 -buscando interf de salida para interf de entrada 1 -reenviando PDU AAL5 a interface 3 long 108 -segmentando PDU AAL5 ,20:0 cabecera -paquete ATM 20:0 reenviado por el enlace 3 -segmentando PDU AAL5 ,20:0 parte 1 de 2 ; completada pos 48 de 108 -paquete ATM 20:0 reenviado por el enlace 3 -segmentando PDU AAL5 ,20:0 parte 2 de 2 ; completada pos 96 de 108 -paquete ATM 20:0 reenviado por el enlace 3 -paquete ATM 20:0 reenviado por el enlace 3 -Segmentando PDU AAL5, ultima parte. ² El nodo 3 comprobará que existe una asociación con los paquetes etiquetados y un FEC, de modo que reensamblará el paquete y lo enviará por el interface de salida que indica el FEC. - ...recogiendo paquete ATM 20:0 en enlace 0 con 2-recibida PDU AAL5 0 - ...recogiendo paquete ATM 20:0 en enlace 0 con 2 -recogiendo fragmento20 0-num Fragm Recibidos: 1 de 2 - ...recogiendo paquete ATM 20:0 en enlace 0 con 2 -recogiendo fragmento20 0-num Fragm Recibidos: 2 de 2 - ...recogiendo paquete ATM 20:0 en enlace 0 con 2 -recogiendo fragmento20 0-padding 12 5.4. EJEMPLOS DE FUNCIONAMIENTO 189 -buscando interf de salida para interf de entrada 2 -Buscando en la LIB -paquete IP 0.0.0.1 : 0.0.0.5 enviado por el enlace 3 5.4.2 Ejemplo 2. Dos ‡ujos de datos en la red. Este ejemplo es similar al ejemplo 1. Hemos añadido dos entidades IP emisoras y dos entidades receptoras. De esta manera existirán datos IP con dos destinos diferentes, los cuales deberán ser clasi…cados por el último nodo. Además se ha añadido un nodo 4, que se encuentra entre el nodo 2 y el 3. Archivo de Con…guración. POSICIONES; 10 100; pos del nodo 1 90 30; pos del nodo 2 230 100; pos del nodo 3 170 70; FIN; POSICIONES IP; 10 140 0.0.0.2 120.120.10.10; 235 30 0.0.0.5 0.0.0.1; 10 30 0.0.0.1 0.0.0.5; 235 140 0.0.0.2 0.0.0.5; FIN; ENLACES; // “conexiones entre los nodos” : formato [nodo origen] [interface origen] [nodo destino] [interface destino]; 190 CAPÍTULO 5. SIMULADOR DE REDES MPLS -3 0 1 6; 2 1 1 2; -1 0 1 1; 2 4 4 2; 4 2 2 4; 4 3 3 4; 1 2 2 1; 3 3 -2 0; 3 6 -4 0; FIN; LIB 123.0.0.3; 1;(ATM) Etiqueta_entrada.tipo ( general , ATM , FR, IP) 0; Etiqueta_entrada.espacio_etiquetas 20; Etiqueta_entrada.vpi 0; Etiqueta_entrada.vci 4;(IP) Etiqueta_salida.tipo ( general , ATM , FR) 0; Etiqueta_salida.espacio_etiquetas 0; Etiqueta_salida.vpi 0; Etiqueta_salida.vci 99.99.99.99; direccion_lsr 0;(DIR) fec.tipo = dir,wildcard,crlsp 0;(IPV4) fec.familia_direccion = IPV4 , IPV6 ... 4; fec.longitud_pre…jo 0.0.0.5; fec.direccion 5.4. EJEMPLOS DE FUNCIONAMIENTO 0; reservado1 0; reservado2 ATM32; nombre_interface_entrada IP33; nombre_interface_salida 4; num_interface_entrada 3; num_interface_salida 1;(ATM) Etiqueta_entrada.tipo ( general , ATM , FR, IP) 0; Etiqueta_entrada.espacio_etiquetas 20; Etiqueta_entrada.vpi 4; Etiqueta_entrada.vci 4;(IP) Etiqueta_salida.tipo ( general , ATM , FR) 0; Etiqueta_salida.espacio_etiquetas 0; Etiqueta_salida.vpi 0; Etiqueta_salida.vci 99.99.99.99; direccion_lsr 0;(DIR) fec.tipo = dir,wildcard,crlsp 0;(IPV4) fec.familia_direccion = IPV4 , IPV6 ... 16; fec.longitud_pre…jo 120.120.0.0; fec.direccion 0; reservado1 0; reservado2 ATM32; nombre_interface_entrada IP33; nombre_interface_salida 4; num_interface_entrada 191 192 CAPÍTULO 5. SIMULADOR DE REDES MPLS 6; num_interface_salida FIN; TABLA ROUTING 123.0.0.1; 120.120.0.0 16 2; 0.0.0.5 4 2; FIN; TABLA ROUTING 123.0.0.2; 120.120.0.0 16 4; 0.0.0.5 4 4; FIN; TABLA ROUTING 123.0.0.4; 120.120.0.0 16 3; 0.0.0.5 4 3; FIN; TABLA ROUTING 123.0.0.3; 1.0.0.0 4 3; 0.0.0.0 4 -3; 0.0.0.0 0 3; FIN; Con estos datos cargados, el simulador muestra los siguientes resultados: ENLACES creado enlace IP del nodo externo 3, interface 0, al nodo 1, interface 6 creado enlace ATM del nodo 2, interface 1, al nodo 1, interface 2 193 5.4. EJEMPLOS DE FUNCIONAMIENTO creado enlace IP del nodo externo 1, interface 0, al nodo 1, interface 1 creado enlace ATM del nodo 2, interface 4, al nodo 4, interface 2 creado enlace ATM del nodo 4, interface 2, al nodo 2, interface 4 creado enlace ATM del nodo 4, interface 3, al nodo 3, interface 4 creado enlace ATM del nodo 1, interface 2, al nodo 2, interface 1 creado enlace IP del nodo 3, interface 3, al nodo externo 2, interface 0 creado enlace IP del nodo 3, interface 6, al nodo externo 4, interface 0 LABEL INFORMATION BASE 123.0.0.3 etiqueta entrada tipo : 1 espacio etiquetas : 0 vpi : 20 vci : 0 etiqueta salida tipo : 4 espacio etiquetas : 0 vpi : 0 vci : 0 FEC tipo : 0 familia direccion : 0 longitud pre…jo : 4 direccion : 0.0.0.5 nombre inter. entr: ATM32 194 CAPÍTULO 5. SIMULADOR DE REDES MPLS nombre inter. sal : IP33 num inter. entr : 4 num inter. sal : 3 etiqueta entrada tipo : 1 espacio etiquetas : 0 vpi : 20 vci : 4 etiqueta salida tipo : 4 espacio etiquetas : 0 vpi : 0 vci : 0 FEC tipo : 0 familia direccion : 0 longitud pre…jo : 16 direccion : 120.120.0.0 nombre inter. entr: ATM32 nombre inter. sal : IP33 num inter. entr : 4 num inter. sal : 6 Con estos datos la ventana de simulación se ve como en la Figura 5.6 de la Página 195. 5.4. EJEMPLOS DE FUNCIONAMIENTO 195 Figura 5.6: Disposición de la red del Ejemplo 2. Ejecución. La principal diferencia respecto al ejemplo 1, es que el nodo 1 ahora recibe datos IP desde dos entidades IP diferentes. De modo que deberá pedir dos etiquetas al siguiente salto, que es el nodo 2 en los dos casos. Igualmente 2 se lo preguntará al nodo 4, y el nodo 4 al nodo 3. Que chequeará su LIB y devolverá las etiquetas pedidas, al corresponder a dos entidades IP de salida diferentes, cada ‡ujo de datos se dirigirá a diferentes entidades IP. ² Recepción de un ‡ujo de datos en el nodo 3 etiquetado 20:4 - ...recogiendo paquete ATM 20:4 en enlace 0 con 4 -buscando interf de salida para interf de entrada 4 -Pos en la LIB 0 -paquete IP 0.0.0.1 : 0.0.0.5 enviado por el enlace 3 ² Recepción de un ‡ujo de datos en el nodo 3 etiquetado 20:0 196 CAPÍTULO 5. SIMULADOR DE REDES MPLS - ...recogiendo paquete ATM 20:4 en enlace 0 con 4 -buscando interf de salida para interf de entrada 4 -Pos en la LIB 1 -paquete IP 0.0.0.2 : 120.120.10.10 enviado por el enlace 6 5.4.3 Ejemplo 3. Dos tipos de datagramas asociados a un ‡ujo de datos En este ejemplo se comprueba cómo dos datagramas con direcciones destino diferentes, pero con coincidencias en sus primeros 16 bits pueden asociarse a un ‡ujo de datos. Archivo de Con…guración. POSICIONES; 10 100; pos del nodo 1 90 30; pos del nodo 2 190 100; pos del nodo 3 FIN; POSICIONES IP; 10 140 0.0.0.2 120.125.100.10; 190 30 0.0.0.5 120.125.80.1; 10 30 0.0.0.5 120.125.80.1; FIN; ENLACES; // ”conexiones entre los nodos” : formato [nodo origen] [interface origen] [nodo destino] [interface destino]; -3 0 1 6; 5.4. EJEMPLOS DE FUNCIONAMIENTO 2 1 1 2; -1 0 1 1; 2 3 3 2; 3 2 2 3; 1 2 2 1; 3 3 -2 0; FIN; LIB 123.0.0.1; 4; Etiqueta_entrada.tipo ( general , ATM , FR, IP) 0; Etiqueta_entrada.espacio_etiquetas 0; Etiqueta_entrada.vpi 0; Etiqueta_entrada.vci 1; Etiqueta_salida.tipo ( general , ATM , FR) 0; Etiqueta_salida.espacio_etiquetas 20; Etiqueta_salida.vpi 0; Etiqueta_salida.vci 123.0.0.1; direccion_lsr 0;(DIR) fec.tipo = dir,wildcard,crlsp 0;(IPV4) fec.familia_direccion = IPV4 , IPV6 ... 16; fec.longitud_pre…jo 120.125.0.0; fec.direccion 0; reservado1 0; reservado2 X; nombre_interface_entrada 197 198 CAPÍTULO 5. SIMULADOR DE REDES MPLS IP11; nombre_interface_salida 1; num_interface_entrada 2; num_interface_salida FIN; LIB 123.0.0.3; 1;(ATM) Etiqueta_entrada.tipo ( general , ATM , FR, IP) 0; Etiqueta_entrada.espacio_etiquetas 20; Etiqueta_entrada.vpi 1; Etiqueta_entrada.vci 4;(IP) Etiqueta_salida.tipo ( general , ATM , FR) 0; Etiqueta_salida.espacio_etiquetas 0; Etiqueta_salida.vpi 0; Etiqueta_salida.vci 123.0.0.3; direccion_lsr 0;(DIR) fec.tipo = dir,wildcard,crlsp 0;(IPV4) fec.familia_direccion = IPV4 , IPV6 ... 16; fec.longitud_pre…jo 120.125.0.0; fec.direccion 0; reservado1 0; reservado2 ATM32; nombre_interface_entrada IP33; nombre_interface_salida 2; num_interface_entrada 3; num_interface_salida 199 5.4. EJEMPLOS DE FUNCIONAMIENTO FIN; TABLA SWITCHING 123.0.0.2; ATM12; interface_entrada ATM23; interface_salida 20; vpi_entrada 20; vpi_salida 0; vci_entrada 1; vci_salida 1; num_interface_entrada 3; num_interface_salida FIN; Resultados al cargar los datos: ENLACES creado enlace IP del nodo externo 3, interface 0, al nodo 1, interface 6 creado enlace ATM del nodo 2, interface 1, al nodo 1, interface 2 creado enlace IP del nodo externo 1, interface 0, al nodo 1, interface 1 creado enlace ATM del nodo 2, interface 3, al nodo 3, interface 2 creado enlace ATM del nodo 3, interface 2, al nodo 2, interface 3 creado enlace ATM del nodo 1, interface 2, al nodo 2, interface 1 creado enlace IP del nodo 3, interface 3, al nodo externo 2, interface 0 LABEL INFORMATION BASE 123.0.0.1 etiqueta entrada tipo : 4 espacio etiquetas : 0 200 CAPÍTULO 5. SIMULADOR DE REDES MPLS vpi : 0 vci : 0 etiqueta salida tipo : 1 espacio etiquetas : 0 vpi : 20 vci : 0 FEC tipo : 0 familia direccion : 0 longitud pre…jo : 16 direccion : 120.125.0.0 nombre inter. entr: X nombre inter. sal : IP11 num inter. entr : 1 num inter. sal : 2 TABLA DE NHLFE 123.0.0.2 posicion 0 interface entrada : ATM12 interface salida : ATM23 vpi entrada : 20 vpi salida : 20 vci entrada : 0 vci salida : 1 5.4. EJEMPLOS DE FUNCIONAMIENTO 201 num interf salida : 1 num interf entrada: 3 LABEL INFORMATION BASE 123.0.0.3 etiqueta entrada tipo : 1 espacio etiquetas : 0 vpi : 20 vci : 1 etiqueta salida tipo : 4 espacio etiquetas : 0 vpi : 0 vci : 0 FEC tipo : 0 familia direccion : 0 longitud pre…jo : 16 direccion : 120.125.0.0 nombre inter. entr: ATM32 nombre inter. sal : IP33 num inter. entr : 2 num inter. sal : 3 Con estos datos la ventana de simulación queda como lo muestra la Figura 5.7 de la Página 202. 202 CAPÍTULO 5. SIMULADOR DE REDES MPLS Figura 5.7: Disposición de la red del Ejemplo 3. Estos son los resultados que se pueden apreciar al cargar los datos: ENLACES creado enlace IP del nodo externo 3, interface 0, al nodo 1,interface 6 creado enlace ATM del nodo 2, interface 1, al nodo 1, interface 2 creado enlace IP del nodo externo 1, interface 0, al nodo 1, interface 1 creado enlace ATM del nodo 2, interface 3, al nodo 3, interface 2 creado enlace ATM del nodo 3, interface 2, al nodo 2, interface 3 creado enlace ATM del nodo 1, interface 2, al nodo 2, interface 1 creado enlace IP del nodo 3, interface 3, al nodo externo 2, interface 0 LABEL INFORMATION BASE 123.0.0.1 ———————– 5.4. EJEMPLOS DE FUNCIONAMIENTO etiqueta entrada tipo : 4 espacio etiquetas : 0 vpi : 0 vci : 0 etiqueta salida tipo : 1 espacio etiquetas : 0 vpi : 20 vci : 0 FEC tipo : 0 familia direccion : 0 longitud pre…jo : 16 direccion : 120.125.0.0 nombre inter. entr: X nombre inter. sal : IP11 num inter. entr : 1 num inter. sal : 2 TABLA DE NHLFE 123.0.0.2 —————— posicion 0 interface entrada : ATM12 interface salida : ATM23 203 204 CAPÍTULO 5. SIMULADOR DE REDES MPLS vpi entrada : 20 vpi salida : 20 vci entrada : 0 vci salida : 1 num interf salida : 1 num interf entrada: 3 LABEL INFORMATION BASE 123.0.0.3 ———————– etiqueta entrada tipo : 1 espacio etiquetas : 0 vpi : 20 vci : 1 etiqueta salida tipo : 4 espacio etiquetas : 0 vpi : 0 vci : 0 FEC tipo : 0 familia direccion : 0 longitud pre…jo : 16 direccion : 120.125.0.0 nombre inter. entr: ATM32 5.4. EJEMPLOS DE FUNCIONAMIENTO 205 nombre inter. sal : IP33 num inter. entr : 2 num inter. sal : 3 Ejecución. En el nodo 1 se comprueba que los paquetes con destinos 120.125.100.10 y 120.125.80.1 corresponden al mismo ‡ujo de datos, ya que el FEC va asociado a las direcciones destino 120.125.x.x con 16 bits de pre…jo. De modo que son tratadas como un solo ‡ujo de datos en toda la red. ² Recepción de una etiqueta con dirección 120.125.100.10 -FEC con dir 120.125.100.10 asociado a 2 -segmentando PDU AAL5, cabecera -paquete ATM 20:0 enviado por el enlace 0 a 2 -segmentando PDU AAL5 , parte 1 de 2 ; completada pos 48 de 108 -paquete ATM 20:0 enviado por el enlace 0 a 2 -segmentando PDU AAL5 , parte 2 de 2 ; completada pos 96 de 108 -paquete ATM 20:0 enviado por el enlace 0 a 2 -paquete ATM 20:0 enviado por el enlace 0 a 2 -segmentando PDU AAL5, ultima parte. ² Recepción de una etiqueta con dirección 120.125.80.1 -recogido paquete IP . dir. 0.0.0.5 : 120.125.80.1 en interface 6 -FEC con direccion 120.125.80.1 se envia a 2 -FEC con dir 120.125.80.1 asociado a IP11 -añadido interf de entrada 6 en la posicion 0 con direccion 120.125.80.1 206 CAPÍTULO 5. SIMULADOR DE REDES MPLS -segmentando PDU AAL5, cabecera -paquete ATM 20:0 enviado por el enlace 0 a 2 -segmentando PDU AAL5 , parte 1 de 2 ; completada pos 48 de 108 -paquete ATM 20:0 enviado por el enlace 0 a 2 -segmentando PDU AAL5 , parte 2 de 2 ; completada pos 96 de 108 -paquete ATM 20:0 enviado por el enlace 0 a 2 -paquete ATM 20:0 enviado por el enlace 0 a 2 -segmentando PDU AAL5, ultima parte. ² Al llegar al nodo 3, se vuelven a insertar las direcciones IP originales a los paquetes: dirección 120.125.100.10 - ...recogiendo paquete ATM 20:1 en enlace 0 con 2 -recibida PDU AAL5 0 - ...recogiendo paquete ATM 20:1 en enlace 0 con 2 -num Fragm Recibidos: 1 de 2 - ...recogiendo paquete ATM 20:1 en enlace 0 con 2 -num Fragm Recibidos: 2 de 2 - ...recogiendo paquete ATM 20:1 en enlace 0 con 2 -padding 12 -buscando interf de salida para interf de entrada 2 -Posicion en la LIB 0 -paquete IP 0.0.0.2 : 120.125.100.10 enviado por el enlace 3 dirección 120.125.80.1 - ...recogiendo paquete ATM 20:1 en enlace 0 con 2 5.4. EJEMPLOS DE FUNCIONAMIENTO -recibida PDU AAL5 0 - ...recogiendo paquete ATM 20:1 en enlace 0 con 2 -num Fragm Recibidos: 1 de 2 - ...recogiendo paquete ATM 20:1 en enlace 0 con 2 -num Fragm Recibidos: 2 de 2 - ...recogiendo paquete ATM 20:1 en enlace 0 con 2 -padding 12 -buscando interf de salida para interf de entrada 2 -Posicion en la LIB 0 -paquete IP 0.0.0.5 : 120.125.80.1 enviado por el enlace 3 207 Capítulo 6 Captura de Datos de Entrada En este capítulo se explicará cómo se desarrolló la Interfaz de Captura de Datos de Entrada para armar el archivo de con…guración que necesita el Simulador de Redes MPLS para su funcionamiento, debido a que el mismo carece de un método para armar el Archivo de Con…guración que mantenga una interfaz amigable y comprensible para el usuario. 6.1 Reglas de codi…cación del Archivo de Con…guración ² La inserción de datos se lee línea a línea. El símbolo ‘;’ o el salto de línea supone un nuevo dato. ² Se pueden insertar comentarios a partir del símbolo ‘;’. ² El …nal de un bloque de datos, por ejemplo posiciones de los nodos, LIB de un nodo especí…co ... deberá indicarse con la palabra ‘FIN’. 6.2 Bloques del Archivo de Con…guración A continuación se explicará como está formado el Archivo de Con…guración: 209 210 CAPÍTULO 6. CAPTURA DE DATOS DE ENTRADA 6.2.1 Datos Generales de la Red. Posiciones: indican el número de nodos y las posiciones grá…cas en el simulador. Cada línea representa la posición (x,y) de los nodos que se deseen incluir. En este ejemplo se mostrarán 5 nodos. POSICIONES; 10 100; pos del nodo 1 90 30; pos del nodo 2 190 100; pos del nodo 3 90 180; pos del nodo 4 90 210; pos del nodo 5 FIN; Enlaces: indican las conexiones entre los nodos y las conexiones con las entidades TCP / IP. Representado por una línea con 4 valores con el siguiente formato: [nodo origen] [interface origen] [nodo destino] [interface destino]. 1. Si el valor del interface es <0 indica que se trata de una conexión IP. 2. Si el valor del nodo es 0 indica que es una conexión con una entidad externa IP. ENLACES; conexiones entre los nodos 0 -1 1 0; conexion IP con el nodo 1 por el int IP 0 2 0 1 1; conexion ATM del nodo 2 int 0 al nodo 1 por el int 1 2 1 3 0; conexion ATM del nodo 2 int 1 al nodo 3 por el int 0 3 0 2 1; conexion ATM del nodo 3 int 0 al nodo 2 por el int 1 3 -1 0 0; conexion IP con el nodo 3 por el int 1 6.2. BLOQUES DEL ARCHIVO DE CONFIGURACIÓN 211 2 -1 3 1; conexion IP del nodo 1 al nodo 2 1 2 4 0; 4 3 3 4; 1 1 2 0; conexion ATM del nodo 1 int 1 al nodo 2 int 0 FIN; 6.2.2 Datos Especí…cos para cada Nodo Tabla Switching (NHLFE): Next Hop Label Forwarding Entry. Las entradas de esta tabla se representan en 8 líneas, cada una de ellas indicando el interface de entrada, el interface de salida, el vpi de entrada, el vpi de salida, el número del interface de entrada y el número del interface de salida. Las entradas deberán ir separadas por una línea en blanco. TABLA SWITCHING 123.0.0.2; ATM20; interface_entrada ATM21; interface_salida 5; vpi_entrada 5; vpi_salida 35; vci_entrada 35; vci_salida 0; num_interface_entrada 1; num_interface_salida ATM20; interface_entrada ATM21; interface_salida 2; vpi_entrada 5; vpi_salida 212 CAPÍTULO 6. CAPTURA DE DATOS DE ENTRADA 0; vci_entrada 35; vci_salida 0; num_interface_entrada 1; num_interface_salida ATM21; interface_entrada ATM20; interface_salida 5; vpi_entrada 5; vpi_salida 35; vci_entrada 35; vci_salida 1; num_interface_entrada 0; num_interface_salida FIN; Tabla LIB: Label Information Base. Las entradas en esta tabla se representan en 19 líneas representando: ² Etiqueta_entrada.tipo ( general , ATM , FR, IP ... sólo están implementados IP -> 4 y ATM -> 0); ² Etiqueta_entrada.espacio_etiquetas; ² Etiqueta_entrada.vpi; ² Etiqueta_entrada.vci; ² Etiqueta_salida.tipo ( general , ATM , FR); ² Etiqueta_salida.espacio_etiquetas; ² Etiqueta_salida.vpi; ² Etiqueta_salida.vci; 6.2. BLOQUES DEL ARCHIVO DE CONFIGURACIÓN 213 ² Direccion_lsr; ² FEC.tipo(dir,wildcard,crlsp, sólo está implementado el tipo dir -> 0); ² FEC.familia_direcc (IPV4 ,IPV6 sólo está representada Ipv4 -> 0); ² FEC.longitud_pre…jo; fec.direccion; ² Reservado1( no utilizado) ; ² Reservado2 (no utilizado); ² nombre_interface_entrada; ² nombre_interface_salida; ² num_interface_entrada; ² num_interface_salida LIB 123.0.0.1; 4;(IP) Etiqueta_entrada.tipo ( general , ATM , FR, IP) 0; Etiqueta_entrada.espacio_etiquetas 0; Etiqueta_entrada.vpi 0; Etiqueta_entrada.vci 1;(ATM) Etiqueta_salida.tipo ( general , ATM , FR) 0; Etiqueta_salida.espacio_etiquetas 5; Etiqueta_salida.vpi 35; Etiqueta_salida.vci 0.0.0.1; direccion_lsr 0;(DIR) fec.tipo = dir,wildcard,crlsp 0;(IPV4) fec.familia_direccion = IPV4 , IPV6 ... 31; fec.longitud_prefijo 1.0.0.5; fec.direccion 214 CAPÍTULO 6. CAPTURA DE DATOS DE ENTRADA 0; reservado1 0; reservado2 IP10; nombre_interface_entrada ATM10; nombre_interface_salida 0; num_interface_entrada 1; num_interface_salida 1;(ATM) Etiqueta_entrada.tipo ( general , ATM , FR) 0; Etiqueta_entrada.espacio_etiquetas 5; Etiqueta_entrada.vpi 35; Etiqueta_entrada.vci 4;(IP) Etiqueta_salida.tipo ( general , ATM , FR) 0; Etiqueta_salida.espacio_etiquetas 0; Etiqueta_salida.vpi 0; Etiqueta_salida.vci 0.0.0.5; direccion_lsr 0;(DIR) fec.tipo = dir,wildcard,crlsp 0;(IPV4) fec.familia_direccion = IPV4 , IPV6 ... 32; fec.longitud_prefijo 0.0.0.1; fec.direccion 0; reservado1 0; reservado2 ATM11; nombre_interface_entrada IP10; nombre_interface_salida 1; num_interface_entrada 6.3. INTERFAZ CON EL USUARIO 215 0; num_interface_salida FIN; Tabla de Routing: las entradas de esta tabla están representadas por líneas con 3 elementos separados por espacios con el formato [dirección] [longitud] [número de interface de salida]. TABLA ROUTING 123.0.0.1; 111.1.0.1 8 1; direccion longitud num.int.salida 111.1.0.2 14 2; 0.0.0.0 4 1; 0.0.0.0 4 2; FIN; 6.3 Interfaz con el Usuario La Interfaz del Usuario que se ha optado elegir para este sistema, es orientado a ventanas, como una aplicación típica de Windows, dispondrá de una ventana con el menú principal, que se particionará de la manera en que muestra la Figura 6.1 de la Página 216. Archivo A continuación se hará una breve descripción del menú Archivo, que luce como en la Figura 6.2 de la Página 216. Guardar Habilita una ventana para guardar el archivo de con…guración en formato .cfg; que es el formato especí…co que requiere el simulador. Se lo observa en la Figura 6.3 de la Página 217. Salir 216 CAPÍTULO 6. CAPTURA DE DATOS DE ENTRADA Figura 6.1: Disposición de las ventanas. Figura 6.2: Menú Archivo. 6.3. INTERFAZ CON EL USUARIO Figura 6.3: Submenú Guardar. 217 218 CAPÍTULO 6. CAPTURA DE DATOS DE ENTRADA Figura 6.4: Submenú Posiciones. Sale del Sistema. Nodos A continuación se hará una breve descripción del menú Nodos, que luce como en la Figura 6.4 de la Página 218. Posiciones Muestra una ventana con cajas de texto y combos; dicha ventana se divide en 2 secciones: una con los datos de los nodos internos, y otra con los nodos externos. Tenemos hasta 5 nodos internos, y 4 nodos externos Esta ventana, al igual que todas, cuentan con rutinas de manejo de errores, que se activan al clickear el botón “OK” y no están completos todos los campos de texto, como lo muestra la Figura 6.5 de la Página 219. Nodos Internos: Los datos que corresponden a estos nodos son los siguientes: ² Posición X. ² Posición Y. 6.3. INTERFAZ CON EL USUARIO 219 Figura 6.5: Mensaje de Error. Figura 6.6: Datos de los nodos internos. Los rangos de estos valores van de 0 - 350, puede apreciarse esta sección de la ventana en la Figura 6.6 de la Página 219. Nodos Externos. Los datos que corresponden a estos nodos son los siguientes: ² Posición X. ² Posición Y. ² Dirección Origen. ² Dirección Destino. En la Figura 6.7 de la Página 220 se puede observar esta ventana. Cuando se terminan de completar los datos de los nodos se activa en el menú principal la ventana de los Enlaces. 220 CAPÍTULO 6. CAPTURA DE DATOS DE ENTRADA Figura 6.7: Datos de los nodos externos. Enlaces En el submenú Enlaces, el de la Figura 6.9 de la Página 221, se cargan todos los enlaces que se necesita para que los nodos se comuniquen. En esta ventana hay que cargar los siguientes datos: ² Nodo Emisor. ² Interfaz Emisora. ² Nodo Receptor. ² Interfaz Receptora. ² Tipo de Nodo Emisor. ² Tipo de Nodo Receptor. Al desplegar los combos nos encontraremos con valores negativos de enlaces, estos signi…can que se trata de nodos externos. Como se observa en la Figura 6.9 de la Página 221. Tabla LIB 6.3. INTERFAZ CON EL USUARIO Figura 6.8: Submenú Enlaces. Figura 6.9: Ventana de Enlaces. 221 222 CAPÍTULO 6. CAPTURA DE DATOS DE ENTRADA Figura 6.10: Submenú Tabla LIB. El submenú Tabla LIB de la Figura 6.10 de la Página 222 muesrta una ventana se divide en tres secciones; en la primer sección, denominada “Información de Entrada” deben introducir los siguientes datos, como lo muestra la Figura 6.11 de la Página 223. ² Espacio de Etiquetas, que ya está prede…nido en cero, se re…ere con qué tipo de etiqueta se trabajará, el valor cero indica que se está manejando el protocolo IPv4. ² VPI de Entrada. ² VCI de Entrada. ² Nombre de la Interfaz de Entrada, valores como IP1, ATM2, etc. ² Número de la Interfaz de Entrada, valores como 1, 2, 3, etc. ² Tipo de Etiqueta, se re…ere al tipo de etiqueta que ingresa al nodo. La Figura 6.12 de la Página 224 muestra la otra sección de nuestra ventana, llamada “Información de Salida”, donde los datos a ingresar son los siguientes: ² Espacio de Etiquetas, que ya está prede…nido en cero, se re…ere con qué tipo de etiqueta se trabajará, el valor cero indica que se está manejando el protocolo IPv4. 6.3. INTERFAZ CON EL USUARIO 223 Figura 6.11: Datos de Entrada de la LIB: ² VPI de Salida. ² VCI de Salida. ² Nombre de la Interfaz de Salida, valores como IP1, ATM2, etc. ² Número de la Interfaz de Salida, valores como 1, 2, 3, etc. ² Tipo de Etiqueta, se re…ere al tipo de etiqueta que sale del nodo. Y esta ultima Figura 6.13 de la Página 224, nos muestra la sección de “Información General”, donde los datos a cargar son los siguientes: ² Dirección del LSR. ² Tipo de FEC, ya determinada en la familia IPv4. ² Longitud del Pre…jo FEC, se re…ere a con cuantos bits se va a comparar la dirección destino. ² Dirección del FEC, dirección IP que formará la ruta hacia el destino. Tabla de Ruteo En el submenú Tabla de Ruteo de la Figura 6.15 de la Página 226 muestra una pantalla posee un juego de botones que se van activando a medida que se completan los campos. 224 CAPÍTULO 6. CAPTURA DE DATOS DE ENTRADA Figura 6.12: Información de Salida. Figura 6.13: Información general. 6.4. CÓDIGO FUENTE 225 Figura 6.14: Submenú Tabla de Ruteo. El primer paso es elegir el nodo y colocar su dirección IP, luego se presiona el botón “Nueva Tabla”; allí se activa el botón “OK”, que se presiona cada vez que quiera añadir una ruta a su tabla, cuando se termine de cargar todas las rutas posibles, se puede presionar el botón “Fin Nueva Tabla”, para elegir otro nodo y comenzar a cargar sus rutas. En la Figura 6.15 de la Página 226 se puede observar un ejemplo de con…guración. 6.4 Código Fuente A continuación se hará una breve reseña de cada una de las clases que intervienen en la Interfaz de Captura de Datos de Entrada. 6.4.1 Clase principal “MPLS.java” import javax.swing.JInternalFrame; import javax.swing.JDesktopPane; 226 CAPÍTULO 6. CAPTURA DE DATOS DE ENTRADA Figura 6.15: Información de la Tabla de Ruteo. import javax.swing.JMenu; import javax.swing.JMenuItem; import javax.swing.JMenuBar; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.ImageIcon; import javax.swing.*; import java.io.File; import javax.swing.…lechooser.FileFilter; import javax.swing.…lechooser.*; import java.io.*; 6.4. CÓDIGO FUENTE 227 import java.awt.Toolkit; import java.awt.BorderLayout; import java.awt.event.ActionListener; import java.awt.event.ActionEvent; import java.awt.*; import java.awt.event.*; import java.lang.*; public class MPLS extends JFrame implements ActionListener{ JDesktopPane desktop; static String[][] general; static Object[] enlaces2; static Object[] nodos; static Object[] nodosint; static Object[] enlaces; static int contNodos = 1; static int contEnlaces = 1; static int congralf=0; static JMenuItem Posiciones, Enlaces, TablaLIB, TablaRouting, guardar, ayulis, acercade, …n; static JFileChooser fc; static JFileChooser fh; static File …le; String s = null; 228 CAPÍTULO 6. CAPTURA DE DATOS DE ENTRADA public MPLS() { super(“Simulador de Redes MPLS - Carga del Archivo de Con…guración”); //Matriz con la información para imprimir el archivo general = new String[50][6]; //Matriz contador de los nodos nodos = new Object[9]; nodosint = new Object[5]; //Matriz contador de los enlaces enlaces = new Object[9]; enlaces2=new Object[6]; //De…ne el Menu. JMenuBar barra = new JMenuBar(); setJMenuBar(barra); JMenu Nodos, ayuda, acerca, salir, archivo; //De…no el marco donde va a estar la consola de salida desktop = new JDesktopPane(); setContentPane(desktop); desktop.putClientProperty(“JDesktopPane.dragMode”, “outline”); FrameConsola frameC = new FrameConsola(); frameC.setVisible(true); desktop.add(frameC); 6.4. CÓDIGO FUENTE // Agregado de submenú al principal. archivo = new JMenu(“Archivo”, true); Nodos = new JMenu(“Nodos”, true); acerca = new JMenu(“Acerca De...”, true); ayuda = new JMenu(“Ayuda”,true); barra.add(archivo); barra.add(Nodos); barra.add(acerca); barra.add(ayuda); // Creación de opciones del menú Nodos. Posiciones = new JMenuItem(“Posiciones”,new ImageIcon(“posi.gif”)); Posiciones.addActionListener(this); Nodos.add(Posiciones); Enlaces = new JMenuItem(“Enlaces”,new ImageIcon(“enlace.gif”)); Enlaces.addActionListener(this); Enlaces.setEnabled(false); Nodos.add(Enlaces); Nodos.addSeparator(); TablaLIB = new JMenuItem(“Tabla LIB”,new ImageIcon(“lista1.gif”)); TablaLIB.addActionListener(this); TablaLIB.setEnabled(false); Nodos.add(TablaLIB); 229 230 CAPÍTULO 6. CAPTURA DE DATOS DE ENTRADA TablaRouting = new JMenuItem(“Tabla de Ruteo”,new ImageIcon(“lista1.gif”)); TablaRouting.addActionListener(this); Nodos.add(TablaRouting); TablaRouting.setEnabled(false); ayulis = new JMenuItem(“Ayuda del Sistema”); ayulis.addActionListener(this); ayuda.add(ayulis); acercade = new JMenuItem(“Acerca del Sistema”); acercade.addActionListener(this); acerca.add(acercade); // Creación de opciones del menú Archivo. guardar = new JMenuItem(“Guardar”,new ImageIcon(“ICONOS/save.gif”)); archivo.add(guardar); guardar.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(ActionEvent e) { JFileChooser fc = new JFileChooser(); fc.addChoosableFileFilter(new FiltroCFG()); int returnVal = fc.showSaveDialog(MPLS.this); if (returnVal == JFileChooser.APPROVE_OPTION) { try{ File …le = new File(fc.getSelectedFile()+“.cfg”); …le.delete(); FileWriter …lempls = new FileWriter(…le); 6.4. CÓDIGO FUENTE 231 Bu¤eredWriter mpls = new Bu¤eredWriter(…lempls); PrintWriter salida = new PrintWriter(mpls); for (int j=0; j<50; j++) { for (int i=0; i<6;i++){ if (general[j][i]!=null) { salida.println(general[j][i]); } }}salida.close(); FrameConsola.areaConsola.append(“Grabación de Archivo ”); } catch (IOException er) {FrameConsola.areaConsola.append(“Error ” + er);} } else { } } }); archivo.addSeparator(); //Menú Archivo …n = new JMenuItem(“Salir”,new ImageIcon(“ICONOS/delete.gif”)); …n.addActionListener(this); archivo.add(…n); addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { dispose(); System.exit(0); } }); } public void actionPerformed(ActionEvent evt) { 232 CAPÍTULO 6. CAPTURA DE DATOS DE ENTRADA JMenuItem c = (JMenuItem) evt.getSource(); String arg = c.getLabel(); if(arg.equals(“Salir”)) { System.exit(0); } else if(arg.equals(“Posiciones”)) { FrPosiciones frameFP = new FrPosiciones(); frameFP.setVisible(true); desktop.add(frameFP); try { frameFP.setSelected(true); } catch (java.beans.PropertyVetoException e) {} } else if(arg.equals(“Enlaces”)) { FrEnlaces frameFEN = new FrEnlaces(); frameFEN.setVisible(true); desktop.add(frameFEN); try { frameFEN.setSelected(true); } catch (java.beans.PropertyVetoException e) {} } else if(arg.equals(“Tabla LIB”)) { FrLIB frameLIB = new FrLIB(); frameLIB.setVisible(true); 6.4. CÓDIGO FUENTE desktop.add(frameLIB); try { frameLIB.setSelected(true); } catch (java.beans.PropertyVetoException e) {} } else if(arg.equals(“Tabla de Ruteo”)) { FrRuteo frameRUTEO = new FrRuteo(); frameRUTEO.setVisible(true); desktop.add(frameRUTEO); try { frameRUTEO.setSelected(true); } catch (java.beans.PropertyVetoException e) {} } else if(arg.equals(“Acerca del Sistema”)) { FrAcerca frameACERCA = new FrAcerca(); frameACERCA.setVisible(true); desktop.add(frameACERCA); try { frameACERCA.setSelected(true); } catch (java.beans.PropertyVetoException e) {} } else if(arg.equals(“Ayuda del Sistema”)) { FrAyuda frameAYUDA = new FrAyuda(); frameAYUDA.setVisible(true); 233 234 CAPÍTULO 6. CAPTURA DE DATOS DE ENTRADA desktop.add(frameAYUDA); try { frameAYUDA.setSelected(true); } catch (java.beans.PropertyVetoException e) {} }} public static void main(String args[]) { System.out.println(“Inicializando INTERFAZ DE CAPTURA DE DATOS DE ENTRADA...”); MPLS mainFrame = new MPLS(); mainFrame.setSize(800, 550); mainFrame.setTitle(“MPLS”); mainFrame.setVisible(true); }} 6.4.2 Clase “FrPosiciones.java” Esta clase se ejecuta cuando se elige en el menú principal la opción “Posiciones”. Esta clase lo que hace es aceptar la información que se ingresa en la pantalla y referirla a una matriz para luego imprimir la información en un archivo. import java.awt.event.*; import java.awt.*; import java.awt.event.ActionEvent; import javax.swing.JDialog; import java.io.File; 6.4. CÓDIGO FUENTE import javax.swing.JInternalFrame; import javax.swing.JPanel; import javax.swing.ImageIcon; import javax.swing.*; import java.io.File; import java.awt.BorderLayout; import java.awt.event.ActionListener; import java.awt.event.ActionEvent; import java.awt.*; import java.awt.event.*; import java.lang.*; class FrPosiciones extends JInternalFrame { boolean bandera = true; int contDir = 0; int contNod =0; int auxDir; int indice3; int indice4; static JTextField txtposx1; …nal JTextField txtposy1; …nal JTextField txtposx2; …nal JTextField txtposy2; …nal JTextField txtdirori; …nal JTextField txtdirdes; 235 236 CAPÍTULO 6. CAPTURA DE DATOS DE ENTRADA …nal JButton btnNuevoNodo; …nal JButton btnNuevoNodo2; static JComboBox listaNodos1; public String seleccionado = “”; static JComboBox listaNodos2; public String seleccionado2=“”; public String posix1; public String posiy1; public String posix2; public String posiy2; public String dirori; public String dirdes; public int indice1; public int indice2; public FrPosiciones() { super(“De…ne las Posiciones de los Nodos”, false, //resizable true, //closable true, //maximizable true);//iconi…able FrameConsola.areaConsola.append(“;——————”+“nn”); FrameConsola.areaConsola.append(“;Archivo de Con…guración de una 6.4. CÓDIGO FUENTE 237 red MPLS”+“nn”); FrameConsola.areaConsola.append(“;—————— ”+“nn”); FrameConsola.areaConsola.append(“POSICIONES;”+“nn”); MPLS.general[MPLS.congralf][0]=(“;——————”); MPLS.congralf++; MPLS.general[MPLS.congralf][0]=(“;Archivo de Con…guracion de una red MPLS”); MPLS.congralf++; MPLS.general[MPLS.congralf][0]=“;——————”+“nn”; MPLS.congralf++; MPLS.general[MPLS.congralf][0]=“POSICIONES;”+“nn”; MPLS.congralf++; MPLS.contNodos = 1; String[] stringNodos1 = {“”,“Nodo 1”,“Nodo 2”, “Nodo 3”,“Nodo 4”,“Nodo 5”}; String[] stringNodos2 = {“”,“Nodo 1”,“Nodo 2”, “Nodo 3”,“Nodo 4”}; //De…no el ComboBox1 de los nodos internos JComboBox listaNodos1 = new JComboBox(stringNodos1); listaNodos1.setSelectedIndex(0); listaNodos1.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { JComboBox cb = (JComboBox)e.getSource(); seleccionado = (String)cb.getSelectedItem(); int indice1 = (int)cb.getSelectedIndex(); 238 CAPÍTULO 6. CAPTURA DE DATOS DE ENTRADA MPLS.enlaces[contNod]= new Integer(indice1); } }); //De…no el ComboBox2 de los nodos internos JComboBox listaNodos2 = new JComboBox(stringNodos2); listaNodos2.setSelectedIndex(0); listaNodos2.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { JComboBox cb2 = (JComboBox)e.getSource(); seleccionado2 = (String)cb2.getSelectedItem(); int indice2 = (int)cb2.getSelectedIndex(); MPLS.enlaces[contNod]= new Integer(“-”+indice2); } }); contDir = 0; txtposx1 = new JTextField(3); txtposy1 = new JTextField(3); txtposx2 = new JTextField(3); txtposy2 = new JTextField(3); txtdirori = new JTextField(15); txtdirdes = new JTextField(15); JLabel etiquetaAclaracion = new JLabel(“La cantidad de Nodos Internos está”); JLabel etiquetaAclaracion2 = new JLabel(“restrigida a 5, y Nodos Externos a 4”); JLabel LBlistanodos = new JLabel(“Nombre del Nodo”); 6.4. CÓDIGO FUENTE JLabel LBposx1 = new JLabel(“Posición X”); JLabel LBposy1 = new JLabel(“Posición Y”); JLabel LBlistanodos2 = new JLabel(“Nombre del Nodo”); JLabel LBposx2 = new JLabel(“Posición X”); JLabel LBposy2 = new JLabel(“Posición Y”); JLabel LBdirori = new JLabel(“Dirección Origen”); JLabel LBdirdes = new JLabel(“Dirección Destino”); // De…ne los botones JButton btnAceptar = new JButton(“Aceptar”); btnAceptar.setToolTipText(“Guarda el nuevo nodo”); btnAceptar.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(ActionEvent e) { MPLS.congralf++; MPLS.general[MPLS.congralf][0]=(“FIN;”+“nn”); FrameConsola.areaConsola.append(“FIN;”+“nn”); dispose(); MPLS.Enlaces.setEnabled(true); } }); JButton btnCancelar = new JButton(“Salir”); btnCancelar.setToolTipText(“Sale de esta ventana”); btnCancelar.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(ActionEvent e) { MPLS.TablaLIB.setEnabled(false); 239 240 CAPÍTULO 6. CAPTURA DE DATOS DE ENTRADA MPLS.TablaRouting.setEnabled(false); MPLS.contNodos = 0; dispose(); } }); btnNuevoNodo = new JButton(“OK”); btnNuevoNodo.setToolTipText(“Guarda los datos de los Nodos Internos”); btnNuevoNodo.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(ActionEvent e){ posix1=(String)txtposx1.getText(); posiy1=(String)txtposy1.getText(); if (posix1.length()==0 jj seleccionado.length()==0 jj posiy1.length()==0){ JOptionPane.showMessageDialog(null,“Complete todos los campos”, “Error de Entrada”, JOptionPane.OK_OPTION); } else{ MPLS.congralf++; FrameConsola.areaConsola.append(txtposx1.getText() +“ ” +txtposy1.getText()+ “; Posición del ”+ seleccionado +“nn”); MPLS.nodos[contNod] = seleccionado; MPLS.nodosint[contNod] = seleccionado; contNod++; MPLS.general[MPLS.congralf][0]=(txtposx1.getText()+“ ”+txtposy1.getText()+ “; Posición del ”+ seleccionado); txtposx1.setText(“”); 6.4. CÓDIGO FUENTE 241 txtposy1.setText(“”); bandera = true; } } } ); btnNuevoNodo2 = new JButton(“OK”); btnNuevoNodo2.setToolTipText(“Guarda los datos de los Nodos Externos”); btnNuevoNodo2.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(ActionEvent e){ //Habilita el menú de nuevo enlace MPLS.Enlaces.setEnabled(true); posix2=(String)txtposx2.getText(); posiy2=(String)txtposy2.getText(); dirori=(String)txtdirori.getText(); dirdes=(String)txtdirdes.getText(); if (posix2.length()==0 jj seleccionado2.length()==0 jj posiy2.length()==0jj dirori.length()==0 jjdirdes.length()==0){ JOptionPane.showMessageDialog(null,“Complete todos los campos”, “Error de Entrada”, JOptionPane.OK_OPTION); } if (bandera){ MPLS.congralf++; FrameConsola.areaConsola.append(“FIN;”+“nn”); FrameConsola.areaConsola.append(“nn”); FrameConsola.areaConsola.append(“POSICIONES IP;”+“nn”); FrameConsola.areaConsola.append(“nn”); 242 CAPÍTULO 6. CAPTURA DE DATOS DE ENTRADA MPLS.general[MPLS.congralf][0]=“FIN;”+“nn”; MPLS.congralf++; MPLS.general[MPLS.congralf][0]=“POSICIONES IP;”+“nn”; bandera=false; } FrameConsola.areaConsola.append(txtposx2.getText() +“ ”+ txtposy2.getText() +“ ”+txtdirori.getText()+“”+txtdirdes.getText()+ “; Posición del ”+ seleccionado2 +“ - Dir. IP Origen - Dir.IP Destino”+“nn”); MPLS.congralf++; MPLS.general[MPLS.congralf][0]=(txtposx2.getText() +“ ” + txtposy2.getText()+“ ”+txtdirori.getText()+“ ”+txtdirdes.getText()+ “; Posición del ”+ seleccionado2 +“ - Dir. IP Origen - Dir.IP Destino”); txtposx2.setText(“”); txtposy2.setText(“”); txtdirori.setText(“”); txtdirdes.setText(“”); bandera = false; MPLS.Enlaces.setEnabled(true); MPLS.nodos[contNod] = seleccionado2; contNod++; } }); // De…ne los paneles JPanel panelTabla = new JPanel(); panelTabla.setLayout(new GridLayout(0,2)); 6.4. CÓDIGO FUENTE panelTabla.add(LBlistanodos); panelTabla.add(listaNodos1); panelTabla.add(LBposx1); panelTabla.add(txtposx1); panelTabla.add(LBposy1); panelTabla.add(txtposy1); panelTabla.setBorder(BorderFactory.createCompoundBorder( BorderFactory.createTitledBorder(“Nodos Internos”), BorderFactory.createEmptyBorder(2,10,2,2))); JPanel panelArriba1 = new JPanel(); panelArriba1.setLayout(new GridLayout(0,1)); panelArriba1.add(btnNuevoNodo); panelArriba1.setBorder(BorderFactory.createCompoundBorder( BorderFactory.createTitledBorder(“”), BorderFactory.createEmptyBorder(2,10,2,2))); JPanel panelArriba2 = new JPanel(); panelArriba2.setLayout(new GridLayout(0,1)); panelArriba2.add(btnNuevoNodo2); panelArriba2.setBorder(BorderFactory.createCompoundBorder( BorderFactory.createTitledBorder(“”), BorderFactory.createEmptyBorder(2,10,2,2))); 243 244 CAPÍTULO 6. CAPTURA DE DATOS DE ENTRADA JPanel panel2Tabla = new JPanel(); panel2Tabla.setLayout(new GridLayout(0,2)); panel2Tabla.add(LBlistanodos2); panel2Tabla.add(listaNodos2); panel2Tabla.add(LBposx2); panel2Tabla.add(txtposx2); panel2Tabla.add(LBposy2); panel2Tabla.add(txtposy2); panel2Tabla.add(LBdirori); panel2Tabla.add(txtdirori); panel2Tabla.add(LBdirdes); panel2Tabla.add(txtdirdes); panel2Tabla.setBorder(BorderFactory.createCompoundBorder( BorderFactory.createTitledBorder(“Nodos Externos”), BorderFactory.createEmptyBorder(2,10,2,2))); JPanel panelArriba = new JPanel(); panelArriba.setLayout(new GridLayout(0,1)); panelArriba.add(etiquetaAclaracion); panelArriba.add(etiquetaAclaracion2); panelArriba.setBorder(BorderFactory.createCompoundBorder( BorderFactory.createTitledBorder(“”), BorderFactory.createEmptyBorder(2,10,2,2))); JPanel panelAbajo = new JPanel(); panelAbajo.setLayout(new GridLayout(0,2)); 6.4. CÓDIGO FUENTE 245 panelAbajo.add(btnAceptar); panelAbajo.add(btnCancelar); panelAbajo.setBorder(BorderFactory.createCompoundBorder( BorderFactory.createTitledBorder(“”), BorderFactory.createEmptyBorder(2,2,2,2))); JPanel contentPane = new JPanel(); contentPane.setLayout(new BoxLayout(contentPane, BoxLayout.Y_AXIS)); contentPane.add(panelArriba); contentPane.add(panelTabla); contentPane.add(panelArriba1); contentPane.add(panel2Tabla); contentPane.add(panelArriba2); contentPane.add(panelAbajo); setContentPane(contentPane); // De…ne el Tamaño setSize(300,500); setLocation(150,0); } public static void main(String s[]) { FrPosiciones fr = new FrPosiciones(); fr.pack(); fr.setVisible(true); }} 246 CAPÍTULO 6. CAPTURA DE DATOS DE ENTRADA 6.4.3 Clase “FrEnlaces.java” En esta clase se ingresan los valores de los enlaces. Recuerde que si se trata de un valor negativo es una entida externa IP. import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.text.*; import javax.swing.JTextField; import javax.swing.*; import java.text.*; import java.awt.event.*; import java.awt.*; import java.awt.event.ActionEvent; class FrEnlaces extends JInternalFrame{ …nal JButton bbtnOK; …nal String interfaz1= “-”; …nal String interfaz2= “”; static JComboBox listaNodos1; static JComboBox listaNodos2; static JComboBox listaNodos3; static JComboBox listaNodos4; public Object[] stringNodos; public Object[] stringNodos2; static JComboBox NodoExt1; 6.4. CÓDIGO FUENTE static JComboBox NodoExt2; static String seleccionado11; static String seleccionado22; static String seleccionado33; static String seleccionado44; static String seleccionado55; static String seleccionado66; public String tipoint1 = interfaz1; public String tipoint2 = interfaz2; public int indice22; public int indice33; public int indice55; public int indice66; public FrEnlaces() { super(“Enlaza los Nodos”, false, //resizable true, //closable true, //maximizable true);//iconi…able FrameConsola.areaConsola.append(“ENLACES;”+“nn”); FrameConsola.areaConsola.append(“nn”); MPLS.congralf++; 247 248 CAPÍTULO 6. CAPTURA DE DATOS DE ENTRADA MPLS.general[MPLS.congralf][0]=(“ENLACES;”+“conexiones entre los nodos: formato [nodo origen] [interface origen] [nodo destino] [interface destino];”+“nn”); // Carga el combo de los nodos habilitados stringNodos = new Object[9]; for (int i=0; i<9;i++){ if(MPLS.nodos[i]!= null){ stringNodos[i]=MPLS.enlaces[i]; }} // De…ne el JCombo Origen JLabel lblVacio= new JLabel(); JLabel lblNodo1= new JLabel(“Nodo Emisor”); JLabel lblNodo2= new JLabel(“Nodo Receptor”); JLabel lblInt1= new JLabel(“Interfaz Emisora”); JLabel lblInt2= new JLabel(“Interfaz Receptora”); JLabel lblTipo1=new JLabel(“Tipo de Nodo Emisor”); JLabel lblTipo2=new JLabel(“Tipo de Nodo Receptor”); // De…ne los botones JButton btnAceptar = new JButton(“Aceptar”); btnAceptar.setToolTipText(“Guarda los Enlaces”); btnAceptar.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(ActionEvent e) { 6.4. CÓDIGO FUENTE MPLS.congralf++; MPLS.general[MPLS.congralf][0]=(“FIN;”+“nn”); FrameConsola.areaConsola.append(“FIN;”+“nn”); MPLS.TablaLIB.setEnabled(true); MPLS.Enlaces.setEnabled(false); dispose(); } }); JButton btnCancelar = new JButton(“Cancelar”); btnCancelar.setToolTipText(“Sale sin guardar los cambios”); btnCancelar.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(ActionEvent e) { dispose(); } }); // De…no el ComboBox de los enlaces habilitados listaNodos1 = new JComboBox(stringNodos); listaNodos1.setSelectedIndex(0); listaNodos1.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { JComboBox cb2 = (JComboBox)e.getSource(); seleccionado22 = (String)cb2.getSelectedItem().toString(); int indice22 = (int)cb2.getSelectedIndex(); MPLS.enlaces2[1]= new Integer(seleccionado22); 249 250 CAPÍTULO 6. CAPTURA DE DATOS DE ENTRADA }}); // De…ne el JCombo Destino listaNodos2 = new JComboBox(stringNodos); listaNodos2.setSelectedIndex(0); listaNodos2.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { JComboBox cb3 = (JComboBox)e.getSource(); seleccionado33 = (String)cb3.getSelectedItem().toString(); int indice33 = (int)cb3.getSelectedIndex(); MPLS.enlaces2[2]= new Integer(seleccionado33); }}); // Carga el combo de los enlaces habilitados stringNodos2 = new Object[9]; for (int i=0; i<9;i++){ if(MPLS.nodos[i]!= null){ stringNodos2[i]=MPLS.enlaces[i]; }} listaNodos3 = new JComboBox(stringNodos2); listaNodos3.setSelectedIndex(0); listaNodos3.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { 6.4. CÓDIGO FUENTE JComboBox cb5 = (JComboBox)e.getSource(); seleccionado55 = (String)cb5.getSelectedItem().toString(); int indice55 = (int)cb5.getSelectedIndex(); MPLS.enlaces2[4]= new Integer(seleccionado55); }}); listaNodos4 = new JComboBox(stringNodos2); listaNodos4.setSelectedIndex(0); listaNodos4.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { JComboBox cb6 = (JComboBox)e.getSource(); seleccionado66 = (String)cb6.getSelectedItem().toString(); int indice66 = (int)cb6.getSelectedIndex(); MPLS.enlaces2[5]= new Integer(seleccionado66); }}); // Cargo el ComboBox con el tipo de enlace String[]tiponodo1={“IP”,“ATM”}; JComboBox NodoExt1 = new JComboBox(tiponodo1); NodoExt1.setSelectedIndex(0); NodoExt1.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { JComboBox cb1 = (JComboBox)e.getSource(); seleccionado11 = (String)cb1.getSelectedItem().toString(); int indice1 = (int)cb1.getSelectedIndex(); 251 252 CAPÍTULO 6. CAPTURA DE DATOS DE ENTRADA if (indice1==0){ seleccionado33=“0”; } else{MPLS.enlaces2[0]=tipoint2;} }}); String[]tiponodo2={“IP”,“ATM”}; JComboBox NodoExt2 = new JComboBox(tiponodo2); NodoExt2.setSelectedIndex(0); NodoExt2.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { JComboBox cb4 = (JComboBox)e.getSource(); seleccionado44 = (String)cb4.getSelectedItem().toString(); int indice4 = (int)cb4.getSelectedIndex(); if (indice4==0){ MPLS.enlaces2[3]= tipoint1; seleccionado66=“0”; } else{MPLS.enlaces2[3]=tipoint2 }}); // De…no los botones bbtnOK = new JButton(“OK”); bbtnOK.setToolTipText(“Guarda los datos del Enlace”); 6.4. CÓDIGO FUENTE bbtnOK.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(ActionEvent e){ if (seleccionado11==nulljjjseleccionado22==nulljjseleccionado33==nulljj seleccionado44==nulljjseleccionado55==nulljjseleccionado66==null){ JOptionPane.showMessageDialog(null,“Complete todos los campos”, “Error de Entrada”, JOptionPane.OK_OPTION); }else{ FrameConsola.areaConsola.append(seleccionado22+“ ”+seleccionado33+ “ ”+seleccionado55+“”+seleccionado66+“;”+“nn”); MPLS.congralf++; MPLS.general[MPLS.congralf][0]=(seleccionado22+“ ”+seleccionado33+“ ” +seleccionado55+“”+seleccionado66+“;”); }}}); // De…no los paneles JPanel datos = new JPanel(); datos.setLayout(new GridLayout(0,2)); datos.add(lblNodo1); datos.add(lblInt1); datos.add(listaNodos1); datos.add(listaNodos2); datos.add(lblNodo2); datos.add(lblInt2); datos.add(listaNodos3); datos.add(listaNodos4); 253 254 CAPÍTULO 6. CAPTURA DE DATOS DE ENTRADA datos.add(lblTipo1); datos.add(lblTipo2); datos.add(NodoExt1); datos.add(NodoExt2); datos.add(lblVacio); datos.setBorder(BorderFactory.createCompoundBorder( BorderFactory.createTitledBorder(“Nodos”), BorderFactory.createEmptyBorder(2,2,2,2))); JPanel panelAbajo1 = new JPanel(); panelAbajo1.setLayout(new GridLayout(0,1)); panelAbajo1.add(bbtnOK); panelAbajo1.setBorder(BorderFactory.createCompoundBorder( BorderFactory.createTitledBorder(“”), BorderFactory.createEmptyBorder(2,2,2,2))); JPanel panelAbajo = new JPanel(); panelAbajo.setLayout(new GridLayout(0,2)); panelAbajo.add(btnAceptar); panelAbajo.add(btnCancelar); panelAbajo.setBorder(BorderFactory.createCompoundBorder( BorderFactory.createTitledBorder(“”), BorderFactory.createEmptyBorder(2,2,2,2))); JPanel contentPane = new JPanel(); 6.4. CÓDIGO FUENTE 255 contentPane.setLayout(new BoxLayout(contentPane, BoxLayout.Y_AXIS)); contentPane.add(datos); contentPane.add(panelAbajo1); contentPane.add(panelAbajo); setContentPane(contentPane); setSize(300,340); setLocation(120,60); } public static void main(String s[]) { FrEnlaces fe = new FrEnlaces(); fe.pack(); fe.setVisible(true); }} 6.4.4 Clase “FrLIB.java” En esta clase se ingresan los datos de la Tabla LIB, que es solamente para las interfaces de los nodos que son frontera. import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.text.*; import javax.swing.JTextField; import javax.swing.*; import java.text.*; import java.awt.event.*; import java.awt.*; 256 CAPÍTULO 6. CAPTURA DE DATOS DE ENTRADA import java.awt.event.ActionEvent; class FrLIB extends JInternalFrame { …nal JButton bbtnOK; static JComboBox listaNodo1; public Object[] stringNodos2; public Object[] stringNodos3; public String seleccionado=““; public String seleccionado2=““; public String seleccionado22=““; …nal JTextField libnodo; static JComboBox tipo; static JComboBox tipo2; public Object[] stringNodos; …nal JTextField eent; …nal JTextField vpient; …nal JTextField vcient; …nal JTextField espetiqsal; …nal JTextField vpisal; …nal JTextField vcisal; …nal JTextField dirlsr; …nal JTextField tipofec; …nal JTextField fec‡ia; …nal JTextField feclong; …nal JTextField fecdir; 6.4. CÓDIGO FUENTE …nal JTextField reser1; …nal JTextField reser2; …nal JTextField nomintent; …nal JTextField nomintsal; …nal JTextField numintent; …nal JTextField numintsal; public FrLIB (){ super(“De…ne las LIB de los Nodos”, false, //resizable true, //closable true, //maximizable true);//iconi…able libnodo = new JTextField(); eent = new JTextField(); eent.setText(“0”); eent.setEnabled(false); vpient = new JTextField(); vcient = new JTextField(); espetiqsal = new JTextField(); espetiqsal.setText(“0”); espetiqsal.setEnabled(false); vpisal = new JTextField(); 257 258 CAPÍTULO 6. CAPTURA DE DATOS DE ENTRADA vcisal = new JTextField(); dirlsr = new JTextField(); tipofec = new JTextField(); tipofec.setText(“0”); tipofec.setEnabled(false); fec‡ia = new JTextField(); fec‡ia.setText(“0”); fec‡ia.setEnabled(false); feclong = new JTextField(); fecdir = new JTextField(); reser1=new JTextField(); reser1.setText(“0”); reser1.setEnabled(false); reser2=new JTextField(); reser2.setText(“0”); reser2.setEnabled(false); nomintent=new JTextField(); nomintsal=new JTextField(); numintent=new JTextField(); numintsal=new JTextField(); // De…no los ComboBox de los tipos de etiquetas String[]stringNodos={“”,“0;General”,“1; ATM”,“2; Frame Relay”,“4; IP”}; JComboBox tipo= new JComboBox(stringNodos); 6.4. CÓDIGO FUENTE 259 tipo.setSelectedIndex(0); tipo.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { JComboBox cb2 = (JComboBox)e.getSource(); seleccionado2 = (String)cb2.getSelectedItem(); int indice2 = (int)cb2.getSelectedIndex(); }}); String[]stringNodos3={“”,“0;General”,“1; ATM”,“2; Frame Relay”,“4; IP”}; JComboBox tipo2= new JComboBox(stringNodos3); tipo2.setSelectedIndex(0); tipo2.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { JComboBox cb2 = (JComboBox)e.getSource(); seleccionado22 = (String)cb2.getSelectedItem(); int indice22 = (int)cb2.getSelectedIndex(); }}); // De…no los ComboBox con los nodos internos stringNodos2 = new Object[5]; for (int i=0; i<5;i++){ if(MPLS.nodosint[i]!= null){ stringNodos2[i]=MPLS.nodosint[i]; }} 260 CAPÍTULO 6. CAPTURA DE DATOS DE ENTRADA listaNodo1 = new JComboBox(stringNodos2); listaNodo1.setSelectedIndex(0); listaNodo1.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { JComboBox cb1= (JComboBox)e.getSource(); seleccionado = (String)cb1.getSelectedItem(); int indice = (int)cb1.getSelectedIndex(); }}); // De…no las etiquetas JLabel Encabezado = new JLabel(“Label Information Base - LIB Solo para nodos frontera.”); JLabel nomnodo= new JLabel(“Nombre del Nodo”); JLabel dirnodo = new JLabel(“Dirección IP del Nodo”); JLabel eti1 = new JLabel(“Tipo de Etiqueta”); JLabel eti2 = new JLabel(“Espacio de Etiqueta”); JLabel eti3 = new JLabel(“VPI”); JLabel eti4 = new JLabel(“VCI”); JLabel eti5 = new JLabel(“Espacio de Etiqueta”); JLabel eti19= new JLabel(“Tipo Etiqueta”); JLabel eti6 = new JLabel(“VPI”); JLabel eti7 = new JLabel(“VCI”); JLabel eti8 = new JLabel(“Dirección del LSR”); 6.4. CÓDIGO FUENTE 261 JLabel eti9 = new JLabel(“Tipo de FEC”); JLabel eti10 = new JLabel(“Dirección ‡ia FEC”); JLabel eti11 = new JLabel(“Long pre…jo FEC”); JLabel eti12 = new JLabel(“Dirección del FEC”); JLabel eti13 = new JLabel(“Reservado 1”); JLabel eti14 = new JLabel(“Reservado 2”); JLabel eti15 = new JLabel(“Nombre Interfaz”); JLabel eti16 = new JLabel(“Nombre Interfaz”); JLabel eti17 = new JLabel(“Número Interfaz”); JLabel eti18 = new JLabel(“Número Interfaz”); JLabel eti20 = new JLabel(“”); JLabel eti21 = new JLabel(“”); // De…no los botones bbtnOK = new JButton(“OK”); bbtnOK.setToolTipText(“Guarda los datos del Enlace”); bbtnOK.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(ActionEvent e){ if (seleccionado==“”jjeent.toString().length()==0jjvpient.toString().length()==0jj vcient.toString().length()==0jjseleccionado22==“”jjespetiqsal.toString().length()==0jj vpisal.toString().length()==0jjvcisal.toString().length()==0jjdirlsr.toString().length()==0jj tipofec.toString().length()==0jjfec‡ia.toString().length()==0jjfeclong.toString().length()==0jj fecdir.toString().length()==0jjnomintent.toString().length()==0jjnomintsal.toString().length()==0j jnumintent.toString().length()==0jjnumintsal.toString().length()==0){ 262 CAPÍTULO 6. CAPTURA DE DATOS DE ENTRADA JOptionPane.showMessageDialog(null,“Complete todos los campos”, “Error de Entrada”, JOptionPane.OK_OPTION); } else{ FrameConsola.areaConsola.append(“nn”); FrameConsola.areaConsola.append(“LIB ”+libnodo.getText()+“;”); FrameConsola.areaConsola.append(“Label Information Base del ”+seleccionado+“nn”); FrameConsola.areaConsola.append(seleccionado2 +“; Tipo Etiqueta de Entrada”+“nn”); FrameConsola.areaConsola.append(eent.getText()+“; Espacio Etiq de Entrada”+“nn”); FrameConsola.areaConsola.append(vpient.getText()+“; VPI de Entrada”+“nn”); FrameConsola.areaConsola.append(vcient.getText()+“; VCI de Entrada”+“nn”); FrameConsola.areaConsola.append(seleccionado22 +“; Tipo Etiqueta de Salida”+“nn”); FrameConsola.areaConsola.append(espetiqsal.getText()+“; Espacio Etiq de Salida”+“nn”); FrameConsola.areaConsola.append(vpisal.getText()+“; VPI de Salida”+“nn”); FrameConsola.areaConsola.append(vcisal.getText()+“; VCI de Salida”+“nn”); FrameConsola.areaConsola.append(dirlsr.getText()+“; Dirección del LSR”+“nn”); FrameConsola.areaConsola.append(tipofec.getText()+“; Tipo de FEC”+“nn”); FrameConsola.areaConsola.append(fec‡ia.getText()+“; Dirección ‡ia FEC”+“nn”); FrameConsola.areaConsola.append(feclong.getText()+“; Longitud pre…jo FEC”+“nn”); 6.4. CÓDIGO FUENTE 263 FrameConsola.areaConsola.append(fecdir.getText()+“; Dirección del FEC”+“nn”); FrameConsola.areaConsola.append(reser1.getText()+“; Reservado 1”+“nn”); FrameConsola.areaConsola.append(reser2.getText()+“; Reservado 2”+“nn”); FrameConsola.areaConsola.append(nomintent.getText()+“; Nombre Interfaz Entrada”+“nn”); FrameConsola.areaConsola.append(nomintsal.getText()+“; Nombre Interfaz Salida”+“nn”); FrameConsola.areaConsola.append(numintent.getText()+“; Número Interfaz Entrada”+“nn”); FrameConsola.areaConsola.append(numintsal.getText()+“; Número Interfaz Salida”+“nn”); FrameConsola.areaConsola.append(“nn”); MPLS.congralf++; MPLS.general[MPLS.congralf][0]=(“LIB ”+libnodo.getText()+“;”+ “Label Information Base del ”+ seleccionado+“nn”); MPLS.congralf++; MPLS.general[MPLS.congralf][0]=(seleccionado2 +“; Tipo Etiqueta de Entrada”); MPLS.congralf++; MPLS.general[MPLS.congralf][0]=(eent.getText()+“; Espacio Etiq de Entrada”); MPLS.congralf++; MPLS.general[MPLS.congralf][0]=(vpient.getText()+“; VPI de Entrada”); MPLS.congralf++; 264 CAPÍTULO 6. CAPTURA DE DATOS DE ENTRADA MPLS.general[MPLS.congralf][0]=(vcient.getText()+“; VCI de Entrada”); MPLS.congralf++; MPLS.general[MPLS.congralf][0]=(seleccionado22 +“; Tipo Etiqueta de Salida”); MPLS.congralf++; MPLS.general[MPLS.congralf][0]=(espetiqsal.getText()+“; Espacio Etiq de Salida”); MPLS.congralf++; MPLS.general[MPLS.congralf][0]=(vpisal.getText()+“; VPI de Salida”); MPLS.congralf++; MPLS.general[MPLS.congralf][0]=(vcisal.getText()+“; VCI de Salida”); MPLS.congralf++; MPLS.general[MPLS.congralf][0]=(dirlsr.getText()+“; Dirección del LSR”); MPLS.congralf++; MPLS.general[MPLS.congralf][0]=(tipofec.getText()+“; Tipo de FEC”); MPLS.congralf++; MPLS.general[MPLS.congralf][0]=(fec‡ia.getText()+“; Dirección ‡ia FEC”); MPLS.congralf++; MPLS.general[MPLS.congralf][0]=(feclong.getText()+“; Longitud pre…jo FEC”); MPLS.congralf++; MPLS.general[MPLS.congralf][0]=(fecdir.getText()+“; Dirección del FEC”); MPLS.congralf++; MPLS.general[MPLS.congralf][0]=(reser1.getText()+“; Reservado 1”); 6.4. CÓDIGO FUENTE 265 MPLS.congralf++; MPLS.general[MPLS.congralf][0]=(reser2.getText()+“; Reservado 2”); MPLS.congralf++; MPLS.general[MPLS.congralf][0]=(nomintent.getText()+“; Nombre Interfaz Entrada”); MPLS.congralf++; MPLS.general[MPLS.congralf][0]=(nomintsal.getText()+“; Nombre Interfaz Salida”); MPLS.congralf++; MPLS.general[MPLS.congralf][0]=(numintent.getText()+“; Número Interfaz Entrada”); MPLS.congralf++; MPLS.general[MPLS.congralf][0]=(numintsal.getText()+“; Número Interfaz Salida”); }}}); JButton btnAceptar = new JButton(“Aceptar”); btnAceptar.setToolTipText(“Guarda la Tabla LIB”); btnAceptar.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(ActionEvent e) { MPLS.congralf++; MPLS.general[MPLS.congralf][0]=(“FIN;”+“nn”); FrameConsola.areaConsola.append(“FIN;”+“nn”); FrameConsola.areaConsola.append(“nn”); 266 CAPÍTULO 6. CAPTURA DE DATOS DE ENTRADA MPLS.TablaRouting.setEnabled(true); MPLS.TablaLIB.setEnabled(false); dispose(); }}); JButton btnCancelar = new JButton(“Cancelar”); btnCancelar.setToolTipText(“Sale sin guardar los cambios”); btnCancelar.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(ActionEvent e) { dispose(); }}); // De…no los paneles JPanel panelArriba = new JPanel(); panelArriba.setLayout(new GridLayout(0,1)); panelArriba.add(Encabezado); panelArriba.setBorder(BorderFactory.createCompoundBorder( BorderFactory.createTitledBorder(“”), BorderFactory.createEmptyBorder(2,10,2,10))); JPanel paneluno = new JPanel(); paneluno.setLayout(new GridLayout(0,2)); paneluno.add(eti2); 6.4. CÓDIGO FUENTE paneluno.add(eent); paneluno.add(eti3); paneluno.add(vpient); paneluno.add(eti4); paneluno.add(vcient); paneluno.add(eti15); paneluno.add(nomintent); paneluno.add(eti17); paneluno.add(numintent); paneluno.add(eti1); paneluno.add(tipo); paneluno.setBorder(BorderFactory.createCompoundBorder( BorderFactory.createTitledBorder(“Información Entrada”), BorderFactory.createEmptyBorder(2,2,2,2))); JPanel paneldos = new JPanel(); paneldos.setLayout(new GridLayout(0,2)); paneldos.add(eti5); paneldos.add(espetiqsal); paneldos.add(eti6); paneldos.add(vpisal); paneldos.add(eti7); paneldos.add(vcisal); paneldos.add(eti16); 267 268 CAPÍTULO 6. CAPTURA DE DATOS DE ENTRADA paneldos.add(nomintsal); paneldos.add(eti18); paneldos.add(numintsal); paneldos.add(eti19); paneldos.add(tipo2); paneldos.setBorder(BorderFactory.createCompoundBorder( BorderFactory.createTitledBorder(“Información Salida”), BorderFactory.createEmptyBorder(2,2,2,2))); JPanel paneltres = new JPanel(); paneltres.setLayout(new GridLayout(0,2)); paneltres.add(eti8); paneltres.add(dirlsr); paneltres.add(eti9); paneltres.add(tipofec); paneltres.add(eti10); paneltres.add(fec‡ia); paneltres.add(eti11); paneltres.add(feclong); paneltres.add(eti12); paneltres.add(fecdir); paneltres.add(eti13); paneltres.add(reser1); paneltres.add(eti14); 6.4. CÓDIGO FUENTE paneltres.add(reser2); paneltres.setBorder(BorderFactory.createCompoundBorder( BorderFactory.createTitledBorder(“Información General”), BorderFactory.createEmptyBorder(2,2,2,2))); JPanel panelAbajo = new JPanel(); panelAbajo.setLayout(new GridLayout(0,3)); panelAbajo.add(bbtnOK); panelAbajo.add(btnAceptar); panelAbajo.add(btnCancelar); panelAbajo.setBorder(BorderFactory.createCompoundBorder( BorderFactory.createTitledBorder(“”), BorderFactory.createEmptyBorder(2,2,2,2))); JPanel panelTabla = new JPanel(); panelTabla.setLayout(new GridLayout(0,2)); panelTabla.add(nomnodo); panelTabla.add(dirnodo); panelTabla.add(listaNodo1); panelTabla.add(libnodo); panelTabla.setBorder(BorderFactory.createCompoundBorder( BorderFactory.createTitledBorder(“Información del Nodo”), BorderFactory.createEmptyBorder(2,2,2,2))); 269 270 CAPÍTULO 6. CAPTURA DE DATOS DE ENTRADA JPanel panelcontenedor = new JPanel(); panelcontenedor.setLayout(new GridLayout(1,3)); panelcontenedor.add(paneluno); panelcontenedor.add(paneldos); panelcontenedor.add(paneltres); panelcontenedor.setBorder(BorderFactory.createCompoundBorder( BorderFactory.createTitledBorder(“Tabla LIB”), BorderFactory.createEmptyBorder(2,10,2,10))); JPanel ContentPane = new JPanel(); ContentPane.setLayout(new BoxLayout(ContentPane, BoxLayout.Y_AXIS)); ContentPane.add(panelArriba); ContentPane.add(panelTabla); ContentPane.add(panelcontenedor); ContentPane.add(panelAbajo); setContentPane(ContentPane); setSize(700,450); setLocation(150,0); } public static void main(String s[]) { FrLIB frLIB = new FrLIB(); frLIB.pack(); 6.4. CÓDIGO FUENTE frLIB.setVisible(true); }} 6.4.5 Clase “FrRuteo.java” En esta clase se ingresan los datos de la tabla de ruteo. import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.text.*; import javax.swing.JTextField; import javax.swing.*; import java.text.*; import java.awt.event.*; import java.awt.*; import java.awt.event.ActionEvent; class FrRuteo extends JInternalFrame{ boolean bandera = false; …nal JTextField dirnodo; …nal JTextField dirdes; …nal JTextField longpre; public Object[] stringNodos3; public Object[] stringNodos4; …nal JButton bbtnOK; …nal JButton btnNuevo; 271 272 CAPÍTULO 6. CAPTURA DE DATOS DE ENTRADA …nal JButton btnNuevoFin; static JComboBox listanodosrut; static JComboBox listaenlaces; static JComboBox NodoExt2; static String seleccionado44; public String seleccionado2; public String signo; public FrRuteo() { super(“De…ne la Tabla de Ruteo”, false, //resizable true, //closable true, //maximizable true);//iconi…able dirnodo=new JTextField(15); dirdes=new JTextField(15); longpre=new JTextField(2); // Carga el combo de los nodos habilitados stringNodos3 = new Object[5]; for (int i=0; i<5;i++){ if(MPLS.nodosint[i]!= null){ stringNodos3[i]=MPLS.nodosint[i]; }} 6.4. CÓDIGO FUENTE listanodosrut = new JComboBox(stringNodos3); listanodosrut.setSelectedIndex(0); stringNodos4 = new Object[9]; for (int i=0; i<9;i++){ if(MPLS.nodos[i]!= null){ stringNodos4[i]=MPLS.enlaces[i]; }} // Cargo el Combox de los enlaces habilitados listaenlaces = new JComboBox(stringNodos4); listaenlaces.setSelectedIndex(0); listaenlaces.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { JComboBox cb2 = (JComboBox)e.getSource(); seleccionado2 = (String)cb2.getSelectedItem().toString(); }}); // Cargo las etiquetas JLabel lblVacio= new JLabel(“Tabla de Ruteo del:”); JLabel lblDirNodoOri= new JLabel(“Dirección del Nodo Origen”); JLabel lblDirNodoDes= new JLabel(“Dirección del Nodo Destino”); JLabel lbllonPre= new JLabel(“Longitud del Pre…jo”); JLabel lblIntSal= new JLabel(“Interfaz de Salida”); JLabel lblAclaracion=new JLabel(“Solo los nodos internos tienen 273 274 CAPÍTULO 6. CAPTURA DE DATOS DE ENTRADA tabla de ruteo”); JLabel lbltiposal= new JLabel(“Tipo Interfaz de Salida”); // De…ne los botones JButton btnAceptar = new JButton(“Aceptar”); btnAceptar.setToolTipText(“Guarda los Enlaces”); btnAceptar.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(ActionEvent e) { MPLS.guardar.setEnabled(true); MPLS.TablaRouting.setEnabled(false); dispose(); } }); JButton btnCancelar = new JButton(“Cancelar”); btnCancelar.setToolTipText(“Sale sin guardar los cambios”); btnCancelar.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(ActionEvent e) { dispose(); }}); btnNuevo = new JButton(“1 - Nueva Tabla”); btnNuevo.setToolTipText(“Carga los datos de la Tabla de Ruteo”); btnNuevo.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(ActionEvent e){ 6.4. CÓDIGO FUENTE 275 if(dirnodo.toString().length()==0){ JOptionPane.showMessageDialog(null,“Complete todos los campos”, “Error de Entrada”, JOptionPane.OK_OPTION); } else{ FrameConsola.areaConsola.append(“TABLA ROUTING ”+ dirnodo.getText()+“;”+“nn”); FrameConsola.areaConsola.append(“nn”); MPLS.congralf++; MPLS.general[MPLS.congralf][0]=(“TABLA ROUTING ”+ dirnodo.getText()+“;”+“nn”); bbtnOK.setEnabled(true); }}}); btnNuevoFin = new JButton(“3 - Fin Nueva Tabla”); btnNuevoFin.setEnabled(false); btnNuevoFin.setToolTipText(“Carga los datos de la Tabla de Ruteo”); btnNuevoFin.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(ActionEvent e){ FrameConsola.areaConsola.append(“FIN;” +“nn”); FrameConsola.areaConsola.append(“nn”); MPLS.congralf++; MPLS.general[MPLS.congralf][0]=(“FIN;” +“nn”); dirnodo.setText(“”); btnNuevo.setEnabled(true); 276 CAPÍTULO 6. CAPTURA DE DATOS DE ENTRADA bbtnOK.setEnabled(false); btnNuevoFin.setEnabled(false); }}); bbtnOK = new JButton(“2 - OK”); bbtnOK.setEnabled(false); bbtnOK.setToolTipText(“Guarda los datos de esa entrada a la Tabla de Ruteo”); bbtnOK.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(ActionEvent e){ if( dirdes.toString().length()==0jjlongpre.toString().length()==0jjseleccionado2==“”){ JOptionPane.showMessageDialog(null,“Complete todos los campos”, “Error de Entrada”, JOptionPane.OK_OPTION); } else{ FrameConsola.areaConsola.append(“”+dirdes.getText()+“ ”+longpre.getText()+ “ ”+ signo+seleccionado2+“;”+“nn”); MPLS.congralf++; MPLS.general[MPLS.congralf][0]=(“”+dirdes.getText()+“ ”+longpre.getText()+ “ ”+signo+seleccionado2+“;”); dirdes.setText(“”); longpre.setText(“”); seleccionado2=“”; bandera=true; btnNuevo.setEnabled(false); 6.4. CÓDIGO FUENTE btnNuevoFin.setEnabled(true); }}}); // Cargo el Combo con los tipo de enlace String[]tiponodo2={“IP”,“ATM”}; JComboBox NodoExt2 = new JComboBox(tiponodo2); NodoExt2.setSelectedIndex(0); NodoExt2.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { JComboBox cb4 = (JComboBox)e.getSource(); seleccionado44 = (String)cb4.getSelectedItem().toString(); int indice4 = (int)cb4.getSelectedIndex(); if (indice4==0){ signo = “-”; } else{ signo = “”;} }}); // De…no los paneles JPanel panelTabla = new JPanel(); panelTabla.setLayout(new GridLayout(0,2)); panelTabla.add(lblVacio); panelTabla.add(lblDirNodoOri); panelTabla.add(listanodosrut); 277 278 CAPÍTULO 6. CAPTURA DE DATOS DE ENTRADA panelTabla.add(dirnodo); panelTabla.setBorder(BorderFactory.createCompoundBorder( BorderFactory.createTitledBorder(“Información del Nodo”), BorderFactory.createEmptyBorder(2,10,2,2))); JPanel panel2Tabla2 = new JPanel(); panel2Tabla2.setLayout(new GridLayout(0,2)); panel2Tabla2.add(lblDirNodoDes); panel2Tabla2.add(dirdes); panel2Tabla2.add(lbllonPre); panel2Tabla2.add(longpre); panel2Tabla2.add(lblIntSal); panel2Tabla2.add(listaenlaces); panel2Tabla2.add(lbltiposal); panel2Tabla2.add(NodoExt2); panel2Tabla2.setBorder(BorderFactory.createCompoundBorder( BorderFactory.createTitledBorder(“Entrada a la Tabla”), BorderFactory.createEmptyBorder(2,10,2,2))); JPanel panel3Tabla = new JPanel(); panel3Tabla.setLayout(new GridLayout(0,3)); panel3Tabla.add(btnNuevo); panel3Tabla.add(bbtnOK); panel3Tabla.add(btnNuevoFin); 6.4. CÓDIGO FUENTE 279 panel3Tabla.setBorder(BorderFactory.createCompoundBorder( BorderFactory.createTitledBorder(“Entrada a la Tabla”), BorderFactory.createEmptyBorder(2,10,2,2))); JPanel panelArriba = new JPanel(); panelArriba.setLayout(new GridLayout(0,1)); panelArriba.add(lblAclaracion); panelArriba.setBorder(BorderFactory.createCompoundBorder( BorderFactory.createTitledBorder(“”), BorderFactory.createEmptyBorder(2,10,2,2))); JPanel panelAbajo = new JPanel(); panelAbajo.setLayout(new GridLayout(0,2)); panelAbajo.add(btnAceptar); panelAbajo.add(btnCancelar); panelAbajo.setBorder(BorderFactory.createCompoundBorder( BorderFactory.createTitledBorder(“”), BorderFactory.createEmptyBorder(2,2,2,2))); JPanel contentPane = new JPanel(); contentPane.setLayout(new BoxLayout(contentPane, BoxLayout.Y_AXIS)); contentPane.add(panelArriba); contentPane.add(panelTabla); contentPane.add(panel2Tabla2); 280 CAPÍTULO 6. CAPTURA DE DATOS DE ENTRADA contentPane.add(panel3Tabla); contentPane.add(panelAbajo); setContentPane(contentPane); setSize(450,400); setLocation(120,60); } public static void main(String s[]) { FrRuteo fru = new FrRuteo(); fru.pack(); fru.setVisible(true); }} 6.4.6 Clase “FrameConsola.java” import javax.swing.JInternalFrame; import javax.swing.JTextArea; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.*; import javax.swing.text.*; import java.awt.event.*; import java.awt.*; public class FrameConsola extends JInternalFrame { static JTextArea areaConsola; 6.4. CÓDIGO FUENTE 281 public FrameConsola() { super(“Vista Preliminar del Archivo de Con…guración”, false, //resizable false, //closable true, //maximizable true);//iconi…able areaConsola = new JTextArea(5,20); areaConsola.setEditable(true); areaConsola.setFont(new Font(“Times”, 0, 12)); JScrollPane scrollPane = new JScrollPane(areaConsola); JPanel contentPane = new JPanel(); contentPane.setLayout(new BoxLayout(contentPane, BoxLayout.Y_AXIS)); contentPane.add(scrollPane); contentPane.setBorder(BorderFactory.createCompoundBorder( BorderFactory.createTitledBorder(“”), BorderFactory.createEmptyBorder(1,1,1,1))); setContentPane(contentPane); setSize(500,300); setLocation(0,0); }} 282 CAPÍTULO 6. CAPTURA DE DATOS DE ENTRADA 6.4.7 Clase “FiltroCFG.java” Esta clase es llamada de la clase principal “MPLS.java”, donde al grabar se tiene que hacer un …ltro para permitir solo los archivos con extensión .cfg. import java.io.File; import javax.swing.*; import javax.swing.…lechooser.*; public class FiltroCFG extends FileFilter { public boolean accept(File f) { if (f.isDirectory()) { return true; } String extension = Utils.getExtension(f); if (extension != null) { if (extension.equals(Utils.cfg)){ return true; } else { return false; }} return false; } public String getDescription() { return “.cfg”; }} 6.4. CÓDIGO FUENTE 6.4.8 283 Clase “FrAyuda.java” Aquí se invoca a una página en formato .htm que contiene la ayuda del sistema y se la vuelca a un panel. import javax.swing.*; import java.net.URL; import java.awt.event.*; import java.awt.*; public class FrAyuda extends JInternalFrame { JEditorPane ventanaAyuda; JScrollPane scrollVentana; …nal JPanel content; String archivo = “Captura.htm”; public FrAyuda() { super(“Ayuda” , true, //resizable true, //closable true, //maximizable true);//iconi…able // Crea la ventana ventanaAyuda = new JEditorPane(); ventanaAyuda.setEditable(false); String s = null; // Genera la ruta de la ayuda 284 CAPÍTULO 6. CAPTURA DE DATOS DE ENTRADA try { s = “…le:” + System.getProperty(“user.dir”) + System.getProperty(“…le.separator”) + archivo; // Crea una URL al archivo html que tiene el ayuda URL ayudaURL = new URL(s); // Coloca la pagina en el JEditorPane ventanaAyuda.setPage(ayudaURL); } catch (Exception e) { FrameConsola.areaConsola.append(“No se puede crear: ” + s + ”nn”); } // Coloca la ventana en un panel con scrolls JScrollPane scrollVentana = new JScrollPane(ventanaAyuda); content = new JPanel(); content.setLayout(new BoxLayout(content, BoxLayout.Y_AXIS)); content.add(scrollVentana); content.setBorder(BorderFactory.createCompoundBorder( BorderFactory.createTitledBorder(“”), 6.4. CÓDIGO FUENTE BorderFactory.createEmptyBorder(5,5,5,5))); setContentPane(content); etSize(400,400); }} 6.4.9 Clase “FrAcerca.java” Muestra un panel cargado con información acerca del sistema. import javax.swing.JInternalFrame; import javax.swing.JPanel; import javax.swing.*; import java.awt.BorderLayout; import java.awt.event.ActionListener; import java.awt.event.ActionEvent; import java.awt.*; import java.awt.event.*; class FrAcerca extends JInternalFrame { public FrAcerca() { super(“Acerca del Sistema”, false, //resizable true, //closable false, //maximizable true);//iconi…able // De…no las etiquetas 285 286 CAPÍTULO 6. CAPTURA DE DATOS DE ENTRADA JLabel Acerca= new JLabel(“Sistema de captura de datos para el archivo de con…guración del Simulador de Redes MPLS”); JLabel Acerca1= new JLabel(“Trabajo Final de Aplicación”); JLabel Acerca2 = new JLabel(“Licenciatura en Sistema”); JLabel Acerca3 = new JLabel(“Facultad de Ciencias Exactas”); JLabel Acerca4 = new JLabel(“Universidad Nacional del Nordeste”); JLabel Acerca5 = new JLabel(“María Sol Canalis”); JLabel Acerca6 = new JLabel(“Corrientes - 2003”); // De…no los paneles JPanel panelAbajo = new JPanel(); panelAbajo.setLayout(new GridLayout(0,1)); panelAbajo.add(Acerca); panelAbajo.add(Acerca1); panelAbajo.add(Acerca2); panelAbajo.add(Acerca3); panelAbajo.add(Acerca4); panelAbajo.add(Acerca5); panelAbajo.add(Acerca6); panelAbajo.setBorder(BorderFactory.createCompoundBorder( BorderFactory.createTitledBorder(“”), BorderFactory.createEmptyBorder(2,2,2,2))); 6.4. CÓDIGO FUENTE 287 JPanel contentPane = new JPanel(); contentPane.setLayout(new BoxLayout(contentPane, BoxLayout.Y_AXIS)); contentPane.add(panelAbajo); setContentPane(contentPane); setSize(550,200); setLocation(30,30); } public static void main(String s[]) { FrAcerca frac = new FrAcerca(); frac.pack(); frac.setVisible(true); }} Capítulo 7 Ampliaciones y Conclusiones 7.1 Ampliaciones y mejoras para el Simulador de Redes MPLS Sería deseable profundizar en varios aspectos de la simulación, para un mejor estudio de esta arquitectura: 1. Mediciones de tiempos: asignando tiempos de retardo de routing y de switching, así como tiempos de espera de la red, se obtendría un modelo mucho más riguroso del que se tiene ahora. De esta manera, la aplicación calcularía el tiempo que emplea un paquete en circular por la red, y se podrían detectar cuellos de botella, etc. La forma más sencilla de controlar estos tiempos es añadir variables locales a las entidades que representan los nodos, de tal manera que cuando sea llamado un proceso de routing, se tenga en cuenta el tiempo teórico de routing que cuesta esa operación. O cuando sea una operación de switching, se tendrá en cuenta el tiempo de switching que se necesita, todos los tiempos se irán acumulando en una tabla, de tal manera que cuando el paquete llegue al …nal, podremos sumar los valores de todos los nodos por los que ha circulado para así saber el tiempo empleado. 2. Estadísticas: sería deseable mostrar estadísticas de tiempos obtenidos, a ser posible en forma grá…ca. De tal manera que se obtuviese una visión general de los resultados obtenidos. 289 290 CAPÍTULO 7. AMPLIACIONES Y CONCLUSIONES 3. Inserción directa de caminos: en el simulador actual, si queremos que un paquete siga una ruta (routing explícito), deberemos modi…car todos y cada uno de los LSRs del camino, añadiendo una entrada en la tabla de routing. Para mayor comodidad debería ser posible, con un solo clic de ratón establecer el camino que se desea que siga un paquete. 7.2 Mejoras para la Interfaz de Captura de datos de Entrada Lo que hace esta interfaz, es crear un Archivo de Con…guración, para hacerla más completa faltaría agregarle opciones de edición de archivos, o sea cargar un archivo que ya existe y poder modi…carlo como se desee. 7.3 Mejoras sobre la arquitectura MPLS ² Decisión de crear clases de envío equivalentes (FEC) en función de varios parámetros. Esta opción no está presente en el sistema actual. Debido en parte a que la idea ha ido siendo madurada a lo largo de la implementación, a medida que se iba obteniendo una perspectiva más amplia del sistema MPLS. La idea en sí, es permitir a los nodos frontera que reciben datagramas IP, tomar las decisiones de clasi…cación de los paquetes en función de la política dictada por el administrador de la red. De esta manera podríamos dirigir los paquetes IP a uno u otro nodo de la red en función de: Dirección destino: esta es la decisión actual, y la única implementada hasta ahora. Dirección origen. Interface de entrada. Calidad de Servicio. ¡Cualquier parámetro de la red!. ² Esta ampliación sólo tendría que realizarse programando la función que recibe los paquetes IP, y modi…cando la tabla Label Information Base, añadiendo el campo nuevo en función del parámetro elegido. De esta manera, cuando se reciba un paquete IP, en lugar de comprobar, como 7.4. CONCLUSIONES 291 se hace ahora, la dirección IP de destino, se comprobaría alguno de estos parámetros, y se buscaría una coincidencia en la LIB. ² Implementación de pilas dentro de los paquetes etiquetados . En la de…nición de MPLS, los paquetes pueden transportar más de una etiqueta dentro de una pila de etiquetas. Gracias a la pila de etiquetas puede llevarse a cabo tunelling dentro de la propia red MPLS (ver más información en el apartado de MPLS) Esta opción no ha sido implementada en el simulador. Para su implementación, sería necesario sacri…car cierto número de octetos del campo de datos de la célula ATM, para que estos se comportasen como una pila de etiquetas. Cada vez que un nodo reciba un paquete etiquetado, deberá extraer de la pila de etiquetas. De igual manera, cada vez que un nodo quiera enviar un paquete, deberá poner una etiqueta en la cima de la pila. 7.4 Conclusiones La evolución imparable de las tecnologías de redes hace extenuante la labor de análisis y recopilación de soluciones para la red. Más cuando hablamos de ideas abiertas a opiniones y expuestas a posibles (y probables) modi…caciones . En lo que respecta a la integración de IP sobre ATM, nunca podremos dar un “sí” rotundo y sin objecciones a una solución. Cuando comenzó este proyecto, MPOA era la solución de…nitiva, aceptada por todo el colectivo, y, tras pasar unos meses, apareció MPLS, solventando los problemas de MPOA y aportando escalabilidad y control sobre la red. De modo que una de las mayores dudas que se me plantean ahora es ¿cuánto tiempo podrá estar MPLS en la cabeza de las propuestas IP - ATM?. ¿Batirá record de permanencia como IP , que va a cumplir 25 años ?. Como se aprecia en el análisis de las soluciones, la gran ventaja de esta frenética evolución, es que ninguna idea cae en saco roto. Todas las ideas son tenidas en cuenta. Y, aunque una solución muera a los pocos meses de haber salido a la luz, seguramente habrá servido para reforzar las nuevas soluciones que la superan. Igualmente, la idea con la que partíamos hace ya un año, de que la principal ventaja que aportaban los switches era la velocidad, ha pasado a un segundo plano. La aparición de los gigabit routers hace que el problema de la velocidad en el routing sea un mal menor. La creatividad de los ingenieros y diseñadores de redes nos ha enseñado que el paradigma de la conmutación aporta mayor escalabilidad de redes, mayor control en la QoS y , lo que más importa a las 292 CAPÍTULO 7. AMPLIACIONES Y CONCLUSIONES empresas, mayor control sobre la Ingeniería del Trá…co (accounting y gestión de recursos). Siendo MPLS, a mi parecer, el ejemplo que engloba todas estas características. No podemos emplear sólo MPLS, ni podemos emplear sólo routing, deberán considerarse como un complemento. Con respecto a la elaboración de la Interfaz de Captura de Datos de Entrada, el motivo para su implementación al Simulador de Redes MPLS es que se pudo observar que a la hora de construir un Archivo de Con…guración no se entendían muy bien los párametros del mismo, por eso este trabajo se enfocó en el estudio de toda la arquitectura MPLS, y del Simulador en sí, por ser una novedad misma entre la comunidad de los Proveedores de Servicios de Internet, y viendo que esta aplicación era muy útil para entenderla, se mejoró la Interfaz con el Usuario para que aparezca fácil y amigable. Bibliografía [Cal99] E. C. Rosen; A. Viswanathan; R. Callon. Multiprotocol Label Switching Architecture. IETF-MPLS, 1999. [Cas98] E. Castillo. Curso de LaTex. Universidad de Cantabria, CantabriaEspaña, 1998. [Com00] Douglas E. Comer. Internetworking with TCP/IP Vol. I: Principles, Protocols, and Architecture. Prentice Hall, Estados Unidos, 2000. [Dav97] Yakov Rekhter;Bruce Davie. Tag Switching Architecture. Cisco Systems Inc., Estados Unidos, 1997. [Fra00] Ceballos Sierra Francisco. Jave 2 Curso de Programación. RA-MA, Madrid-España, 2000. [Mun94] M. Borsseau; M. Demange; J.M. Munier. Redes ATM. Gestión 2000, España, 1994. [Ros99] Eric C. Rosen. Multi Protocol Label Switching Architecture. Cisco Systems Inc., Estados Unidos, 1999. [Sem99] C. Semeria. Multiprotocol Label Switching: Enhancing Routing in the New Public Network. Juniper Networks Inc., White Paper, 1999. [Sta99] William Stalling. Comunicaciones y Redes de Computadores. Prentice Hall, España, 1999. [Swa99] Davie Doolan; Lawrence McGloghirie Rekhter; Rosen Swallow. MPLS Using LDP and ATM VC Switching. Cisco Systems, 1999. [Tan97] Andrew S. Tanenbaum. Redes de Computadoras. Prentice Hall Hispanoamérica, México, 1997. 293 294 BIBLIOGRAFÍA [Vup97] Xipeng Xiao; Lionel . Ni; Vibhavasu Vuppala. An Overview of IP Switching an Tag Switching. Cisco Systems Inc., Estados Unidos, 1997. Índice de Materias agregación, 125 almacenes de datos, 151 API (Application Programming Interface), 10 aplicación interactiva, 32 archivo, 215 Arequipa, 85, 92 ARP, 79 arrays, 27 asignación y distribución de etiquetas, 139 ATM, 82 AWT concepto, 30 interface grá…ca de usuario, 30 clase object, 26 clases de utilidad, 27 clase Arrays, 27 clases string y StringBu¤er, 28 Double, 29 integer, 30 codi…cación de etiquetas, 127 codigo fuente interfaz, 225 comentarios, 19 componente de control, 104 componentes de un LSR, 154 control de LSP, 124 CoS, 141 creación de clases Java, 167 CSR, 86 cuerpos ‡otantes, 68 best e¤ort, 90 bifurcaciones, 20 if, 20 if else, 20 bloque try, catch, …nally, 23 bucles, 21 do while, 22 for, 21 while, 21 datagrama IP, 80 datos especí…cos del nodo, 163 datos genéricos de a red, 163 datos generales de la red, 210 descripción de procesos, 152 descripción ‡ujo de datos, 153 descubrimiento básico, 136 descubrimiento extendido, 136 descubrimiento LDP, 136 DFD de primer nivel nuevo, 151 diagrama de contexto, 87 diagrama de contexto nuevo, 149 diccionario de datos, 155 direccionamiento, 81 tilde no de salidas, 162 C/C++, 19 cambios de letra, 66 captura de datos de entrada, 209 celula ATM, 83 clase, 7, 24 características, 24 295 296 tilde no del sistema, 162 disposición de la red, 165 división del domumento, 57 documento tipo libro, 58 documentos en Latex, 46 double, 29 ejemplo de arrays, 28 bifurcación if, 20 bifurcación if else, 20 bucle for, 21 bucle while, 21 clase, 8 comentario, 19 construcción de nombres de archivos en Java, 36 do while, 22 interface, 9 línea compuesta por tres sentencias, 18 método, 26 matriz, 28 operadores incrementales y relacionales, 16 programa no portable, 33 sentencia return, 23 ejemplos de funcionamiento, 181 enlaces, 210, 220 errores de programación carga de drivers JDBC, 38 entrada/salida por archivo, 40 fuentes de caracteres, 40 scheduling de los hilos de ejecución, 33 terminación de líneas, 39 uso de características de portabilidad, 35 uso de directorios de…nidos, 35 estilo de página, 50 ÍNDICE DE MATERIAS estilo del documento, 47 estructuras de programación, 17 etiqueta de salida, 126 etiquetas, 106 evento, 31 sources, 31 eventos listeners, 31 expresión, 18 fase de análisis, 147 FEC, 95 FiltroCFG.java, 282 forma de trabajo en Latex, 42 fraccionamiento de documentos, 63 FrAcerca.java, 285 FrameConsola.java, 280 FrAyuda.java, 283 FrEnlaces.java, 246 FrLIB.java, 255 FrPosiciones.java, 234 FrRuteo.java, 271 FTN, 111 funcionamiento de la red, 165 granularidad, 125 guardar, 215 herencia, 8, 10 ICMP, 79 IETF, 86 ILM, 111 implementación, 166 implementación de los procedimientos, 169 indice de palabras, 73 inialización de arrays, 28 inicio de sesión LDP, 138 integer, 30 métodos de la clase, 30 ÍNDICE DE MATERIAS 297 interface, 8 interfaz, 215 interfaz del usuario, 165 IP clásico sobre ATM, 90 IP sobre ATM, 84 IP Switching, 93 IPSec, 143 ITU-T, 82 módulo ventana, 178 módulo ventanaLSR, 178 manejo y distribución de etiquetas, 138 mantenimiento de sesiones LDP, 138 mensaje LDP, 135 modo de operación LDP, 135 modo de trabajo en Latex, 46 MPLS, 94, 99 MPLS.java, 225 MPOA, 86, 92 multicast, 88 Java, 3, 7 características, 4 conceptos, 1 errores de programación, 33 estructura general de un programa, 6 Jerarquía de clases en, 10 LAN virtual, 89 LANE, 84, 89 latex, 41 LC-ATM, 108 LDP, 104, 115, 133 LER, 96 LIS, 87, 90 lista de …guras y tablas, 55 listener, 31 LSP, 121 LSR, 95, 96 métodos, 25 de la clase object, 26 de objeto, 25 módulo …chero, 180 módulo general, 179 módulo gra…co, 179 módulo nodoMPLS, 169 módulo paquete, 176 módulo PaqueteIp, 177 módulo PDUAAL5, 178 módulo sim, 175 módulo TCP, 175 NBMA, 91 NHLFE, 110 NHRP, 86, 90 nodos, 218 notas al pié, 66 OOP, 6 operadores, 14 aritméticos, 14 de asignación, 14 de concatenación de cadenas de caracteres, 17 incrementales, 15 precedencia de, 17 racionales, 15 unarios, 15 OSPF, 108 página del título, 53 párrafos, 66 package, 9, 10 packages, 7 partes ‡otantes, 67 pila de etiquetas, 109 posiciones, 210, 218 preámbulo, 47 protocolo IP, 79 298 QoS, 84 rótulos, 64 RARP, 79 referencia cruzada, 71 referencias bibliográ…cas, 74 reglas de con…guración, 209 requerimientos del sistema, 166 resumen, 55 return do while, 23 routing IP, 81 RSVP, 85 salir, 215 selección de ruta, 125 sentencia, 18 sesiones LDP, 137 sistema actual, 78 software, 9 string, 28, 29 stringBu¤er, 28 swing, 32 túneles, 130 tabla de contenidos, 55 tabla LIB, 212, 220 tabla routing, 215, 223 tabla switching, 211 Tag Switching, 94 tipo célula ATM, 161 tipo datagrama IP, 160 tipo etiqueta, 160 tipo FEC, 160 tipos especiales de datos, 160 trabajo en Modo Texto, 63 TTL, 114, 126 variable clasi…cación, 10 local, 11 ÍNDICE DE MATERIAS miembro de una clase, 11 referencia, 11 variables tipo primitivo, 10 visibilidad y vida de las, 13 VC, 87 VLAN, 89 VP, 87 VPN, 142 wan, 85