9.8. Puertos

Una dirección IP indica para qué host es un paquete. Un host moderno ejecuta muchos programas a la vez (un navegador web, un cliente de chat, una videollamada, una tarea de copia de seguridad) y cada uno de ellos está enviando y recibiendo paquetes en paralelo. La capa IP no tiene forma de distinguirlos; simplemente entrega cada paquete que llega a «el host». Algo tiene que decidir qué paquete pertenece a qué programa.

El número de puerto es la respuesta. Cada paquete en la capa de transporte lleva dos campos adicionales más allá del encabezado IP: un puerto de origen y un puerto de destino. Cada uno es un entero de 16 bits, de modo que hay 65535 números de puerto posibles por host. Combinado con la dirección IP, el puerto identifica un punto final específico dentro de un host: la conversación específica de un programa específico.

Una única caja de host a la derecha con una dirección IP etiquetada en la parte superior. Tres programas dentro del host están etiquetados como "servidor HTTP", "videollamada" y "cliente de chat", cada uno conectado a un número de puerto distinto etiquetado como 80, 5004 y 4321 respectivamente. Tres flechas llegan al host desde la red, cada una marcada con un puerto de destino; cada flecha aterriza en el programa correspondiente.

Muchos programas comparten una sola dirección IP; el puerto de destino encamina cada paquete que llega hacia el correcto.

9.8.1. Puertos bien conocidos

Los primeros 1024 números de puerto están reservados por convención para servicios estándar. Algunos que el lector encontrará:

  • 22 – SSH (el protocolo Secure Shell, usado para el inicio de sesión remoto cifrado).

  • 53 – DNS, el sistema de nombres de dominio (tratado en Nombres y DNS).

  • 80 – HTTP, el protocolo de transferencia de hipertexto, el protocolo sin cifrar de la web.

  • 123 – NTP, el protocolo de tiempo de red (cómo los dispositivos ajustan sus relojes a partir de un servidor de tiempo).

  • 443 – HTTPS, HTTP transportado sobre TLS (Transport Layer Security, el envoltorio de cifrado estándar para los protocolos de internet), el protocolo que hay detrás de cada página web que muestra un icono de candado en el navegador.

La convención es lo que hace posible que un navegador se conecte a http://example.com sin especificar un puerto: asume el 80 porque ese es el puerto bien conocido de HTTP. Una cámara que se conecta a un servidor web hace lo mismo.

Por encima de 1024, los números de puerto no tienen restricciones y cualquier programa puede reclamar uno. Los servidores de bases de datos (5432 para PostgreSQL, 3306 para MySQL), los servidores de aplicaciones y los protocolos personalizados viven todos en algún lugar del rango superior.

9.8.2. Puertos efímeros

Los servidores escuchan en un puerto conocido. Los clientes usan un puerto distinto en su propio extremo, elegido de nuevo para cada conexión saliente.

Cuando la cámara se conecta a un servidor web en el puerto 443, la conversación es entre

camera IP : <some-port>     <-->     server IP : 443

El <some-port> es un puerto efímero: MicroPython elige un número no utilizado de un rango alto, lo usa durante la conexión y lo libera después. Al script no le importa qué número se eligió; la capa de sockets se encarga de ello.

9.8.3. Escuchar frente a hablar

El papel que desempeña un puerto depende de en qué lado de la conversación se encuentre. Dos casos distintos:

  • Un puerto de escucha pertenece a un programa que quiere recibir conexiones no solicitadas. El programa le dice a MicroPython «cualquier paquete entrante dirigido a mí en el puerto 80 es mío» y espera. Los servidores hacen esto.

  • Un puerto conectado pertenece a un programa que quiere iniciar una conversación. El programa elige (o le pide a MicroPython que elija) un puerto efímero, envía un paquete con ese puerto como origen y el puerto bien conocido del servidor como destino, y usa el mismo par de puertos durante el resto de la conversación.

Un único programa puede hacer ambas cosas a la vez, manteniendo puertos distintos para cada rol. Una cámara podría escuchar en el puerto 8000 conexiones HTTP entrantes desde una interfaz de usuario de configuración y mantener una conexión HTTPS saliente a un servidor remoto en el puerto 443. Los dos roles no interfieren: cada conversación se identifica por la cuádrupla completa (src IP, src port, dst IP, dst port), y no hay dos conversaciones que compartan la misma cuádrupla.

9.8.4. Lo que los puertos desbloquean

Con los puertos en su lugar, la capa de transporte puede por fin resolver el problema de la entrega de programa a programa. Un paquete ahora lleva suficiente información para encaminarse no solo al host correcto (la dirección IP), sino al socket correcto dentro de ese host (el número de puerto).

Las dos páginas siguientes cubren los dos sabores que la capa de transporte ofrece sobre ese direccionamiento: UDP (el protocolo de datagramas de usuario, cada paquete independiente, sin garantías) y TCP (el protocolo de control de transmisión, un flujo conectado, fiable y ordenado).