当前位置: 首页 > 科技观察

为什么域名根服务器只能有13台?

时间:2023-03-15 10:24:08 科技观察

有人刚刚在知乎上发了这个链接https://www.zhihu.com/question/22587247,问哪个答案正确。我看了里面的答案,结果好坏参半。我会尽力回答。其实对于新手来说,这个问题的核心不在于13,而在于,域名的根服务器是什么,查询过程又是怎样的呢?基础知识DNS不久前是一个层次结构。形成一个树状系统,顶层是系统的根域名,下层是TLD和二级域名,叶子构成所谓的FQDN(FullyQualifiedDomainNames),根域名通常用“.”表示,实际上是由世界上目前有13组域名根节点组成,由少数几个国家管理,而中国只有少数几个根节点镜像。比如查询www.im.qq.com,简述DNS过程就是先查询com域名的域名服务器,然后选择一个继续查询qq子域名的域名服务器,然后选择一个继续查询im域名子域名的名称服务器有哪些,www不是域名,查询结束。此查询的结果是google.com域名。所谓域名服务器,其实就是一个dns服务器,用来解析域名。万物之始之风——RootServers而上面的查询过程中有个问题,程序应该去哪里查询com、gov等顶级域名的服务器呢?这就是Rootservers(根服务器)的作用,它是用来查询上述顶级域名的域名服务器。想想如何获取Root服务器的地址。请注意,此处没有可用的动态域名(DNS)。获取地址其实就是获取IP。如果我们实现DNS服务器,您将在这一步中做什么?其实这种做法很明显,写程序的直觉是这样的:写一个配置文件放在程序中,记录所有Root服务器的IP地址列表,从网上更新这个配置文件(这个可以经常用作域名);或启动程序时,直接从网上获取信息,保存,定期更新;DNS方法是一样的,上面提到的“配置文件”在https://www.internic.net/domain/named.root,里面包含了所有的`RootServers`信息:"缓存。<文件>";BIND域名服务器的配置文件)。;;这个文件由InterNIC提供;在匿名FTP下;文件/域/named.cache;.INTERNIC.NET;-OR-RS.INTERNIC.NET;;上次更新时间:2019年7月30日;rootzone的相关版本:2019073000;;FORMERLYNS.INTERNIC.NET;.3600000NSA.ROOT-SERVERS.NET.A.ROOT-SERVERS。网B.ROOT-SERVERS.NET.3600000A199.9.14.201B.ROOT-SERVERS.NET.0000AAAA2001:500:200::b;;FORMERLYC.PSI.NET;.3600000NSC.ROOT-SERVERS.NET.C.ROOT-SERVERS.NET.3600000A192.33.4.12C.ROOT-SERVERS.NET.3600000AAAA2001:500:2::c;;FORMERLYTERP.UMD.EDU;.3600000NSD.ROOT-SERVERS.NET.D.ROOT-SERVERS.NET.3600000A199.7.91。13D.ROOT-SERVERS.NET.3600000AAAA2001:500:2d::d;.3600000NSM.ROOT-SERVERS.NET.M.ROOT-SERVERS.NET.3600000A202.12.27.33M.ROOT-SERVERS.NET.3600000AAAA2001:dc3::35;Endofffile中的服务器太多,所以我将删除部分PrimingQuery!按照我的风格,没有权威的资料,我怎么能写出这样的文章呢?呢绒布。InitializingaDNSResolverwithPrimingQueries[1]是由InternetEngineeringTaskForce(IETF)编写的关于启动查询[2]的BCP(最佳当前实践)文档。本文档描述了DNS解析器应发出以初始化其缓存的查询。结果是解析器获得根区域的当前NSRRSet和到达根服务器所需的地址信息。上面提到的列表信息,可能不是最新的,所以DNS解析器第一次启动的时候,并没有读取这个文件,而是直接查询有哪些服务器可用(从下面提到的那篇文章,我对这个有疑问statement,因为文件大小不同,查询出来的应该差别不大,需要验证)。有关PrimingQuery的更多知识,请参阅下面的补充。启动查询是一个普通的DNS查询。因此,根名称服务器无法将启动查询与任何其他对根NSRRset的查询区分开来。因此,根服务器的响应也将是正常的DNS响应。解析器软件应该将对启动查询的响应视为正常的DNS响应,就像它会使用提供给其缓存的任何其他数据一样。解析器软件不应期望恰好有13个NSRR,因为历史上一些根服务器返回的更少。为什么是13,这有关系吗?是的感觉它不再那么重要了。是这样的。DNS设计之初,在网速较慢的情况下,当然希望做PrimeQuery来查RootServers,以达到最高的性价比。DNS使用UDP传输数据,在设计DNS查询的时候,一个数据包中可以存放的最大数据是512Bytes,为什么是512Bytes,为什么只有13个域名根服务器呢?-车小胖的回答-知乎[3]做了一个完整的回答,摘录如下:网上大部分网络接口MTU>512,即使DNS包+UDP+IP=512+8+20=540,这个size几乎可以在互联网上畅通无阻无IP分片。为什么IP分片不好?如果一个UDP数据包的大小>MTU,它会被IP层分成两个或多个分片,但只有一个分片有端口号。由于其他分片没有端口号,完全看数据包能否通过防火墙。面对防火墙,能否通信成功还不得而知。如果防火墙开着,不检查端口号,分片都可以通过,然后在目的地组装在一起,IP层提交给UDP/DNS,完全没有问题。但是,防火墙的安全功能大大降低。如何防止非法的外部攻击包?如果防火墙严格检查端口号,所有没有端口号的分片都会被丢弃,造成通信障碍。因此选择合适的UDP大小以避免分片非常重要。有同学说,MTU<512的物理接口的DNS如何处理?这其实很容易处理。这些只是访问最终用户的访问层接口。用户的DNS请求就是请求上层的DNS服务器做一次递归查询(告诉我最终的查询结果)然后就是13这个数字的结果。为了做PrimeQuery去查RootServers来实现性价比最高,一个包里装得下的东西肯定是塞得满满当当的,所以把RootServers的结果全部塞进去,装下14个就好了,不用的就13个。留下一些东西,以备后用,以供扩展。关于封堵的细节,https://miek.nl/2013/november/10/why-13-dns-root-servers/这篇文章有详细的介绍,不过我不是很感兴趣~本文转载来自微信公众号“山写缓存”,您可以通过以下二维码关注。转载本文请联系在山津写东西的cache公众号。