🔌 第一章 浏览器生成消息
📄 一句话概括

从根服务器顺着树往下问:每一步得到的都是【下一层的门牌】(NS 记录),一层一层递到管目标的区——全世界的 DNS 是一场接力。

📝 本节和前面几节的关系

1.3.2 画好了地图;本篇照地图走一遍完整接力。

一、接力的走法

本地 DNS 问根:根不答 IP,只答【com 的服务器在哪】; 问 com:答【glb 的在哪】;问 glb:答【lab 的在哪】; 问 lab:答出 172.20.1.1——这是权威答案。

二、给的是门牌不是地址

中间每步给的是下一层服务器的门牌(NS 记录+它的 IP, 那个 IP 有时要再查一次——胶水记录,教材点到为止)。

三、动手 Demo:一场 DNS 接力(迭代查询)

四问四答的完整剧本:

chain = [('根','com 的服务器在 XXX'),
         ('com','glb 的服务器在 YYY'),
         ('glb','lab 的服务器在 ZZZ'),
         ('lab','172.20.1.1(权威答案)')]
for i, (who, ans) in enumerate(chain, 1):
    print('第%d问 %s -> %s' % (i, who, ans))

实跑输出:

--------------------------------------------------------------------
一场 DNS 接力(迭代查询)
--------------------------------------------------------------------
  解析器只认自己的 DNS 服务器,剩下的一层层往下问:

    解析器 -> 本地DNS   查 www.lab.glb.com?
    本地DNS -> 根       查 www.lab.glb.com?
    根     -> 本地DNS   我不管 com,com 的服务器在 XXX
    本地DNS -> com      查 www.lab.glb.com?
    com    -> 本地DNS   我不管 glb.com,glb 的在 YYY
    本地DNS -> glb      查 www.lab.glb.com?
    glb    -> 本地DNS   我不管 lab,lab 的在 ZZZ
    本地DNS -> lab      查 www.lab.glb.com?
    lab    -> 本地DNS   172.20.1.1   (权威答案!)
    本地DNS -> 解析器   172.20.1.1

  全程 4 问 4 答,每一步给的都是【下一层去哪问】。

这种【你问一步、我指下一步】叫迭代查询; 解析器让本地 DNS 代跑全程,自己只等最终答案。

30 秒实验

  1. 用 nslookup 加 +trace 参数看一次真实接力(Linux/新 nslookup 支持)。
  2. 查一下根服务器的数量(13 个名字,靠 anycast 铺成上千个点)。
  3. 想想为什么根服务器不直接存所有记录——维护量算一算。

常见误区

  1. 以为本地 DNS 一次就查出答案——它也要一层层问。
  2. 以为中间服务器也给出 IP——它们只给下一层的门牌。
自测三问(点开对答案) 1. 接力的起点是哪台服务器? —— 根 DNS 服务器。 2. 中间每一步给出的是什么? —— 下一层 DNS 服务器的门牌(NS 记录)。 3. 【权威答案】来自哪台? —— 直接管辖目标区的那台。

相关笔记