Comunicación entre Procesos en Red: Sockets y Llamadas de Sistema

Conceptos Básicos: Cliente y Servidor

Servidor: Se aplica a cualquier programa que ofrece un servicio que se puede obtener en una red. Acepta la petición desde la red, realiza el servicio y devuelve el resultado al solicitante.

Cliente: Manda una petición al servidor y espera una respuesta. Algunos mandan peticiones directamente, otros los difunden.

Interfaz Socket

Unix se desarrolló originalmente como un sistema de tiempo compartido para computadoras de un solo procesador. Está orientado al proceso, en el que cada programa de aplicación se ejecuta como un proceso de nivel de usuario. Este interactúa con el Sistema Operativo haciendo llamadas de sistema.

Los sistemas primitivos de E/S de Unix siguen un paradigma que se denomina open-read-write-close. Una de las primeras implantaciones del TCP/IP bajo Unix también utilizó dicho paradigma:

Como los protocolos de red eran más completos que los dispositivos convencionales de E/S, la interacción entre los procesos de usuario y los protocolos de red debía ser más compleja que las interacciones entre los procesos de usuario y las instalaciones convencionales de E/S.

Por ello, los diseñadores eligieron abandonar el paradigma tradicional de Unix y añadir varias llamadas nuevas del S.O. junto con una nueva biblioteca.

La base para E/S de red en BSD de Unix se centra en la abstracción conocida como socket. Es una generalización del mecanismo de acceso a archivos de Unix que proporciona un punto final para la comunicación. Los programas de aplicación también requieren que el S.O. cree un socket cuando se necesita. El sistema devuelve un entero que utiliza el programa de aplicación para hacer referencia al socket creado. La aplicación puede elegir abastecer una dirección de destino cada vez que utiliza el socket (envío de datagramas) o enlazar la dirección de destino a un socket y evadir la especificación de destino repetidamente (conexión TCP). Los sockets hacen ejecuciones exactamente iguales a los archivos o dispositivos de Unix, de manera que pueden utilizarse con operaciones tradicionales, como read y write.

Llamadas del Sistema

socket (creación del socket) -> resultado (pf, tipo, protocolo)

  • pf: familia del protocolo a utilizar.
  • tipo: tipo de comunicación:
    1. SOCK_STREAM (TCP)
    2. SOCK_DGRAM (UDP)
    3. SOCK_RAW interfaces de red
  • protocolo: protocolo específico.

fork: crea una copia del programa de aplicación en ejecución y se reemplaza con el programa deseado. La copia hereda el acceso a los sockets abiertos.

exec: La nueva aplicación detiene el acceso para todos los sockets abiertos.

close (cerrar socket)

Cuando un proceso termina de utilizar un socket, este llama a close, que cierra todos los sockets que permanecen abiertos, disminuye la cuenta de referencia para un socket y lo destruye si la cuenta llega a cero.

bind (dirección local) Establece una dirección local para asociar al socket.

bind (socket, localaddr, addrlen)

  • socket: descriptor de enteros del socket a enlazar.
  • localaddr: estructura que especifica la dirección local a la que el socket se enlaza.
  • addrlen: entero que especifica la longitud de las direcciones medidas en bytes.

bind devuelve error cuando quien llama pide un puerto de protocolo local en uso o una dirección IP no válida.

connect (establecer una conexión)

connect enlaza un destino permanente a un socket, colocándolo en el estado connected. Sirve para establecer una conexión antes de que se pueda transferir datos a través de un socket de flujo confiable.

connect (socket, destaddr, addrlen)

  • socket: descriptor entero del socket.
  • destaddr: estructura de dirección socket que especifica la dirección de destino a la que deberá enlazarse el socket.
  • addrlen: longitud de dirección destino.

connect es funcional a los protocolos subyacentes. En el caso de TCP, construye una conexión con el destino. En UDP, no hace nada más que almacenar localmente la dirección de destino.

Envío de Datos a través de un Socket

  1. send
  2. sendto (UDP)
  3. sendmsg
  4. write
  5. writev (Solo TCP, no especifica dirección de destino)

write: Se bloquea hasta que los datos se puedan transferir (es decir, si los buffers del sistema interno para el socket están llenos).

write (socket, buffer, length)

  • socket: descriptor del socket.
  • buffer: contiene la dirección de datos que se han de mandar.
  • length: bytes que manda.

Devuelve código de error para el que llama.

writev (vector escribir)
Funciona como write, pero realiza escritura de recolección (el programa escribe un mensaje sin copiarlo en los bytes de memoria).

writev (socket, iovector, vectorlen)

  • iovector: da la dirección de un arreglo de tipo iovec, que contiene punteros de los bloques de bytes que forman el mensaje junto con su longitud.
  • vectorlen: número de entradas en iovector.

send (socket, message, length, flags)

  • socket: socket a usar.
  • message: dirección de datos a enviar.
  • length: cantidad de bytes a enviar.
  • flags: controla la transmisión.

sendto (socket, message, length, flags, destaddr, addrlen)

Equivalencias:

send <=> connect

sendmsg (socket, messagestruct, flags): se utiliza en caso de que sendto sea ineficaz.

  • messagestruct: contiene información acerca del mensaje a mandar: longitud, dirección de destino y longitud de dirección.
  • flags: controla la transmisión.

Recepción de Datos a través de un Socket

  1. read
  2. readv
  3. recv (TCP)
  4. recvfrom
  5. recvmsg (UDP)

Parámetros comunes:

  • descriptor: da el descriptor de un socket o del archivo a leer.
  • buffer: dirección en memoria en la que se almacenan los datos.
  • length: número máximo de bytes que pueden leerse.

readv (descriptor, iovector, vectorlen) Utiliza el estilo de interfaz de lectura de diseminación que relocaliza los datos que entran en ubicaciones no contiguas.

  • iovector: dirección de estructura de tipo iovec.
  • vectorlen: número de entradas en iovector.

recv (socket, buffer, length, flags)

  • socket: descriptor del socket receptor.
  • buffer: dirección en memoria del mensaje.
  • length: longitud del área del buffer.
  • flags: controlan la recepción.

recvfrom (socket, buffer, length, flags, fromaddr, addrlen)

  • fromaddr: punteros de estructura de socket. Registra las direcciones de quien envía el mensaje.

recvmsg (socket, messagestruct, flags)

  • messagestruct: dirección de estructura que sostiene la dirección para el mensaje que entra, así como también las ubicaciones para la dirección de quien envía.

listen (socket, qlength)

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.