当我inputwww.google.com时,dns查找是如何工作的。 据我所知,它首先去根服务器,并找出.com DNS服务器在哪里。 接下来它返回该服务器的IP地址。 接下来从中找出谷歌服务器的位置。 现在它返回一个IP地址,这将是www.google.comfind的地方。
所以要解决这两个DNS查找需要。 纠正我,如果我错了。
当你开始考虑caching和任播等事情时,DNSparsing会变得非常多毛,但现在让我们保持简单。
下面是对www.google.com的查询的tcpdump片段旁边的digs片段,以新启动的名称服务器,因此不使用caching。 我已经删减了一些可读性的时间戳。
首先,本地域名服务器(这里是192.168.10.10)询问一个根服务器(在本例中是h.root-servers.net,128.63.2.53),询问“www.google.com的Alogging是什么?” h.root-servers.net对于www.google.com来说并不是权威的,但它确实有一个.com的代表团,所以它会返回。
192.168.10.10.17203 > 128.63.2.53.53: 29969 [1au] A? www.google.com. (43) 128.63.2.53.53 > 192.168.10.10.17203: 29969- 0/15/16 (719) ;; QUESTION SECTION: ;www.google.com. IN A ;; AUTHORITY SECTION: com. 172800 IN NS a.gtld-servers.net. com. 172800 IN NS b.gtld-servers.net. com. 172800 IN NS c.gtld-servers.net. com. 172800 IN NS d.gtld-servers.net. com. 172800 IN NS e.gtld-servers.net. com. 172800 IN NS f.gtld-servers.net. com. 172800 IN NS g.gtld-servers.net. com. 172800 IN NS h.gtld-servers.net. com. 172800 IN NS i.gtld-servers.net. com. 172800 IN NS j.gtld-servers.net. com. 172800 IN NS k.gtld-servers.net. com. 172800 IN NS l.gtld-servers.net. com. 172800 IN NS m.gtld-servers.net.
其次,本地名称服务器然后从h.root-servers.net返回的列表中select一个名称服务器,并发送相同的查询:“www.google.com的Alogging是什么?” 在这种情况下,查询的名称服务器是f.gtld-servers.net(192.35.51.30)。 对于.com来说权威性的f.gtld-servers.net已经为区域google.com的域名服务器代理做出了回应
192.168.10.10.65182 > 192.35.51.30.53: 58632 [1au] A? www.google.com. (43) 192.35.51.30.53 > 192.168.10.10.65182: 58632- 0/4/5 (179) ;; QUESTION SECTION: ;www.google.com. IN A ;; AUTHORITY SECTION: google.com. 172800 IN NS ns2.google.com. google.com. 172800 IN NS ns1.google.com. google.com. 172800 IN NS ns3.google.com. google.com. 172800 IN NS ns4.google.com.
越来越近! 现在,本地名称服务器在最后一个响应中select一个名称服务器,并询问相同的问题。 在这种情况下,它询问ns2.google.com(216.239.34.10)。 ns2.google.com回应www.google.com实际上是www.l.google.com的CNAME(规范名称)logging
192.168.10.10.4767 > 216.239.34.10.53: 15830 [1au] A? www.google.com. (43) 216.239.34.10.53 > 192.168.10.10.4767: 15830*- 6/0/0 CNAME[|domain] ;; QUESTION SECTION: ;www.google.com. IN A ;; ANSWER SECTION: www.google.com. 604800 IN CNAME www.l.google.com.
很接近! 现在我们只需要www.l.google.com的地址。 现在因为我们已经知道google.com的名称服务器,所以我们只需要问一个。 在这种情况下,我们要求ns3.google.com(216.239.36.10)“www.l.google.com的Alogging是什么?” 它回应的地址,我们有我们的答案:
192.168.10.10.63657 > 216.239.36.10.53: 62511 [1au] A? www.l.google.com. (45) 216.239.36.10.53 > 192.168.10.10.63657: 62511*- 5/0/0 A[|domain] ;; QUESTION SECTION: ;www.l.google.com. IN A ;; ANSWER SECTION: www.l.google.com. 300 IN A 74.125.232.116 www.l.google.com. 300 IN A 74.125.232.112 www.l.google.com. 300 IN A 74.125.232.115 www.l.google.com. 300 IN A 74.125.232.113 www.l.google.com. 300 IN A 74.125.232.114
好哇!
无论如何,我希望这足以让你开始。 那里有很多很棒的资源。 O'Reilly的书“DNS和BIND”是非常有用的。
我强烈build议安装dig来查看DNS查询的方式。 例如,您可以使用dig + trace轻松查看到主机的委派path:
; <<>> DiG 9.7.0-P1 <<>> +trace www.google.com ;; global options: +cmd . 516930 IN NS k.root-servers.net. . 516930 IN NS g.root-servers.net. . 516930 IN NS h.root-servers.net. . 516930 IN NS j.root-servers.net. . 516930 IN NS a.root-servers.net. . 516930 IN NS m.root-servers.net. . 516930 IN NS b.root-servers.net. . 516930 IN NS f.root-servers.net. . 516930 IN NS d.root-servers.net. . 516930 IN NS c.root-servers.net. . 516930 IN NS l.root-servers.net. . 516930 IN NS i.root-servers.net. . 516930 IN NS e.root-servers.net. ;; Received 244 bytes from 127.0.0.1#53(127.0.0.1) in 1 ms com. 172800 IN NS i.gtld-servers.net. com. 172800 IN NS j.gtld-servers.net. com. 172800 IN NS c.gtld-servers.net. com. 172800 IN NS l.gtld-servers.net. com. 172800 IN NS d.gtld-servers.net. com. 172800 IN NS h.gtld-servers.net. com. 172800 IN NS a.gtld-servers.net. com. 172800 IN NS e.gtld-servers.net. com. 172800 IN NS b.gtld-servers.net. com. 172800 IN NS g.gtld-servers.net. com. 172800 IN NS f.gtld-servers.net. com. 172800 IN NS k.gtld-servers.net. com. 172800 IN NS m.gtld-servers.net. ;; Received 492 bytes from 202.12.27.33#53(m.root-servers.net) in 45 ms google.com. 172800 IN NS ns2.google.com. google.com. 172800 IN NS ns1.google.com. google.com. 172800 IN NS ns3.google.com. google.com. 172800 IN NS ns4.google.com. ;; Received 168 bytes from 192.33.14.30#53(b.gtld-servers.net) in 42 ms www.google.com. 604800 IN CNAME www.l.google.com. www.l.google.com. 300 IN A 74.125.232.115 www.l.google.com. 300 IN A 74.125.232.113 www.l.google.com. 300 IN A 74.125.232.116 www.l.google.com. 300 IN A 74.125.232.114 www.l.google.com. 300 IN A 74.125.232.112 ;; Received 132 bytes from 216.239.34.10#53(ns2.google.com) in 131 ms
请注意,它与之前的查询跟踪有多相似? 希望有所帮助。
DNS稍微复杂一点,因为DNS的caching很大。 您的本地机器甚至可能已经caching了数据,而且查找也不会比这更进一步。
您的机器将查询它自己的caching,如果失败,它将查询它被告知的主要DNS服务器。 这可能是一个cachingDNS服务器,我的结果是它的caching,在这种情况下,logging返回给你,查找结束。 这也是最有可能的recursionDNS服务器,现在将为您的机器做腿部工作。
如果主DNS服务器没有这些信息,它将查询它们将响应的根名称服务器(在你的例子中)为.com的TLD名称服务器
查询将被发送到.com顶级域名(TLD)服务器,该服务器将以google.com的权威名称服务器的地址进行响应
查询将被发送到google.com的权威名称服务器,请求www.google.comlogging。 这将被发现并返回到主要的DNS服务器,它将caching它并将logging返回给你。
DNS是分层的,正如Lain所说的那样,被高度caching。 也许,一个更复杂的例子可以帮助你。
假设您拥有一台属于某个公司的机器,其中有几个业务单位在域结构中反映出来。 您的机器名称为machine.businessunit1.company.com,即属于businessunit1.company.com,这是您的主DNS后缀。
该业务部门非常庞大,运行着多个DNS服务器(dns1.businessunit1.company.com,dns2.businessunit1.company.com)以及一个名为www.businessunit1.company.com的networking服务器。
如果您的机器现在想要解决www.businessunit1.company.com,它将首先查找本地DNScaching。 I. e。 您的机器本身会记住您最近查询的DNS条目,因为您很可能会再次需要结果,例如,当您单击网站上的链接时。 我不知道你是否可以看到你的机器已经被caching了,但是有一个命令来删除你的机器在Windows上的记忆: ipconfig /flushdns
如果您的机器不记得答案,它将会询问为您的networking适配器configuration的DNS服务器。 最有可能的是,您的pipe理员将configurationdns1.businessunit1.company.com和dns2.businessunit.company.com。 原因是,你希望你的DNS查询迅速回答,没有大量的stream量。 如果dns1.businessunit1.company.com收到您对www的查询,它将回答它,因为它对区域* .businessunit1.company.com是权威的。 权威性意味着此服务器知道结尾为“businessunit1.company.com”的所有DNS名称的唯一正确答案。
现在假设你有疑问www.businessunit2.company.com。 如果您的机器不记得答案本身,将再次询问dns1.businessunit1.company.com。 现在有很多的可能性:首先,你的pipe理员可能是聪明的,他们认为businessunit1的人很可能也会经常访问businessunit2中的机器。 因此,他们已经将dns1.businessunit1.company.comconfiguration为从dns1.businessunit2.company.com持有数据的副本。 dns1.businessunit1.company.com可以使用这个副本来回答你的问题。 其次,你的pipe理员肯定会告诉dns1.businessunit1.company.com当你不知道你的问题的答案时,应该怎么做:这是问另一个DNS服务器。 也许这是dns1.company.com,但也可能是任何其他DNS服务器,包括根服务器。
正如Lain所说,dns1.businessunit1.company.com可以自由地记住从其他DNS服务器得到的答案。 I. e。 如果您要求www.google.com,则可能需要询问其他服务器,但是如果您再次提问,则会记住答案并直接告诉您。
你可以基本上看到你的DNS的答案是从什么时候,例如nslookup www.google.com键入。 输出会告诉你服务器是否是权威的答案。 最有可能的是,它将是非权威性的,因为它的DNS服务器没有回答,它们负责以“google.com”结尾的所有DNS名称。
事实上,一切都非常复杂,取决于DNS服务器。 解除绑定66查询 。
你没有错。 以下是DNS查询如何工作的一个很好的例子。
这是对的。 也许更多的查找“www”子域。