ICOM 5007- SISTEMAS OPERATIVOS

 

Instructor: Héctor M Lugo Cordero

e-mail: hector.lugo@ece.uprm.edu

 

Laboratorio 9 – Programación de Sockets

I Objetivos

 

II Teoría

 

En esta práctica se estudiará el uso de Sockets para enviar información a través de una red. Los nodos (e.g. PC, enrutadores, conmutadores, etc.) utilizan el concepto de encapsulación de data a través de diferentes capas. Una capa es un conjunto de funciones que cumplen con una tarea. Existen varios modelos de referencia de capas para las redes. Los más comunes son el OSI y el TCP/IP. 

Ejemplo de una conexión utilizando capas

Recibirán una explicación breve de cómo funcionan las redes utilizando el modelo OSI que contiene 7 capas que sirven para entender mejor el funcionamiento. En la actualidad sin embargo,  a  la hora de implementar, el modelo utilizado es el TCP/IP que contiene sólo 5 capas. A continuación dos figuras para mostrar gráficamente 1) la diferencia entre los dos modelos de referencia y 2) como cada capa va insertando en la data una información que le servirá para comunicarse con la misma capa en el otro extremo de la conexión.

Modelos de referencia para redes de computadoras

Capa Física (OSI 1, TCP/IP 1): Provee la conexión de un nodo a otro. En esta capa se estudia la transmisión de ondas, codificación de señales (OFDM – Orthogonal Frequency Division Multiplexing). Además, las personas que trabajan en esta capa, se encargan del diseño de antenas para la transmisión. Dispositivos que trabajen con información de esta capa son los repetidores (repeater) y hubs. En esta capa podemos recalcar los estándares IEEE802.3 para redes alambradas y IEEE802.11 para las redes inalámbricas.

Capa de Data Link (OSI 2, TCP/IP 2): Se encarga de mayormente de manejar el control de acceso al medio (MAC) utilizando algún tipo de calendarización que típicamente es CSMA/CD (Carrier Sense Multiple Access/Collision Detection) para redes alambradas y CSMA/CA para las inalámbricas (Carrier Sense Multiple Access/Collision Avoidance). También se encuentra en esta capa otra sub capa conocida como el Logical Link Control (LLC), la cual está encargada de las mismas funciones del MAC sólo que esta es independiente del tipo de medio. Entre medio de esta y la próxima capa podemos encontrar protocolos como ARP (Adrress Resolution Protocol) y RAPR (Reverse ARP). Además cabe mencionar que en esta capa trabajan los dispositivos conocidos como puntes (bridge) y conmutadores (switch), los cuales utilizan direcciones de MAC (ver ipconfig en Windows y ifconfig en Unix) para comunicar nodos en la red.

Capa de Red (OSI 3, TCP/IP 3): Esta capa esta encargada de proveer conexión entre un nodo y otro adyacente al mismo, utilizando algoritmos de enrutamiento y direcciones de IP (Internet Protocol). Tipos de protocolos de enrutamiento para las redes alambradas son RIP, EIGRP, y OSPF; mientras que para las redes inalámbricas nos encontramos con OSPF nuevamente, OLSR, DSR entre otros. Estos protocolos establecen la mejor ruta para llegar de un extremo de la conexión a otro a través de distintas métricas entre las cuales podemos encontrar el número de saltos, la distancia física entre los extremos de un enlace, la velocidad del enlace, etc. En esta capa podemos encontrar, además de IP y los protocolos de enrutamiento, otros protocolos como ARP, RARP, ICMP, IGMP, NAT, PAT, y muchos más. Mayormente los dispositivos que trabajan en esta capa lo son los enrutadores (routers) y conmutadores capa 3 (layer 3 switches).

Comunicación de capas a través de adición de información al paquete

Capa de Transporte (OSI 4, TCP/IP 4): Esta capa provee conexión confiable entre la fuente de un mensaje y el destino del mismo. Aquí encontramos protocolos como TCP (Transport Control Protocol) y UDP (User Datagram Protocol). La diferencia fundamental entre ellos es que TCP garantiza entrega de un paquete a usando técnicas de control como ventanas de deslizamiento entre otras. Sin embargo esto consume tiempo que en ciertas aplicaciones (e.g. VoIP, video streaming, juegos online, etc.) no son aceptables. Aquí entonces entra UDP el cual inserta menos información para comunicarse con el destino haciéndolo más rápido que TCP aunque menos confiable. Sin embargo estos asuntos de confiabilidad son entonces manejados por las capas superiores. Ambos protocolos trabajan con número de puerto en lugar de direcciones IP las cuales son desconocidas a este nivel.

Capa de Sesión (OSI 5, TCP/IP 5): Esta capa, al igual que la de transporte y las siguientes, cambia sólo en los extremos de una conexión. Los nodos intermedios no trabajan con la misma. Es la tarea de esta capa de decidir en un sistema de múltiples usuarios quien tendrá acceso en que momento a los servicios de red.

Capa de Presentación (OSI 6, TCP/IP 5): En esta capa se cambia la información de data a bytes simbolicos y viceversa, para poder así comunicar aplicaciones con la red. Por ejemplo es trabajo de esta capa de distinguir entre los bytes de texto y los bytes de una foto, aplicación, etc. A diferencia de los bytes creados en la capa data link para la física que son señales, estos solo son valores de registros/variables.

Capa de Aplicación (OSI 7, TCP/IP 5): Siendo esta la última capa de la red es la que comunica al usuario con los servicios de la red, proveyendo una abstracción de la misma. Existen varios protocolos reconocidos a este nivel los cuales utilizan diferentes protocolos de transporte dependiendo de cual sea el caso. La siguiente tabla muestra algunos de estos protocolos.

Aplicación

Protocolo

Puerto

FTP (File Transfer Protocol)

TCP

20, 21

SSH (Secure Shell)

TCP

22

TELNET (Telecommunication Network)

TCP

23

SMTP (Simple Mail Transfer Protocol)

TCP

25

DNS (Domain Name Service)

UDP

53

DHCP

UDP

67, 68

TFTP (Trivial FTP)

UDP

69

HTTP (Hyper Text Transfer Protocol)

TCP

80

MYSQL

TCP

3306

RTP

UDP

5004

RTCP

UDP

5005

VoIP, IPTV, Online Games

UDP

1024

Java provee, para el envió de datos a través de una red, al menos dos clases que deciden si la transmisión será a través de UDP (DatagramSocket) o TCP (Socket). En este laboratorio se utilizará la clase Socket. Independientemente de cual sea el método de transmisión podemos recalcar unas funciones basicas:

Open: para abrir un Socket, se podria traducir tambien a un constructor.

Bind: para asociar un numero de puerto al Socket.

Accept: para aceptar una conexión entrante.

Send/recv: para enviar y recibir bytes.

Close: para terminar la conexión.

 

III Práctica

 

Van a implementar una aplicación la cual se conectará a través de un Socket de TCP con la maquina 104.3.2.10 a través del puerto 2008. Inicialmente su maquina enviará un numero entero único, el cual será asignado a cada grupo y los identificará. Luego la maquina 104.3.2.10 les responderá con un paquete cuyo contenido será un numero entero de 8 bits. La aplicación deberá procesar este numero de la siguiente manera: invertir los bits pares (0, 2, 4) luego enviar dicho numero a 104.3.2.10 donde se comparará el numero procesado recibido con el que esta localmente procesado para determinar si es correcto.

 

Deberán implementar esta aplicación como un driver POSIX, o al menos algo parecido implementando la interfaz que pueden conseguir aquí.

 

Utilizaran la siguiente estructura para enviar (recuerden que realmente trabajaran con bytes):

 

int type (2 bits): identifica el proceso (0 iniciar sesión, 1 respuesta del servidor con el numero, 2 enviar el numero procesado,  3 respuesta del servidor. Esta respuesta será 0 para OK cualquier otra cosa si no)

int number (6 bits): el numero en cuestión. O sea la data será el número de grupo, número de servidor, el número procesado, o el status final.

 

Los 2 bits más significativos son para el type y los 6 bits menos significativos para el number.