Con el anuncio de parte de Cloudflare de un nuevo servicio de resolución de DNS y viendo benchmarks que solo tomaban en cuenta el ping al servidor se me ocurrió hacer una comparativa local de rendimiento de distintos servicios de DNS.
¿Pero qué es DNS? ultrasimplificado
Todo sitio o servicio que "existe" en Internet tiene asignada una dirección IP, como las direcciones IP son difíciles de recordar se creó el DNS (Domain Name System) que sin dar muchas vueltas es una especie de "guía telefónica" de Internet; es el responsable de saber que nombre de dominio pertenece a cual dirección IP, por ejemplo melizeche.com
apunta al IP 173.230.137.131
.
Para más(y mejor) info está la Wikipedia :)
El problema
Generalmente si uno no especifica que servidor DNS utilizar tu proveedor de internet te asigna uno automáticamente, cosa que no suele ser la mejor opción debido a posibles fallas del mismo proveedor o inclusive pueden ser utilizados para censurar sitios de internet. En Paraguay hay un nefasto antecedente de esto de parte de Copaco.
everywhere twitter everywhere resistance
— Biçda (@bicda) March 21, 2014
walls from istanbul#direntwitter #resisttwitter #TurkeyBlockedTwitter pic.twitter.com/JEoUyOkDv2
Además otros servidores de DNS pueden ofrecer otros servicios como bloqueo de publicidad o mejores condiciones de privacidad; la mayoría del tráfico DNS no está cifrado lo que facilita el tracking por parte del proveedor u otros actores "maliciosos".
Las opciones
Debido a la importancia de los servidores DNS con el tiempo fueron surgiendo distintas opciones. Empresas como Google, Cisco, IBM, entre otras lanzaron sus servicios de DNS cada uno con distintas prestaciones y/o promesas.
Pero sin mas preambulos los servicios de DNS que vamos a testear son:
- Google Public DNS
- Cloudflare 1.1.1.1
- OpenDNS
- IBM Quad9
- DNS de Tigo Paraguay (186.16.16.16)
Benchmark
El problema con algunos "benchmarks" que vi en estos días es que solo lo hacían con ping cosa que no es suficiente porque no toma en cuenta el tiempo que tarda en procesar el request por eso opté por una metodología diferente. Además los resultados dependen mucho del país o región donde se realice.
Normalmente bastaría con utilizar el comando dig
de *nix para obtener el tiempo que tarda un request pero para obtener un mejor resultado es necesario hacer varios request además para esto necesitamos un poco más de precisión.
Metodología
- Elegir targets distintos para mayor variedad(Sitio nacional, sitio de alto tráfico y un sitio no muy solicitado).
- Hacer varias peticiones DNS a los distintos servidores usando
bash
/zsh
ydig
. - Capturar los paquetes de red con Wireshark.
- Medir la diferencia de tiempo entre el request y la respuesta.
- Sacar el promedio.
Targets:
Script:
El script solicita la resolución de cada dominio de forma intercalada unas 5 veces y por cada servidor DNS haciendo una pausa de 200ms entre cada request (el script e extremadamente mejorable pero es lo que salió en el momento ¯\_(ツ)_/¯
)
for dns in "8.8.8.8" "9.9.9.9" "186.16.16.16" "1.1.1.1" "208.67.222.222"; do
for x in 1 2 3 4 5; do
for url in "instagram.com" "www.abc.com.py" "melizeche.com"; do
dig $url @$dns && sleep 0.2;
done;
done;
done;
Captura
El uso de Wireshark ya escapa del alcance de este post pero básicamente se pueden usar los filtros dns
, ip.src
, ip.dst
para ver los resultados que nos interesan.
Delta
En Wireshark podemos marcar un evento o paquete como referencia temporal lo que nos permite fácilmente obtener la diferencia entre el request y la respuesta
Exportar y promedio
Wireshark permite exportar a CSV y con eso se facilita el procesamiento de los datos, utilicé Google Spreadsheets para que sea más fácil de compartir. En el siguiente link se pueden encontrar todos los datos en crudo y los cálculos utilizados.
Resultados
No sorprende que el servidor de menor tiempo de respuesta sea el de Tigo dado que es el proveedor local y el request no sale de la red interna, igual más arriba ya citamos los posibles inconvenientes de usar un DNS local.
Algo interesante es el caso de Cloudflare: Hasta en su propio sitio dicen que es 28% más rápido, pero al menos desde Paraguay la cosa es distinta, comparando con Google el servicio de Cloudflare es 5.3X más rápido.
Conclusión
Puede parecer despreciable que un servicio sea 120ms más lento que otro pero eso es asumiendo que por cada sitio que uno ingresa solo se hace un request. La realidad actual es otra, la mayoría de los sitios actuales hacen muchas, pero muuchas (81 en el caso de abc) peticiones externas para cargar recursos, scripts, trackers y demás. Si tenemos en cuenta esto vemos que a la larga esos 120ms por request en promedio realmente suman.
Por mi lado las prestaciones de privacidad y seguridad del 1.1.1.1 de Cloudflare ya eran más que suficientes pero sumando la diferencia de velocidad con Google Public DNS y OpenDNS ya estoy totalmente convencido.
Cualquier sugerencia de como mejorar el benchmark o si tenés algún comentario al respecto no dudes en dejar un comentario.