Tecnología y gadgets

Socket: qué es, cómo funciona y para qué sirve en redes

10 min de lectura

Socket: qué es, cómo funciona y para qué sirve en redes

Cuando dos programas necesitan comunicarse a través de una red, necesitan algún mecanismo que permita enviar y recibir información. Uno de los conceptos fundamentales para conseguirlo es el socket.

Los sockets aparecen en servidores web, aplicaciones de mensajería, videojuegos online, servicios de streaming, programas cliente-servidor y prácticamente cualquier aplicación que necesite establecer una comunicación mediante una red.

Aunque al principio puede parecer un concepto complicado, la idea básica es bastante sencilla: un socket proporciona un punto de comunicación que permite a un programa enviar y recibir datos a través de una red.

¿Qué es un socket?

Un socket es una interfaz de comunicación que permite a un programa intercambiar datos con otro proceso, normalmente a través de una red.

Podemos imaginarlo como un extremo de una conexión:

Programa A
    │
  Socket
    │
    │ Red
    │
  Socket
    │
Programa B

Cada aplicación utiliza su socket para enviar o recibir información.

En una comunicación TCP, por ejemplo, el socket está asociado normalmente con una dirección IP y un puerto, lo que permite identificar dónde debe establecerse la comunicación.

La documentación de Python describe precisamente los sockets como una interfaz de bajo nivel para las comunicaciones de red, basada en la interfaz BSD de sockets.

¿Para qué sirve un socket?

Los sockets se utilizan para permitir que diferentes programas puedan comunicarse.

Por ejemplo, pueden utilizarse en:

  • Servidores web.
  • Aplicaciones cliente-servidor.
  • Chats.
  • Videojuegos online.
  • Transferencia de archivos.
  • Aplicaciones de escritorio conectadas a servidores.
  • Sistemas distribuidos.
  • Servicios de red.
  • Aplicaciones en tiempo real.
  • Comunicación entre procesos.

Una aplicación puede abrir un socket, conectarse a otro ordenador y comenzar a intercambiar datos.

Socket, dirección IP y puerto

Para comprender cómo funciona un socket es importante conocer tres conceptos:

Dirección IP: identifica un dispositivo o interfaz dentro de una red.

Puerto: identifica un servicio o punto de comunicación dentro de ese dispositivo.

Socket: representa el mecanismo mediante el cual el programa utiliza esa comunicación.

Podemos imaginarlo así:

IP:      192.168.1.20
Puerto:  8080
          │
          ↓
       Socket
          │
          ↓
      Aplicación

Cuando un cliente quiere conectarse a un servidor, normalmente necesita conocer su dirección y el puerto en el que está escuchando.

Por ejemplo:

192.168.1.20:8080

La combinación de dirección y puerto permite determinar el destino de la conexión.

¿Cómo funciona un socket?

El funcionamiento depende del tipo de socket y del protocolo utilizado, pero una comunicación TCP típica sigue un proceso parecido a este:

Servidor
   ↓
Crear socket
   ↓
Asociar IP + puerto
   ↓
Escuchar conexiones
   ↓
Aceptar cliente
   ↓
Intercambiar datos
   ↓
Cerrar conexión

El cliente realiza un proceso diferente:

Cliente
   ↓
Crear socket
   ↓
Conectarse al servidor
   ↓
Enviar datos
   ↓
Recibir datos
   ↓
Cerrar conexión

Una vez establecida la conexión, ambos extremos pueden intercambiar información.

Socket cliente y socket servidor

En una arquitectura cliente-servidor podemos diferenciar dos funciones.

El servidor

El servidor crea un socket y lo utiliza para esperar conexiones.

De forma simplificada:

Socket servidor
      ↓
Escuchar
      ↓
Aceptar conexión
      ↓
Cliente conectado

Una vez que recibe una conexión, puede comunicarse con el cliente.

El cliente

El cliente crea su propio socket y lo utiliza para conectarse:

Socket cliente
      ↓
IP + puerto
      ↓
Servidor

Después puede enviar solicitudes y recibir respuestas.

Este modelo aparece constantemente en aplicaciones de red.

TCP y sockets

Uno de los usos más habituales de los sockets es trabajar con TCP.

TCP proporciona una comunicación orientada a conexión y está diseñado para entregar los datos de forma fiable y ordenada.

Un ejemplo conceptual sería:

Cliente
   │
   │ TCP
   ↓
Servidor

Antes de intercambiar los datos se establece una conexión entre ambos extremos.

Por eso los sockets TCP resultan adecuados para aplicaciones en las que la integridad y el orden de la información son importantes.

Por ejemplo:

  • Transferencia de archivos.
  • Aplicaciones web.
  • Bases de datos.
  • Servicios de autenticación.
  • Comunicación entre aplicaciones.

UDP y sockets

Los sockets también pueden utilizarse con UDP.

A diferencia de TCP, UDP no establece una conexión de la misma manera y no proporciona las mismas garantías de entrega y orden.

Esto puede resultar útil cuando interesa reducir la sobrecarga y la latencia.

UDP puede utilizarse en determinados escenarios como:

  • Streaming.
  • Juegos online.
  • DNS.
  • Comunicaciones en tiempo real.
  • Aplicaciones donde cierta pérdida de paquetes puede ser aceptable.

La elección entre TCP y UDP depende de las necesidades concretas de la aplicación.

Tipos de socket

En programación de redes existen diferentes tipos de sockets.

Los dos más habituales son:

SOCK_STREAM
SOCK_DGRAM

SOCK_STREAM se utiliza habitualmente con TCP y proporciona una comunicación orientada a flujo.

SOCK_DGRAM se utiliza habitualmente con UDP y trabaja mediante datagramas.

La documentación de Python, por ejemplo, incluye estas constantes dentro de su módulo socket.

Ejemplo de socket TCP en Python

Python incorpora un módulo llamado socket que permite trabajar directamente con sockets.

Un cliente TCP sencillo podría tener una estructura como esta:

import socket

cliente = socket.socket(
    socket.AF_INET,
    socket.SOCK_STREAM
)

cliente.connect(("example.com", 80))

cliente.sendall(b"Hola servidor")

cliente.close()

El módulo socket de Python proporciona acceso a las interfaces de sockets del sistema operativo y permite crear conexiones TCP y UDP, entre otras posibilidades.

En una aplicación real, naturalmente, habría que utilizar el protocolo que espera el servidor y gestionar correctamente las respuestas y posibles errores.

Crear un servidor TCP sencillo

Un servidor utiliza el socket de una manera algo diferente.

Conceptualmente:

import socket

servidor = socket.socket(
    socket.AF_INET,
    socket.SOCK_STREAM
)

servidor.bind(("0.0.0.0", 5000))
servidor.listen()

conexion, direccion = servidor.accept()

datos = conexion.recv(1024)

print(datos)

conexion.close()

El proceso básico es:

socket()
   ↓
bind()
   ↓
listen()
   ↓
accept()
   ↓
recv()
   ↓
send()
   ↓
close()

Estas operaciones representan algunas de las funciones fundamentales utilizadas en servidores basados en sockets.

¿Qué significa bind()?

La función bind() permite asociar un socket con una dirección local.

Por ejemplo:

servidor.bind(("0.0.0.0", 5000))

Esto indica al sistema que el servidor quiere utilizar el puerto 5000 en la dirección especificada.

A partir de ahí puede comenzar a escuchar conexiones.

¿Qué hace listen()?

En un servidor TCP, listen() indica que el socket debe empezar a aceptar conexiones entrantes.

Por ejemplo:

servidor.listen()

Después de ejecutar esta instrucción, el servidor queda preparado para recibir clientes.

¿Qué hace accept()?

La función accept() espera a que llegue un cliente.

Por ejemplo:

conexion, direccion = servidor.accept()

Cuando alguien se conecta, la función devuelve información que permite comunicarse con ese cliente.

Podemos representarlo así:

Servidor
   │
   │ listen()
   ↓
Esperando...
   │
   │ Cliente conecta
   ↓
accept()
   │
   ↓
Nueva conexión

Esto permite que el socket utilizado para escuchar nuevas conexiones y el utilizado para comunicarse con un cliente puedan tener funciones diferentes.

¿Qué hacen send() y recv()?

Una vez establecida la conexión, los programas necesitan intercambiar información.

Para enviar datos podemos utilizar funciones como:

socket.send()

o:

socket.sendall()

Para recibir información:

socket.recv()

Por ejemplo:

datos = conexion.recv(1024)

El número 1024 indica el tamaño máximo de datos que queremos recibir en esa llamada.

En aplicaciones reales hay que tener en cuenta que una llamada a recv() no necesariamente devuelve todo el mensaje lógico que esperamos. La aplicación debe gestionar correctamente el protocolo y el flujo de datos.

¿Qué ocurre al cerrar un socket?

Cuando la comunicación termina, debemos cerrar el socket.

Por ejemplo:

conexion.close()

Cerrar correctamente las conexiones ayuda a liberar recursos y evita mantener conexiones abiertas innecesariamente.

En sistemas más complejos también existen mecanismos para gestionar tiempos de espera, errores y conexiones interrumpidas.

Sockets y servidores web

Aunque normalmente utilizamos un navegador y no vemos directamente los sockets, las aplicaciones web dependen de mecanismos de comunicación de red.

Los servidores pueden utilizar sockets TCP para aceptar conexiones de los clientes.

En el caso de WebSocket, existe además un protocolo específico diseñado para mantener una comunicación bidireccional entre un navegador y un servidor. MDN explica que WebSocket permite abrir una sesión interactiva en dos direcciones sin tener que realizar continuamente consultas para comprobar si existen nuevos datos.

Por ejemplo:

Navegador
    │
    │ WebSocket
    ↓
Servidor
    │
    │ Mensajes
    ↕
Navegador

Esto resulta especialmente útil para aplicaciones en tiempo real.

¿Socket y WebSocket son lo mismo?

No.

Un socket es un concepto general relacionado con una interfaz de comunicación de red.

WebSocket es un protocolo y una API específica diseñada para proporcionar comunicación bidireccional entre aplicaciones web y servidores.

Un servidor WebSocket utiliza sockets TCP para establecer la comunicación, pero WebSocket añade un protocolo específico encima de esa conexión. MDN describe precisamente un servidor WebSocket como una aplicación que escucha conexiones TCP y utiliza el protocolo WebSocket.

Por tanto:

Socket
   ↓
Mecanismo/interfaz de comunicación

WebSocket
   ↓
Protocolo de comunicación bidireccional para aplicaciones web

Socket frente a HTTP

También es habitual confundir sockets con HTTP.

HTTP es un protocolo utilizado para realizar solicitudes y respuestas entre clientes y servidores.

Un socket proporciona una interfaz mediante la cual los programas pueden comunicarse a través de la red.

De hecho, HTTP puede funcionar sobre conexiones TCP que utilizan sockets.

Una simplificación sería:

Aplicación
   ↓
HTTP
   ↓
TCP
   ↓
Socket
   ↓
Red

No significa que todos los sockets tengan que utilizar HTTP. Un socket puede utilizarse para implementar diferentes protocolos y tipos de comunicación.

¿Para qué se utilizan los sockets en videojuegos?

Los videojuegos online son otro ejemplo interesante.

Un juego puede necesitar enviar continuamente información sobre:

  • Posición de jugadores.
  • Movimientos.
  • Acciones.
  • Estado de la partida.
  • Puntuaciones.
  • Eventos.

Dependiendo de las necesidades, pueden utilizarse diferentes tecnologías y protocolos de red.

En algunos casos se utilizan conexiones TCP, UDP o soluciones especializadas para reducir la latencia.

La elección depende de si resulta más importante garantizar la entrega de todos los datos o conseguir una comunicación rápida donde algunas actualizaciones puedan perderse.

Sockets y aplicaciones de chat

Una aplicación de mensajería puede utilizar comunicaciones persistentes para intercambiar mensajes entre usuarios.

Un ejemplo simplificado sería:

Usuario A
    ↓
Servidor
    ↓
Usuario B

Cuando A envía un mensaje, el servidor puede recibirlo y posteriormente entregarlo a B.

Tecnologías como WebSocket pueden facilitar la comunicación bidireccional en aplicaciones web que necesitan recibir mensajes en tiempo real.

Ventajas de utilizar sockets

Los sockets proporcionan una interfaz flexible para construir sistemas de comunicación.

Entre sus principales ventajas encontramos:

  • Comunicación directa entre programas.
  • Compatibilidad con TCP y UDP.
  • Control sobre la comunicación de red.
  • Posibilidad de crear aplicaciones cliente-servidor.
  • Soporte para comunicaciones locales y remotas.
  • Uso en numerosos lenguajes de programación.
  • Base para implementar diferentes protocolos.

Python, C, C++, Java, PHP y otros lenguajes ofrecen diferentes mecanismos para trabajar con sockets.

Inconvenientes y dificultades

Trabajar directamente con sockets también implica asumir una mayor responsabilidad.

El programador puede tener que gestionar:

  • Conexiones interrumpidas.
  • Tiempos de espera.
  • Errores de red.
  • Datos incompletos.
  • Concurrencia.
  • Autenticación.
  • Cifrado.
  • Validación de datos.
  • Cierre de conexiones.
  • Ataques y problemas de seguridad.

Por eso, aunque un socket permite trabajar a un nivel bastante bajo, muchas aplicaciones utilizan bibliotecas y protocolos de nivel superior para simplificar el desarrollo.

¿Los sockets son importantes para aprender programación?

Sí, especialmente si quieres comprender cómo funcionan las redes informáticas y las aplicaciones cliente-servidor.

Aprender sockets permite entender conceptos como:

IP
 ↓
Puerto
 ↓
Conexión
 ↓
Envío de datos
 ↓
Recepción de datos
 ↓
Cierre

Estos conceptos aparecen detrás de muchas tecnologías que utilizamos diariamente.

Aunque posteriormente trabajes con HTTP, REST, WebSocket, gRPC u otras tecnologías, comprender qué ocurre debajo puede ayudarte a entender mucho mejor cómo se comunican las aplicaciones.

En resumen

Un socket es una interfaz que permite a un programa comunicarse con otro proceso mediante una red. Es uno de los conceptos fundamentales de la programación de redes y sirve como base para construir aplicaciones cliente-servidor.

Los sockets pueden utilizar diferentes protocolos y modelos de comunicación. Los más habituales incluyen TCP, orientado a conexiones fiables, y UDP, que prioriza una comunicación más ligera y sin las mismas garantías de entrega.

Un flujo TCP típico sería:

Servidor
   ↓
socket()
   ↓
bind()
   ↓
listen()
   ↓
accept()
   ↓
recv() / send()
   ↓
close()

Los sockets también forman parte de tecnologías de nivel superior. Por ejemplo, WebSocket utiliza conexiones TCP para proporcionar comunicación bidireccional entre navegadores y servidores.

En definitiva, si quieres entender cómo se comunican realmente los programas a través de Internet o de una red local, aprender qué es un socket es uno de los conceptos fundamentales que co

Productos recomendados

Seleccionados de nuestra tienda para este tema

Plafón LED de techo rectangular ultrafino de 23 pulgadas… Hasta -75% Plafón LED de techo rectangular ultrafino de 23 pulgadas… El precio original era: 263,92 €.El precio actual es: 65,98 €. Ver opciones
Si eres de jerseys navideños feos, este de El Regreso al… -95% Si eres de jerseys navideños feos, este de El Regreso al… El precio original era: 226,50 €.El precio actual es: 11,99 €. Añadir al carrito
Leave a comment

Carrito de compra

×

No hay productos en el carrito.