相信很多人都听过互联网只有13台根服务器,且一个都不在国内,那这是不是意味着我们有被阿美利卡断网的风险呢?
其实这个所谓的根服务器是DNS的根域,今天我们来一起看看到底是怎么回事,咋就非得是13台,15台不行吗
DNS的IPV4根域只有13个吗?
确实是的。
为什么是13个IP,不能再加吗?
这个,单纯是历史原因了。上面提到基于UDP的DNS报文不应该超过512Byte
,刨去DNS本身的报头信息,算下来大概能放13个IP(IPV4)。
具体的计算过程不太重要,我就省略了,对计算过程感兴趣的话,可以看下这篇文章最下面的参考文献。
虽然现在大部分机器MTU=1500了,但由于还可能存在MTU=576的机器,需要向前兼容,因此也不建议随意调整。
但问题叒来了。
退一万步,就算所有机器的MTU都到1500了,是不是就没这个限制了?
嗯,从这个角度来说,确实可以加,但没必要。
我们需要思考下为什么要加?
是因为觉得13个IP对应13台服务器,压力太大了吗?
还是说出于其他不可明说的因素考虑?
比如,很久以前看电视的时候,有位砖家提到"全球DNS根服务器只有13台,其中x台部署在漂亮国,只要它们切断访问,那我们的网络就会受影响balabala"。
但其实,13个IP不代表只有13台服务器。准确点来说,应该说是13组服务器,每个组都可以无限扩展服务器的个数,多个服务器共用同一个IP。
这里面其实涉及到一个叫任播的技术。
任播是什么
我们知道,在传输的过程中,一台机器发消息给另一台机器,这叫单播(unicast)。
一台机器,发消息给本地网段的所有机器,那叫广播(broadcast)。
这两个都很常见,应该都没问题。
一台机器,发消息给的所有符合条件的目的机器里的其中一台,那叫任播(anycast)。
我们知道,全世界的网络设备,放在一起就形成了一个网状结构,这也是网络这个名称的由来。
我们假设有这么一个路由器,它想要访问某个IP的机器。从路由器到目的机器有非常多条路径,路由器可以通过跳数等信息来计算每条路径的成本,得到最优的路径。将最优路径汇成一张表,也就是我们常说的路由表。
比如下面的图里,绿色的线和红色的线都能到达同样的目的地,但显然,绿色的路径更短,所以路由表记录了成本更低的绿色路线。
那么现在假设我们将这个网状结构里的两个点的网络IP设为一样,路由器其实不知道这是两个不同的机器,对它来说,这只是两条不同的路径,但都是通向同一个IP。
这两条路径都能到同一个IP,因此打到任意一个服务都能拿到想要的信息,从而实现了任播。
现在我们再加个条件,路由器和其中一台机器都在国内,另一台机器在国外。对路由器来说,由于国内的机器离得近,传输成本低,而国外的机器远,传输成本高,所以路由器生成的最优路线是打到国内的机器。
基于这样的思路,我们只要镜像一份国外的DNS域名服务器信息到国内机房里。我们就不再需要请求国外服务器了。
所以,就算其他国家的根域名服务器挂了,也不会对我们有什么影响,事实上国内已经有非常多的镜像服务器了,稳得很。
那稍微扩展一下,假设在上海和广东都设置了相同IP的镜像服务,那对于上海的用户来说,他们的路由器会优先将请求打到上海的镜像服务。而广东的用户则会优先打到广东的机器里,从而实现了就近访问。
上海的镜像服务挂了,那对应的上海用户路由器里的路由表,就会将路径更新为广东的镜像机器。上海用户的请求就会打到广东的镜像服务中。从而实现高可用(或者说灾备)。
看起来,利用任播既能做到负载均衡,还能实现高可用,这跟nginx很像啊。
那么,问题就来了。
既然有任播技术,那为什么还要用nginx?
nginx
作为常见的反向代理服务器,背后可以连N个服务端。当客户端想要请求后端时,客户端根本不需要知道是哪个服务器在为它提供服务,只管拿nginx最后返回的结果就行了。像这种,屏蔽掉具体有哪些服务器的代理方式就是所谓的反向代理。
正因为不知道背后有哪些服务器,因此可以做到无限扩展,挂了一台其他也能顶上,因此实现了负载均衡和高可用。
之前写过一篇文章《为什么有HTTP协议,还要有websocket协议?》,提到过对于网络游戏场景,需要有服务器主动推数据到客户端。由于nginx与客户端和服务端之间会建立TCP长链接,因此客户端在收到服务端的消息之后,能沿着这条连接响应服务端。
而如果这时候不用nginx,单纯使用任播,那服务器将消息主动推给客户端之后,客户端响应时,消息不保证还能给回原来的服务器。毕竟“任播”的含义就是,只要能访问任意一台服务器就行了。
因此任播并不能代替nginx。
当然这两个本来也不是一个维度的东西,拿来比较其实并不合适,我只是举了个反例来帮助大家捋一捋两者之间的差异。
总结
• 虽然根域只有13个IP,但不代表只有13台服务器,准确的说,应该是十三组服务器,每组服务器都共用同一个IP,国内已经有非常多的镜像服务器,利用任播技术,只要能就近访问到其中一台就行了。
• 国内国外如果都有相同IP的目的机器,那对于路由器来说,无非就是有两条路径可以抵达相同的目的地,一个远一些,一个近一些。基于成本,会将更近的路径放到路由表中。
• 任播技术虽然也能在一定程度上实现负载均衡和高可用,但它跟nginx并不是一个维度的东西,不能替代nginx。
参考资料
《Why 13 DNS root servers?》
https://miek.nl/2013/november/10/why-13-dns-root-servers/
最后
最后在结尾推荐一下我专栏--程序员的全能画图课,专栏有针对大型项目的技术评审案例分析和带练演示,无论是小型项目和大型项目都通过实际的案例分析讲解带你掌握下面这些技能。关于技术博文、公众号的画图经验诀窍也在专栏中有所涉及。
课程采用理解优于记忆的方式,用平时开发中常见的案例分析,教会大家对他们的使用。同时还会普及一些做好业务开发的经验要诀,教大家怎么对业务结构和流程进行多视角的分析和可视化表达。
课程中提供 15个 拿来即用的在线画图模版,涵盖需求分析、技术方案评审、述职汇报和甲方商务对接的支持,这些我们经常会接触到的工作。
现在可在公众号专栏《程序员的全能画图课》上直接订阅或者扫描上方海报二维码订阅,课程内容已经更新完成,不存在烂尾的风险,后面会定期加更一些新的总结。