sábado, 9 de marzo de 2013

Diseño de arquitecturas de redes


Cuando se diseña una arquitectura de red hay una serie de aspectos y decisiones fundamentales que condicionan todo el proceso. Entre estos cabe mencionar los siguientes:

Direccionamiento: cada capa debe poder identificar los mensajes que envía y recibe. En ocasiones un mismo ordenador puede tener varias instancias de una misma capa, por lo que la sola identificación del ordenador puede no ser suficiente.

Normalmente cualquier protocolo admite comunicación en ambos sentidos (dúplex); pero no siempre se permite que esta ocurra de forma simultánea (full-dúplex). También se debe determinar si se definirán prioridades, y cuáles serán éstas.

En cualquier comunicación es preciso establecer un control de errores, ya que los canales de comunicación no son totalmente fiables. Es preciso decidir que código de detección y/o corrección de errores se va a utilizar, y en que capa o capas se va a llevar a cabo. Generalmente a medida que los medios de transmisión mejoran y las tasas de errores disminuyen la detección/corrección se va suprimiendo de las capas inferiores y dejando al cuidado de las más altas, ya que es un proceso costoso que puede llegar a ralentizar apreciablemente la transmisión.

En algunos casos se debe tener en cuenta la posibilidad de que los paquetes lleguen a su destino en orden diferente al de envío.

Debe contemplarse la posibilidad de que el receptor no sea capaz de ‘digerir’ la información enviada por el transmisor. Para esto es conveniente disponer de algún mecanismo de control de flujo y notificación para indicar la congestión.

Normalmente los equipos funcionan de forma óptima cuando el tamaño de los mensajes que se envían esta dentro de un cierto rango. Para evitar los problemas que puede producir el envío de mensajes muy grandes o muy pequeños se suelen contemplar mecanismos de fragmentación y reagrupamiento. Es importante que estos mecanismos estén claramente especificados para evitar la destrucción del mensaje en tránsito.

Interfaces y servicios


Debido a su importancia vamos a estudiar con más detalle que es un servicio. Empezaremos con algunas definiciones.

Llamaremos entidad a los elementos activos en cada capa. Una entidad puede ser un proceso, un componente hardware, o una combinación de ambos. Un ordenador puede tener una o varias entidades en cada capa (por ejemplo un ordenador con dos tarjetas de conexión a LAN).

Llamaremos entidades iguales o entidades pares (‘peer entities’ en inglés) a dos entidades diferentes que pertenecen a la misma capa; generalmente estarán en diferentes máquinas, pero podrían estar en la misma.

Las entidades de la capa n implementan los servicios que utiliza la capa n+1. En este caso la capa n actúa como el proveedor del servicio y la capa n+1 es el usuario del servicio. El uso que la capa n haga de los servicios de la capa n-1 es algo que no afecta ni incumbe a la capa n+1.

Los servicios están disponibles en los SAPs (Service Access Points). Los SAPs de la capa n son los puntos donde la capa n+1 puede acceder a los servicios ofertados. Cada SAP de cada entidad de la capa n tiene una dirección que le identifica de forma única en toda la red.

Denominamos interfaz al conjunto de reglas que gobiernan el intercambio de información entre capas. En una comunicación la entidad de la capa n+1 intercambia una IDU (Interface Data Unit) con la entidad de la capa n a través del SAP (ver Fig. 1-12 del Tanenbaum). La IDU esta formada por una SDU (Service Data Unit) e información de control. La SDU es la información que se transmite a la entidad equivalente (peer) en el lado contrario, y de allí a la capa n+1 a través de su SAP. La información de control es necesaria como su nombre indica para que la capa n haga correctamente su trabajo, pero no es parte de los datos mismos. En la especificación de una arquitectura solo es necesario describir la estructura de la SDU, pero no la de la IDU; ésta se describe en la interfaz, que puede ser distinta para cada implementación.

Para transferir la SDU (Service Data Unit) la entidad de la capa n puede tener que fragmentarla en varias PDUs (Protocol Data Units). Cada PDU llevará una cabecera que permitirá a la entidad de la capa n en el otro lado ensamblar de nuevo la SDU correctamente.

Servicios orientados y no orientados a conexión


En una arquitectura de redes cada capa utiliza los servicios de la capa inmediatamente inferior para comunicar con la correspondiente del otro extremo. En función de como se establezca esa comunicación suelen distinguirse dos tipos de servicios: orientados a conexión y no orientados a conexión.

En el servicio orientado a conexión, también llamado CONS (Connection Oriented Network Service), primero se establece el canal de comunicación, después se transmiten los datos, y por último se termina la conexión. Dicha ‘conexión’ se denomina circuito virtual (VC, virtual circuit). Una vez establecido el VC el camino físico que van a seguir los datos está determinado; los paquetes deben ir todos por él desde el origen al destino, y llegar en el mismo orden con el que han salido. Dado que el VC establece de forma clara el destino, los paquetes no necesitan contener su dirección. Generalmente se distinguen dos tipos de circuitos virtuales: conmutados, también llamados SVCs (Switched Virtual Circuits), y permanentes, conocidos también como PVCs (Permanent Virtual Circuits). Los SVCs se establecen y terminan a petición del usuario, normalmente cuando hay paquetes que se quieren transmitir. Los PVCs están establecidos todo el tiempo que la red está operativa (o al menos eso es lo que se pretende). Al hablar de circuitos utilizaremos las denominaciones ‘establecer’ y ‘terminar’ en vez de abrir y cerrar, ya que estos términos tienen un significado completamente opuesto según se trate de ingenieros informáticos o electrónicos (para un ingeniero electrónico un circuito esta abierto cuando esta interrumpido, es decir cuando no puede viajar por el ninguna señal).

En el servicio no orientado a conexión, llamado también CLNS (ConnectionLess Network Service) la comunicación se establece de manera menos formal. Cuando una entidad tiene información que transmitir sencillamente la envía en forma de paquetes, confiando que estos llegaran a su destino mas pronto o mas tarde. No se establece previamente un VC ni otro tipo de canal de comunicación extremo a extremo; los paquetes pueden ir por caminos físicos diversos, y deben incluir cada uno la dirección de destino. Los paquetes pueden ser almacenados por nodos intermedios de la red, y reenviados mas tarde. Aunque lo normal es que lleguen en el mismo orden con que han salido, esto no esta garantizado como ocurría en el servicio orientado a conexión debido al almacenamiento en nodos intermedios y a la diversidad de caminos físicos posibles. A los paquetes enviados en un servicio no orientado a conexión se les denomina datagramas, ya que cada paquete viaja hacia su destino de forma completamente independiente de los demás como si fuera un telegrama.

Generalmente se suelen explicar los modelos orientado y no orientado a conexión con dos analogías: el sistema telefónico y el sistema postal. El sistema telefónico es un ejemplo de servicio orientado a conexión, mientras que el sistema postal es un servicio no orientado a conexión. La analogía es bastante exacta salvo por el hecho de que en redes telemáticas la diferencia en el tiempo de entrega del mensaje entre servicios CONS y CLNS no es tan grande como la anterior comparación podría hacer pensar.

En cualquiera de los dos tipos de servicio antes mencionados es posible que se produzca pérdida de información; también puede ocurrir que el tiempo de envío del paquete, también llamado retardo o latencia (‘delay’ y ‘latency’ respectivamente en inglés) sea demasiado grande o fluctúe dentro de un amplio rango debido a la carga o congestión en la red (el término inglés usado para denominar dicha fluctuación es jitter, que literalmente significa mieditis, temblar de miedo). En algunos casos se requiere una entrega fiable, es decir que se garantice la entrega de los paquetes, o un retardo y/o jitter garantizados, o sea no superiores a un determinado valor. Por ejemplo si transferimos un fichero, normalmente dividiéndolo en múltiples paquetes, necesitaremos un servicio fiable en la entrega, pero podemos tolerar un retardo o jitter más o menos grande; por el contrario la voz, o el vídeo (imagen en movimiento) toleran un pequeño porcentaje de pérdidas, pero requieren un retardo y un jitter reducidos y constantes. Cuando al establecer una comunicación se solicita un nivel mínimo para alguno de éstos parámetros se dice que se requiere una calidad de servicio (llamada QoS, Quality of Service). La calidad de servicio estipula unos mínimos que la red ha de satisfacer para efectuar la conexión, por ejemplo 'transmisión fiable con un retardo no superior a 100 ms'; es posible que la red no sea capaz de satisfacer la calidad solicitada, en cuyo caso podría hacer una propuesta alternativa, a modo de regateo (por ejemplo, ‘no puedo asegurar 100 ms de retardo, lo mínimo es 250ms, ¿estás conforme?’) Una vez pactadas las condiciones de la conexión éstas actúan a modo de contrato que obliga a la red a dar la calidad de servicio prometida al usuario. No todos los protocolos o redes ofrecen la posibilidad de negociar calidades de servicio; en estos casos el protocolo simplemente aprovecha los medios disponibles lo mejor que puede, intentando evitar las congestiones y situaciones críticas en lo posible, y repartir los recursos entre los usuarios de manera mas o menos equilibrada; esta estrategia se denomina del ‘mejor esfuerzo’ (o también ‘best effort’). Como ejemplos de redes con QoS podemos citar ATM, como ejemplos de redes ‘best effort’ podemos mencionar TCP/IP (la Internet) y Ethernet.

Primitivas de servicio


Recordemos que, en el modelo de capas, cada capa ofrece sus servicios a la siguiente. El servicio se define por un conjunto de operaciones u órdenes que la capa superior puede mandar a la capa inferior. Dicho conjunto de operaciones se denomina primitivas.

Vamos a analizar en detalle las primitivas que participan en el establecimiento y terminación de una conexión entre la capa n de dos sistemas llamados A y B. La entidad A.n (es decir, la capa n del sistema A) inicia la conexión emitiendo la primitiva CONNECT.request, que provoca la transferencia de una IDU (Interface Data Unit) a través del SAP (Service Access Point) a la entidad A.n-1; ésta extrae la información de control y la interpreta creando la SDU (Service data Unit), que convierte en una o varias PDUs (Protocol Data Units); las PDUs son transferidas a B.n-1, que regenera a partir de ello la SDU, luego la información de control correspondiente y con ambos la IDU; una vez dispone de la IDU la transmite a B.n a través del SAP mediante la primitiva CONNECT.indication, que le indica a B.n que alguna entidad desea establecer conexión con ella. La entidad B.n emite entonces la primitiva CONNECT.response para indicar si acepta o rechaza la conexión (las primitivas pueden llevar parámetros y sería aquí donde se indicaría esto). La respuesta se traduce en un paquete que B.n-1 envía a A.n-1, el cual informa a A.n de la situación mediante la primitiva CONNECT.confirm.

Obsérvese que el mismo evento origina diferentes primitivas en cada lado. Una CONNECT.request produce una CONNECT.indication en el lado contrario, y la CONNECT.response se convierte en CONNECT.confirm. Existe una cierta simetría entre las primitivas, ya que a una CONNECT.request siempre le corresponderá una CONNECT.indication en el lado opuesto (salvo que falle la comunicación).

En este ejemplo hemos hecho un servicio confirmado, es decir, hemos verificado que la conexión se establecía, para lo cual ha tenido que enviarse un paquete en cada sentido. Se podría haber hecho una conexión no confirmada, para lo cual sencillamente se habría emitido la CONNECT.request y la CONNECT.indication.

Una vez establecida la conexión lo normal sería transferir datos, y finalmente terminar la conexión. Un ejemplo del conjunto de primitivas que se emitirían a lo largo de una conexión podría ser el siguiente:


En A:                                                                    En B:

CONNECT.request
CONNECT.indication
CONNECT.response
CONNECT.confirm
DATA.request
DATA.indication
DATA.request
DATA.indication
DISCONNECT.request
DISCONNECT.indication


Aquí hemos introducido cuatro nuevas primitivas para poder transferir datos y terminar la conexión. Obsérvese que como antes una primitiva request va seguida siempre de una indication en el lado contrario. En este ejemplo hemos supuesto que se intercambiaban únicamente dos paquetes de datos.

Como ya hemos dicho las primitivas pueden llevar parámetros, y de hecho casi siempre los llevan. Por ejemplo una CONNECT.request llevará la máquina con la que se desea conectar, una CONNECT.indication dirá la máquina que quiere conectar con nosotros, etc. La descripción detallada de estos argumentos, su significado, etc., no es parte de la especificación de las primitivas (y por tanto del servicio) sino del protocolo. El protocolo puede modificarse sin necesidad de cambiar las primitivas. Por ejemplo, un protocolo puede establecer que el servicio de establecimiento de conexión sea confirmado y otro que no lo sea, y ambos pueden utilizar el mismo conjunto de primitivas antes descrito.

Una vez más diremos que la interfaz no forma parte del protocolo. Por ejemplo imaginemos en el caso anterior que las entidades A.n y A.n-1 acuerdan que la SDU estará codificada en EBCDIC, mientras que B.n y B.n-1 acuerdan utilizar ASCII. Si el protocolo de la capa n-1 establece que la PDU estará en ASCII, entonces A.n-1 sabe que deberá realizar la conversión de códigos cada vez que construya una PDU a partir de una SDU, o viceversa.

No hay comentarios:

Publicar un comentario