• DNS 解析流程


    一、背景

    最近,在S3协议项目中调研通过DNS域名解析处理流量负载均衡问题。原来对dns也有一些粗浅的了解,知道通过DNS可以将域名转换为IP地址,也可以做负载均衡。但是DNS的解析流程以及缓存等机制,只是一知半解。正好,趁着这个机会系统的学习一下。

    二、DNS解析流程图

    DNS解析流程图

    1. 浏览器(谷歌,火狐,IE等)有自己的DNS缓存机制。当通过浏览器访问网站时,浏览器会优先查询自己的DNS缓存是否有缓存相关网站地址。如果DNS缓存命中,则直接根据缓存的IP地址访问目标网站,可以大大缩短DNS解析域名时间,提升访问速度。(谷歌浏览器DNS缓存TTL,默认60s)如果没有命中,则进入下一步;
    2. 查询操作系统的hosts文件。hosts文件是最初的接入互联网的方式(比域名先出现,算是域名的前辈吧),记录了IP地址和域名的映射关系。当访问的域名被记录到hosts文件后,会直接访问该域名在hosts文件中对应IP地址。访问没有记录到hosts文件中的域名时,则进入下一步;
    3. 查询操作系统DNS客户端。开启DNS客户端服务后,所有域名服务器返回的“域名–IP的映射关系对” 都会被DNS客户端保存到内存。应用需要进行DNS解析时,如果命中,则将结果返回给应用;如果没有命中则进入下一步。(如果需要DNS客户端缓存服务,需要开启DNS客户端;本步骤以前都不涉及网络通信,可以提高访问效率)
    4. 查询本地域名服务器。本地域名服务器是作为应用(访问者)的代理人,去查询域名地址的。应用只需要告诉本地域名服务器,“我需要xxx域名对应的IP,你把结果给我就行,我不关心你是怎么查询的”,即对于应用来说,本地域名服务器提供域名递归查询服务。本地域名服务器解析域名顺序位:从本地缓存开始查,如果没有命中,则依次从根域名服务器,二级域名服务器,三域名服务器查询,直到成功解析域名地址,即本地域名服务器干的是迭代查询的事情。
    5. 根域名服务器。最高层次的域名服务器,本地域名服务器解析不了的域名就会向其求助。包括国家顶级域名(cn、us、uk)和通用顶级域名(com、edu、gov、int、mil、net、org)
    6. 二级域名服务器。负责管理在该顶级域名服务器下注册的二级域名。
    7. 三级域名服务器。负责管理在该二级域名服务器下注册的三级域名。

    三、windows DNS客户端

    在windows 2000以前,没有DNS客户端服务,在浏览器和hosts没有命中的情况下,直接去本地DNS服务器解析域名了。从windows 2000开始,有DNS客户端服务,缓存了域名和地址映射关系,进一步加速了DNS解析。

    3.1 修改windows DNS缓存时间

    1.打开注册表(Regedit.exe);
    2.依次展开以下目录:
    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Dnscache\Parameters
    3.修改 “MaxCacheTtl ”字段的值(笔者电脑windows 7,该字段默认值为:10800)。

    3.2 DNS 列表管理

    DNS 列表查询命令:

    # 显示本机dns, 生存时间, 80-8000都有
    ipconfig /displaydns 
    
    • 1
    • 2

    清除DNS缓存命令:

    # 刷新windows dns缓存
    ipconfig /flushdns
    
    • 1
    • 2

    3.3 DNS 服务

    windows DNS服务名称是Dnscache,在任务管理器中可以查看到该服务。如果想关闭DNS客户端缓存,则打开任务管理器,停止该服务即可。DNS服务停止后,只是取消DNS缓存机制,依然可以正常访问网站(通过本地域名服务器解析域名)。

    四、linux DNS 客户端

    Linux系统需要安装Systemd-Resolved,DNSMasq 或 Nscd 等缓存服务,否则没有操作系统级 DNS 缓存。不同的Linux发型版本,使用的缓存服务不同。不同的DNS服务,清除DNS缓存的方法也不一样。清除DNS缓存命令如下:
    Systemd-Resolved( Ubuntu发行版自带该应用):

    sudo systemd-resolve --flush-caches
    
    • 1

    Dnsmasq:

    sudo service dnsmasq restart
    或者
    sudo systemctl restart dnsmasq.service
    
    • 1
    • 2
    • 3

    NSCD(Rethat发行版首先应用):

    $ sudo systemctl restart nscd.service
    或者
    $ sudo service nscd restart
    
    • 1
    • 2
    • 3

    日拱一卒无有尽,功不唐捐终入海,与君共勉之!

  • 相关阅读:
    简单工厂和工厂模式
    Python入门必学:单引号、双引号与三引号的差异与应用
    CAPL通过RS232通信发送指令控制程控电源
    redis源码阅读-zset
    上传项目的全部依赖到maven私有仓库-nexus
    【毕业设计】 python flas疫情爬虫可视化
    深入理解Linux进程管理与优化:原理、调度和资源控制详解
    基于Peer-Group(对等体组)的BGP和 BGP水平分割&路由反射器
    .Net下验证MongoDB 的 Linq 模式联合查询是否可用
    了解3dmax坐标系
  • 原文地址:https://blog.csdn.net/hejingdong123/article/details/126903230