Capture pacotes para entender o processo DNS e o princípio CDN

DNS (Domain Name System) é um protocolo que usamos todos os dias, e CDN (Content Delivery Network) também é encontrado com frequência, mas você pode dizer seus princípios?

Se você pode dizer o princípio, você viu seus pacotes de dados reais capturando pacotes?

Hoje, vamos nos aprofundar no processo DNS e nos princípios CDN por meio da captura de pacotes.

Princípios de implementação do DNS

O processo de DNS pode ser visto nesta foto:

Quando o navegador visita um nome de domínio, ele primeiro pesquisará o cache do navegador, o arquivo de hosts locais e o cache DNS e, se não for encontrado, solicitará o servidor DNS local, responsável por concluir a resolução do nome de domínio.

O DNS local, por sua vez, solicitará ao servidor de nome de domínio raiz para obter o endereço do servidor de nome de domínio de nível superior correspondente e, em seguida, solicitará ao servidor de nome de domínio de nível superior para obter o endereço do servidor de nome de domínio autoritativo e, em seguida, o nome de domínio autoritativo servidor de nome de domínio retornará o IP final ao servidor DNS local, que retornará ao navegador.

Por exemplo, para o nome de domínio baidu.com, o nome de domínio raiz é ., o nome de domínio de nível superior (também chamado de nome de domínio de primeiro nível) é com e o nome de domínio de segundo nível é baidu.com, então ele primeiro procurará no servidor de nome de domínio raiz o endereço do servidor de nome de domínio de nível superior de com. Em seguida, procure o endereço do servidor de nome de domínio autorizado de baidu.com no servidor de nome de domínio de nível superior de com.

Alguns alunos podem perguntar, e quanto a image.baidu.com ou xx.yy.zz.baidu.com?

Os nomes de domínio de segundo nível e os nomes de domínio de mais nível são resolvidos em servidores de nomes de domínio autoritativos, e os servidores de nomes de domínio têm apenas três níveis.

Como os servidores de nome de domínio são classificados dessa maneira para distribuir a pressão por meio do balanceamento de carga, a resolução do nome de domínio específico é tratada por seus respectivos servidores de nome de domínio autorizados, e o nome de domínio raiz e os servidores de nome de domínio de nível superior são apenas encaminhados.

Três níveis já podem atingir a meta e mais níveis podem ser divididos por você. Por exemplo, o serviço CDN que será discutido posteriormente é fazer mais níveis de balanceamento de carga por conta própria.

Falando em CDN, qual é a relação entre CDN e DNS?

Princípio de implementação do CDN

CDN não é um protocolo, mas uma rede distribuída baseada no protocolo DNS.

Conforme mencionado anteriormente, o nome de domínio de nível superior e o servidor de nome de domínio de segundo nível são apenas encaminhados, e a resolução final do nome de domínio é feita no servidor de nome de domínio autoritativo.

O servidor de nome de domínio autoritativo pode fazer outra camada de encaminhamento?

Por exemplo, o seguinte é o diagrama esquemático do Baidu Cloud CDN:

权威 DNS 服务器通过 CNAME 的配置(DNS 协议里指定别名的方式)把请求转发到了 baidu 的 DNS 服务器,baidu 的 DNS服务器再根据 IP 返回用户所在区域的一台机器的 IP。

这样用户从这个域名下载内容的时候,就找到了最近的一台机器,那速度自然快很多。

这就是 CDN 的原理。

大概介绍了 DNS 和 CDN 的实现原理,下面我们通过抓包来验证下。

抓包验证上述结论

我们一步步来,首先,前面讲到这三级查找是对的么?

浏览器缓存和 DNS 缓存真的存在么?真的会查 hosts 文件么?

我们用抓包工具来验证下:

这种网络包需要用 wireshark 来抓。

抓取网卡的数据包,过滤 DNS 的包:

刷新页面就可以看到所有 DNS 数据包了:

然后你可以打开 chrome://net-internals/#dns ,查询某个域名的浏览器 DNS 缓存:

点击按钮可以清掉浏览器 DNS 缓存:

这证明了浏览器缓存的存在。

我们再往下验证,hosts 真的会生效么?

修改下 hosts 文件,加个配置:

用 ping 命令试了下,真的生效了,这说明 DNS 确实会查询 hosts 文件。

然后继续验证下系统的 DNS 缓存真的存在么?

我 ping 了几次 www.baidu.com,都没有新的 DNS 数据包,说明确实是有缓存的。

可以执行这个命令清掉系统 DNS 缓存: sudo dscacheutil -flushcache; sudo killall -HUP mDNSResponder

我 ping 了两次 www.baidu.com 都没有 DNS 数据包,但是我一清空缓存,再 ping 就有了:

这验证了系统级别的 DNS 缓存确实存在。

也就是说浏览器 DNS 缓存、hosts 文件、系统 DNS 缓存这三步确实都是会经历的:

继续往下看,本地 DNS 服务是啥?

这个可以在“系统偏好设置 > 网络 > 高级”里看到:

确实是有本地 DNS 服务器的地址的,这个一般是运营商提供的,可能每个城市都有一些公共的。这一级也有缓存。

通过这层层缓存加上域名系统本身就是分布式的,这种设计极大的减轻了 DNS 服务器的压力,实现了高并发,这是我们每天都在用的高并发系统。

继续往后看,这三级域名服务怎么验证呢?

可以 ping 一个不存在的域名,比如 ddd1111.com

这时候可以看到请求了 com 的域名服务器,地址是 a.gtld-server.net,没错,这个就是一个顶级域名服务器的域名。

但你再请求一个别的域名,你会发现它并没有从根域名顶级域名开始查,而是直接从权威域名服务器开始的:

没错,这也是缓存,本地 DNS 服务器会把域名对应的权威域名服务器的 IP 缓存下来,直接去那里查。

你会发现有的返回结果是 CNAME,值为一个域名,这个 CNAME 是一种记录类型,别名的意思。之后会再去这里查,最后查到 A 的记录类型,值就是 IP 了。

CDN 就是这么实现的,我们来看一个真实的 CDN 的 DNS 查询的例子:

这是 www.baidu.com 的 DNS 查询结果:

你会发现先通过 CNAME 指向了另一个域名,然后这个域名又给了两条 IP 的结果。

对照下 CDN 的原理图,就知道这俩 IP 都是离用户最近的服务器的 IP 了:

这就是 CDN 的原理。

再来看个 www.juejin.cn 的,他也是用了 CDN 的:

也是同样 CNAME 指向了 CDN 的 DNS 服务器,然后返回了就近的一些服务器的 IP,只不过它的负载均衡的机器更多一些。

总结

我们通过 wireshark 抓包的方式,验证了 DNS 的流程和 CDN 的实现原理。

DNS 的流程是会先查找浏览器 DNS 缓存、hosts 文件、系统 DNS 缓存,然后请求本地 DNS 服务器,由它去一级级查询最终的 IP:

CDN 是基于 DNS 的,在权威域名服务器做了 CNAME 的转发,然后根据请求 IP 的所在地来返回就近区域的服务器的 IP。

这个流程是有一层层的缓存的,而且还是分布式的,是我们接触最多的高并发系统了。

おすすめ

転載: juejin.im/post/7166995181093257246