Ir al contenido
· 15 min de lectura

IP, puertos y sockets: qué son y cómo funcionan

En una frase: La IP dice a qué ordenador va cada paquete, los routers deciden por dónde y el puerto dice a qué programa. Un socket es lo que une las tres cosas.

Lo que vas a aprender

  • Distinguir una IP privada de una pública y explicar cómo NAT deja que toda tu casa comparta una sola.
  • Entender cómo viaja un paquete de router en router sin que nadie conozca el camino entero.
  • Explicar qué es un puerto, por qué la web usa el 80 y el 443 y qué es un socket.
  • Averiguar con la terminal qué programas escuchan en tu ordenador y en qué dirección.

Antes de empezar, lee: 04-el-modelo-tcp-ip.md

En la lección anterior viste que la IP de tu portátil se parece a 192.168.1.133 y que es privada. El portátil de tu vecino puede tener la misma, y el de alguien en Tokio, también.

Entonces, cuando example.com te responde, ¿cómo sabe a cuál de todos los 192.168.1.133 del mundo enviar la respuesta? ¿Por dónde la envía, entre miles de redes? Y cuando llega a tu portátil, donde están abiertos el navegador, Spotify y Slack, ¿a qué programa se la entrega?

Son tres preguntas: qué ordenador, por qué camino y qué programa.

La analogía

Piensa en un edificio de oficinas con una sola dirección postal y una recepción en la entrada. Dentro, cada despacho tiene un número interno que solo vale dentro del edificio: en el de enfrente también hay un despacho 3, y no pasa nada.

Cuando alguien del despacho 3 envía una carta, recepción cambia el remitente por la dirección del edificio, le añade una referencia, «ref. 61000», y apunta en su libreta: «61000 → despacho 3». Cuando llega la respuesta con esa referencia, recepción mira la libreta y la sube al despacho 3. Desde fuera, nadie sabe que existe un despacho 3. Y dentro de cada despacho, cada persona tiene su buzón.

La dirección del edificio es tu IP pública; el número de despacho, tu IP privada; cada buzón, un puerto; y la recepción con su libreta, tu router. La referencia también es un puerto, el del router.

Dónde falla la analogía

  • Recepción tira las cartas cuya referencia no está en la libreta: no puede preguntar «¿para quién es esto?».
  • En el edificio, cada buzón es fijo. En la red, solo los servidores usan puertos fijos; un cliente, como tu navegador, estrena uno en cada conversación.
  • Con IPv6 hay direcciones de sobra: cada despacho puede tener su propia dirección pública, y recepción no tiene que traducir nada.

Una (término) Dirección IPEl número que identifica a un ordenador en una red, por ejemplo 192.168.1.133 (IPv4) o 2606:4700:10::6814:179a (IPv6). Es la dirección que usa la capa de red para llevar cada paquete a su destino.Ir a la definición identifica a un ordenador dentro de una red, y hay dos versiones en uso.

IPv4 son cuatro números del 0 al 255 separados por puntos, como 192.168.1.133: 32 bits, que dan para unos 4.300 millones de direcciones. Hoy hay más dispositivos conectados que direcciones: los últimos bloques libres se repartieron en 2011.

Para que alcanzaran, se reservaron unos rangos para uso interno. Las (término) IP privadaUna dirección IP que solo vale dentro de una red local, como 192.168.1.133. Las mismas se repiten en millones de casas, y desde internet no se puede llegar a ellas.Ir a la definición solo valen dentro de su red local, y por eso pueden repetirse en todo el mundo. Una (término) IP públicaUna dirección IP única en todo internet, con la que se puede llegar a un ordenador desde cualquier parte. En casa, normalmente la tiene tu router y la comparten todos tus dispositivos.Ir a la definición, en cambio, es única en todo internet.

Rango Qué es
10.0.0.0 a 10.255.255.255 Privado. Redes de empresas y de operadores
172.16.0.0 a 172.31.255.255 Privado. Por ejemplo, la red interna de Docker (Fase 7)
192.168.0.0 a 192.168.255.255 Privado. Casi todas las redes de casa
127.0.0.0 a 127.255.255.255 No es privado: es este mismo ordenador (loopback). La más usada es 127.0.0.1, la de (término) localhostUn nombre que siempre significa «este mismo ordenador». Cuando abres localhost:8080, el cliente y el servidor están en tu máquina.Ir a la definición

IPv6 son 128 bits: un 34 seguido de 37 ceros, suficientes para que cada dispositivo tenga una dirección pública propia. Se escriben como ocho grupos de cuatro cifras hexadecimales separados por dos puntos, y se acortan quitando los ceros a la izquierda de cada grupo y cambiando, una sola vez, una tira de grupos a cero por ::. La dirección de example.com que viste en la lección anterior, 2606:4700:10::6814:179a, es en realidad 2606:4700:0010:0000:0000:0000:6814:179a. Y ::1 es la versión IPv6 de 127.0.0.1.

Las dos versiones conviven: tu ordenador seguramente tiene al menos una de cada, y curl prueba las dos. En una URL, una IPv6 va entre corchetes para no confundir sus dos puntos con los del puerto: http://[::1]:4321.

Si tu IP privada no vale fuera de casa, alguien tiene que cambiarla al salir. Lo hace tu (término) RouterUn aparato que conecta redes distintas y decide hacia dónde reenviar cada paquete según su dirección IP de destino. El de tu casa conecta tu red local con la de tu operador.Ir a la definición, y se llama (término) NATTraducción de direcciones de red (Network Address Translation). Al salir a internet, el router cambia la IP privada de tu dispositivo por su IP pública y apunta el cambio para deshacerlo en las respuestas.Ir a la definición (Network Address Translation, traducción de direcciones de red). Tu router tiene dos direcciones: una privada hacia dentro (192.168.1.1) y una pública hacia fuera, que le asigna tu operador.

Así va y vuelve una petición tuya a example.com:

  1. 1Tu portátil → router

    origen
    192.168.1.133:54321
    destino
    104.20.23.154:80

    Tu portátil envía la petición con su IP privada como origen.

  2. 2Router → example.com

    origen
    203.0.113.7:61000lo cambia el router
    destino
    104.20.23.154:80

    El router cambia el origen por su IP pública y un puerto libre (a veces, el mismo), y apunta el cambio en su tabla.

  3. 3example.com → router

    origen
    104.20.23.154:80
    destino
    203.0.113.7:61000

    El servidor responde a quien cree que le ha escrito: el router.

  4. 4Router → tu portátil

    origen
    104.20.23.154:80
    destino
    192.168.1.133:54321lo cambia el router

    El router busca el puerto 61000 en su tabla y devuelve el destino original.

La tabla NAT del router
Fuera (pública)Dentro (privada)
203.0.113.7:61000192.168.1.133:54321
203.0.113.7:61001192.168.1.140:50122
El router reescribe el origen al salir y el destino al volver. El servidor solo ve la IP pública del router (en este ejemplo, 203.0.113.7) y nunca sabe que existe 192.168.1.133. Las direcciones son de ejemplo, menos la de example.com.

La segunda fila podría ser tu móvil, en el mismo wifi: gracias a los puertos, el router distingue las conversaciones de todos tus dispositivos aunque salgan por la misma IP pública. Normalmente también apunta con quién habla cada uno, y borra la entrada cuando la conversación termina o tras un rato sin tráfico.

La consecuencia importante es que una conversación solo se puede empezar desde dentro. Si alguien de internet envía un (término) PaqueteLa unidad de datos de la capa de red. Lleva la dirección IP de origen y la de destino, y los routers lo van pasando de red en red hasta su destino.Ir a la definición a tu IP pública sin que hayas empezado nada, el router no encuentra su entrada en la tabla, no sabe a quién dárselo y lo tira. «Abrir un puerto» en el router es añadir una entrada fija: «lo que llegue al puerto 8080, mándalo a 192.168.1.133». Por eso los servidores de verdad viven en centros de datos, con IP públicas (Fase 8).

Dos matices:

  • Algunos operadores hacen otro NAT en su red (CGNAT, Carrier-Grade NAT): ni siquiera tu router tiene IP pública, y la compartes con otros clientes. Entonces, abrir un puerto en tu router no sirve.
  • Con IPv6 no hace falta NAT. Tu portátil tiene su propia IPv6 pública (lo comprobarás en el Pruébalo). Lo que frena las conexiones de fuera que nadie ha pedido es el router, que casi siempre las bloquea por defecto.

Falta saber por dónde va el paquete. A decidirlo se le llama (término) EnrutamientoCómo decide cada router hacia dónde reenviar un paquete para acercarlo a su destino (en inglés, routing). Ningún router conoce el camino entero, solo el siguiente salto.Ir a la definición (routing), y lo hace cada aparato del camino.

Simplificada, la tabla de rutas de tu portátil es esta:

Si el destino es… Lo envía…
127.0.0.1 o ::1 A sí mismo, sin salir del ordenador
192.168.1.…, su red local Directamente, por el wifi
Cualquier otra dirección (default) A 192.168.1.1, su (término) Puerta de enlaceEl router al que tu ordenador envía todo lo que no va a su propia red local (en inglés, gateway). En casa es tu router, por ejemplo 192.168.1.1.Ir a la definición (gateway): el router de casa

Sabe qué direcciones son de su red local por la máscara (netmask) que viste en la lección anterior: 0xffffff00, o sea 255.255.255.0, significa que las que comparten los tres primeros números, 192.168.1.…, son vecinas.

El router de casa hace lo mismo: lo de tu red, hacia dentro, y lo demás, hacia tu operador. Los routers de internet tienen tablas enormes, con rutas hacia todas las redes, que se cuentan entre ellos con un protocolo llamado BGP.

Lo importante es que ningún router conoce el camino entero. Cada uno solo decide el siguiente salto, como en una autopista: cada cartel te acerca a Madrid, pero ninguno te da la ruta completa.

¿Y si dos routers mal configurados se pasan un paquete para siempre? Para evitarlo, la cabecera IP lleva un contador, el TTL (time to live, nada que ver con el TTL de DNS de la lección 7), que empieza por ejemplo en 64 y al que cada router le resta uno. Si llega a cero, el router tira el paquete y avisa al origen con un mensaje de error. En el Pruébalo usarás esos avisos para ver el camino.

Cuando el paquete llega al ordenador, el sistema operativo tiene que entregarlo al programa correcto. Para eso está el (término) PuertoUn número, del 0 al 65535, que indica a qué programa de un ordenador va dirigida una conexión. El ordenador tiene una dirección; cada programa que escucha, su puerto.Ir a la definición: un número del 0 al 65535. La cabecera (término) TCPEl protocolo de la capa de transporte que hace que los datos lleguen completos y en orden, y al programa correcto gracias a los puertos.Ir a la definición (o UDP) lleva el puerto de destino, que dice a qué programa va, y el de origen.

IANA, la organización que los reparte, los divide en tres rangos:

Rango Nombre Ejemplos
0 a 1023 Puertos conocidos (well-known) 22 (SSH), 53 (DNS), 80 (HTTP), 443 (HTTPS)
1024 a 49151 Registrados 5432 (PostgreSQL), 3306 (MySQL). Por costumbre, también los de las herramientas para crear webs: 3000, 5173, 8080
49152 a 65535 Dinámicos o efímeros Los que el sistema operativo elige para los clientes

Por qué la web usa el 80 y el 443. Es una convención: IANA asignó el 80 a HTTP y el 443 a HTTPS. Si una URL no lleva puerto, el navegador usa el 80 con http:// y el 443 con https://. Por eso https://example.com y https://example.com:443 son la misma dirección, y por eso en la lección 2 escribiste :8080.

Los puertos efímeros. Tu navegador no tiene un puerto fijo. Cuando abre una conexión, el sistema operativo le asigna un puerto libre para esa conversación y lo libera al terminar. macOS los elige entre el 49152 y el 65535, y Linux, por defecto, entre el 32768 y el 60999.

Un programa no fabrica paquetes IP. Le pide al sistema operativo un (término) SocketLo que el sistema operativo le da a un programa para usar la red, con su protocolo, su dirección IP y su puerto. Un servidor escucha con un socket, y cada conversación tiene un socket en cada extremo, que conoce también la IP y el puerto del otro.Ir a la definición (en inglés, «enchufe»): un extremo de comunicación con su protocolo, su dirección IP y su puerto. Si está conectado, también conoce la IP y el puerto del otro extremo.

Un socket se usa de dos formas:

  • Para escuchar. El servidor pide un socket, lo asocia a un puerto (bind) y se pone a escuchar (listen), como nc -l 8080 en la lección 2. Cuando llega un cliente, el sistema operativo crea un socket nuevo para esa conversación, y el que escucha sigue esperando.
  • Para conectarse. El cliente pide un socket y lo conecta a la IP y el puerto del servidor. El sistema operativo le pone tu IP y un puerto efímero.

Una conexión TCP queda identificada por cuatro valores: la IP y el puerto de origen, y la IP y el puerto de destino. Por eso un servidor puede atender a miles de clientes a la vez en el mismo puerto 443: cada conversación se distingue por la IP o el puerto del cliente.

En qué dirección escucha un servidor. Al asociar el socket, el servidor elige también la IP, y eso decide quién puede conectarse:

Escucha en Quién puede conectarse
127.0.0.1 Solo los programas de tu ordenador, por IPv4
::1 Solo los programas de tu ordenador, por IPv6
0.0.0.0 Cualquiera que llegue a alguna IPv4 de tu ordenador, también desde tu red
:: Cualquiera que llegue a alguna de tus IP, por IPv6 y normalmente también por IPv4

Aquí está la respuesta a lo que viste en la lección 2. localhost es un nombre que apunta a dos direcciones, ::1 y 127.0.0.1, y en macOS nc -l 8080 escucha solo en IPv4. Así que curl probó primero ::1, no encontró a nadie («Connection refused») y después probó 127.0.0.1, donde sí estaba nc.

Primero, tus dos direcciones IP:

1. Tu IP privada y tu IP pública

Ventana de terminal
ipconfig getifaddr en0
curl -4 icanhazip.com
curl -6 icanhazip.com

Lo que verás:

192.168.1.133
203.0.113.7
2001:db8:4f2a:1c00:9d3e:71b2:a85c:3e10

Cada comando escribe una línea:

  • ipconfig getifaddr en0 te da tu IP privada, la de tu portátil en el wifi de casa. En Linux, usa hostname -I.
  • curl -4 icanhazip.com pregunta a un servidor de Cloudflare desde qué dirección le llega tu petición, por IPv4 (-4). Es tu IP pública, que no es de tu portátil sino de tu router (o, con CGNAT, de tu operador): desde el móvil, en el mismo wifi, verías la misma.
  • curl -6 icanhazip.com hace lo mismo por IPv6. Ejecuta después ifconfig en0 | grep inet6 y encontrarás esa dirección entre las de la lista: es de tu portátil, sin traducir, porque con IPv6 no hay NAT. Si tu red no tiene IPv6, dará un error, y no pasa nada.

Hemos cambiado las dos IP públicas por direcciones de ejemplo. Las tuyas serán distintas.

Ahora, los sockets. Abre una terminal y deja un servidor escuchando, como en la lección 2:

Ventana de terminal
nc -l 8080

En una segunda terminal, pregunta qué programas están escuchando:

2. ¿Quién está escuchando?

Ventana de terminal
lsof -nP -iTCP -sTCP:LISTEN

Lo que verás:

COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
limactl 5445 tuusuario 14u IPv4 0x376dab910c3f4fd7 0t0 TCP 127.0.0.1:52593 (LISTEN)
…
node 15218 tuusuario 19u IPv6 0x3bfa7c36078a5081 0t0 TCP [::1]:5173 (LISTEN)
nc 26159 tuusuario 3u IPv4 0xd0ac77b78e83fcc3 0t0 TCP *:8080 (LISTEN)
…

lsof lista los ficheros abiertos, y para el sistema operativo un socket también lo es. -iTCP -sTCP:LISTEN pide solo los sockets TCP que escuchan, y -n y -P muestran las direcciones y los puertos como números.

Cada línea es un socket escuchando. COMMAND y PID son el programa y su número de (término) ProcesoUn programa en ejecución. Cuando arrancas un servidor, el sistema operativo crea un proceso que se queda vivo esperando peticiones.Ir a la definición; TYPE, si es IPv4 o IPv6; y NAME, dónde escucha:

  • 127.0.0.1:52593 y [::1]:5173 (Vite, para crear webs) solo aceptan conexiones de tu ordenador, por IPv4 y IPv6.
  • *:8080, tu nc, escucha en todas tus direcciones IPv4: el 0.0.0.0 de la tabla de arriba. lsof escribe * tanto para 0.0.0.0 como para ::, y TYPE te dice cuál es.

Tus programas y números serán otros, y hemos cambiado el nombre de usuario por tuusuario. En macOS, sin sudo, lsof solo enseña tus programas. En Linux también puedes usar ss -tln.

Deja nc escuchando. En una tercera terminal, conéctate a él con nc localhost 8080, y vuelve a la segunda:

3. Una conversación, tres sockets

Ventana de terminal
lsof -nP -i :8080

Lo que verás:

COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
nc 26159 tuusuario 3u IPv4 0xd0ac77b78e83fcc3 0t0 TCP *:8080 (LISTEN)
nc 26159 tuusuario 4u IPv4 0x433842aea8e4ffc 0t0 TCP 127.0.0.1:8080->127.0.0.1:49823 (ESTABLISHED)
nc 26179 tuusuario 5u IPv4 0xb04bd315e3db3fc 0t0 TCP 127.0.0.1:49823->127.0.0.1:8080 (ESTABLISHED)

-i :8080 pide todos los sockets del puerto 8080. Hay tres:

  1. *:8080 (LISTEN): el socket que escucha, esperando a más clientes.
  2. 127.0.0.1:8080->127.0.0.1:49823: el socket que el sistema operativo creó para esta conversación, en el mismo proceso del servidor (mira el PID).
  3. 127.0.0.1:49823->127.0.0.1:8080: el socket del cliente, en otro proceso, con el puerto efímero 49823.

Los sockets 1 y 2 comparten el puerto 8080, pero el 2 conoce también el otro extremo, y así los distingue el sistema operativo. Las líneas 2 y 3 son la misma conexión (ESTABLISHED, abierta) vista desde cada extremo, con los mismos cuatro valores. Tu puerto efímero será otro. Al acabar, pulsa Ctrl + C en las dos terminales de nc.

Por último, el camino que siguen tus paquetes hasta example.com:

4. El camino, salto a salto

Ventana de terminal
traceroute -n example.com

Lo que verás:

traceroute: Warning: example.com has multiple addresses; using 172.66.147.243
traceroute to example.com (172.66.147.243), 64 hops max, 40 byte packets
1 192.168.1.1 3.171 ms 3.506 ms 1.866 ms
2 10.0.33.135 5.687 ms 3.461 ms 7.890 ms
3 * 172.16.4.129 5.818 ms 3.314 ms
4 10.221.236.69 4.825 ms
10.220.106.138 6.570 ms 6.740 ms
5 10.221.223.12 6.005 ms 5.590 ms 5.462 ms
6 198.51.100.46 6.193 ms
198.51.100.60 8.876 ms
198.51.100.12 20.815 ms
7 188.114.108.68 7.125 ms 5.646 ms
198.51.100.155 22.526 ms
8 188.114.108.67 7.222 ms
188.114.108.31 15.326 ms
188.114.108.23 9.224 ms
9 172.66.147.243 6.541 ms 5.953 ms 5.127 ms

traceroute usa el TTL a propósito: envía paquetes que solo aguantan un salto, luego dos, luego tres… Cada router que tira uno avisa al origen, y así se descubre quién es. -n muestra las direcciones como números.

  • Cada línea es un salto. El 1 es tu router, tu puerta de enlace, y el último es example.com (172.66.… es pública: el rango privado va solo del 172.16 al 172.31). Las 188.114.… ya son de la red de Cloudflare.
  • Los saltos 2 a 5 tienen IP privadas: son routers internos del operador, que no necesitan ser alcanzables desde internet.
  • Los tres tiempos son las tres pruebas de cada salto, de ida y vuelta, en milisegundos. Un * es una prueba sin respuesta a tiempo, y varias IP en un salto significan que las pruebas fueron por caminos paralelos.

Hemos cambiado las IP públicas del operador por direcciones de ejemplo, y tu camino será distinto. Si se queda imprimiendo * * * sin llegar, páralo con Ctrl + C. En Linux puede que tengas que instalarlo (sudo apt install traceroute) o usar tracepath -n example.com.

  • La página del router está en su IP privada, a menudo 192.168.1.1: tu puerta de enlace.
  • «Abrir puertos» para jugar online, como piden algunas consolas, es añadir una entrada fija a la tabla NAT del router.

Y si programas:

  • Network: use --host to expose en Vite. Por defecto, Vite solo escucha en localhost; en macOS, solo en [::1] (ejercicio 2): http://localhost:5173 funciona (se prueba ::1), pero http://127.0.0.1:5173 da «Connection refused», la lección 2 al revés. Con --host escucha en todas las direcciones y te enseña tu IP privada: Network: http://192.168.1.133:5173/.
  • En Node, http.createServer(…).listen(3000) pide el socket, hace bind y listen; cada fetch usa un socket de cliente.
  • Error: listen EADDRINUSE: address already in use :::3000: ya hay un socket escuchando en ese puerto, a menudo un servidor que dejaste abierto. :::3000 es :: (Node escucha por defecto en todas las direcciones) y :3000. Para ver quién lo ocupa: lsof -nP -iTCP:3000 -sTCP:LISTEN.
  • new URL('https://example.com:443').port es una cadena vacía: el puerto por defecto ni se apunta.
  • «localhost, 127.0.0.1 y 0.0.0.0 son lo mismo.» localhost es un nombre para 127.0.0.1 y ::1, a los que solo se llega desde tu ordenador. Escuchar en 0.0.0.0 es escuchar en todas tus direcciones IPv4, y te pueden alcanzar desde tu red. Con Docker (Fase 7) te importará: un servidor que escucha en 127.0.0.1 dentro de un contenedor no es accesible desde fuera del contenedor, ni siquiera desde tu propio ordenador.
  • «Un puerto solo admite una conexión.» Un socket que escucha acepta todas las que lleguen, y cada una se distingue por sus cuatro valores. Lo que no se puede es tener dos sockets escuchando en el mismo puerto y la misma dirección: eso es el error EADDRINUSE («dirección ya en uso»).
  • «Un socket es un WebSocket.» No son lo mismo, aunque se llamen parecido. WebSocket es un protocolo de aplicación para que el navegador y el servidor se envíen mensajes en los dos sentidos, y funciona sobre una conexión TCP, es decir, sobre sockets. Lo verás en la Fase 4.
  • Una dirección IP identifica a un ordenador en una red. IPv4 se quedó sin direcciones libres; IPv6 tiene de sobra.
  • En IPv4, tus dispositivos tienen IP privadas, y el router las traduce a su IP pública con NAT. Por eso nadie de fuera puede empezar una conversación con tu portátil.
  • Cada router solo decide el siguiente salto, y nadie conoce el camino entero.
  • El puerto dice a qué programa va cada dato: los servidores usan puertos conocidos (80, 443) y los clientes, efímeros.
  • Un socket es lo que el sistema operativo le da a un programa para usar la red. Una conexión se identifica por la IP y el puerto de cada extremo.
Tu portátil y el de un amigo, cada uno en su casa, tienen la IP 192.168.1.133. ¿Hay algún problema?Ver respuesta

No. Son IP privadas, y cada una solo vale dentro de su red local. Al salir a internet, el router de cada casa la cambia por su IP pública, que sí es única.

Un servidor escucha en el puerto 443 y tiene 5.000 clientes conectados a la vez. ¿Cómo sabe el sistema operativo a qué conexión pertenece cada paquete que llega?Ver respuesta

Por los cuatro valores. El destino es el mismo para todos (la IP del servidor y el 443), pero cada cliente llega desde otra IP, o desde la misma con otro puerto efímero. Cada combinación es un socket distinto en el servidor.

Dejas nc -l 8080 escuchando en tu portátil. ¿Puede conectarse tu móvil, que está en tu wifi? ¿Y un amigo desde su casa?Ver respuesta

Tu móvil, sí: está en tu red y puede llegar a tu IP privada, http://192.168.1.133:8080. Tu amigo, no: tu IP privada no vale fuera de tu casa, y si se conecta a tu IP pública, tu router no encuentra esa conexión en su tabla NAT y la tira. Por IPv6 tampoco: en macOS, nc solo escucha en IPv4 y, aunque escuchara, el router suele bloquear las conexiones que nadie ha pedido. Habría que abrir un puerto en el router, y para un servidor de pruebas no es buena idea.

fase-0 · lección 5/9