Make your own free website on Tripod.com

Introducción

Preámbulo

 

 

q          Historia

q          Preámbulo

q          Definiciones

q          Componentes básicos de una red

q          Tipos de redes

q          Topología

q          Características de una red local

q          Aspectos del nivel de red

q          LAN alámbrica e inalámbrica

q          Ejemplos de redes

 

 

INTRODUCCION A LAS REDES DE DATOS

1.1 Introducción

El desarrollo del hombre desde el nivel físico de su evolución, pasando por su crecimiento en en las áreas sociales y científicas hasta llegar a la era moderna se ha visto apoyado por herramientas que extendieron su funcionalidad y poder como ser viviente.

Durante la época prehistórica, el hombre se valió de la piedra, la madera y el metal para construir extensiones de su cuerpo: Un martillo o punta de lanza de piedra, obsidiana, madera endurecida al fuego para tener un alcance mayor de sus brazos y dominar a las bestias para conseguir el sustento diario.

Después domesticó a los animales y construyó artefactos cada vez más complejos: Un arco para enviar sus "brazos" (flechas) en la distancia y subyugar a animales más peligrosos. Y así como extendió sus brazos, pronto encontró la forma de extender sus piernas para alcanzar lugares más lejanos: fabricó navíos para cruzar ríos, lagos y mares; carretas que los llevaban a lugares distantes más rapido que sus pies y con cargas mayores y hasta refinó las artes que le permitieron tener en el hogar paisajes y monumentos de la naturaleza para darse la sensación de tenerlos a su alcance en todo momento.

Finalmente, y sintiéndose conciente de su habilidad creativa, metódicamente elaboró procedimientos para organizar su conocimiento, sus recursos y manipular su entorno para su comodidad, impulsando las ciencias y mejorando su nivel de vida a costa de sacrificar el desarrollo natural de su ambiente, produciendo así todos los adelantos a los que un gran sector de la población conocemos: automóviles, aeroplanos, trasatlánticos, teléfonos, computadoras, televisiones, etc.

1.1.1 El cómputo electrónico

En el transcurso de todo este desarrollo, lo que nos interesa revisar es la evolución de un sector tecnológico: El cómputo electrónico. Este nació con las primeras computadoras en la década de los 40's con los tubos al vacío y los tableros de control enchufables. Y fue así porque la necesidad del momento era extender la rapidez del cerebro humano para realizar de algunos cálculos aritméticos y procedimientos repetitivos.

1.1.2 Las generaciones de computadoras

El esfuerzo en el cómputo electrónico se reflejó en crear unidades de procesamiento cada vez más veloces conforme la tecnología en la electrónica avanzaba. Así tenemos cuatro generaciones bien definidas: la primera con tubos al vacío, la segunda con transistores, la tercera con circuitos integrados y la cuarta con circuitos integrados que permitieron el uso de computadoras personales y el desarrollo de las redes de datos.

1.1.3 Las redes de datos

Una vez resuelto el problema de extender el poder de cálculo del cerebro humano nació o se comenzó a atacar el problema de compartir los datos y la información que ese poder de cálculo produjo, lo cual nos llevó a inventar la forma de compartir recursos (impresoras, graficadores, archivos, etc) a través de algún medio de transmisión usando una serie de reglas (proocolos) para accesar y manipular dichos recursos.

1.1.4 Los sistemas distribuidos

Las redes de computadoras nos permitieron reunir esfuerzos aislados en esfuerzos conjuntos que producían bienes mayores (sinergia). Sin embargo, en una red la forma de accesar dichos recursos va de la mano con conocer la manera de llegar a esos recursos y saber cómo manipularlos, es decir, no hay transperencia. El siguiente salto tecnológico-filosófico es extender las redes de cómputo (extensiones del poder de cómputo de cerebros humanos aislados) hacia los sistemas distribuidos (una entidad vista como un todo y conformado por múltiples cerebros ubicados en localidades alejadas unas de otras que nos ofrecen servicios y recursos sin importar su ubicación).
Y si Carl Jung está en lo correcto respecto a su teoría del conciente colectivo, parece ser que los adelantos tecnológicos se van agrupando y homogeneizando hacia un conciente colectivo tecnológico. Más información acerca de sistemas distribuidos vea [COL94]

1.2 Redes para las compañias

Cuando una persona física o moral establece una empresa siempre piensa en obtener beneficios y para esto, en muchas ocasiones se requiere de compartir recursos (impresoras, digitalizadores, computadoras, discos duros, archivos, el conocimeinto de personas, etc.) y una solución es tener una red que puede ser local, metropolitana, nacional, amplia o global, dependiendo su amplitud de la dispersión geográfica de los recursos que queremos compartir. Esos recursos deben están disponibles en el momento adecuado y que los datos o información que produzcan sean altamente confiables, esto es, que no sufran deterioro durante su transmisión. En ocasiones, será vital que contemos con réplicas de algunos recursos para que, dado el caso de un desastre en algún púnto de la red, podamos consultar o accesar un recurso similar o de respaldo.

Las compañías también se han dado cuenta que resulta más barato tener una red de computadoras en donde reparten sus procesos productivos que tener una sola supercomputadora en donde concentren todo. Las ventajas de la red son: economía, capacidad de crecimiento más granular, capacidad de soportar fallas, capacidad de tener réplicas más económicas y otras.


1.3 Redes para las personas

El desarrollo tecnológico ha permitido que las computadoras sean accesibles cada vez a mayor número de personas en sus oficinas y en sus hogares, lo cual tambiém implica que se puedan crear micronegocios de alta competitividad y con gastos mínimos. Este tipo de negocios ya no tienen el problema de contar con enormes capitales, ahora su problema es el saber en dónde accesar los recursos que necesitan para proveer bienes y servicios.

Por otro lado, cada vez es más común el usar diveros servicios (correo electrónico, fax, operaciones de compra-venta, reservaciones en hoteles y líneas aéreas, pláticas interactivas persona a persona, acceso al diario en formato electrónico, WWW y videoconferencia) desde una computadora personal en el hogar.

1.4 Aspectos sociales

Desde el momento en que un monitor en casa permite el acceso a tan variados recursos, se corre el riesgo de ver cosas indeseables. Existen en Internet diversos bancos de información accesibles desde Foros de Información (newsgroups), Boletines de Información (Bulletin Board Systems), Páginas de Web, etc.

Muchos de los bancos de datos requieren de algún tipo de permiso (proveer un nombre de usuario y clave de acceso) para accesarlos. Otros permiten el acceso abierto y aquí reside el problema principal. Podemos darnos cuenta de temas que algunos sectores de la población apoyan y que van contra nuestros principios (por ejemplo el tema del aborto, la pornografía, el racismo, etc.) y en algunos casos junto a los datos podemos ver imágenes que ofenden nuestro gusto o que pueden ser traumáticas para nuestros hijos.

Y entonces enfrentamos el problema de que este vasto terreno de información puede estar fuera de control y accesible, tal vez, a personas no aptas o no preparadas para digerirlo. Este problema es similar a controlar las emisiones de las cadenas televisivas donde se sopesan la libertad de expresión contra los principios éticos y morales.

1.5 El peligro de la transculturización

En la época moderna estamos viviendo bajo el paradigma de las modas. Se nos ha estado presionando para que tengamos en el hogar los aparatos electrónicos de moda (videos, televisores, decodificadores de cable, computadoras, teléfonos, fax, alarmas), aparatos de transporte de moda (automóvil, avión, yate, etc.), aparatos personales de moda (rasuradora eléctrica, agenda, calculadora, despertador, teléfono celular, etc.), diversiones de moda (videojuegos, viajes a lugares exóticos, centros nocturnos, clubes, conciertos, encuentros deportivos, etc) y así sucesivamente. La persona que cuenta con el mayor número de estos recursos y diversiones es la más destacada y digna de ser tomada en cuenta en conversaciones y homenajes, aunque no produzca ningún bien tangible para la sociedad. Todos estos acercamientos a las modas llevan el tiítulo lavacerebros de "progreso", "modernización", etc. y cambian totalmente la calidad de vida de las personas y la población en general.

Es tan fuerte el llamado a la "modernización", que las sociedades, al tener disponible el acceso a los medios electrónicos (por ejemplo Internet), rápidamente se van dando cuenta de costumbres y adelantos tecnológicos en todo el mundo y seguramente, si tienen o llegan a tener el recurso económico van a tratar de comprar esos adelantos. ¿ Qué país se resiste al progreso y al modernismo ? ¿ Hay otros caminos para vivir mejor ?

¿Existe alguna otra forma de vivir que no sea el de ser dueño o empleado de alguna empresa, ir a trabajar por la mañana, regresar en la noche, repetir eso todos los días y tal vez descansar los fines de semana? Ah! Y mantenerse a la moda.

Una pregunta es: ¿Cuál será la correlación entre el porcentaje de cremiento al acceso a Internet y el nivel de transculturización?

Otra pregunta es: ¿ Será todo esto un camino hacia una homogeneización de la forma de pensamiento de una sociedad global?


2. TIPOS DE REDES POR SU DISPERSION


Al crear una red, se toman en cuenta dos factores principales: el medio físico de transmisión y las reglas que rigen la transmisión de datos. Al primer factor le llamamos nivel físico y al segundo protocolos.

En el nivel físico generalmente encontramos señales de voltaje que tienen un significado preconcebido. Esas señanles se agrupan e interpretan para formar entidades llamadas paquetes de datos. La forma como se accesan esos paquetes determinan la tecnología de transmisión y se aceptan dos tipos: "broadcast" y "point-to-point".

Las redes de tipo "broadcast" se caracterizan porque todos los miembros (nodos) pueden accesar todos los paquetes que circulan por el medio de transmisión.

Las redes punto a punto sólo permiten que un nodo se conecte a otro en un momento dado.

Por la extensión de las redes "broadcast" o "punto a punto", podemos clasificarlas de acuerdo a la tabla siguiente.




2.1 Redes de Area Local

Las redes de área local son el punto de contacto de los usuarios finales. Su finalidad principal es la de intercambiar información entre grupos de trabajo y compartir recursos tales como impresoras y discos duros. Se caracterizan por tres factores: extensión, su tecnología de transmisión y su topología.

2.1.1 Extensión de las redes de área local

Su extensión va de unos cuantos metros hasta algunos kilómetros. Esto permite unir nodos que se encuentran en una misma sala de cómputo, en un edificio, en un campus o una empresa mediana y grande ubicada en una misma locación.

2.1.2 Tecnologías de transmisión de las redes de área local

Las redes tradicionales operan con medios de transmisión tales como cable de par trenzado (Unshielded Twisted Pair), cables coaxial (ya casi obsoleto porque presenta muchos problemas), fibra óptica (inmune a la mayoría de interferencias), portadoras de rayo infrarojo o láser, radio y microondas en frecuencias no comerciales. Las velocidades en las redes de área local van desde 10 Megabits por segundo ( Mbps) hasta 622 Mbps.

2.1.3 Topologías de las redes de área local

La topología de una red se refiere a la forma que ésta toma al hacer un diagrama del medio físico de transmisión y los dispositivos necesarios para regenerar la señal o manipular el tráfico. Las topologías generales son: anillo (ring), dorsal (bus), dorsal dual (dual bus), estrella (star), árbol (tree) y completas.

 


Las topologías de anillo, dorsal y árbol se adecuan mejor para redes de tipo "broadcast" y el resto para redes de tipo punto a punto.

Los estándares más comunes son el IEEE 802.3 llamado Ethernet y el IEEE 802.5 llamado Tojen Ring. Ethernet opera entre 10 y 100 Mbps. En este estándard, todo nodo escucha todos los paquetes de está red broadcast, saca una copia y examina el destinatario. Si el destinatario es el nodo mismo, lo procesa y si no lo deshecha para escuchar el siguiente. Para enviar un paquete escucha cuando el medio de transmisión esté libre. Si ocurre que dos nodos enviaron un paquete al mismo tiempo, se provoca una colisión y cada nodo vuelve a retransmitir su paquete después de esperar un tiempo aleatorio. Token Ring opera entre 4 y 16 Mbps y utiliza una ficha (token) que permite enviar paquetes al nodo que la posee mientras los otros escuchan. Una vez que un nodo termina de enviar paquetes, pasa la ficha a otro nodo para que transmita.


2.2 Redes de Area Metropolitana

Una red de área metropolitana es una versión más grande de una LAN en cuanto a topología, protocolos y medios de transmisión que abarca tal vez a un conjunto de oficinas corporativas o empresas en una ciudad. Las redes deservicio de televisión por cable se pueden considerar como MANs y, en general, a cualquier red de datos, voz o video con una extensión de una a variuas decenas de kilómetros. El estándard IEEE 802.6 define un tipo de MAN llamado DQDB por sus siglas en inglés Distributed Queue Dual Bus. Este estándard usa dos cables half-duplex por los cuales se recibe y transmiten voz y datos entre un conjunto de nodos.

2.3 Redes de Area Amplia

Una red de área amplia se expande en una zona geográfica de un país o continente. Los beneficiarios de estas redes son los que se ubican en nodos finales llamados también sistemas finales que corren aplicaciones de usuario (por ejemplo, algún procesador de palabras o un navegador de WWW). A la infraestructura que une los nodos de usuarios se le llama subred y abarca diveros aparatos de red (denominados en general como routers o enrutadores) y líneas de comunicación que une a las redes de área local. El término de subred también se aplica a una técnica para optimixzar el tráfico en una red de área local de tamaño medio.

En la mayoría de las redes de área amplia se utilizan una gran variedad de medios de transmisión para cubrir grandes distancias. La transmisión puede efectuarse por microondas, por cable de cobre, fibra óptica o alguna combinación de los anteriores. Sin omportar el medio, los datos en algún punto se convierten e interpretan como una secuencia de unos y ceros para formar marcos de información (frames), luego estos frames son ensamblados para formar paquetes y los paquetes a su vez construyen archivos o registros específicos de alguna aplicación.

Las redes clásicas se caracterizan porque utilizan routers para unir las diferentes LANs. Como en este caso los paquetes viajan de LAN en LAN a través de ciertas rutas que los routers establecen, siendo dichos paquetes almacenados temporalmente en cada router, a la subred que usa este pricipio se le conoce como punto-a-punto, almacena-y-envía o de enrutado de paquetes (point-to-point, store-and-forward, packet-switched).

Las topologías comunes en una red punto a punto son: de estrella, annilo, árbol, completa, anillos intersectados e irregular.

La posibilidad de usar el aire como medio de transmisión nos da lugar a las redes inalámbricas. Se pueden construir usando estaciones de radio o satélites que envían ondas a diferentes frecuencias para enlazar los correspondientes enrutadores. Como el alcance de estas ondas no puede ser restringido en un cierto radio, se deben tomar algunas medidas especiales para no entrar en conflicto con otras ondas y para restringir el acceso.

2.4 Red Global Internet e internets

La red Internet es aquella que sa ha derivado de un proyecto del departamento de defensa de Estados Unidos y que ahora es accesible desde más de 2 millones de nodos en todo el mundo, y cuyos servicios típicos son las conexiones con emulación de terminal telnet , la transferencia de archivos ftp , el W W W , el correo electrónico , los foros de información globales NetNEWS .

Por otro lado, se consideran como internets (con la letra "i" minúscula) a aquellas redes públicas o privadas que se expanden por todo el mundo. El asunto interesante es que estas internets pueden valerse del Internet en algunos tramos para cubrir el mundo. La restricción mayor para que una red privada se expanda en el mundo usando Internet es que puede verse atacada por usuarios del Internet. Un esquema de seguridad para este caso puede ser que, para las LANs que conforman la internet privada, cada una de ellas encripte su información antes de introducirla a Internet y se decodifique en las LANs destinos, previo intercambio de las claves o llaves de decodificación. Este tipo de esquemas se pueden lograr con el uso de firewalls .


3. PROTOCOLOS DE COMUNICACION

Un protocolo es un conjunto de reglas que indican cómo se debe llevar a cabo un intercambio de datos o información. Para que dos o más nodos en una red puedan intercambiar información es necesario que menejen el mismo conjunto de reglas, es decir, un mismo protocolo de comunicaciones.

Debido a la gran variedad de protocolos, se hizo necesario estandarizarlos y para eso se tomó un diseño estructurado o modular que produjo un modelo jerárquico conocido como modelo de referencia OSI (Open Systems Interconnection).

3.1 Jerarquías de protocolos

La idea central detrás del modelo es que, para que una aplicación que reside en un nodo A establezca comunicación con una aplicación en un nodo B, debe usar los servicios de una capa de la red. Llamemos a esa capa "capa de aplicación". La capa de aplicación le brinda un conjunto de servicios a las aplicaciones pero a su vez depende de otra capa inferior para trabajar. Llamemos a esa capa "capa de transporte de paquetes". La capa de transporte de paquetes es todo lo que necesita la de aplicaión para trabajar en la red y, a su vez, la capa de aplicación es todo lo que necesita la de transporte para comunicarse con la aplicación, de manera que tenemos un flujo de información en ambos sentidos. Bajo la capa de transporte residen otras capas con relaciones similares a las ya descritas, hasta llegar a la capa que se encarga del problema del medio físico por el cual viaja finalmente la información de manera electrónica. Llamemos a esta última capa "capa física". Por ejemplo, esta capa podría encargarse de detectar señales de voltaje en un cable de cobre y agruparlas como unos y ceros para formar un byte, y luego unir los bytes hasta formar una cadena de cierto tamaño predefinido por el protocolo y pasar esa cadena a la capa inmediata superior.

Los principios que rigen este diseño modular son:

Cada capa debe ser lo suficientemente pequeña para que sus funciones sean fácilmente entendibles.
Cada capa debe ser lo suficientemente amplia para que realice un conjunto de funciones que sean significativas para el protocolo en su conjunto.
Cada capa debe ofrecer un conjunto bien definido de funciones hacia la capa superior.
Cada capa debe poder hacer su trabajo usando los servicios provistos por la capa inferior.


En cada capa del modelo de referencia se puede hablar del protocolo de la capa n y cada entidad que reside en una capa usa una interfase para comunicarse con la capa inferior o con la capa superior. Esa interfase consta de un conjunto de operaciones y servicios bien definidos según los principios antes descritos. En un momento dado, se puede decir que existe una comunicsción virtual directa entre la capa n de una aplicación en un nodo con la capa n de otra aplicación en otro nodo.

Podemos decir que el conjunto de capas, sus principios y sus protocolos definen una arquitectura de red. De esta forma es sencillo que un fabricante produzca aparatos de red para algún nivel o niveles de la arquitectura de red.


3.2 Aspectos de diseño

Dependiendo de las funciones y servicios que cada capa debe proveer y usar, se deben atacar algunos problemas interesantes al diseñar la arquitectura de red.

En primer lugar, dado que en una red existen muchos nodos que quieren comunicarse entre sì, debe existir un mecanismo de direccionamiento que sea capaz de:

Identificar de manera única a una conexión que parte de un nodo n a un nodo x que está siendo requerida por procesos en dichos nodos.
Identificar de manera única para cada conexión a qué tipo de servicio pertenece.
Si la interfase soporta mensajes de tamaño restringido, se debe proveer un mecanismo de identificación de mensajes pequeños que pertenecen a uno mayor.
Identificar en un mismo medio diferentes canales activos simultáneos.

Debido a que algunos medios físicos no están libres de errores, se debe tener un mecanismo para detectarlos y en alguna de las capas debe haber un mecanismo para corregir el error.

Debido a los medios no libres de errores, en el caso de no poder corregir un error se debe pedir la retransmisión de datos.

Debido a que se puede perder la comunicación entre dos nodos, debe existir un mecanismo para asignar un tiempo máximo de espera en el envío o recepción de datos (timeout).
El protocolo debe contemplar la posibilidad de manejar un medio simplex, half duplex o full duplex.


3.3 Interfases y servicios

Como ya vimos, cada capa tiene un conjunto de operaciones que realizar y un conjunto de servicios que usa de otra capa. De esta manera identificamos como usuario de servicio a la capa que solicita un servicio y como proveedor a quien la da. Cuando una entidad se comunica con otra ubicada en la misma capa pero en diferentes nodos se dice que se establece comunicación entre entidades interlocutoras (peer entities).

Cada capa tiene un conjunto de servicio que ofrecer, el punto exacto donde se puede pedir el servicio se llama punto de acceso al servicio (Service Access Point, SAP). Por ejemplo, en el servicio telefónico se ofrecen conferencias persona a persona, el SAP es la roseta o jack donde se conecta el teléfono y la dirección es el número telefónico con quien se desea hablar.

En cada capa, la entidad activa recibe un bloque de datos consistente de un encabezado que tiene significado para el protocolo de esa capa y un cuerpo que contiene datos para ser procesados por esa entidad o que van dirigidos a otra capa.

3.4 Relaciones entre servicios y protocolos

Las capas ofrecen servicios de dos tipos generales: orientadas a conexión y no orientadas a conexión y los servicios obtenidos cumplen con cierta calidad de servicio que puede ser un servicio confiable (reliable) o no confiable (non reliable).

3.4.1 Servicios orientados a conexión

Los servicios orientados a conexión se caracterizan porque cumplen tres etapas en su tiempo de vida:


    • Etapa 1: Negociación del establecimiento de la conexión.

    • Etapa 2: Sesión de intercambio de datos

    • Etapa 3: Negociación del fin de la conexión



Los servicios orientados a conexión pueden ser considerados como "alambrados", es decir, que existe un conexión alambrada entre los dos interlocutores durante el tiempo de vida de la conexión.

3.4.2 Servicios no orientados a conexión

Los servicios no orientados a conexión carecen de las tres etapas antes descritas y en este caso los interlocutores envían todos paquetes de datos que componen una parte del diálogo por separado, pudiendo éstos llegar a su destino en desorden y por diferentes rutas. Es responsabilidad del destinatario ensamblar los paquetes, pedir retransmisiones de paquetes que se dañaron y darle coherencia al flujo recibido. Los servicios no orientado a conexión se justifican dentro de redes de área local en donde diversos estudios han demostrado que el número de errores es tan pequeño que no vale la pena tener un mecanismo de detección y correción de los mismos.

3.4.3 Servicios confiables y no confiables

Se dice que un servicio es confiable si nos ofrece una transmisión de datos libre de errores. Para cumplir este requisito, el protocolo debe incluir mecanismos para detectar y/o corregir errores. La corrección de errores puede hacerse con información que está incluida en en un paquete dañado o pidiendo su retransmisión al interlocutor. También es común que incluya mecanismos para enviar acuses de recibo cuando los paquetes llegan correctamente.

Se dice que un servicio es no confiable si el protocolo no nos asegura que la transmisión está libre de errores y es responsabilidad del protocolo de una capa superior (o de la aplicación) la detección y corrección de errores si esto es pertinente o estadísticamente justificable.

A un servicio que es a la vez no orientado a la conexión y no confiable se le conoce como "datagram service". Un servicio que es no orientado a la conexión pero que incluye acuse de recibo se le conoce como " acknowledged datagram service ". Un tercer tipo de servicio se le llama " request-reply " si consiste de un servicio no orientado a conexión y por cada envío de datos se espera una contestación inmmediata antes de enviar el siguiente bloque de datos. Este último servicio es útil en el modelo cliente-servidor.

Los servicios no orientado a conexión se justifican dentro de redes de área local en donde diversos estudios han demostrado que el número de errores es tan pequeño que no vale la pena tener un mecanismo de detección y correción de los mismos.


4. EL MODELO DE REFERENCIA OSI

La Organización Estándares Internacionales (ISO por sus iniciales en Inglés) emitió un modelo de referencia para la interconexión de sistemas abiertos (Open Systems Interconnection OSI) el cual formaliza el modelo prototipo explicado en secciones anteriores.



4.1 Capas del modelo de referencia





4.1.1 Capa Física

La capa física tiene que ver con el envío de bits en un medio físico de transmisión y se asegura de que si de un lado del medio se envía un 1 del otro lado se reciba ese 1. También tiene que ver con la impedancia, resistencia y otras medidas eléctricas o electrónicas del medio y de qué forma tiene (tamaño, número de patas) en conector del medio y cuáles son los tiempos aprobados para enviar o recibir una señal. También se toma en cuenta si el medio permite la comunicación simplex, half duplex o full duplex.

4.1.2 Capa de Ligado

En esta capa se toman los bits que entrega la capa física y los agrupa en algunos cientos o miles de bits para formar marcos de bits. Se puede hacer en este nivel un chequeo de errores y si no los hay enviar un marco de acuse de recibo (acknowledge). Para detectar los límites de un marco se predefinen secuencias de bits de control. Si un marco se pierde o daña en el medio físico este capa se encarga de retransmitirlo, aunque en ocasiones dicha operación provoca que un mismo frame se duplique en el destino, dado el caso es obligación de esta capa detectar tal anomalía y corregirla. También en esta capa se decide cómo accesar el medio físico.

4.1.3 Capa de Red

La capa de red se encarga de controlar la operación de la subred (medios físicos y dispositivos de enrutado). Una tarea primordial es decidir cómo hacer que los paquetes lleguen a su destino dados un origen y un destino en un formato predefinido por un protocolo. Otra función importante en este nivel es la resulocuón de cuellos de botella. En estos casos se pueden tener varias rutas para dar salida a los paquetes y en base a algunos parámetros de eficiencia o disponibilidad se eligen rutas dinámicas de salida. Otra función que se puede obtener en esta capa es el registro o reporte del tipo y cantidad de paquetes que circulan por el enrutador para efectos de cobro o de obtención de estadísticas.

4.1.4 Capa de Transporte

La obligación en esta capa es la de tomar datos de la capa de sesión y asegurarse que dichos datos llegan a su destino. En ocasiones los datos que vienen de la capa de sesión exceden el tamaño máximo de transmisión (Maximum Transmission Unit MTU) de la interfaz de red, por lo cual es necesario partirlos y enviarlos en unidades más pequeñas, lo cual da orígen a la fragmentación y ensamblado de paquetes cuyo control se realiza en esta capa.

Una vez que esta capa se encarga de procesar datos de la capa de sesión y servir de interfase con la de red, podemos afirmar que su función es la de separar a las capas superiores de los posibles cambios en el hardware de red.

Otra función en esta capa es la de multiplexar varias conexiones que tienen diferentes capacidades de transmisión para ofrecer una velocidad de transmisión adecuada a la capa de sesión. Por ejemplo, se puede decidir en un momento dado que una conexión es muy cara y que mejor se multiplexe sobre una conexión existente más barata para tener un ahorro. Estas decisiones son transparentes para la capa de sesión.

A partir de la capa de transporte (inclusive) las capas ofrecen servicios de interlocutor a interlocutor, esto es, que un programa de red en un nodo platica con otro programa similar en otro nodo de la red. En las capas inferiores esto no es posible ni requerido.

La última labor importante de la capa de transporte es ofrecer un mecanismo de nombrado que sirva para identificar y diferenciar las múltiples conexiones existentes, así como determinar en qué momento se inician y se terminan las conversaciones; es decir, en esta capa hay un mecanismo de control de flujo. Por ejemplo, si el usuario "operador" en el nodo "A" quiere iniciar una sesión de trabajo remoto (telnet) en un nodo "B", existirá una conexión que debe ser diferenciada de la conexión que el usuario "luis" necesita para transferir un archivo (ftp) del nodo "B" al nodo "A".

4.1.5 Capa de Sesión

Esta capa ofrece el servicio de establecer sesiones de trabajo entre nodos diferentes de una red. Permite el transporte de datos (spoprtado por la capa de transporte) y añade algunas facilidades para el establecimiento del flujo de datos.

Esta capa decide a quíen se le hace caso para transmitir datos entre las múltiples conexiones, una manera de hacerlo es proveer de fichas a los participantes de una conexión, de manera que aquél que tenga la ficha es el que puede transmitir (lo cual es útil en un medio half duplex). Otro servicio de esta capa es la sincronización y el establecimiento de puntos de chequeo. Por ejemplo, si se hace necesario transferir un archivo muy garnde entre dos nodos que tienen una alta probabilidad de sufrir una caída, es lógico pensar que una transmisión ordinaria nunca terminaría porque algún interlocutor se caerá y se perderá la conexión. La solución es que se establezcan cada pocos minutos un punto de chequeo de manera que si la conexión se rompe más tarde se pueda reiniciar a partir del punto de chequeo, lo cual ahorrará tiempo y permitirá tarde o temprano la terminación de la transferencia.

4.1.6 Capa de Presentación

La capa de presentación nos provee de facilidades para que podamos transmitir datos con alguna sintaxis propia para nuestras aplicaciones o para nuestro nodo. Existen computadoras que interpretan sus bytes de una manera diferente que otras (Big Endian versus Little Endian). En esta capa es posible convertir los datos a un formato independiente de los nodos que intervienen en la transmisión.

4.1.7 Capa de Aplicación

En esta capa se encuentran aplicaciones de red que nos permiten explotar los recursos de otros nodos. Dicha explotación se hace, por ejemplo, a través de una emulación de una terminal que trabaja en un nodo remoto, interpretando una gran variedad de secuencias de caracteres de contro que nos permiten desplegar en la terminal local los resultados, aún cuando éstos sean gráficos. Otra forma de explatación se da cuando transmitimos un archivo de una computadora que almacena sus archivos en un formato dado a una computadora de formato distinto. Es posible que el programa de transferencia realice las conversiones necesarias de manera que el archivo puede usarse inmediatamente bajo alguna aplicación.

4.2 Transmisión de datos en el modelo OSI

Un envío de datos típico bajo el model de referencia OSI comienza con una aplicación P en un nodo cualquiera de la red. P genera los datos D que quiere enviar a su contraparte en otro nodo. Le pasa los datos D a la capa de aplicación .


La capa de aplicación toma los datos y los encapsula añadiendo un encabezado que contiene información de control o que puede estar vacío. El paquete completo resultante se lo pasa a la capa de presentación.


La capa de presentación lo recibe y no intenta siquiera decodificar o separar los componentes del paquete, sino que lo toma como datos y le añade un encabezado con información de control de esta capa y el paquete resultante se lo envía a la capa de sesión.


La capa de sesión recibe el paquete, que también son sólo datos para ella y le añade un encabezado de control. El resultado se lo envía a la capa de transporte.


La capa de transporte recibe todo el paquete como datos y le añade su propio encabezado de control creando otro paquete que envía a la capa de red, la cual se encargará de enrutarlo a su destino apropiado, entre otras actividades que realiza. Las capas de red, ligado de datos y física toman, respectivamente, el paquete que les envía la capa superior y añaden a éste un encabezado definido por el protocolo que corresponde a cada capa y pasan el resultada a la capa inferior. La capa física traducirá el último paquete a las señales apropiadas para que viajen por el medio físico hasta el nodo destino.

En el nodo destino, la capa física toma los paquetes y les quita el encabezado de la capa física, pasando el paquete resultante a la capa de ligado de datos. La capa de ligado lo recibe y le quita el encabezado de esta capa, pasando el resultado a la capa de red, quien lo toma y le quita el encabezado de red, pasando el paquete a la capa de transporte que elimina el encabezado de transporte y pasa el resultado a la capa de sesión, quien también le quita el encabezado respectivo y pasa el paquete a la capa de presentación, que a su vez le quita el encabezado de presentación y le pasa el paquete a la capa de aplicación que, finalmente, le quita el último encabezado y le entrega el paquete de datos reales a la aplicación en el nodo destino.

De manera virtual, se establecen conexiones directas entre las capas del mismo nombre de los dos diferentes nodos. Por ejemplo, el paquete que envía la capa de red es interpretado por la capa de red en el destino y no por otra capa. Para las capas inferiores de la de red, dicho paquete fue interpretado como datos, y para las capas superiores (transporte,sesión, presentación y aplicación) como un paquete compuesto de datos y encabezado.

Por otro lado, todas las capas, excepto la de aplicación, procesan los paquetes realizando operaciones que sólo sirven para verificar que el paquete de datos real esté íntegro o para que éste llegue a su destino, sin que los datos por sí mismos sufran algún cambio.


5. EL MODELO DE REFERENCIA TCP/IP

La Agencia de Proyectos de Investigación Avanzada del Departamento de Defensa de los Estados Unidos de Norteamérica definieron un conjunto de reglas que establecieron cómo conectar computadoras entre sí para lograr el intercambio de información, soportando incluso desastres mayores en la subred. Fue así como se definió el conjunto de protocolos de TCP/IP ( TCP/IP Internet Suite of Protocols). Para los años 80 una gran cantidad de instituciones estaban interesados en conectarse a esta red que se expandió por todo EEUU. La Suite de TCP/IP consta de 4 capas principales que se han convertido en un estándard a nivel mundial.

5.1 Las capas del modelo TCP/IP

Las capas de la suite de TCP/IP son menos que las del modelo de referencia OSI, sin embargo son tan robustas que actualmente une a más de 3 millones de nodos en todo el mundo.


La capa inferior, que podemos nombrar como física respecto al modelo OSI, contiene varios estándares del Instituto de Ingenieros Electrónicos y Eléctricos (IEEE en inglés) como son el 802.3 llamado Ethernet que establece las reglas para enviar datos por cable coaxial delgado (10Base2), cable coaxial grueso (10Base5), par trenzado (10Base-T), fibra óptica (10Base-F) y su propio método de acceso, el 802.4 llamado Token Bus que puede usar estos mismos medios pero con un método de acceso diferente, el X.25 y otros estándares denominados genéricamente como 802.X.

La siguiente capa cumple, junto con la anteriormente descrita, los niveles del modelo de referencia 1,2 y 3 que es el de red. En esta capa se definió el protocolo IP también conocido como "capa de internet". La responsabilidad de este protocolo es entregar paquetes en los destinos indicados, realizando las operaciones de enrutado apropiadas y la resolución de congestionamientos o caídas de rutas.

La capa de transporte es la siguiente y está implantada por dos protocolos: el Transmission Control Protocol y el User datagram Protocol. El primero es un protocolo confiable (reliable) y orientado a conexiones, lo cual significa que nos ofrece un medio libre de errores para enviar paquetes. El segundo es un protocolo no orientado a conexiones (connectionless) y no es confiable (unreliable). El TCP se prefiere para la transmisión de datos a nivel red de área amplia y el otro para redes de área local.

La última capa definida en la suite de TCP/IP es la de aplicación y en ella se encuentran decenas de aplicaciones ampliamente conocidas actualmente. Las más populares son el protocolo de transferencia de archivos (FTP), el emulador de terminales remotas (Telnet), el servicio de resolución de nombres (Domain Name Service DNS), el WWW, el servicio de correo electrónico (Simple Mail Transfer Protocol SMTP), el servicio de tiempo en la red (Network Time Protocol NTP), el protocolo de transferencia de noticias (Network News Transfer Protocol NNTP) y muchos más.

5.2 Comparación con el modelo OSI

El model TCP/IP no tiene bieen divididas las capas de ligado de datos, presentación y sesión y la experiencia ha demostrado que en la mayoría de los casos son de poca utilidad [Tan96].

Los estándares 802.X junto con el protocolo IP realizan todas las funciones propuestas en el modelo OSI hasta la capa de red. Los protocolos TCP y UDP cumplen con la capa de transporte. Finalmente, las aplicaiones ya mencionadas son ejemplos prácticos y reales de la funcionalidad de la capa de aplicación.

5.2.1 Tipos de Comunicaciones

El modelo OSI propone tener comunicaciones orientadas y no orientadas a conexión en la capa de red, mientras que TCP/IP sólo ofrece no orientadas a conexión, mientras que OSI propone en el nivel de transporte comunicaciones orinetadas a conexión mientras que TCP/IP ofrece orientadas y no orientadas a conexión en dicha capa. [Tan96].

5.2.2 Críticas al modelo OSI

El modelo OSI tiene siete niveles que fueron propuestos debido a que IBM tenía su protocolo de siete capas SNA (Systems Network Architecture) y el comité no quiso ir contra la corriente peleando contra la preponderancia de IBM en esos días [Tan96]. Por otro lado, mientras se planeaba y discutía el modelo OSI, ya se estaba trabajando y creando redes usando TCP/IP, de manera que al estar disponible el trabajo del modelo OSI la mayoría de las compañías ya no quiso hacer el esfuerzo de migrar sus productos. En general, las críticas más importantes al modelo OSI y sus implantaciones se pueden resumir en los siguientes puntos [Tan96]:

El conjunto total de la pila de protocolos resultó sere demasiada compleja para entender e implantar.
Las capas contienen demasiadas actividades redundantes, por ejemplo, el control de errores se integra en casi todas las capas siendo que tener un único control en la capa de aplicación o presentación sería suficiente.
La enormidad de código que fue necesario para implantar el modelo OSI y su consecuente lentitud hizo que la palabra OSI se asociara a "calidad pobre", lo cual contrstó con TCP/IP que se implantó exitosamente en el sistema operativo UNIX y era gratis.
OSI tuvo poca aceptación en EEUU porque la mayoría de la gente pensó que era un estándard implantado por la comunidad europea, y todos sabemos que la tecnología o deporte que no es inventado en EEUU es discriminada rápidamente.

5.2.3 Críticas al modelo TCP/IP

El modelo TCP/IP primero fue llevado a la práctica y luego fue descrita su funcionalidad, por lo cual se acepta que no puede usarse para describir otros modelos. Las críticas en general se resumen a continuación:

El modelo no distingue bien entre servicios, interfaces y protocolos, lo cual afecta el diseño de nuevas tecnologías en base a TCP/IP.
Las capas que le faltan con respecto al modelo OSI ni siquiera se mencionan y eso es lógico porque TCP/IP fue un predecesor de OSI.
No se puede hablar propiamente de un modelo TCP/IP, pero se tiene que discutir acerca de él forzados por su uso en todo el mundo.
Algunos de los protocolos de TCP/IP fueron creados por estudiantes y para solucionar problemas viejos y las necesidades modernas requieren de otros protocolos.

Conluyendo, el modelo OSI es muy bueno como marco teórico para describir la funcionalidad de los dispositivos y protocolos que hacen funcionar una red, pero se acepta que las capas de sesión y presentación no son muy útiles [Tan96], por lo cual generalmente se usa un modelo reducido con las capas física, ligado de datos, red, transporte y apicación.




5.3 Programación en red usando sockets bajo UNIX.


BSD Sockets: Un Tutorial Introductorio
por Jim Frost y Enrique Sanchez (traducción y ejemplos)
November 22, 1989, May 1996



Los aprendices de UNIX muchas veces encontramos conceptos y facilidades que son difíciles de aprender en primera instancia. Uno de esos conceptos es la facilidad de SOCKETS. En este tutorial se explica qué son, cómo se usan y se muestran ejemplos de código fuente para su uso correcto.

Una Analogía ¿ Qué es un socket?

El socket es el método de BSD para llevar a cabo la comunicación entre procesos (Interprocess Communication o IPC). Esto quiere decir que un socket se usa para permitir que un proceso pueda platicar o intercambiar información con otro, de una manera muy parecida a cómo se usa una línea telefónica entre dos personas.

La analogía del teléfono es buena, y será usada en repetidas ocasiones para describir el comportamiento de un socket.

Instalación de un Nuevo Teléfono ¿ Cómo escuchar en la red por conexiones de socket ?

Para que una persona reciba llamadas telefónicas, primero necesita tener una línea instalada. Para que un socket pueda aceptar peticiones primero debe crearse el socket. Para crear el socket se deben seguir algunos pasos. El primero es preparar el lugar para poner el teléfono, en este caso, debemos hacer el socket con el comando socket() .

Como los sockets pueden crearse de varios tipos, debemos especificar de qué tipo lo queremos al crearlo. Una opción es indicar el formato de direccionamiento del socket. Así como el correo electrónico usa un esquema diferente para entregar correspondencia a como un teléfono funciona para lograr la comunicación, asi pueden diferir los sockets. Los dos esquemas más comunes de direccionamiento son AF_UNIX y AF_INET . El direccionamiento AF_UNIX usa senderos ( pathnames ) para identificar a los sockets y son muy útiles para la comunicación entre procesos en una misma computadora. El otro esquema, AF_INET usa direcciones de Internet (Internet Protocol Addresses o Direcciones IP) que consisten en cuatro números decimales escritos de la forma #1.#2.#3.#4, por ejemplo, (140.148.101.26). Además, cada computadora con una dirección IP puede manejar varios tipos de conexiones al mismo tiempo, cada una de ellas en un puerto distinto.

Otra opción que debemos proveer cuando creamos un socket es el tipo de socket, que indique cómo preferimos que los datos viajen por la red. Los dos tipos más comunes son SOCK_STREAM y SOCK_DGRAM . La opción SOCK_STREAM indica que los datos viajan por la red como una secuencia de letras una tras otra, mientras que SOCK_DGRAM indica que los mismos lo harán en grupos (llamados datagramas). Nosotros preferiremos SOCK_STREAM.

Después de crear un socket, debemos darle una dirección para que escuche llamadas, así como nosotros damos nuestro número telefónico a nuestros conocidos para que nos llamen. La función bind() es usada para hacer esta tarea.

Los sockets de tipo SOCK_STREAM tienen la capacidad de encolar llamadas pendientes cuando estamos ocupados en atender una llamada en particular. La función listen() es usada para establecer el máximo número de llamadas que somos capaces de encolar. Aunque no es obligatorio invocar o usar a listen(), es muy recomendable hacerlo para procesar llamadas pendientes.

Las siguientes funciones muestran cómo usar socket(), bind() y listen() para establecer un socket que acepta llamadas:

/* código para establecer un socket;
original de bzs@bu-cs.bu.edu
*/

int establece(num_puerto)
u_short num_puerto;
{ char minombre[MAXHOSTNAME+1];
int s;
struct sockaddr_in sa;
struct hostent *hp;

bzero(&sa,sizeof(struct sockaddr_in)); /* limpia nuestra direccion*/
gethostname(minombre,MAXHOSTNAME); /*Obtengo mi nombre */

hp= gethostbyname(minombre); /* Determina nuestra información */
if (hp == NULL) /* Aborto si no existo!! */
return(-1);

sa.sin_family= hp->h_addrtype; /* Esta es nuestra direccion*/
sa.sin_port= htons(num_puerto); /* Este es nuestro puerto */

/* crea socket */
if ((s=socket(AF_INET,SOCK_STREAM,0))<0)
return(-1);

if (bind(s,&sa,sizeof sa,0) < 0) {
close(s);
return(-1); /* Asigna la dirección al socket */
}

listen(s, 3); /* Encolo hasta 3 llamadas */

return(s);
}

Después de que creamos el socket, debemos esperar que alguien nos llame. La función accept() es usada para hacer esto. Esta función esperara a que alguien llame y cuando esto sucede, accept() hace una copia del teléfono original y nos la entrega. El teléfono original se queda esperando otra llamada.

La siguiente función puede ser usada para aceptar una llamada en un socket:

int descuelga_tel(s)
int s; /* s es un socket creado con establece() */
{ struct sockaddr_in isa; /* dirección del socket */
int i; /* tamano de la dirección */
int t; /* socket de la conexion */

i = sizeof(isa); /* obtiene el tamano */
getsockname(s, & isa,&i); /* obtiene el nombre del socket */

if ((t = accept(s, & isa,&i)) < 0) /* acepta la llamada y duplica */
return(-1);

return(t);
}

Así como en una central telefónica se reciben llamadas que son delegadas a una persona mientras la recepcionista se queda esperando nuevas llamadas, en UNIX usamos la función fork() para crear un nuevo proceso que atienda la llamada actual. El siguiente código muestra cómo usar la función establece() y descuelga_tel() para controlar varias conexiones simultáneas:

#include <errno.h> /* Encabezados necesarios*/
#include <signal.h> /* vea "man bind" */
#include <stdio.h> /* vea "man listen */
#include <sys/types.h> /* vea "man accept */
#include <sys/socket.h>
#include <sys/wait.h>
#include <netinet/in.h>
#include <netdb.h>

#define PORTNUM 50000 /* Puerto donde vamos a escuchar */

void bomberazo(), haz_algo();

main()
{ int s, t;

if ((s= establece(PORTNUM)) < 0) { /* instala el teléfono */
perror("establece");
exit(1);
}

signal(SIGCHLD, bomberazo); /* Para eliminar "zombis" */

for (;;) { /* Ciclo infinito para llamadas*/
if ((t= descuelga_tel(s)) < 0) { /* alguien llama */
if (errno == EINTR) /* error EINTR en accept() */
continue; /* darle chance de intentar */
perror("accept"); /* otra vez */
exit(1);
} /* Delegar esta llamada */
switch(fork()) {
case -1 : /* No se pudo delegar llamada */
perror("fork");
close(s);
close(t);
exit(1);
case 0 : /* Ya pude delegar, atiendo la */
haz_algo(t); /* llamada con haz_algo(). */
exit(0);
default : /* Soy la telefónista, espero */
close(t); /* por otra llamada */
continue;
}
}
}

/* Como atiendo llamadas delegadas, una vez que fueron atendidas
* finiquito a quien la atendió (que es un proceso hijo)
*/

void bomberazo()
{ union wait wstatus;

while(wait3(&wstatus,WNOHANG,NULL) >= 0);
}

/* Esta función haz_algo() es la que va a leer la información que
* produzca la llamada. Puede ser, por ejemplo, guardar en un
* archivo los datos, desplegarlos en pantalla o cualquier otra
* cosa.
*/

void haz_algo(s)
int s;
{
/* código tuyo para manipular la información recibida
:
:
*/
}

Haciendo la Llamada ¿Cómo llamar en el socket?


Ahora ya sabemos cómo crear un socket en el cual despachar llamadas. Así que, ¿Cómo hacemos llamadas sobre ese socket ? Los pasos para realizar una llamada es similar a como las escuchamos. Primero necesitamos el teléfono para hacer la llamada, es decir, necesitamos crear el socket. Para crearlo, usamos la función socket().

Después de conseguir el teléfono (socket), tratamos de marcar el número asignandole la dirección al socket e invocando a la función connect() . La siguiente función intenta hacer una llamada a un socket particular.

int marca_número(hostname, num_puerto)
char *hostname;
{ struct sockaddr_in sa;
struct hostent *hp;
int a, s;

/* verificamos nombre */
if ((hp= gethostbyname(hostname)) == NULL) {
errno= ECONNREFUSED; /* y dirección */
return(-1); /* error, salimos */
}

bzero(&sa,sizeof(sa)); /* limpiamos estructura*/
/* pon dirección */
bcopy(hp->h_addr,(char*)&sa.sin_addr,hp->h_length);
sa.sin_family= hp->h_addrtype;
sa.sin_port= htons((u_short)num_puerto);

/* crea socket */
if ((s= socket(hp->h_addrtype,SOCK_STREAM,0)) < 0)
return(-1);
if (connect(s,&sa,sizeof sa) < 0) { /* conexión */
close(s);
return(-1);
}
return(s);
}

Esta función regresa un teléfono (socket) ya conectado a través del cual los datos ya pueden fluir.

Conversación ¿Cómo platicar entre sockets?

Ahora que ya tenemos una conexion hecha con sockets queremos enviar datos entre ellos. Las funciones read() y write nos servirán para realizar la lectura y escritura de los mismos. La diferencia de usar las funciones read() y write() con archivos abiertos a usarlas con sockets es el número de bytes que la función regresa. Con un archivo, read() lee los bytes que se especifiquen en sus argumentos, y write() escribe tambien lo indicado en los argumentos. En un socket, esas funciones leerán o escribirán los bytes que esteén disponibles en ese momento, de manera que para leer o escribir el número deseado, es necesario realizar un ciclo de lecturao escritura hasta llegar al número deseado de bytes. Una función muy simple que realiza el ciclo mencionado se muestra enseguida:

int lee_datos(s,buf,n)
int s; /* s = socket ya conectado */
char *buf; /* buf = apuntador a un arreglo de letras */
int n; /* n = número de bytes que deseamos leer */
{ int cnt, /* cnt = bytes leidos en un instante dado */
br; /* br = bytes leidos en un paso */

cnt= 0;
br= 0;
while (cnt < n) { /* ciclo de lectura */
if ((br= read(s,buf,n-cnt)) > 0) {
cnt += br; /* incrementa bytes leidos */
buf += br; /* mueve el apuntador del buffer */
}
if (br < 0) /* si no se puede leer mando -1 */
return(-1);
}
return(cnt);
}

Una función similar debería usarse para la escritura de datos, pero se deja al lector ese ejercicio para que se divierta, y haga algo!

Colgando el teléfono ¿Cómo deshacerse de un socket después de usarlo) ?

Igual que colgamos el teléfono cuando terminamos una llamada, necesitamos cerrar la conexion que se hizo entre sockets. Para esta labor se usa la función close() , la cual debe invocarse en cada lado del socket. Si un extremo del socket es cerrado y en el otro se intenta leer o escribir, el sistema enviará un mensaje de error.

Hablando un Mismo Lenguaje (El orden de los bytes es importante)

Ahora que podemos hacer que dos computadoras platiquen entre ellas debemos tener cuidado en cómo se transmiten la informacion. Sabemos que hay diferentes formas de codificar los datos, por ejemplo usando un código ASCII o un código EBCDIC. Otro aspecto es que una misma cadena de 7 u 8 bits puede ser interpretada de dos formas diferentes: que el bit 0 sea el mas significativo y el bit 7/8 sea el menos significativo, o viceversa. Es el famoso problema de maquinas "BIG-ENDian" y "LITTLE-ENDian". Así que si comunicamos una máquina BIG-END con una LITTLE-END, es posible que un conjunto de bytes signifiquen cosas diferentes para una y otra.

Para atacar el problema del orden de bytes se usan las funciones ntohs() (netork to host short integer), htons (host to network short integer), htoni() (host to network integer),
htonl() (host to network long integer) y ntohl() (network to host long integer). Por ejemplo, para poder enviar un número entero a través de un socket en la red, primero le aplicamos la función host to network integer htoni() como se muestra enseguida.

i= htoni(i);
escribe_datos(s, &i, sizeof(i));

Y después de leer un entero de la red, debemos convertirlo con ntohi():

lee_datos(s, &i, sizeof(i));
i= ntohi(i);

Es recomendable seguir el hábito de usar estas funciones para evitar problemas del orden de bytes.

El Futuro esta en tus manos ¿Qué hacer ahora?


Usando lo que ya se ha discutido aquí debe ser suficiente para construir nuestros propios programas de comunicación con sockets. Como con todas las cosas nuevas, es buena idea revisar el código de programas ya hechos para dilucidar su funcionamiento o la aplicación novedosa de esta tecnología.

Existen muchos programas de dominio publico que usan el concepto del socket y hay muchos libros que los exploran con mucha mas profundidad de lo que aqui se hace. Al final de este documento se anexan el código de un servidor y de un cliente que usan sockets. Realizan una función muy sencilla. El servidor escucha llamadas en un puerto dado y cualquier información que reciba la vuelve a escribir al socket hacia el cliente, es decir, responde la llamada repitiendo lo que le dicen. Por otro lado, el cliente lee un renglón de texto del teclado y se lo envía al servidor, y escribe en la pantalla todo aquello que el servidor le responda.

Si tienes preguntas adicionales acerca de sockets o de este tutorial, sientete en la confianza de enviarlas a:

madd@bu-it.bu.edu
enrique@cca.pue.udlap.mx


Jim Frost Enrique Sanchez Lara
Saber Software UDLA Consultores
(617) 876-7636 (5222) 292750
madd@saber.com enrique@udlac.com.mx


/***********************************************************************
* Archivo: tutor10.c
* Creador: Enrique SL
* Proposito: Demostrar el uso de la programación en red, SERVIDOR
* Compilar con: cc -o tutor10 tutor10.c -lsocket para una SUN
**********************************************************************/
#include "inet.h" /* definiciones y rutinas propias */

main(argc,argv)
int argc;
char **argv;
{

/* declaración de descriptores de red */
/**************************************/
int sockfd, newsockfd, clilen, childpid;
struct sockaddr_in cli_addr, serv_addr;
pname = argv[0];

/* creación del socket, que es como un "pipe" pero en red */
/**********************************************************/
if ( (sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0 ) {
perror("socket opening");
exit(1);
}

/* Inicialización de dirección y puerto de red del socket */
/**********************************************************/

bzero((char*) &serv_addr, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
serv_addr.sin_port = htons(SERV_TCP_PORT);

/* Le digo al sistema que reserve el socket para mi aplicacion*/
/**************************************************************/
if (bind(sockfd,(struct sockaddr *)&serv_addr,sizeof(serv_addr))<0){
perror("binding");
exit(1);
}

/* Una vez reservado el puerto, espero por siempre por peticiones*/
/*****************************************************************/
listen(sockfd, 5);

for(;;) {

clilen = sizeof(cli_addr);
newsockfd = accept(sockfd,(struct sockaddr *)&cli_addr,&clilen);
if ( newsockfd < 0 ) {
perror("accepting");
exit(1);
}

/* Ejemplo de la creación de subprocesos */
/*****************************************/

if ((childpid = fork()) < 0 ) {
perror("forking");
exit(1);
}
else if (childpid == 0 ) {
close(sockfd);
atiende_llamada(newsockfd); /* este es el hijo */
exit(0);
}

close(newsockfd); /* aqui no llega el hijo, es el 'papa' */
}
}

/********** FIN DE TUTOR10.c ******************************************/


/***********************************************************************
* Archivo: tutor11.c
* Creador: Enrique SL
* Proposito: Demostrar la programación en red, CLIENTE
* Compilar: cc -o tutor11 tutor11.c -lsocket en una SUN
**********************************************************************/
#include "inet.h"
main(argc,argv)
int argc;
char **argv;
{
int sockfd;
struct sockaddr_in cli_addr, serv_addr;
pname = argv[0];

/* Note la diferencia con el servidor, aca se pone la direccion
* del servidor. El servidor acepta peticiones de quien sea
**************************************************************/
bzero((char*) &serv_addr, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = inet_addr(SERV_HOST_ADDR);
serv_addr.sin_port = htons(SERV_TCP_PORT);
if ( (sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0 ) {
perror("socket opening");
exit(1);
}

if ( connect(sockfd,(struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0 ) {

perror("connecting");
exit(1);
}

/* La rutina platicame lo que hace es leer del teclado o stdin
* y enviarlo al servidor, el servidor retorna lo que se le envia
* y se imprime en pantalla.
*****************************************************************/

platicame(stdin, sockfd);
close(sockfd);
exit(0);


}

 

Home | Redes |