V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
ChristopherWu
V2EX  ›  程序员

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

  •  
  •   ChristopherWu · 2019-08-11 10:51:26 +08:00 · 8755 次点击
    这是一个创建于 1935 天前的主题,其中的信息可能已经有所发展或是发生改变。

    之前在公众号『 YongHao 写东西的 Cache 』 写的文章笔记,但总觉得哪里不太对。又要麻烦各位大佬指正一下了~

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

    其实对于一个小白,这个问题核心并不是 13 台,而是,域名根服务器什么,查询的过程是怎么样呢?

    不算太久以前的基础知识

    DNS 是一种分层结构,在整个互联网中组成一个树状系统,顶层是系统的根域名,下层为 TLD 以及二级域名,叶子就构成了所谓的 FQDN ( Fully Qualified Domain Names ),根域名通常使用 "." 来表示,其实际上也是由域名组成,全世界目前有 13 组域名根节点,由少数几个国家进行管理,而国内仅有几台根节点镜像。 img

    如查询 www.im.qq.com,简略描述 DNS 的过程就是,先查询 com 这个域名的name server有哪些,然后选一个继续查询qq这个子域名的name servers有哪些,再选一个继续查询im这个子域名的name servers有哪些,www不是域名,查询结束。这个查询出来的结果就是google.com域名。所谓的name server,其实就是 dns 服务器啦,用来解析域名的。

    万物起始之风—— Root Servers

    而上面的查询过程有一个问题就是,程序该去哪里查询comgov这些顶级域名的服务器呢?

    这个就是 Root servers (根服务器) 的作用,用来查询以上的顶级域名的name server

    思考

    而怎么样获取 Root servers 的地址呢,注意这里没有动态域名(DNS)可用,获取的地址其实就是要获取IP,假如我们来实现 DNS 服务器,这一步你会怎么做呢?

    其实这种做法很显然易见,写程序直觉就是如此:

    • 写一份配置文件放程序里,记录了全部Root servers的 IP 地址列表,定时从网上(这个就可以用域名了)更新这份配置文件;
    • 又或者程序启动的时候,直接从网上获取这些信息,存下来,也是定时更新;

    DNS的做法也不外乎如是,而上面说到的这份"配置文件",就在 https://www.internic.net/domain/named.root,里面就是所有Root Servers的 信息:

    ;       This file holds the information on root name servers needed to 
    ;       initialize cache of Internet domain name servers
    ;       (e.g. reference this file in the "cache  .  <file>"
    ;       configuration file of BIND domain name servers). 
    ; 
    ;       This file is made available by InterNIC 
    ;       under anonymous FTP as
    ;           file                /domain/named.cache 
    ;           on server           FTP.INTERNIC.NET
    ;       -OR-                    RS.INTERNIC.NET
    ; 
    ;       last update:     July 30, 2019 
    ;       related version of root zone:     2019073000
    ; 
    ; FORMERLY NS.INTERNIC.NET 
    ;
    .                        3600000      NS    A.ROOT-SERVERS.NET.
    A.ROOT-SERVERS.NET.      3600000      A     198.41.0.4
    A.ROOT-SERVERS.NET.      3600000      AAAA  2001:503:ba3e::2:30
    ; 
    ; FORMERLY NS1.ISI.EDU 
    ;
    .                        3600000      NS    B.ROOT-SERVERS.NET.
    B.ROOT-SERVERS.NET.      3600000      A     199.9.14.201
    B.ROOT-SERVERS.NET.      3600000      AAAA  2001:500:200::b
    ; 
    ; FORMERLY C.PSI.NET 
    ;
    .                        3600000      NS    C.ROOT-SERVERS.NET.
    C.ROOT-SERVERS.NET.      3600000      A     192.33.4.12
    C.ROOT-SERVERS.NET.      3600000      AAAA  2001:500:2::c
    ; 
    ; FORMERLY TERP.UMD.EDU 
    ;
    .                        3600000      NS    D.ROOT-SERVERS.NET.
    D.ROOT-SERVERS.NET.      3600000      A     199.7.91.13
    D.ROOT-SERVERS.NET.      3600000      AAAA  2001:500:2d::d
    ; 
    .                        3600000      NS    M.ROOT-SERVERS.NET.
    M.ROOT-SERVERS.NET.      3600000      A     202.12.27.33
    M.ROOT-SERVERS.NET.      3600000      AAAA  2001:dc3::35
    ; End of file
    

    中间的服务器太多,我就删掉一部分了。

    Priming Query !

    按照我的风格,写这样一篇文章时,怎么能不带权威的信息呢。

    Initializing a DNS Resolver with Priming Queries 就是Internet Engineering Task Force (IETF) 写的一份关于 priming query 的 BCP(Best Current Practice )文档。

    This document describes the queries that a DNS resolver should emit to initialize its cache. The result is that the resolver gets both a current NS RRSet for the root zone and the necessary address information for reaching the root servers.

    上面提到的列表信息,可能并不是最新的,所以DNS 解析器首次启动时,并不去读这份文件,而是直接去查询有哪些服务器(来自下文提及的文章,我对这个说法存疑,因为文件的大小跟查询到的东西差别应该不大,有待验证)。

    关于 Priming Query 的额外知识请看下面补充。

    A priming query is a normal DNS query. Thus, a root name server cannot distinguish a priming query from any other query for the root NS RRset. Thus, the root server's response will also be a normal DNS response.

    Resolver software SHOULD treat the response to the priming query as a normal DNS response, just as it would use any other data fed to its cache. Resolver software SHOULD NOT expect exactly 13 NS RRs because historically some root servers have returned fewer.

    为什么是 13,还重要吗?

    是不是感觉没那么重要了呢。

    是这样的,在 DNS 设计之初,在龟速的网络下,当然是希望做Prime QueryRoot Servers性价比达到最高啦。

    DNS 是用 UDP 传数据的,而设计的时候规定 DNS 查询时,一个包的能放的数据最多是 512 Bytes,为什么是 512 Bytes,为什么域名根服务器只能有 13 台呢? - 车小胖的回答 - 知乎 做了完整的回答,摘录一点如下:

    Internet 大多数网络接口 MTU>512,即使 DNS 报文 + UDP+ IP= 512+8+20=540,这个大小几乎可以在 Internet 上畅通无阻,而无需 IP 分片。

    为何 IP 分片不好? 一个 UDP 报文如果因为 size > MTU,则会被 IP 层分成两片多片,但是只有一片有端口号,由于其它分片没有端口号,能否通过防火墙则完全看防火墙的脸色,所以对于能否通信成功是一个未知数。

    如果防火墙网开一面,不检查端口号,分片可以全部通行,到目的地再组装到一起,IP 层提交给 UDP/DNS,一点问题没有。但是防火墙的安全功能大打折扣,如何阻止非法的外来攻击包?

    如果防火墙严格检查端口号,则没有端口号的分片则统统丢弃,造成通信障碍。

    所以选择一个合适的 UDP size 至关重要,避免分片。

    有同学说,对于 MTU <512 物理接口的 DNS 如何处理?这个其实好办,这些只是接入层接口,用于接入终端用户,用户的 DNS 请求是请求其上一级 DNS 服务器做递归查询(告诉我最终查询结果)

    接着就是13这个数字的果了。

    为了做Prime QueryRoot Servers性价比达到最高,肯定是一个包能放多少东西就塞多少东西,所以把所有Root Servers的结果都塞进去,刚好能塞 14 个,不全用就塞 13 个吧,留下一点东西以备后患,留待扩展。

    塞的细节嘛,https://miek.nl/2013/november/10/why-13-dns-root-servers/ 这篇文章有详细的介绍,但是我对此不大感兴趣了~

    Post image

    TO BE CONTINUE

    39 条回复    2019-08-12 14:35:17 +08:00
    chinvo
        1
    chinvo  
       2019-08-11 11:14:28 +08:00 via iPhone   ❤️ 4
    看到 www 不是域名就不用继续往下看了
    iscraft
        2
    iscraft  
       2019-08-11 11:22:36 +08:00
    @chinvo www 不是域名 最初只为标记域下的主机或服务 后面的 google.com 才是严格意义上的域名
    szhaoliang
        3
    szhaoliang  
       2019-08-11 11:23:57 +08:00 via Android
    www是主机名,以前 mcse 培训时讲师说过。
    chinvo
        4
    chinvo  
       2019-08-11 11:38:10 +08:00
    @iscraft #2 主机名也是域名的一部分,也是需要解析的大兄弟
    crbee
        5
    crbee  
       2019-08-11 11:53:10 +08:00   ❤️ 3
    "www 不是域名,查询结束。"
    前半句对不对不是很清楚,非要说是主机名似乎也没错?但是怎么就查询结束了...
    例如:
    xxx.com -> 1.1.1.1
    www.xxx.com -> 2.2.2.2
    查到 www 就结束了... 岂不是全部都返回 1.1.1.1 了么?

    "这个查询出来的结果就是 google.com 域名。"
    还有是怎么就返回 google.com 了,难道不是 im.qq.com 的结果么?

    看到这两句,就不用继续往下看了。
    azh7138m
        6
    azh7138m  
       2019-08-11 11:54:40 +08:00   ❤️ 1
    @chinvo www 是 sub-domain 嘛(
    www.google.comgoogle.com 都是 domain (也都是 sub-domai )

    不过嘛 rfc822 里面也说了,很多基础设施做的比较早,就可能会只认为 google.com 是 domain
    DefoliationM
        7
    DefoliationM  
       2019-08-11 12:07:07 +08:00
    www 算域名的 有些网站你不加 www dns 是解析不出 ip 的
    hymzhek
        8
    hymzhek  
       2019-08-11 12:21:31 +08:00   ❤️ 5
    www 不是域名 那 http://www.com/ 怎么算 哈
    xfspace
        9
    xfspace  
       2019-08-11 12:34:01 +08:00 via Android
    我 get 不到 point 整篇文章看不到解答疑问的 point

    “由少数几个国家进行管理,”
    Root-servers.org:
    The 13 root name servers are operated by 12 independent organisations.
    确实有几台 Root server 在 US mil 手上

    NS 是权威
    www 做了 NS record 也会转发到另外的权威 DNS 查询

    .回复 com 的 NS
    com 权威回复 example.com 的 NS
    Example.com 权威回复 AAA.example.com 的 A 结束
    Example.com 权威回复 BBB.example.com 的 NS
    BBB.example.com 权威回复 www.bbb.example.com 的 A 结束


    给出的 IETF 草案已经 Expires: June 27, 2017
    正式的是 RFC 8109,有这么 1 段:
    The Recursion Desired (RD) bit
    MAY be set to 0 or 1, although the meaning of it being set to 1 is
    undefined for priming queries.
    还有 1 段:
    There are currently 13 root servers. All have one IPv4 address and
    one IPv6 address. Not even counting the NS RRSet, the combined size
    of all the A and AAAA RRSets exceeds the original 512 octet payload
    limit from [RFC1035].

    而且 EDNS 本来就超过 512 bytes


    13 不 13 已经不重要 适应的是较早的互联网环境
    用 Anycast,root server 镜像节点已经有 1k+
    crbee
        10
    crbee  
       2019-08-11 12:41:41 +08:00
    @hymzhek
    类似的还有 www.net.cn
    starsriver
        11
    starsriver  
       2019-08-11 13:00:59 +08:00 via Android
    @hymzhek 你可真是个人才
    ryanlid
        12
    ryanlid  
       2019-08-11 13:20:05 +08:00
    @DefoliationM #7 解析不出 ip 是因为管理员没有做裸域名解析。

    example.comwww.example.com 是独立的两条 DNS 记录
    flynaj
        13
    flynaj  
       2019-08-11 13:29:52 +08:00   ❤️ 4
    是 13 组不是 13 台,年轻人应该学会查 wikipedia ,不要只会用 baidu ,以前中国也有根服务器,因为 dns 污染被撤销了。https://zh.wikipedia.org/wiki/%E6%A0%B9%E7%B6%B2%E5%9F%9F%E5%90%8D%E7%A8%B1%E4%BC%BA%E6%9C%8D%E5%99%A8
    txydhr
        14
    txydhr  
       2019-08-11 13:41:24 +08:00
    @flynaj 现在又部署回来了
    ChristopherWu
        15
    ChristopherWu  
    OP
       2019-08-11 13:43:28 +08:00 via iPhone
    @flynaj 我不止不用百度,还查 rfc...疏漏错了不代表就是查百度。用百度这样的话对我来说是个小侮辱...
    ChristopherWu
        16
    ChristopherWu  
    OP
       2019-08-11 13:44:15 +08:00 via iPhone
    @crbee 查询结果那里很明显是笔误...www 是什么东西,我是还没有了解清楚。
    firefox12
        17
    firefox12  
       2019-08-11 13:59:46 +08:00 via iPhone
    www 当然是主机名 没毛病。简单的一句话总结 dns 的消息大小 也就是放 13 个根的结果正好,更多会分片。就是这么简单。

    知道现在的马路一根车道为什么这么宽吗?因为当年 2 匹马的马车就这么宽。所以马屁股的宽度决定了今天马路的宽度。
    txydhr
        18
    txydhr  
       2019-08-11 14:10:44 +08:00
    @flynaj https://root-servers.org/ 上海 1 个 杭州 2 个 北京 5 个
    mytsing520
        19
    mytsing520  
       2019-08-11 14:52:28 +08:00   ❤️ 1
    用不着争议 www 是不是域名,只要能 NS 记录继续查下去都可以视为进一步递归,看不到 NS 了,就视为在当前这一级权威上查询 www 的结果
    misaka19000
        20
    misaka19000  
       2019-08-11 14:57:39 +08:00
    课代表来了:

    因为一个 UDP 最多能塞 14 个 DNS 地址
    visualbasic
        21
    visualbasic  
       2019-08-11 15:16:02 +08:00 via Android
    @flynaj 中国从未有过 IPv4 的根域名服务器,只有镜像服务器,以前只有 F、I 两个镜像的时候被撤销过路由通告。现在中国 IPv6 有 1 个主根、3 个辅根
    mytsing520
        22
    mytsing520  
       2019-08-11 15:23:20 +08:00
    @visualbasic 现在中国大陆有 10 组根镜像,北京 5 组,杭州 2 组,上海 1 组
    MeteorCat
        23
    MeteorCat  
       2019-08-11 15:42:26 +08:00 via Android
    国内只有镜像站
    citydog
        24
    citydog  
       2019-08-11 18:56:20 +08:00
    @flynaj 早回来了
    Mitt
        25
    Mitt  
       2019-08-11 19:08:40 +08:00
    主机名跟域名概念场景不一样不应该混淆使用,域名再 sub 也是域名,不然怎么叫根域、一级域 /顶级域名、二级域、...
    CEBBCAT
        26
    CEBBCAT  
       2019-08-11 22:44:33 +08:00
    JOJO 都加上了,楼主下次再在标题加个书名号呗
    vhwwls
        27
    vhwwls  
       2019-08-11 22:50:14 +08:00
    这是一个伪命题,全球的根服务器在多播的加持下早就已经不止 13 台。
    KasuganoSoras
        28
    KasuganoSoras  
       2019-08-11 23:04:06 +08:00
    草,jojo
    mason961125
        29
    mason961125  
       2019-08-11 23:05:46 +08:00
    @vhwwls #27 anycast 是 「任播」。
    jaskle
        30
    jaskle  
       2019-08-12 07:14:58 +08:00 via Android
    所以美国是可以限制外国对中国的域名解析,不过那时不会对本土产生影响,国内 dns 可以自己做查询规则,但国外如果不做差异化中国互联网将被孤岛。
    bunnyblueair
        31
    bunnyblueair  
       2019-08-12 08:22:26 +08:00 via Android
    国内有 root,至于为啥被移除了 地球人都知道
    shenxj
        32
    shenxj  
       2019-08-12 08:53:42 +08:00
    @bunnyblueair 国内一直都是镜像服务器,未有过 IPv4 的根域名服务器,之前移除的也只是镜像
    sunsulei
        33
    sunsulei  
       2019-08-12 09:07:08 +08:00
    尴尬的很,完全复制的知乎某帖子,连 google 那块都一模一样。。
    hbolive
        34
    hbolive  
       2019-08-12 09:17:03 +08:00
    这文章东抄西凑的也发上来了。。
    tankren
        35
    tankren  
       2019-08-12 10:27:59 +08:00
    to be continued
    つづく
    未完待续
    crbee
        36
    crbee  
       2019-08-12 11:27:05 +08:00
    @sunsulei 我以为这个和知乎是同一个作者
    ChristopherWu
        37
    ChristopherWu  
    OP
       2019-08-12 11:53:16 +08:00 via iPhone
    @sunsulei
    @crbee 肯定同一个,还用想吗?谁脑抽了抄别人东西还说自己写的发出来
    fuxiuyin
        38
    fuxiuyin  
       2019-08-12 13:30:07 +08:00
    @hymzhek 其他的不知道,www.com 这个完整的是 http://www.www.com
    no1xsyzy
        39
    no1xsyzy  
       2019-08-12 14:35:17 +08:00
    我以为的是 www.im.qq.com 这个域名不存在,所以说的 “ www 不是域名,查询结束”
    要么不查 X.Y 的 NS,要么会查 www.X.Y 的 A,不可能说查了 X.Y NS 不查 www.X.Y A 的
    因为说到底为什么查 X.Y NS ?就是因为要知道去找谁查 www.X.Y A ……
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1112 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 22:49 · PVG 06:49 · LAX 14:49 · JFK 17:49
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.