精华内容
下载资源
问答
  • dns解析
    千次阅读
    2021-07-09 12:16:43

    前言

    本文参考倪朋飞老师的DNS 解析时快时慢,该怎么办文章,结合
    DNS服务介绍ICMP协议 ping和traceroute介绍这两篇文章,能对DNS从理论到具体解析流程有个理解。
    可细看:阮一峰DNS 原理入门

    DNS各种命令介绍

    • DNS 协议在 TCP/IP 栈中属于应用层,不过实际传输还是基于 UDP 或者 TCP 协议(UDP 居多) ,并且域名服务器一般监听在端口 53 上。

    • DNS 服务通过资源记录的方式,来管理所有数据,它支持 A、CNAME、MX、NS、PTR 等多种类型的记录。
      参考DNS各项记录
      A 记录,是指定域名对应的IP地址。;
      CNAME记录,别名记录,允许您将多个名字映射到同一台计算机;
      NS 记录,是域名服务器记录,用来指定该域名由哪个DNS服务器来进行解析。
      AAAA记录: 将主机名(或域名)指向一个IPv6地址,需要添加AAAA记录;

    • 执行cat /etc/resolv.conf命令,查询系统配置的DNS 服务器;
      系统必须要配置 DNS 服务器,这样才可以通过域名来访问外部服务:

    $ cat /etc/resolv.conf
    nameserver 192.168.4.251
    nameserver 172.20.64.240
    
    • 执行nslookup命令,可以查询到这个域名的 A 记录
    ~ nslookup www.baidu.com                
    Server:		192.168.4.251
    Address:	192.168.4.251#53
    
    Non-authoritative answer:
    www.baidu.com	canonical name = www.a.shifen.com.
    Name:	www.a.shifen.com
    Address: 110.242.68.3  // A 记录
    Name:	www.a.shifen.com
    Address: 110.242.68.4 // A 记录
    
    • 执行dig命令,可以展示递归查询的整个过程
      输出里展示的各级域名的 NS 记录,其实就是各级域名服务器的地址,可以更清楚 DNS 解析的过程;
      它执行 DNS 搜索,显示从受请求的域名服务器返回的答复;可以利用 dig 作为 DNS 问题的故障诊断,因为它灵活性好、易用、输出清晰。
      第一部分显示 dig 命令的版本和输入的参数。
      第二部分显示服务返回的一些技术详情,比较重要的是 status。如果 status 的值为 NOERROR 则说明本次查询成功结束。
      第三部分中的 “QUESTION SECTION” 显示我们要查询的域名。
      第四部分的 “ANSWER SECTION” 是查询到的结果。
      第五部分则是本次查询的一些统计信息,比如用了多长时间,查询了哪个 DNS 服务器,在什么时间进行的查询等等。
     ~ dig www.baidu.com
    // 第一部分
    ; <<>> DiG 9.10.6 <<>> www.baidu.com
    ;; global options: +cmd 
    // 第二部分
    ;; Got answer:
    ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 29880;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 13, ADDITIONAL: 27
    //第三部分
    ;; OPT PSEUDOSECTION:
    ; EDNS: version: 0, flags:; udp: 4096
    ;; QUESTION SECTION:
    ;www.baidu.com.			IN	A
    //第四部分
    ;; ANSWER SECTION:
    www.baidu.com.		52	IN	CNAME	www.a.shifen.com.
    www.a.shifen.com.	209	IN	A	110.242.68.3
    www.a.shifen.com.	209	IN	A	110.242.68.4
    
    ;; AUTHORITY SECTION:
    com.			133139	IN	NS	b.gtld-servers.net.
    com.			133139	IN	NS	j.gtld-servers.net.
    com.			133139	IN	NS	c.gtld-servers.net.
    com.			133139	IN	NS	h.gtld-servers.net.
    com.			133139	IN	NS	i.gtld-servers.net.
    com.			133139	IN	NS	l.gtld-servers.net.
    com.			133139	IN	NS	f.gtld-servers.net.
    com.			133139	IN	NS	a.gtld-servers.net.
    com.			133139	IN	NS	m.gtld-servers.net.
    com.			133139	IN	NS	e.gtld-servers.net.
    com.			133139	IN	NS	d.gtld-servers.net.
    com.			133139	IN	NS	g.gtld-servers.net.
    com.			133139	IN	NS	k.gtld-servers.net.
    
    ;; ADDITIONAL SECTION:
    a.gtld-servers.net.	2901	IN	A	192.5.6.30
    a.gtld-servers.net.	10065	IN	AAAA	2001:503:a83e::2:30
    b.gtld-servers.net.	83957	IN	A	192.33.14.30
    b.gtld-servers.net.	2320	IN	AAAA	2001:503:231d::2:30
    c.gtld-servers.net.	83397	IN	A	192.26.92.30
    c.gtld-servers.net.	145158	IN	AAAA	2001:503:83eb::30
    d.gtld-servers.net.	16584	IN	A	192.31.80.30
    d.gtld-servers.net.	133139	IN	AAAA	2001:500:856e::30
    e.gtld-servers.net.	82924	IN	A	192.12.94.30
    e.gtld-servers.net.	60534	IN	AAAA	2001:502:1ca1::30
    f.gtld-servers.net.	83959	IN	A	192.35.51.30
    f.gtld-servers.net.	60853	IN	AAAA	2001:503:d414::30
    g.gtld-servers.net.	17022	IN	A	192.42.93.30
    g.gtld-servers.net.	133139	IN	AAAA	2001:503:eea3::30
    h.gtld-servers.net.	82708	IN	A	192.54.112.30
    h.gtld-servers.net.	60431	IN	AAAA	2001:502:8cc::30
    i.gtld-servers.net.	14862	IN	A	192.43.172.30
    i.gtld-servers.net.	60431	IN	AAAA	2001:503:39c1::30
    j.gtld-servers.net.	84156	IN	A	192.48.79.30
    j.gtld-servers.net.	133139	IN	AAAA	2001:502:7094::30
    k.gtld-servers.net.	21663	IN	A	192.52.178.30
    k.gtld-servers.net.	60853	IN	AAAA	2001:503:d2d::30
    l.gtld-servers.net.	16592	IN	A	192.41.162.30
    l.gtld-servers.net.	87523	IN	AAAA	2001:500:d937::30
    m.gtld-servers.net.	58701	IN	A	192.55.83.30
    m.gtld-servers.net.	133139	IN	AAAA	2001:501:b1f9::30
    // 第五部分
    ;; Query time: 167 msec
    ;; SERVER: 192.168.4.251#53(192.168.4.251)
    ;; WHEN: Thu Jul 08 10:58:31 CST 2021
    ;; MSG SIZE  rcvd: 897
    

    DNS优化方法

    • 可以把主机名和 IP 地址的映射关系,写入本机的 /etc/hosts 文件中。这样,指定的主机名就可以在本地直接找到目标 IP。可以作为优化dns解析的手段;

    • 对 DNS 解析的结果进行缓存。缓存是最有效的方法,但要注意,一旦缓存过期,还是要去 DNS 服务器重新获取新记录。不过,这对大部分应用程序来说都是可接受的。

    • 对 DNS 解析的结果进行预取。这是浏览器等 Web 应用中最常用的方法,也就是说,不等用户点击页面上的超链接,浏览器就会在后台自动解析域名,并把结果缓存起来。

    • 使用 HTTPDNS 取代常规的 DNS 解析。这是很多移动应用会选择的方法,特别是如今域名劫持普遍存在,使用 HTTP 协议绕过链路中的 DNS 服务器,就可以避免域名劫持的问题。

    • 基于 DNS 的全局负载均衡(GSLB)。这不仅为服务提供了负载均衡和高可用的功能,还可以根据用户的位置,返回距离最近的 IP 地址。

    DNS解析为何使用UDP协议

    • 区域传送时使用TCP
      DNS的规范规定了2种类型的DNS服务器,一个叫主DNS服务器,一个叫辅助DNS服务器。在一个区中主DNS服务器从自己本机的数据文件中读取该区的DNS数据信息,而辅助DNS服务器则从区的主DNS服务器中读取该区的DNS数据信息。当一个辅助DNS服务器启动时,它需要与主DNS服务器通信,并加载数据信息,这就叫做区传送(zone transfer)。
      辅域名服务器会定时(一般时3小时)向主域名服务器进行查询以便了解数据是否有变动。如有变动,则会执行一次区域传送,进行数据同步。区域传送将使用TCP而不是UDP,因为数据同步传送的数据量比一个请求和应答的数据量要多得多。

    • 客户端向DNS服务器查询域名使用UDP;
      DNS需要优先解决的快速查询,以及减少对DNS服务器的压力。
      如果使用TCP查询DNS,需要三次握手+一次查询RTT+四次挥手。而用UDP查询,只需要1RTT,当然如果发生超时丢包,重传就是了,使用UDP对服务器的压力也小很多。另外你也可以试想下TCP丢包的场景,也是需要重传的,只是这部分的功能,被包括在了TCP协议里面。

    参考:
    DNS为什么既使用TCP又使用UDP?
    为什么DNS使用UDP而不是TCP?

    更多相关内容
  • 主要介绍了Python爬虫DNS解析缓存方法,结合具体实例形式分析了Python使用socket模块解析DNS缓存的相关操作技巧与注意事项,需要的朋友可以参考下
  • dns协议栈客户端实现,实现了多种解析格式,不仅是域名解析ip,还有ENUM的格式解析
  • 一个很实用的DNS域名解析DNS,用于网络视频服务器中。
  • DNS解析过程

    千次阅读 2022-03-07 14:58:28
    1、DNS DNS(Domain Name System)是域名系统的英文缩写,是一种组织成域层次结构的计算机和网络服务命名系统,用于 TCP/IP 网络。 2、域名系统DNS 的作用 通常我们有两种方式识别主机:通过主机名或者 IP 地址。...

    1、DNS

    DNS(Domain Name System)是域名系统的英文缩写,是一种组织成域层次结构的计算机和网络服务命名系统,用于 TCP/IP 网络。

    2、域名系统DNS 的作用

    通常我们有两种方式识别主机:通过主机名或者 IP 地址。人们喜欢便于记忆的主机名表示,而路由器则喜欢定长的、有着层次结构的 IP 地址。为了满足这些不同的偏好,我们就需要一种能够进行主机名到IP 地址转换的目录服务,域名系统作为将域名和 IP 地址相互映射的一个分布式数据库,能够使人更方便地访问互联网。

    因此,即使不使用域名也可以通过IP地址来寻址目的主机,但域名与IP地址相比,便于人们记忆。因此对于大多数网络应用,我们一般使用域名来访问目的主机,而不是直接使用IP地址来访问。

    对于本例,简单来说,当我们在浏览器地址栏中输入某个Web服务器的域名时。用户主机首先用户主机会首先在自己的DNS高速缓存中查找该域名所应的IP地址。

    img

    如果没有找到,则会向网络中的某台DNS服务器查询,DNS服务器中有域名和IP地映射关系的数据库。当DNS服务器收到DNS查询报文后,在其数据库中查询,之后将查询结果发送给用户主机。

    img

    现在,用户主机中的浏览器可以通过Web服务器的IP地址对其进行访问了。

    img

    3、域名的层级关系

    层级关系特点

    • 因特网采用层次树状结构的域名结构

    • 域名的结构由若干个分量组成,各分量之间用“点”隔开,分别代表不同级别的域名。

      • 每一级的域名都由英文字母和数字组成,不超过63个字符,不区分大小写字母。
      • 级别最低的域名写在最左边,而级别最高的顶级域名写在最右边。
      • 完整的域名不超过255个字符。
    • 域名系统既不规定一个域名需要包含多少个下级域名,也不规定每一级的域名代表什么意思。

    • 各级域名由其上一级的域名管理机构管理,而最高的顶级域名则由因特网名称与数字地址分配机构ICANN进行管理。

    因特网的域名空间

    img

    上图展示了 DNS 服务器的部分层次结构,从上到下依次为根域名服务器、顶级域名服务器和权威域名服务器。域名和IP地址的映射关系必须保存在域名服务器中,供所有其他应用查询。显然不能将所有信息都储存在一台域名服务器中。DNS使用分布在各地的域名服务器来实现域名到IP地址的转换。

    域名服务器可以划分为以下四种不同的类型:

    • 根域名服务器 根域名服务器是最高层次的域名服务器。每个根域名服务器都知道所有的顶级域名服务器的域名及其IP地址。因特网上共有13个不同IP地址的根域名服务器。当本地域名服务器向根域名服务器发出查询请求时,路由器就把查询请求报文转发到离这个DNS客户最近的一个根域名服务器。这就加快了DNS的查询过程,同时也更合理地利用了因特网的资源。
    • 顶级域名服务器 这些域名服务器负责管理在该顶级域名服务器注册的所有二级域名。当收到DNS查询请求时就给出相应的回答(可能是最后的结果,也可能是下一级权限域名服务器的IP地址)。
    • 权限域名服务器 这些域名服务器负责管理某个区的域名。每一个主机的域名都必须在某个权限域名服务器处注册登记。因此权限域名服务器知道其管辖的域名与IP地址的映射关系。另外,权限域名服务器还知道其下级域名服务器的地址。
    • 本地域名服务器 本地域名服务器不属于上述的域名服务器的等级结构。当一个主机发出DNS请求报文时,这个报文就首先被送往该主机的本地域名服务器。本地域名服务器起着代理的作用,会将该报文转发到上述的域名服务器的等级结构中。本地域名服务器离用户较近,一般不超过几个路由器的距离,也有可能就在同一个局域网中。本地域名服务器的IP地址需要直接配置在需要域名解析的主机中。

    4、DNS 域名解析过程

    域名解析包含两种查询方式,分别是递归查询迭代查询

    递归查询

    如果主机所询问的本地域名服务器不知道被查询域名的 IP 地址,那么本地域名服务器就以 DNS 客户端的身份,向其他根域名服务器继续发出查询请求报文,即替主机继续查询,而不是让主机自己进行下一步查询。

    我们以一个例子来了解DNS递归查询的工作原理,假设图中的主机 (IP地址为m.xyz.com) 想知道域名y.abc.com的IP地址。

    • 1、主机首先向其本地域名服务器进行递归查询
    • 2、本地域名服务器收到递归查询的委托后,也采用递归查询的方式向某个根域名服务器查询。
    • 3、根域名服务器收到递归查询的委托后,也采用递归查询的方式向某个顶级域名服务器查询。
    • 4、顶级域名服务器收到递归查询的委托后,也采用递归查询的方式向某个权限域名服务器查询。

    过程如图所示:

    img

    当查询到域名对应的IP地址后,查询结果会在之前受委托的各域名服务器之间传递,最终传回给用户主机。

    过程如图所示:

    img

    迭代查询

    当根域名服务器收到本地域名服务器发出的迭代查询请求报文时,要么给出所要查询的IP 地址,要么告诉本地服务器下一步应该找哪个域名服务器进行查询,然后让本地服务器进行后续的查询。

    迭代查询过程如下:

    • 1、主机首先向其本地域名服务器进行递归查询
    • 2、本地域名服务器采用迭代查询,它先向某个根域名服务器查询。
    • 3、根域名服务器告诉本地域名服务器,下一次应查询的顶级域名服务器的IP地址。
    • 4、本地域名服务器向顶级域名服务器进行迭代查询
    • 5、顶级域名服务器告诉本地域名服务器,下一次应查询的权限域名服务器的IP地址。
    • 6、本地域名服务器向权限域名服务器进行迭代查询
    • 7、权限域名服务器告诉本地域名服务器所查询的域名的IP地址。
    • 8、本地域名服务器最后把查询的结果告诉主机。

    过程如图所示:

    img

    由于递归查询对于被查询的域名服务器负担太大,通常采用以下模式:从请求主机到本地域名服务器的查询是递归查询,而其余的查询是迭代查询。

    5、高速缓存

    为了提高DNS的查询效率,并减轻根域名服务器的负荷和减少因特网上的DNS查询报文数量,在域名服务器中广泛地使用了高速缓存。高速缓存用来存放最近查询过的域名以及从何处获得域名映射信息的记录。

    由于域名到IP地址的映射关系并不是永久不变,为保持高速缓存中的内容正确,域名服务器应为每项内容设置计时器并删除超过合理时间的项(例如,每个项目只存放两天)。

    不但在本地域名服务器中需要高速缓存,在用户主机中也很需要。许多用户主机在启动时从本地域名服务器下载域名和IP地址的全部数据库,维护存放自己最近使用的域名的高速缓存,并且只在从缓存中找不到域名时才向域名服务器查询。同理,主机也需要保持高速缓存中内容的正确性。

    如图所示:

    img

    如果本地域名服务器不久前已经有用户查询过域名为y.abc.com的IP地址,则本地域名服务器的高速缓存中应该存有该域名对应的IP地址。因此,直接把高速缓存中存放的上次查询结果(即y.abc.com的IP地址)告诉用户。

    6、DNS相关面试问题

    1、DNS为什么用UDP?

    更正确的答案是 DNS 既使用 TCP 又使用 UDP。当进行区域传送(主域名服务器向辅助域名服务器传送变化的那部分数据)时会使用 TCP,因为数据同步传送的数据量比一个请求和应答的数据量要多,而 TCP 允许的报文长度更长,因此为了保证数据的正确性,会使用基于可靠连接的 TCP。

    当客户端向 DNS 服务器查询域名 ( 域名解析) 的时候,一般返回的内容不会超过 UDP 报文的最大长度,即 512 字节。用 UDP 传输时,不需要经过 TCP 三次握手的过程,从而大大提高了响应速度,但这要求域名解析器和域名服务器都必须自己处理超时和重传从而保证可靠性。

    2、递归查询和递归查询区别?

    递归查询: 如果主机所询问的本地域名服务器不知道被查询域名的 IP 地址,那么本地域名服务器就以 DNS 客户端的身份,向其他根域名服务器继续发出查询请求报文,即替主机继续查询,而不是让主机自己进行下一步查询。

    迭代查询: 当根域名服务器收到本地域名服务器发出的迭代查询请求报文时,要么给出所要查询的IP 地址,要么告诉本地服务器下一步应该找哪个域名服务器进行查询,然后让本地服务器进行后续的查询。

    3、使用域名访问web服务器过程

    具体请看本专栏的这篇文章:面试官问我:从地址栏输入URL到显示页面都发生了什么? https://blog.csdn.net/weixin_45629285/article/details/120930370

    4、讲讲DNS解析过程?

    详细解析过程请看上文DNS域名解析过程,这里我们做一个总结:

    浏览器缓存——》系统hosts文件——》本地DNS解析器缓存——》本地域名服务器(本地配置区域资源、本地域名服务器缓存)——》根域名服务器——》主域名服务器——》下一级域名域名服务器 客户端——》本地域名服务器(递归查询) 本地域名服务器—》DNS服务器的交互查询是迭代查询

    展开全文
  • 域名解析文功能,对ip地址和网络名称之间进行一一对应解析
  • Linux 用UDP自己实现DNS解析代码,只取其第一个IP地址,但是完整实现整个流程,对于UDP的理解非常之好,原创
  • Android DNS解析过程

    万次阅读 2022-01-02 00:39:49
    一次排查接口404问题,引伸的Android DNS解析过程,简单分析总结一下 1、首先明白DNS解析流程 操作系统检查自身本地的hosts文件是否有这个网址的映射关系,如果有,直接返回完成域名解析如果hosts文件没有这个域名...

    前言

    一次排查接口404问题,引伸的Android DNS解析过程,简单分析总结一下

    1、首先明白DNS解析流程

    1. 操作系统检查自身本地的hosts文件是否有这个网址的映射关系,如果有,直接返回完成域名解析如果hosts文件没有这个域名映射,则查找本地dns解析器缓存,如果有映射关系则完成域名解析
    2. 如果hosts和本地dns缓存都没有映射关系,则查找TCP/IP中的首选dns服务器(本地dns服务器),收到查询时,如果查询的资源在本地配置区域中,则返回解析地址给客户机,完成域名解析。
    3. 如果不在本地dns服务器区域解析,但是该服务器缓存了相关的信息,则从缓存中调用这个映射关系,完成解析,但是这个解析不具备权威性
    4. 如果本地dns服务器本地区域文件与缓存都解析失败,则根据本地dns服务器的设置进行查询,如果没有启用转发模式,本地dns就把请求发给13台根dns,根dns判断这个域名所述的顶级域名服务器,并返回负责该顶级域名的服务器的一个IP地址。本地dns服务器收到ip信息后联系对应的顶级域的这台服务器。这台负责顶级域的服务器收到请求后,如果自己无法解析,它会找到下一集dns的地址并返回给本地dns服务器。当本地dns服务器收到这个地址后,就会取新的服务器上查询一直重复这个动作,直到找到主机
    5. 如果使用了转发模式,此dns服务器会把请求转发至上一级dns服务器,由上一级服务器进行解析如果也不能解析则继续转发到上机,知道找到能够解析的服务器

    2、Java DNS查询内部实现

    在Android的DNS操作API同样是Java的InetAddress 来实现的。

    jshell> InetAddress.getByName("baidu.com").getHostAddress()
    $1 ==> "220.181.38.148"
    
    jshell> InetAddress.get
    getAllByName(          getByAddress(          getByName(             getLocalHost()         getLoopbackAddress()
    
    jshell> InetAddress.getAllByName("baidu.com")
    $2 ==> InetAddress[2] { baidu.com/220.181.38.148, baidu.com/220.181.38.251 }
    
    域名反查,百度IP还是返回IP,DNS欧凯
    InetAddress[] addresses = InetAddress.getAllByName("8.8.8.8");
    addresses[0].getHostName();
    $6 ==> "dns.google"
    

    打开IDE,看看源码和doc,也很简单明了。

    nameServices 是真正的DNS查询;并依次解析

    DNSNameService 是默认查询实现,通过spi, jndi 方式可以指定DNS服务器,不过只限Java

    /**
         * 获取DNS服务器信息
         *
         * @param domain     要获取DNS信息的域名
         * @param provider   DNS服务器
         * @param types      信息类型 "A"(IP信息),"MX"
         * @param timeout    请求超时
         * @param retryCount 重试次数
         * @return 所有信息组成的数组
         * @throws NamingException
         */
    
        @SuppressWarnings("rawtypes")
        public static ArrayList<String> getDNSRecs(String domain, String provider,
                                                   String[] types, int timeout, int retryCount) throws NamingException, NamingException {
            ArrayList<String> results = new ArrayList<String>(15);
            Hashtable<String, String> env = new Hashtable<String, String>();
            env.put("java.naming.factory.initial",
                    "com.sun.jndi.dns.DnsContextFactory");
            //设置域名服务器
            env.put(Context.PROVIDER_URL, "dns://" + provider);
            // 连接时间
            env.put("com.sun.jndi.dns.timeout.initial", String.valueOf(timeout));
            // 连接次数
            env.put("com.sun.jndi.dns.timeout.retries", String.valueOf(retryCount));
            DirContext ictx = new InitialDirContext(env);
            Attributes attrs = ictx.getAttributes(domain, types);
            for (Enumeration e = attrs.getAll(); e.hasMoreElements(); ) {
                Attribute a = (Attribute) e.nextElement();
                int size = a.size();
                for (int i = 0; i < size; i++) {
                    results.add((String) a.get(i));
                }
            }
            return results;
        }
        /**
         * 获取域名所有IP
         *
         * @param domain     域名
         * @param dnsServers DNS服务器列表
         * @param timeout    请求超时
         * @param retryCount 重试次数
         * @return
         */
        public static Set<String> getAllIP(String domain, String[] dnsServers,
                                           int timeout, int retryCount) {
            Set<String> ips = new HashSet<String>();
            for (String dnsServer : dnsServers) {
                List<String> ipList;
                try {
                    ipList = getDNSRecs(domain, dnsServer, new String[]{"A"},
                            timeout, retryCount);
                } catch (NamingException e) {
                    continue;
                }
                ips.addAll(ipList);
            }
            return ips;
        }
    

    3、Android DNS查询内部实现

    追踪InetAddress 分析,是netbsd 来解释DNS的,Libcore.os.getaddrinfo 为主要调用函数

    Android系统采用的是一个从BSD继承而来的标准的系统函数库bionic

    bionic/
    |——libc//C库
    |——libstdc++ //C++实现库
    |——libthread_db //线程库
    

    Android DNS 代码都在bionic/libc/netbsd中、(虽然netbsd 是个废弃的项目,但dns功能部分代码被 Android用上了, 真牛逼,代码晦涩难懂)。想了解的同学,查查源码,这里推荐不错的文章Android okhttp3 DNS 底层实现追踪

    4、网络优化优化HTTPDNS

    我们知道DNS解析通常采用的UDP。UDP基于无连接传输,所以传输效率高。
    TCP响应时间=TCP连接时间 + DNS查询时间;
    UDP响应时间=DNS查询时间;

    移动解析HTTPDNS 则基于 HTTP 协议向xx云的 DNS 服务器发送域名解析请求,替代了基于 DNS 协议向运营商 Local DNS 发起解析请求的传统方式,可以避免 Local DNS 造成的域名劫持和跨网访问问题,解决移动互联网服务中域名解析异常带来的困扰。更有效地保障您的业务正常,避免移动互联网中的劫持、跨网域名解析错误等问题。

    安卓上要实现自己DNS解析,工作量还不少,建议看看dnsjavaminidns 这些实现库

    基于HTTPDNS的+OKHTTP,倒是很舒服就能接入成功,但是我们最好了解整个过程。

    简化

    • 域名对应的IP地址
    • OKHTTP DNS接口,返回InetAddress[] 对象
    byte[] bytes = textToNumericFormatV4("220.181.38.251");
            try {
                InetAddress byAddress = Inet4Address.getByAddress("baidu.com", bytes);
                System.out.println(byAddress instanceof Inet4Address);
            } catch (UnknownHostException e) {
                e.printStackTrace();
            }
    

    如果不是OKHTTP,可以参考阿里云的解决方案Android端HTTPS(含SNI)业务场景:IP直连方案

    另外,aliyun httpdns android-sdk ,是个HTTPDNS 实现很好的参考sdk源码,可见这块优化,必须采用成熟的方案。

    常用共有云DNS

    名称首选地址备选地址
    114 DNS114.114.114.114114.114.115.115
    阿里DNS223.5.5.5223.6.6.6
    百度DNS180.76.76.76

    参考网站

    cloudflare&DNS

    一文看懂网络七层协议/OSI七层模型

    cloudflare&DNS

    diggui

    windows & linux dig download

    ping & net

    Java DNS查询内部实现

    jndi

    Local Managed DNS (Java)

    dnsjava

    Android okhttp3 DNS 底层实现追踪

    在 Android 上解析 DNS SRV 记录的轻量级方法

    DNS : Java Glossary

    minidns

    HTTPDNS

    展开全文
  • DNS:快速搭建公司内网DNS解析服务器

    千次阅读 2022-04-15 11:17:45
    烦死了,然后就说弄个dns转发吧,提供内网解析,最后将这个dns服务器内网Ip配置在交换机的dhcp pool里面,这样研发组同事也不用一个个去改这个dns,直接运维就搞完(我弄得单机)。概念性东西来源网络。 DNS 概念性...

    背景

    是这样的,公司办公室有小机房,研发测试开发环境在这,但是CTO吧,觉得测试环境通过ip访问太复杂,难记,通过黄页打开觉得太low,虽然办公室出口也有公网ip,直接可以解析进来,但是又觉得公网访问测试开发环境觉得不可以,烦死了,然后就说弄个dns转发吧,提供内网解析,最后将这个dns服务器内网Ip配置在交换机的dhcp pool里面,这样研发组同事也不用一个个去改这个dns,直接运维就搞完(我弄得单机)。概念性东西来源网络。

    DNS 概念性东西

    FQDN:完全限定域名,即每个域在全球唯一,域不是域名,google.com 是域,www.google.com 是域名。
    域可以分为根域(.)和顶级域(TLD)
    顶级域又可以分为三类:

    1. 通用顶级域(.com 商业机构,.org 非营利性组织,.net 网络服务机构等)

    2. 国家顶级域(.cn 中国,.uk 英国,.us 美国,.jp 日本)

    3. 反向域(基础建设顶级域,.arpa)

    DNS 查询方式包含递归和迭代:

    1. 递归是客户端发起一次请求给 DNS 服务器,通过多次查找返回正确解析。
    2. 迭代是发出多次请求查询不同的 DNS 服务器。

    解析方式包含正向解析和反向解析:正向解析指代将 FQDN 转换成 IP,反向则相反。
    一般 DNS 的服务器类型包含:主从 DNS 服务器,缓存服务器,转发服务器。
    主从好理解,就是从自动更新同步主的配置,作为 backup 存在。
    缓存的服务器作用在于使用递归查询,将查询到的结果返回客户端,并缓存查询的结果。
    转发服务器作用在于当发现查询不是本机的时候则将请求转发出去。

    DNS 监听 TCP 和 UDP 都是 53 端口。
    以下是一次完整的请求大致过程:

    从客户机到服务器之前采用得是递归查询,而服务器之间则是采用迭代查询。

    DNS 记录类型:DNS 域名数据库由资源记录和区文件指令组成。
    SOA 记录:起始授权机构记录,SOA 备注说明了众多 NS(name server)记录中谁是主名称服务器,不参与功能,但是不能缺少。
    NS 记录:域授权记录,当请求到达根域的时候,通过 NS 记录找到对应的域。
    A 记录:当通过 NS 记录到达域以后,比如访问 www.baidu.com,通过 NS 我们找到了 baidu.com,此时就需要通过 A 记录找到 www。
    MX:将该域下的所有邮件服务器地址指向邮件服务器。
    AAAA 记录:A 记录处理 IPV4,AAAA 处理 IPV6。
    PTR 记录:反向解析,将 IP 解析成域名。
    CNAME:别名记录,允许多个名字映射到另外一个域名。比如我们 ping 百度的时候可以发现返回其实是 www.a.shifen.com 这个域名返回。所有 www.baidu.com 其实是个别名。

    部署单机DNS (我弄得这个)

    我是直接将dns服务器的firewalld关闭了,反正内网局域网专用网络了。例外端口也Ok
    准备了三台虚拟机:
    IP 系统 说明
    在这里插入图片描述

    DNS 服务器安装 bind 服务:

    yum -y install bind-utils bind bind-devel bind-libs
    
    1. 配置主配置文件:/etc/named.conf
    options {
        listen-on port 53 { any; };
        listen-on-v6 port 53 { ::1; };
        directory     "/var/named";
        dump-file     "/var/named/data/cache_dump.db";
        statistics-file "/var/named/data/named_stats.txt";
        memstatistics-file "/var/named/data/named_mem_stats.txt";
        recursing-file  "/var/named/data/named.recursing";
        secroots-file   "/var/named/data/named.secroots";
        allow-query     { any; };
        recursion yes;
        dnssec-enable yes;
        dnssec-validation yes;
        bindkeys-file "/etc/named.iscdlv.key";
        managed-keys-directory "/var/named/dynamic";
        pid-file "/run/named/named.pid";
        session-keyfile "/run/named/session.key";
        forwarders { 202.96.128.166;8.8.8.8; };
    };
    ​
    logging {
            channel default_debug {
                    file "data/named.run";
                    severity dynamic;
            };
    };
    ​
    zone "." IN {
        type hint;
        file "named.ca";
    };
    ​
    include "/etc/named.rfc1912.zones";
    include "/etc/named.root.key";
    

    最终内容如上。

    1. 追加域名解析入口配置:/etc/named.rfc1912.zones
    zone "fengliuxiaosan.com" IN {           # 测试用的域是 fengliuxiaosan.com
            type master;
            file "fengliuxiaosan.com.zone";  # 配置文件为 fengliuxiaosan.com.zone,该文件目录为 /var/named/ 下
    };
    
    
    1. 配置单独的解析文件:
    
    cd /var/named/
    cp named.localhost fengliuxiaosan.com.zone  
    chown named.named fengliuxiaosan.com.zone
    

    修改配置:fengliuxiaosan.com.zone

    
    $TTL 1D                                         ;TTL 修改配置生效时间,默认为一天
    @       IN SOA  @ rname.invalid. (
                                            0       ; serial,配置编号,每次改完配置 +1,这样从服务器就知道更新配置
                                            1D      ; refresh,从服务器刷新时间,默认一天刷新一次
                                            1H      ; retry,如果刷新失败,默认1小时重试一次
                                            1W      ; expire,缓存过期时间,一周
                                            3H )    ; minimum
            NS      @
            A       127.0.0.1
            AAAA    ::1
    www     IN A       192.168.3.212
    

    我们新加了个 www.fengliuxiaosan.com 的 A 记录。

    1. 启动服务测试:
    
    systemctl start named
    systemctl enable named
    

    查看端口:

    netstat -tlunp | grep 53
    

    结果如图:
    在这里插入图片描述

    可以看到除了服务本身的 53 端口外,也监听了 953,这是 dns 服务的一个插件,现在我们先不理这个
    本机测试解析:

    dig @127.0.0.1 www.fengliuxiaosan.com
    

    在这里插入图片描述

    另外介绍两种检查配置的方法:

    # 检查主配置
    named-checkconf /etc/named.conf
    ​
    # 检查 zone 配置
    named-checkzone fengliuxiaosan.com /var/named/fengliuxiaosan.com.zone
    

    结果如下:
    在这里插入图片描述
    我们在客户端修改 DNS 配置测试,修改网卡 DNS 配置重启网卡:
    在这里插入图片描述

    主从 DNS 服务部署

    1. 主从 DNS 的搭建开始的时候其实是和单机搭建一样的,我们修改主服务器192.168.3.253的配置文件:/etc/named.rfc1912.zones

    将我们之前的配置进行修改:

    zone "fengliuxiaosan.com" IN {           # 测试用的域是 fengliuxiaosan.com
            type master;
            file "fengliuxiaosan.com.zone";  # 配置文件为 fengliuxiaosan.com.zone,该文件目录为 /var/named/ 下
            allow-update { 192.168.3.80; };
            allow-transfer { 192.168.3.80; };    # 允许同步DNS的辅助服务器IP
            also-notify { 192.168.3.80; };
            notify yes;                             # 启用变更通告,当主文件变更,通知从进行比较同步
    };
    

    指定了从的地址,重启服务

    systemctl restart named
    2. 从服务器192.168.3.80也安装 bind 并将 /etc/named.conf 配置拷贝过来。
    接着也是配置:/etc/named.rfc1912.zones,此时就能体现主从的不同:

    zone "fengliuxiaosan.com" IN {
            type slave;
            file "slaves/fengliuxiaosan.com.zone";
            masters { 192.168.3.253; };   # 指定主服务器的 IP
            masterfile-format text;         # 指定区域文件的格式为text,不指定有可能会为乱码
    };
    

    这时候不需要再去配置 fengliuxiaosan.com.zone 文件,因为需要去主服务器192.168.3.253同步。所以直接启动从的 dns 服务。

    systemctl start named
    systemctl enable named
    
    1. 修改主配置测试同步情况:
      我们修改主服务器的 fengliuxiaosan.com.zone,新加解析的同时,修改配置编号,让从能够探测到变化。
      现在我们重启主服务器,会发现从服务器就能够同步成功。
      还有就是我这里使用 reload named 服务并没有使配置生效。

    总结

    在域名解析过程中,还会遇到某些特殊情况:

    1. @ 可以引用当区域名字,比如直接访问 baidu.com 就是这样的解析
    2. 同一名字通过不同的名字定义多条记录,此时 DNS 会轮询响应。
    3. 同一值可以多个名字。
    4. 星号* 泛域名解析,比如配置 *.baidu.com 指向某个 IP,那么如果你访问 a.baidu.com 这种没有配置的会默认走这个配置。

    最后,在核心交换机DHCP pool地址池配置dns地址的时候记得多加几个,内网这个dns服务器配置上去即可,为啥呢,因为通过这个dns内网服务器转发慢啊,打开网页都慢,dhcp client多配置个公网dns解析快。

    展开全文
  • DNS解析流程

    千次阅读 2022-04-23 18:47:45
    第一步:客户端提出域名解析请求,并将请求发送给本地域名服务器。 第二步:本地域名服务器收到请求后,首先查询本地缓存。如果有这条记录,则本地域名服务器直接返回查询结果。 第三步:如果本地缓存没有记录,则...
  • DNS域名解析,能够根据域名解析出IP地址等相关信息·
  • Android DNS解析的过程

    千次阅读 2021-12-27 10:53:33
    Android DNS解析的过程 DNS解析概念 DNS的全称是domain name system,即域名系统。DNS是因特网上作为域名和IP地址相互映射的一个分布式数据库,能够使用户更方便的去访问互联网而不用去记住能够被机器直接读取的IP...
  • k8s解析之coredns解析问题

    千次阅读 2021-12-21 11:21:44
    其中,基于内部域名的方式,涉及到 Kubernetes 内部域名的解析,而 kubedns,是 Kubernetes 官方的 DNS 解析组件。从 1.11 版本开始,kubeadm 已经使用第三方的 CoreDNS 替换官方的 kubedns 作为 Kubernetes 集群的...
  • unix系统下一个C语言实现的dns域名解析
  • DNS 解析时快时慢,我该怎么办?

    千次阅读 2021-03-11 08:32:02
    文章目录域名与 DNS 解析案例准备案例分析案例 1:DNS 解析失败案例 2:DNS 解析不稳定总结 上一节,我带你一起学习了网络性能的评估方法。简单回顾一下,Linux 网络基于 TCP/IP 协议栈构建,而在协议栈的不同层,...
  • 后续流程不涉及)DNS一对多域名的解析随机性DNS 域名解析负载均衡缺点:可能方案方案一、dns解析层面控制DNS解析结果1.1 通过内置DNS服务器控制IP解析(伪造DNS)1.2、让备机nginx的状态能够影响DNS服务器解析方案二...
  • dns解析失败的处理办法

    千次阅读 2021-11-22 14:54:48
    说起dns解析失败,这是站长朋友最常遇到的问题了,所以刚接触建站的朋友一定学会分析并解决dns解析失败。今天小编特地整理了常见导致dns解析异常的原因和对应的解决方法,快随小编一起往下看吧!
  • dns解析详细过程

    千次阅读 2022-02-22 21:16:49
    下面可能不会细致到每个名字都做解释,但会尽可能地帮助大家理解dns的全过程。 DNS概述 dns全称Domain Name Server,是通过tcp和udp实现的一个服务。目的是实现域名和ip的转换。访问dns是通过一个称为resolver的...
  • DNS(全称:Domain Name System,中文:域名系统)是互联网的一项服务。它作为将域名和 IP 地址相互映射的一个分布式数据库,能够使人更方便地访问互联网。1 前言 要想弄清楚 DNS,必须先将域名和 IP 搞清楚。域名是...
  • 第三章:加速dns解析 目标: 了解一个请求是如何发送到一个dns资源池中的,并且了解如何监控资源池中成员的健康状态 使用dns缓存对dns请求进行加速 使用dns express进行对dns请求进行加速 智能解析dns请求 ...
  • 【计算机网络】DNS解析详解

    千次阅读 2021-12-19 18:22:58
    文章目录基本概念介绍域名的解析过程DNS查询优化 基本概念介绍 根据域名服务器所起的作用, 可以把域名服务器划分为以下四种不同的类型: 根域名服务器 这是最重要的服务器,因为只要本地域名服务器无法解析, 就...
  • kubernetes集群内部DNS解析原理

    千次阅读 2022-04-14 10:55:07
    kubernetes集群内部DNS解析原理 当kubernetes初始化完成后,在kube-system名称空间下会出现kube-dns的service服务与core-dnsd的pod $ kubectl get svc -n kube-system NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) ...
  • python实现dns解析

    千次阅读 2021-07-31 01:32:02
    dnspython模块中最常用的域名查询,它提供了一个DNS解析器类resolver,使用resolver的query方法来实现域名的查询功能。1.模块库安装pip install dnspython2.指定DNS服务器my_resolver = dns.resolver.Resolver()my_...
  • dns解析失败如何处理?

    千次阅读 2022-01-05 13:43:04
    由于IP地址信息不太好记忆,所以网络中出现了域名这个名字,在访问时我们这需要输入这个好记忆的域名即可,网络中会存在着自动将相应的域名解析成IP地址的服务器,这就是Dns服务器。
  • 解决DNS解析故障的几种方法

    千次阅读 2022-02-11 16:11:50
    DNS解析是将域名指向解析成可由计算机直接识别的IP地址,从而完成服务器的访问。DNS解析出现错误,就是无法解析域名,或者将域名指向一个错误的IP地址,导致用户无法通过域名正常访问相应站点。出现DNS解析故障最大...
  • 简述DNS解析过程

    千次阅读 2021-05-26 18:49:52
    简述DNS解析过程 1、客户机发出查询请求,在本地计算机缓存查找,若没有找到,就会将请求发送给dns服务器 2、本地dns服务器会在自己的区域里面查找,找到即根据此记录进行解析,若没有找到,就会在本地的缓存里面...
  • 一、什么是DNS 域名系统 (DNS) 将人类可读的域名 (例如,www.amazon.com) 转换为机器可读的 IP 地址 (例如,192.0.2.44)。 DNS 服务的类型 权威 DNS(Authoritative DNS):处于 DNS 服务端的一套系统,该系统保存了...
  • IPv6动态地址DNS解析

    千次阅读 2021-01-22 11:39:46
    IPv6动态地址DNS解析 最近想在家里搭建一台小服务器,用来当NAS和远程写一点代码。正好接了IPv6网络,就不用了内网穿透那么麻烦了,利用阿里的给的API,把服务器的IPv6地址放在DNS服务器上就好了。 获取IPv6地址 用...
  • Java 如何做到DNS解析工具类

    千次阅读 2022-03-22 22:44:07
    /** * 通过dns解析域名得到IP列表 * @param host 域名 * @return */ public static List<String> getIPListByDNS(String host) throws UnknownHostException { InetAddress[] addresses= Address.getAllByName(host...
  • DNS解析过程详解

    万次阅读 2020-04-21 14:06:57
    一、DNS名词解释   域名,是由一串用点分隔的名字组成的Internet上某一台计算机或计算机组的名称,用于在数据传输时对计算机的定位标识。   DNS,全称Domain Name System,中文名为域名系统,是因特网的一项核心...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 260,693
精华内容 104,277
关键字:

dns解析