Depurar en lugar de adivinar
Un metodo en vez de una corazonada: recorrer las capas en un orden fijo, empezar por la comprobacion mas barata, aislar un sospechoso cada vez y saber con exactitud que demuestra cada herramienta.
Depurar una red no consiste en saber mas comandos. Consiste en sustituir las corazonadas por una secuencia de preguntas cuyas respuestas no admitan discusion. El metodo tiene tres reglas. Empieza por la comprobacion que cuesta menos tiempo y descarta mas. Cambia exactamente una cosa cada vez. Y despues de cada prueba, pregunta que demuestra el resultado y que no: una prueba que podria haber pasado por dos motivos distintos no te ha dicho nada.
Lo mas barato primero significa: antes de tocar una configuracion, pregunta si la cosa funciona del todo desde aqui y si funciona desde otro sitio. Comparar dos puntos de observacion cuesta un comando y parte el espacio del problema por la mitad. Pedir al usuario que pruebe otra red, o ejecutar la misma peticion desde otra maquina, suele valer mas que una hora leyendo registros.
La escalera de preguntas, desde abajo: tiene la maquina alguna direccion, y una ruta por defecto? Se resuelve el nombre a una direccion? Responde la direccion en el nivel de IP? Esta abierto el puerto, y responde el servicio en el? Devuelve la aplicacion una respuesta correcta? Cada pregunta la responde una herramienta distinta, y cada respuesta reduce el sospechoso hasta que solo queda una capa. El sentido de la escalera es que al final termina: una buena sesion de diagnostico encoge el conjunto de causas posibles en lugar de agrandarlo.
Cada herramienta demuestra algo estrecho, y usarla para mas que eso es la forma de llegar a conclusiones erroneas. ping demuestra que un host responde a ICMP y que existe un camino en ambos sentidos; no demuestra que haya un servidor web en marcha. dig demuestra que respondio un resolutor y cuanto tiempo esta cacheada la respuesta; no demuestra que la direccion sea alcanzable. curl demuestra que hace toda la pila para una peticion concreta; no demuestra que otros clientes reciban la misma respuesta. ss demuestra que hay escuchando en esta maquina y en que direccion; no demuestra que un cortafuegos deje entrar a alguien.
$ dig api.example.org +short
198.51.100.20
$ dig api.example.org +short
198.51.100.20
$ dig api.example.org @1.1.1.1 +short
203.0.113.7
$ dig api.example.org @8.8.8.8 +short
203.0.113.7Dos resolutores, dos respuestas distintas: una cache y un registro obsoleto, no una red rota.$ curl -v https://api.example.org/health
* Trying 198.51.100.20:443...
* connect to 198.51.100.20 port 443 failed: Connection timed out
* Failed to connect to api.example.org port 443: Connection timed out
$ curl -sv https://api.example.org/health -o /dev/null
* Trying 93.184.216.34:443...
* Connected to api.example.org (93.184.216.34) port 443
* Server certificate: CN=*.example.org
< HTTP/2 200
< content-type: application/jsonEl mismo comando con un tiempo de espera sobre el puerto y con la direccion que si funciona.ss merece atencion especial porque separa dos fallos que desde fuera parecen identicos: no hay nadie escuchando en el puerto, o hay alguien escuchando pero solo en la direccion de loopback. Un servidor atado a 127.0.0.1 acepta conexiones de la misma maquina y rechaza todas las de fuera, diga lo que diga el cortafuegos. Esa unica distincion explica buena parte de los casos en los que el servicio funciona en local y es inalcanzable desde cualquier otro sitio.
$ ss -tlnp
State Local Address:Port Process
LISTEN 127.0.0.1:8080 users:(("node",pid=4127,fd=21))
LISTEN 0.0.0.0:22 users:(("sshd",pid=880,fd=3))
$ curl -s -o /dev/null -w "%{http_code}\n" http://127.0.0.1:8080/
200Un servicio es alcanzable desde la red y el otro solo desde esta maquina.Práctica
Construye la escalera de aislamiento: ordena las comprobaciones para un sitio que no abre, desde lo primero que puedes probar hasta lo ultimo.
Haz clic en el nodo de origen y luego en el de destino. Volver a hacer clic en un par elimina la conexión.
Pistas
- Cada paso consulta una capa distinta, asi que ordenalos desde la pregunta mas simple hasta la mas especifica.
- Un nombre tiene que convertirse en una direccion antes de que exista algo que alcanzar, y un puerto solo se puede probar cuando la direccion responde.
- La respuesta de la aplicacion es lo ultimo que puedes observar, asi que va al final de la cadena.
Un companero dice que la API esta caida. En su maquina, dig devuelve 198.51.100.20 y curl al puerto 443 agota el tiempo de espera. En tu maquina el mismo dig devuelve 203.0.113.7 y curl devuelve 200. Cual es la explicacion mas probable?
Pistas
- Su ping por nombre ya demuestra dos cosas distintas: el nombre se resolvio y los paquetes viajan.
- Compara las dos respuestas de dig: una viene del resolutor local y la otra de uno publico.
- Pregunta que tienen de diferente las dos maquinas en lugar de que esta mal en el servidor.
Ordena los primeros cuatro pasos para investigar una pagina que carga despacio para algunos usuarios de una ciudad.
- 1ejecuta curl -v para ver la direccion resuelta y que fase es lenta
- 2repite desde una segunda ubicacion para distinguir la distancia de un problema local
- 3repite la misma peticion sobre una conexion ya establecida para separar el coste del handshake del coste de la transferencia
- 4reproduce la lentitud desde la ubicacion afectada y anota los tiempos
Pistas
- Empieza por la pregunta que no cuesta nada y que descarta una capa entera si falla.
- curl -v nombra el host, la direccion resuelta y el puerto que va a usar, en ese orden.
- Repite la misma solicitud dos veces desde la ubicacion afectada y compara los dos tiempos antes de culpar a cualquier otra cosa.
Preguntas sobre esta lección
¿Para qué aprender redes?
Casi todo lo que construyes acaba hablando con otra cosa. Entender cómo viajan de verdad los datos convierte «no funciona» en una lista de cosas que puedes comprobar una a una.
¿Cuál es la diferencia real entre TCP y UDP?
TCP se asegura de que todo llegue y en orden, y reintenta lo perdido, a cambio de tiempo. UDP envía y no mira atrás; por eso el vídeo en vivo y los juegos lo prefieren: un fotograma tardío es peor que uno perdido.
¿Qué es DNS en palabras simples?
Es la guía telefónica de internet. Tú conoces el nombre, el ordenador necesita el número. DNS convierte un nombre como example.org en una dirección IP y guarda la respuesta para no preguntar cada vez.
¿Es gratis?
Sí. El primer nivel de cada materia es gratis y no necesita cuenta. Los niveles más profundos y los grados superiores son de pago: eso es lo que mantiene vivo el proyecto.
¿Para qué edad es?
Está escrito para adolescentes curiosos a partir de unos 12 años y para adultos que empiezan de cero. No se supone experiencia previa en programación; las lecciones de redes y física no necesitan matemáticas más allá del colegio.
¿Necesito saber programar ya?
No. Las rutas de lógica, física y redes empiezan desde cero. El código lo escribes en la sección de lenguajes, que también arranca desde el principio.
¿Hay que instalar algo?
No. Todo funciona en el navegador: teoría, práctica y las simulaciones interactivas. No hay nada que descargar ni que configurar.
¿Cuánto se tarda en una materia?
Una lección dura entre 10 y 15 minutos. Un grado junior son unas 12 a 20 lecciones, así que son unas semanas de práctica constante, no una tarde.
¿Hay que seguir el orden?
Dentro de un grado los niveles se abren uno tras otro, porque cada uno se apoya en el anterior. Entre materias eres libre: empieza por lógica, física o redes.