Un socket es la combinación de dirección IP y puerto que identifica una conversación de transporte. Gracias a esta tupla, los sistemas operativos pueden multiplexar cientos o miles de conexiones sobre la misma interfaz física sin mezclarlas.
La multiplexación permite que un servidor web atienda a múltiples clientes simultáneamente, que un mismo host aloje varios servicios y que los routers puedan distinguir flujos incluso cuando comparten IP mediante NAT.
Un socket TCP queda definido por cuatro valores: {IP_origen, puerto_origen, IP_destino, puerto_destino}. Esta cuádrupla es única en el tiempo y permite distinguir conexiones aunque los mismos hosts se comuniquen varias veces.
La suma de IP+puerto es la clave que utiliza el sistema operativo para enrutar los segmentos al socket correcto en la pila de transporte.
Cuando un servidor escucha en un puerto bien conocido (por ejemplo 443), cada conexión entrante genera un socket distinto:
listen y queda atento en el puerto elegido.Este esquema permite que cientos de clientes compartan el mismo puerto destino (443) siempre y cuando usen puertos de origen diferentes.
Un cliente suele elegir un puerto efímero, iniciar el handshake y, una vez establecida la conexión, intercambiar datos con el servidor. Cada mensaje de aplicación se encapsula en segmentos etiquetados con la cuádrupla correspondiente, lo que garantiza que la respuesta volverá al socket correcto.
Los servidores modernos pueden usar modelos bloqueantes, no bloqueantes o basados en eventos (como select, poll, epoll) para administrar cientos de sockets simultáneos sin saturar la CPU.
Una conexión HTTP típica se describe como:
Cliente: puerto aleatorio 51532 → Servidor: 203.0.113.10:80
Mientras la sesión está activa, cada segmento trae esos valores. Si otro cliente abre la web, usará el mismo IP destino y puerto 80, pero un puerto de origen diferente (por ejemplo 51533), lo que evita colisiones.
Los dispositivos NAT expanden la idea de multiplexación: traducen las cuádruplas privadas a cuádruplas públicas. Al mantener una tabla interna, pueden asociar cada puerto externo con un host interno y reenviar los segmentos apropiados.
Esta técnica permite que docenas de dispositivos compartan una sola dirección IP pública sin interferirse.
Algunas aplicaciones multiplexan lógicamente múltiples flujos sobre un mismo socket TCP (por ejemplo HTTP/2, HTTP/3 sobre QUIC). Aunque el transporte ve una sola conexión, la capa de aplicación define streams independientes con identificadores propios.
Este enfoque reduce el número de sockets abiertos y mejora la eficiencia cuando existen muchas solicitudes concurrentes entre dos hosts conocidos.
Administradores y desarrolladores pueden auditar los sockets activos para confirmar que los servicios escuchan donde corresponde.
Get-NetTCPConnection -State Listen |
Select-Object -First 5 -Property LocalAddress, LocalPort, OwningProcess
Get-NetTCPConnection -RemotePort 443 |
Select-Object -First 5 -Property LocalAddress, LocalPort, RemoteAddress, State
El primer comando lista sockets en escucha; el segundo muestra conexiones hacia el puerto 443 para verificar cuántos clientes están utilizando HTTPS desde el host actual.
El siguiente ejemplo crea un servidor eco que atiende múltiples clientes usando select para esperar eventos en varios sockets a la vez:
import select
import socket
def servidor_echo(host="0.0.0.0", puerto=5000):
servidor = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
servidor.setblocking(False)
servidor.bind((host, puerto))
servidor.listen()
sockets = {servidor}
print(f"Escuchando en {host}:{puerto}")
while True:
listos, _, _ = select.select(sockets, [], [])
for sock in listos:
if sock is servidor:
cliente, direccion = servidor.accept()
cliente.setblocking(False)
sockets.add(cliente)
print("Conexión aceptada", direccion)
else:
datos = sock.recv(1024)
if datos:
sock.sendall(datos)
else:
sockets.remove(sock)
sock.close()
servidor_echo()
Cada cliente aceptado se integra en el conjunto de sockets vigilados. select permite multiplexar los eventos de lectura sin crear un hilo por conexión, demostrando cómo la capa de transporte y la aplicación cooperan para escalar.
La multiplexación por sockets es el secreto que permite que Internet funcione a gran escala. Dominar este concepto facilita diseñar servicios resilientes, comprender capturas de red complejas y diagnosticar cuellos de botella en servidores con alta concurrencia.