01 · Punto de partida
La base común de Internet
Los tres temas anteriores trataron radios: formas de llevar bits por el aire. Pero un dispositivo no habla con «el Wi-Fi»: habla con un servidor que puede estar en otro continente, atravesando docenas de redes de distinta tecnología. Lo que permite esa conversación es un conjunto de reglas común que no depende de la radio: la familia de protocolos de Internet, conocida por sus dos protagonistas, TCP e IP.
Como programador de aplicaciones, quizá nunca miraste esta capa: requests.get(url) o fetch la esconden. En un microcontrolador, en cambio, vas a manejarla más de cerca: elegir entre TCP y UDP, decidir cuántas conexiones abrir, poner tiempos máximos, entender por qué una consulta de nombres tarda y cuánta energía cuesta cada viaje. En IoT los detalles de la red son detalles de consumo.
Los fragmentos de C++ siguen el estilo Arduino para ESP32. Los tiempos y tamaños de las tablas son órdenes de magnitud para razonar.
02 · Capas
Las capas y quién hace qué
La comunicación se divide en capas, cada una con una tarea y apoyada en la inferior. Un mensaje de tu aplicación se va envolviendo en «sobres» a medida que baja, y se desenvuelve al subir del otro lado.
| Capa | Qué resuelve | Ejemplos | Direccionamiento |
|---|---|---|---|
| Aplicación | El significado del mensaje | HTTP, MQTT, CoAP, DNS, NTP | Nombre del servidor, tópico, ruta |
| Transporte | Entregar al programa correcto, con o sin garantías | TCP, UDP | Número de puerto |
| Red (Internet) | Llevar los paquetes de un equipo a otro, atravesando redes | IP (IPv4 e IPv6) | Dirección IP |
| Enlace | Mover los bits por el medio físico local | Wi-Fi, Ethernet, BLE, LoRa | Dirección MAC |
El esquema explica la división de responsabilidades. El enlace (Wi-Fi) lleva el paquete hasta el router. La capa IP lo hace avanzar router por router hasta el destino. El transporte (TCP o UDP) lo entrega al programa que lo espera. Y la aplicación (MQTT, HTTP) le da sentido. Cada capa ignora los detalles de las demás: por eso el mismo MQTT funciona sobre Wi-Fi, Ethernet o celular sin cambios.
03 · Identificar equipos
Direcciones, subredes y NAT
La dirección IP y la máscara
Una dirección IPv4 son cuatro números de 0 a 255 (32 bits), como 192.168.1.57. Se divide en dos partes: la que identifica la red y la que identifica al equipo dentro de esa red. La máscara de subred indica dónde está el corte: con 255.255.255.0 (o /24 en notación abreviada), los tres primeros números son la red y el último, el equipo. Esa red local admite 254 equipos.
La máscara le sirve al dispositivo para decidir si el destino está en su red (envía directo) o fuera (envía a la puerta de enlace, el router, para que lo haga avanzar). Los datos que obtiene del DHCP (tema 14) son justamente cuatro: su dirección, la máscara, la puerta de enlace y el servidor DNS.
Direcciones privadas y NAT
Hay rangos de direcciones reservados para uso interno que no se enrutan por Internet: 10.0.0.0/8, 172.16.0.0/12 y 192.168.0.0/16. Casi todas las redes domésticas y de oficina los usan. Para salir a Internet, el router hace NAT (traducción de direcciones): reemplaza la dirección privada del dispositivo por la pública del router, y recuerda a quién corresponde cada conversación para devolver las respuestas.
Esto tiene una consecuencia fundamental para IoT: desde afuera no se puede iniciar una conexión hacia un dispositivo que está detrás de un NAT. El router solo deja pasar las respuestas a conexiones que alguien de adentro abrió. Por eso, en la inmensa mayoría de los diseños, es el dispositivo el que inicia la conexión con el servidor, y mantiene esa conexión abierta si necesita recibir órdenes (como hace MQTT). La alternativa, abrir puertos en el router del cliente, es insegura, inviable para productos masivos y casi nunca se usa.
IPv6
Las direcciones IPv4 se agotaron. IPv6 usa 128 bits (2001:db8::1) y ofrece direcciones de sobra para que cada dispositivo tenga una pública, sin NAT. Los chips modernos lo soportan y las redes celulares lo usan cada vez más, pero la mayoría de las redes domésticas y de servicios todavía se apoyan en IPv4, y conviene que el firmware maneje ambas.
04 · Programas y nombres
Puertos y DNS
Una dirección IP identifica al equipo, pero en él corren varios programas a la vez. El puerto (un número de 0 a 65535) distingue a cuál va cada mensaje. Algunos son convenciones universales:
| Puerto | Protocolo | Transporte | Uso |
|---|---|---|---|
| 53 | DNS | UDP (y TCP) | Traducir nombres a direcciones |
| 80 | HTTP | TCP | Web sin cifrar |
| 123 | NTP | UDP | Sincronizar la hora |
| 443 | HTTPS | TCP | Web cifrada |
| 1883 | MQTT | TCP | Mensajería sin cifrar |
| 8883 | MQTT sobre TLS | TCP | Mensajería cifrada |
| 5683 | CoAP | UDP | Protocolo ligero tipo web para dispositivos |
Una conexión queda definida por la dupla de direcciones y puertos de ambos extremos. El dispositivo, como cliente, usa un puerto de origen elegido al azar; el servidor escucha en un puerto conocido.
DNS: los nombres
Las personas usamos nombres (broker.ejemplo.com) y las redes usan direcciones. El DNS es la libreta de direcciones de Internet: el dispositivo le pregunta al servidor DNS (que obtuvo por DHCP) cuál es la dirección de un nombre y recibe la respuesta, junto con un TTL, el tiempo durante el cual puede recordarla. Cada resolución cuesta al menos un viaje de ida y vuelta, y si el servidor DNS falla, el nombre no se resuelve aunque el servidor de destino esté perfecto.
Para el IoT, los nombres tienen una virtud enorme: permiten mover el servidor a otra dirección sin tocar el firmware de los equipos instalados. Cuestan un viaje y un punto de falla más, por lo que conviene resolver una vez, guardar la dirección con su TTL y volver a resolver solo si la conexión falla. Es la optimización del tema 14.
05 · Transporte
TCP y UDP
La capa de transporte ofrece dos servicios muy distintos, y la elección condiciona todo el diseño del envío.
| Aspecto | TCP | UDP |
|---|---|---|
| Modelo | Conexión: flujo continuo de bytes entre dos extremos | Datagramas: mensajes sueltos e independientes |
| Para empezar | Apretón de manos de tres mensajes (un viaje de ida y vuelta) | Nada: se envía directamente |
| Entrega | Garantizada: numera, confirma y reenvía lo perdido | No garantizada: un datagrama puede perderse o duplicarse |
| Orden | Se entrega en orden | Puede llegar desordenado |
| Control de congestión | Sí: reduce el ritmo si la red se satura | No: depende de la aplicación |
| Encabezado | 20 bytes o más | 8 bytes |
| Memoria y complejidad | Mantiene estado y búferes por conexión | Casi nada |
| Típico en IoT | HTTP, MQTT, TLS | CoAP, DNS, NTP, mensajes breves |
TCP da una comodidad enorme: el programador escribe bytes en un extremo y los lee, completos y en orden, en el otro, sin preocuparse por pérdidas. A cambio, abrir la conexión cuesta un viaje, mantenerla cuesta memoria y energía, y cuando la red es muy mala, la espera de las retransmisiones puede alargar mucho un envío. UDP es lo opuesto: casi sin costo, pero cada garantía que se necesite (confirmación, reintento, orden) la tiene que construir la aplicación. Protocolos como CoAP lo hacen con un esquema simple de confirmación y reintento.
Una regla de oro: si el mensaje es breve, independiente y puede repetirse sin problema, UDP es candidato; si hay una conversación, un flujo o datos que no pueden perderse sin enterarse, TCP. Y si hay que proteger la comunicación, TLS se suma sobre TCP (o DTLS sobre UDP) con su propio costo en viajes.
06 · Programar la red
Sockets desde el firmware
Un socket es la interfaz con la que un programa usa la red: un punto de conexión con una dirección y un puerto. Las operaciones son siempre las mismas en cualquier lenguaje: crear el socket, conectar (o enlazar, si se espera recibir), enviar y recibir, y cerrar. Un cliente TCP, que es lo que hace un dispositivo IoT, sigue estos pasos:
- Resolver el nombre del servidor (si no se tiene la dirección).
- Conectar a la dirección y el puerto. Aquí se produce el apretón de manos.
- Enviar el pedido y leer la respuesta, con un tiempo máximo.
- Cerrar la conexión o dejarla abierta para el próximo envío.
#include <WiFi.h>
#include <WiFiUdp.h>
const char *SERVIDOR = "datos.ejemplo.com";
const uint16_t PUERTO_TCP = 8080;
const uint16_t PUERTO_UDP = 5005;
// Envío por TCP: conectar, enviar, leer la respuesta y cerrar, con tiempos máximos.
bool enviarPorTcp(const String &mensaje) {
WiFiClient cliente;
if (!cliente.connect(SERVIDOR, PUERTO_TCP, 5000)) { // resuelve el nombre y conecta; 5 s como máximo
Serial.println("No conectó");
return false;
}
cliente.setTimeout(3000); // 3 s como máximo para leer
cliente.print(mensaje + "\n");
String respuesta = cliente.readStringUntil('\n'); // espera hasta el fin de línea o el tiempo máximo
cliente.stop();
return respuesta == "OK";
}
// Envío por UDP: un datagrama, sin conexión.
void enviarPorUdp(const uint8_t *datos, size_t largo) {
IPAddress ip;
if (!WiFi.hostByName(SERVIDOR, ip)) return; // resolver el nombre con DNS
WiFiUDP udp;
udp.beginPacket(ip, PUERTO_UDP);
udp.write(datos, largo);
udp.endPacket(); // sale el datagrama; nadie garantiza que llegue
}
Observá lo que el código hace por cuidado: cada operación que espera tiene un tiempo máximo. Sin ellos, un servidor caído deja al dispositivo colgado en el connect o en la lectura durante minutos, con la radio encendida. Y siempre se cierra el cliente al terminar: una conexión olvidada ocupa memoria que en un microcontrolador es muy escasa.
Dos modos de trabajar con sockets importan: el bloqueante, donde el programa se detiene hasta que la operación termina (simple, pero congela el resto), y el no bloqueante, donde se pregunta cada tanto si hay algo (más complejo, pero permite atender otras tareas). En un sistema con un sistema operativo de tiempo real, lo habitual es dedicar una tarea a la red y dejar que se bloquee ahí.
07 · El costo real
Cada viaje de ida y vuelta cuesta
La unidad de medida del costo de una comunicación no es el byte, sino el viaje de ida y vuelta (RTT, round-trip time): el tiempo que tarda un mensaje en llegar al destino y volver su respuesta. En una red Wi-Fi local es de unos 5 a 30 milisegundos; hasta un servidor en Internet, de 30 a 150; por una red celular, de 100 a 500; por satélite, unos 600 o más. Cada etapa que requiere una respuesta antes de seguir suma un RTT al tiempo y, con la radio encendida, al consumo.
El diagrama muestra que de los cinco viajes de un envío HTTPS completo con TLS 1.2, solo el último lleva el dato. Los otros cuatro son preparación: DNS, apertura de TCP y negociación del cifrado. Por eso las optimizaciones apuntan siempre en la misma dirección:
- Evitar el DNS guardando la dirección (un viaje menos).
- Reutilizar la conexión en lugar de abrir una nueva para cada envío (se ahorran TCP y TLS enteros, a costa de mantenerla viva).
- Usar TLS 1.3, que reduce el apretón de manos a un solo viaje, o reanudar sesiones TLS ya negociadas.
- Usar UDP cuando el mensaje lo permite, sin conexión que abrir.
- Agrupar los datos para hacer menos envíos con más contenido (tema 12).
Además de los viajes, el cifrado cuesta cálculo: en un microcontrolador, la verificación del certificado y el intercambio de claves pueden llevar de varias centenas de milisegundos a más de un segundo de procesador, con la radio y el chip encendidos. Y también cuesta bytes: el apretón de manos de TLS mueve varios kilobytes (sobre todo por los certificados) para entregar a veces solo veinte bytes útiles.
08 · Analogía con programación
Contar los viajes en Python
El programa modela cinco formas de enviar un mensaje de 20 bytes y cuenta, para cada una, los viajes de ida y vuelta: uno por el pedido y su respuesta, uno más si hay que resolver el nombre con DNS, uno de apretón de manos de TCP si se abre conexión, y uno o dos de TLS. A los viajes multiplicados por el RTT les suma el tiempo de cálculo del cifrado, y con la corriente del Wi-Fi (100 mA) obtiene la energía por envío. Al final usa el módulo estándar ipaddress para analizar una red local.
Python en tu navegador. Los bloques son editables: cambiá los valores y presioná «Ejecutar Python». La primera vez tarda unos segundos en cargar.
CORRIENTE_MA = 100 # corriente media con la radio Wi-Fi activa
# protocolo: (viajes de ida y vuelta de la conexión, milisegundos de cálculo de cifrado, bytes que viajan por la red)
PROTOCOLOS = {
"UDP con confirmación": (0, 0, 100), # sin conexión: solo pedido y respuesta
"TCP sin cifrar (HTTP)": (1, 0, 1000), # apretón de manos de TCP
"TCP con TLS 1.2 (HTTPS)": (3, 400, 5200), # TCP (1) + TLS 1.2 (2)
"TCP con TLS 1.3 (HTTPS)": (2, 300, 4700), # TCP (1) + TLS 1.3 (1)
"Conexión TLS ya abierta": (0, 0, 700), # se reutiliza la conexión: solo pedido y respuesta
}
BYTES_DNS = 170 # consulta y respuesta de DNS
def costo_del_envio(protocolo, rtt_ms, resolver_dns):
viajes_conexion, cpu_ms, bytes_red = PROTOCOLOS[protocolo]
if protocolo == "Conexión TLS ya abierta":
resolver_dns = False # la conexión existe: no hay nada que resolver
viajes = viajes_conexion + 1 + (1 if resolver_dns else 0) # + 1 por pedido y respuesta, + 1 si hay DNS
tiempo_ms = viajes * rtt_ms + cpu_ms
mah = CORRIENTE_MA * tiempo_ms / 3.6e6
return viajes, tiempo_ms, mah, bytes_red + (BYTES_DNS if resolver_dns else 0)
print("RTT = 100 ms, resolviendo el nombre con DNS:")
print("protocolo viajes tiempo mAh por envío bytes en la red")
for nombre in PROTOCOLOS:
viajes, ms, mah, b = costo_del_envio(nombre, 100, True)
print(f"{nombre:<27} {viajes:>6} {ms:>8.0f} ms {mah:>14.4f} {b:>16}")
print()
print("Mismo costo con la IP del servidor guardada y RTT distinto:")
for rtt in (20, 100, 400):
fila = []
for nombre in ("UDP con confirmación", "TCP con TLS 1.2 (HTTPS)", "Conexión TLS ya abierta"):
viajes, ms, mah, b = costo_del_envio(nombre, rtt, False)
fila.append(f"{ms:>6.0f} ms")
print(f"RTT {rtt:>3} ms: UDP {fila[0]} TLS 1.2 {fila[1]} reutilizada {fila[2]}")
# Direcciones: ¿pertenece cada equipo a la misma red local?
import ipaddress
red = ipaddress.ip_network("192.168.1.0/24")
print()
print(f"Red {red}: máscara {red.netmask}, {red.num_addresses - 2} direcciones para equipos, difusión {red.broadcast_address}")
for texto in ("192.168.1.57", "192.168.2.10", "8.8.8.8"):
ip = ipaddress.ip_address(texto)
print(f" {texto:<14} en la red local: {ip in red} privada: {ip.is_private}")
Resultado con los valores iniciales. Con RTT de 100 ms y resolviendo el nombre: UDP necesita 2 viajes (200 ms, 0,0056 mAh, 270 bytes en la red); TCP sin cifrar, 3 viajes (300 ms); TCP con TLS 1.2, 5 viajes y 900 ms (0,0250 mAh, 5370 bytes); con TLS 1.3, 4 viajes y 700 ms; y con una conexión TLS ya abierta, 1 viaje, 100 ms y 700 bytes. Con la dirección guardada y TLS 1.2 el envío tarda 480 ms con RTT de 20 ms, 800 ms con 100 ms y 2000 ms con 400 ms, mientras que UDP o una conexión reutilizada tardan 20, 100 y 400 ms. La red de ejemplo 192.168.1.0/24 tiene 254 direcciones para equipos; la 192.168.1.57 pertenece a ella, la 192.168.2.10 es privada pero de otra red, y la 8.8.8.8 es pública.
Dos conclusiones del modelo. Una: la preparación de una conexión cifrada cuesta 8 veces lo que el pedido: de los 900 ms, 100 son el pedido y 800 son DNS, TCP, TLS y cálculo. Otra: la latencia de la red multiplica el costo: con RTT de 400 ms, un envío HTTPS completo con TLS 1.2 llega a 2,4 segundos (con DNS); la misma preparación en una red celular es mucho más cara que en el Wi-Fi.
09 · Exploración interactiva
¿Cuánto tarda un envío?, de extremo a extremo
Este laboratorio ejecuta el mismo modelo del código anterior. Elegí el protocolo, la latencia de la red (RTT) y si el nombre del servidor se resuelve con DNS. Cada barra descompone el tiempo del envío en DNS, conexión TCP, apretón de manos TLS, cálculo de cifrado y el pedido con su respuesta; la del protocolo elegido va resaltada. Los tiempos, bytes y la corriente son valores didácticos.
Viajes de ida y vuelta de un envío
Elegí los parámetros y presioná «Calcular».
Recorrido guiado
- Con los valores iniciales (TLS 1.2, RTT 100 ms, resolviendo DNS), calculá. 5 viajes, 900 ms, 0,0250 mAh y 5370 bytes: «Medio». La barra celeste del pedido es solo una pequeña parte.
- Cambiá a UDP con confirmación: 2 viajes (DNS y pedido), 200 ms, 0,0056 mAh y 270 bytes. Para 20 bytes útiles viajan 270 bytes por la red, contra 5370 con TLS 1.2.
- Probá TCP sin cifrar: 3 viajes y 300 ms. La conexión TCP agrega un viaje; el cifrado de TLS 1.2 agrega otros dos y 400 ms de cálculo.
- Pasá a TLS 1.3: 4 viajes y 700 ms. Un viaje menos y menos cálculo, 200 ms de ahorro por envío.
- Elegí Conexión TLS ya abierta: 1 viaje y 100 ms, y el DNS desaparece. Es la forma más barata de enviar con cifrado, a costa de mantener la conexión.
- Volvé a TLS 1.2, cambiá a Dirección IP guardada y subí el RTT a 400 ms: 4 viajes y 2000 ms, con «Pesado». En una red celular lenta, el mismo envío cuesta 2,5 veces lo que en Internet fija (800 ms). Con 20 ms de RTT son 480 ms.
Desafío: el precio de mantener la conexión abierta
Reutilizar una conexión TLS reduce un envío de 900 ms a 100 ms (0,0250 a 0,0028 mAh). Pero la conexión necesita mantenerse viva: si el router olvida la conversación a los 60 segundos, hace falta un mensaje de keepalive cada 30 a 50 segundos. Con la radio Wi-Fi atenta todo el día, el gasto es de decenas de mA continuos (tema 14: unos 480 mAh por día), muchísimo más que los 96 envíos cada 15 minutos con conexión completa nueva cada vez (96 × 0,0250 = 2,4 mAh por día de TCP y TLS). Reutilizar la conexión conviene cuando se envía cada pocos segundos y hay alimentación eléctrica; con batería y envíos espaciados, es mejor abrir y cerrar. El punto de cruce depende del intervalo entre envíos y del costo de mantener la radio activa.
10 · Método de trabajo
Cómo diagnosticar una conexión
Cuando «conecta al Wi-Fi pero no llega el dato», recorré las capas de abajo hacia arriba. Cada paso descarta una familia de causas:
- Enlace. ¿Está asociado al punto de acceso? ¿Qué RSSI tiene? (Tema 14.)
- Dirección. ¿Obtuvo una IP? ¿Está en la subred correcta? ¿Qué puerta de enlace tiene?
- Alcance del router. ¿Responde la puerta de enlace? Un ping al router distingue un problema local de uno de Internet.
- Salida a Internet. ¿Llega a una dirección pública conocida (por ejemplo, un servidor DNS público)?
- DNS. ¿Resuelve el nombre del servidor? Probá con la IP directa para separar el problema.
- Transporte. ¿Conecta al puerto? Un firewall o un puerto equivocado produce un fallo de conexión.
- Cifrado. ¿Falla el apretón de manos de TLS? Causas típicas: reloj desajustado (los certificados tienen fecha), certificado de la autoridad ausente o vencido.
- Aplicación. ¿El servidor acepta las credenciales y el formato del mensaje?
Registrá en el monitor serie, con marca de tiempo, el resultado de cada paso. Un diagnóstico de campo que dice «falló en el paso 5: DNS» ahorra días frente a «no conecta».
11 · Comprensión
Confusiones frecuentes
«Conectado al Wi-Fi quiere decir que tengo Internet»
Solo indica enlace con el router. Pueden fallar la dirección, el DNS, la salida a Internet o el firewall. Cada capa se comprueba aparte.
«Puedo conectarme a mi dispositivo desde afuera con su IP»
Su IP es privada y el router con NAT descarta las conexiones que no inició alguien de adentro. Para recibir órdenes, el dispositivo mantiene una conexión saliente con un servidor (MQTT, WebSocket) y las órdenes llegan por ahí.
«UDP es mejor porque es más rápido y liviano»
Lo es, pero no garantiza la entrega ni el orden. Si el dato no puede perderse, hay que construir reintentos y confirmaciones, y el costo se traslada a la aplicación. Cada caso decide.
«El costo de una conexión HTTPS es el del mensaje»
El mensaje suele ser lo más barato. DNS, TCP, TLS y el cálculo del cifrado pueden costar varias veces más tiempo, energía y bytes que el dato útil. Reutilizar conexiones, TLS 1.3 y guardar direcciones lo reducen.
«Un tiempo máximo es opcional; si el servidor responde, ¿qué importa?»
Cuando el servidor no responde, sin tiempo máximo el dispositivo queda esperando con la radio encendida, vaciando la batería. Cada operación de red debe tener un tiempo máximo y una acción de reintento.
«Para ahorrar energía mantengo la conexión TCP abierta siempre»
Evita el costo de abrir, pero obliga a mantener la radio atenta y a enviar keepalives. Con batería y envíos esporádicos, abrir y cerrar suele consumir mucho menos que mantener.
12 · Práctica guiada
Predecí antes de comprobar
1. Misma red o no
Un dispositivo tiene la IP 192.168.1.57 con máscara 255.255.255.0 y puerta de enlace 192.168.1.1. Indicá si envía directo o por la puerta de enlace cuando el destino es: (a) 192.168.1.20; (b) 192.168.2.10; (c) 8.8.8.8.
Ver solución
La red local es 192.168.1.0/24. (a) Directo: está en la misma red. (b) Por la puerta de enlace: es de otra red (192.168.2.x), aunque también sea privada. (c) Por la puerta de enlace: es una dirección pública.
2. Contar viajes
Un envío HTTPS con TLS 1.2 resuelve el nombre, abre TCP y negocia TLS antes de mandar el pedido. ¿Cuántos viajes de ida y vuelta tiene? ¿Y si la dirección está guardada y se usa TLS 1.3?
Ver solución
Con TLS 1.2: DNS (1) + TCP (1) + TLS (2) + pedido (1) = 5 viajes. Con la dirección guardada y TLS 1.3: TCP (1) + TLS (1) + pedido (1) = 3 viajes. Con RTT de 100 ms, de 500 ms a 300 ms más el cálculo de cifrado.
3. Elegir el transporte
Elegí TCP o UDP para: (a) un termómetro que informa su lectura cada minuto y no pasa nada si se pierde una; (b) la actualización de firmware completa; (c) un comando de apertura de puerta que debe ejecutarse una sola vez.
Ver solución
(a) UDP: mensaje breve e independiente. (b) TCP: grandes volúmenes que deben llegar completos y en orden (con verificación de firma, tema 43). (c) TCP (o UDP con confirmación y comandos idempotentes, como en el tema 11): no puede perderse sin enterarse, y el cifrado y la autenticación son obligatorios.
4. El NAT que olvida
Un router celular olvida las conexiones inactivas después de 60 segundos. Un dispositivo MQTT mantiene la conexión abierta y envía datos cada 5 minutos. ¿Qué pasa y cómo se evita?
Ver solución
Entre un envío y el siguiente pasan 300 segundos sin tráfico: el router olvida la conversación a los 60 segundos y la conexión queda rota sin que ninguno de los extremos lo sepa. El próximo mensaje se pierde o la conexión se cae. Se evita con un keepalive menor a 60 segundos (por ejemplo, cada 30), o abriendo una conexión nueva en cada envío.
5. Tiempo con latencia
Un envío HTTPS (TLS 1.2, dirección guardada) requiere 4 viajes y 400 ms de cálculo. ¿Cuánto tarda con RTT de 20, 100 y 400 ms? ¿Y la energía a 100 mA con 400 ms?
Ver solución
20 ms: 4 × 20 + 400 = 480 ms. 100 ms: 4 × 100 + 400 = 800 ms. 400 ms: 4 × 400 + 400 = 2000 ms. Energía con RTT 400 ms: 100 mA × 2 s / 3600 ≈ 0,056 mAh por envío, 2,5 veces la del RTT de 100 ms (0,022 mAh).
6. Diagnóstico por capas
El dispositivo tiene IP y responde el ping al router, pero no conecta con broker.ejemplo.com. Probando con la IP directa del broker, conecta. ¿Dónde está el problema?
Ver solución
En el DNS: la red local y el transporte funcionan (conecta con la IP directa), y falla la resolución del nombre. Hay que revisar el servidor DNS que entregó el DHCP, probar con uno público o guardar la IP del broker como plan B.
13 · Síntesis
Ideas para recordar
- TCP/IP es la base común sobre la que corren HTTP, MQTT y casi todo en Internet, independiente de la radio.
- La dirección IP y la máscara de subred indican quién es el equipo y qué otros están en su red; la puerta de enlace lleva todo lo demás.
- El NAT oculta la red local: desde afuera no se puede iniciar una conexión a un dispositivo, así que es el dispositivo quien conecta al servidor y mantiene el canal para recibir órdenes.
- El NAT olvida las conexiones inactivas en 30 s a unos minutos; el keepalive debe ser más corto.
- El puerto distingue a qué programa va el mensaje; DNS traduce nombres a direcciones, a costa de un viaje y un punto de falla.
- TCP da conexión, orden y garantías al costo de un apretón de manos; UDP es liviano pero sin garantías, ideal para mensajes breves y repetibles.
- Los sockets se usan con tiempos máximos en cada operación, y se cierran siempre.
- El costo real de un envío se mide en viajes de ida y vuelta: DNS, TCP y TLS son preparación, y solo el último viaje lleva el dato.
- Se ahorra con direcciones guardadas, conexiones reutilizadas (si hay energía), TLS 1.3, UDP y menos envíos con más contenido.
- El diagnóstico recorre las capas de abajo hacia arriba y registra cada paso.
¿Listo para el tema 18?
Antes de avanzar, tomá el firmware de tu dispositivo y registrá, con marcas de tiempo, cuánto tarda cada paso de un envío: resolución del nombre, conexión TCP, apretón de manos TLS y pedido. Calculá qué parte del tiempo total es el dato y qué parte es preparación, y decidí cuál de las cinco optimizaciones del tema aplicarías primero.
En el próximo tema cerramos el bloque de redes con la reconexión y las fallas de red: cortes, señal débil, reintentos con espera creciente y qué hacer con los datos cuando no hay conexión.