Arquitectura para servicios basados en TCP/IP. Temporada 1: Introducción a Sockets.

Adam’s Creation by Michelangelo, www.italianreinassance.org

Motivación

Los programadores somos usuarios de cualquier cantidad de tecnologías, las cuales están soportadas por capas y capas de otras tecnologías que a su vez las soportan. Observo que en LatAm (y USA, EU, Asia) somos usuarios de tecnologías, que se ubican en capas de alta abstracción: Bootstrap, React, Django, Apache o incluso más altas: Liferay, Unity, Docker… y la lista puede continuar, e incluso el nivel de abstracción puede subir. -No está mal-, pero qué ocurre cuando queramos construir algo nuevo? Qué ocurre si queremos construir el próximo Liferay? Qué ocurre si queremos construir una nueva plataforma para arquitecturas basadas en microservicios? O si queremos conectar nuestros servicios Web de manera que no dependamos de una REST API, o tecnologías en las capas medias-altas como Ajax?. La respuesta a esto es simple: Arquitecturas basadas en modelo Cliente / Servidor, cuya tecnología de transporte de datos sea el protocolo TCP y su tecnología de enrutamiento sea el protocolo IP: es decir, remangarnos y entender cómo funcionan los sistemas operativos y los protocolos de comunicación más comunes.

Ok, el tema es éste: qué ocurre si te dicen que construyas un servidor web, con ciertas características, que las tecnologías más comunes y populares no tienen, es decir no existe en el mercado tal cosa.

Ese es el punto donde simplemente saber escribir código -o programar- no es suficiente, simplemente es una herramienta más del ingeniero de software.

Y por eso decidí escribir esta serie, para entender de manera muy muy muy muy muy superficial las cosas mínimas (lo superficial de lo mínimo!), algunas cosas que harán falta para escribir este tipo de herramientas.

La serie será ilustrada con código en C & C++.

  • T1E01: Intro, Mecanismo de intercomunicación de procesos, Sockets.
  • T1E02: Server Sockets TCP: Sockets usados por un programa servidor.
  • T1E03: Server Sockets TCP: Atando interfaces físicas, binding, sockets.
  • T1E04: Server Sockets TCP: Escuchando conexiones, listen, en el socket.
  • T1E05: Server Sockets TCP: Aceptando conexiones, accept, en el socket.
  • T1E06: Server Sockets TCP: Apagando y Cerrando, shutdown & close, en el socket.
  • T1E07: Client Sockets TCP: Sockets usados por un programa cliente.
  • T1E08: Client Sockets TCP: Conectándose a un servidor.
  • T1E09: Configuración de un socket.
  • T1E10: Obteniendo información de un socket.
  • T2 : Hilos.
  • T3: Sistema de Sincronización de Recursos.
  • T4: Web Servers & WebSockets.

T1E01: Intro, Mecanismo de intercomunicación de procesos, Sockets.ockets Servidores & Clientes….

En las arquitecturas que utilizan un modelo cliente servidor, usamos una tecnología de intercomunicación de procesos llamada Sockets. En Unix y sus derivados se llaman sockets y en Windows se llaman winsockets.

Los sockets son una abstracción de un punto por donde entran o salen datos. Como un socket se puede conectar a otro socket (no importa si es en la misma máquina o en la misma galaxia), debe existir un mecanismo de conexión. Los mecanismos de conexión de los sockets están altamente relacionado con las tecnologías físicas, sobre los que la conexión está implementada. Dado que en esta serie la tecnología base sobre la que estamos construyendo, aplicaciones, servicios etc, es TCP/IP, usaremos entonces sockets TCP/IP, cada vez que hagamos referencia a la palabra socket, estaremos haciendo también referencia a que es un socket TCP/IP.

Qué son los protocolos TCP/IP

TCP, es un protocolo de transporte de datos en la capa de transporte del modelo OSI. Al desarrollar usando este protocolo, se le asegura a los dos puntos involucrados en la comunicación la integridad y el orden de los datos, es decir, no toca estar mirando el orden en que arriva la información y si está no se ha modificado por error en el camino.

IP es un protocolo de enrutamiento de datos en la capa de red del modelo OSI. TCP está desarrollado sobre IP. Este protocolo se encarga de garantizar que la información llegue al receptor: no se ocupa de que sea rápido, eficiente etc., solo garantiza que los datos llegan (y por eso es que en internet tenemos tantas retransmisiones).

T1E02: Server Sockets TCP: Sockets usados por un programa servidor o sockets que escuchan.

Los sockets pueden ser uno de dos tipos: Servidor (y como tal escuchan) ó Cliente (y como tal, se conectan a un socket que escucha) . Nos referimos entonces a los distintos tipos de socket como Server ó Client.

Los servidores, utilizan sockets tipo listener, para generar y administrar las conexiones de los clientes que a ellos se conectan . Un socket tipo listener, es aquel que está “escuchando” mediante un puerto TCP, peticiones de clientes que desean conectarse al servidor. Es decir un socket listener ES un server socket.

Cual es el ciclo de vida de un server socket? Un server socket: nace, se ata a una interfaz (bind), escucha conexiones entrantes(listen), se repr…err las acepta (accept) y se apaga/cierra (shutdown & close).

Nace, Un server socket debe ser creado: los constituye la tecnología de direccionamiento, la tecnología de transporte y el protocolo de comunicación en el que va a operar. En general este sería el código para crear un server socket usando la librería de C:

int sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);

Los parámetros son descritos así por el manual de llamado de sistema BSD

PF_INET: Dominio de comunicaciones o protocolo que describe el tipo de comunicaciones a establecer por el socket. PF_INET, significa que dicho protocolo será Internet version 4: IPv4.

SOCK_STREAM, IPPROTO_TCP: Estos parámetros especifican el tipo de transporte usado para los datos. Este par de parámetros indican que el protocolo de transporte usado será TCP.

De esta manera se crean los sockets TCP/IP. El descriptor (int) es un valor mayor que cero y le sirve al proceso para referencia al socket creado. Cada función que llamemos que haga referencia al socket lo hará por medio de este número.

Y este sería el código para cerrar o terminar el socket:

shutdown (socket, SHUT_RDWR);
close (socket);

shutdown( socket) SHUT_RDWR: significa que el socket se cierra y que cualquier operación de lectura o escritura de datos se cancela.

Durante el transcurso de la semana iré publicando el segundo episodio: Server Sockets TCP: Sockets usados por un programa servidor.

www.julianguarin.com