MPLS - Una Arquitectura de Backbone para la Internet del Siglo XXI.

Anuncio
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
Descargar