DNS域名解析
words: 883 views: time: 3minDNS(Domain Name System) 域名系统是一个分布式架构的查询系统,提供根据域名查询IP的服务,但问题是它要维护全球所有的域名,大概有几亿个,并对全球提供查询能力,qps(query per seconde)估计得千亿级别。主要思路就是分而治之,然后配上缓存设计
域名分层
解决办法是对域名URL进行分层,这样就可以将所有域名组织成一个树状结构,然后依据层级结构对域名服务进行拆分,解析过程示意如下
具体操作起来,并不会对每个三级域都搞一台服务器,而是会搭建一组权威域名服务器集群,负责返回该二级域下所有三级域名地址。一般只有大型公司或组织才会建设和管理自己的域名服务,然后这些大型服务商顺便还可以对外提供域名托管服务(一组权威域名服务器完全可以服务成千上万个二级域名),这样一些小公司就不用自己搭建DNS服务器了。
根域名对应的IP地址不需要查询,而是会以配置文件的形式放在每个域名服务器中(DNS的IPv4根域名只有13个),dig +trace www.baidu.com可以看下解析过程:
缓存设计
一般对于读多写少的场景,都会想到使用缓存,尤其适合DNS解析这种需求,如果浏览器访问某个URL,其解析过程可以示意如下:
通过多级缓存,每一层实际接收到的请求都会大大减少,而且一般人经常访问的网站数量非常有限,大部分解析请求都能命中缓存直接返回
任播技术
对于一台路由器,它要访问某个IP地址的机器,可以有多条路径,然后通过跳数、链路带宽、延迟等信息计算每条路径的成本,得到最优的路径。将最优路径汇总成一张表,就是我们常说的路由表。
假设将网络中的两个点的IP地址设为一样,路由器其实并不知道这是两台不同的机器,对它来说,只说两条不同的路径,都通向同一个IP地址,如果发往任意一台服务器都能拿到想要的信息,也就实现了任播。
如果一台服务器在国内,另一台在国外,路由器计算传输成本,生成的最优路线自然是发往国内的机器。基于这样的思路,我们可以在国内对国外的一些服务器搭建镜像服务器,从而实现就近访问,这样就算国外的服务关闭或者挂了,依然能够提供服务,从高可用的角度看也就实现了异地多活的概念。所以尽管只有13个根域,但并不是物理上只有13台根域服务器,是可以根据需要进行扩展的。
DNS协议
- 报文格式:
Transaction ID表示事物ID,对应一次请求和应答;QR标志,0表示查询,1表示响应;RCode是响应码,0表示正常,其它表示各种错误;
- 抓包
从抓包结果看到总是成对的记录,通过事务ID关联一个请求和响应
参考: