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

解析器把【名字+类别+类型】三件套装进查询消息,委托协议栈用 UDP 发给 DNS 服务器——这一步用的正是后面 1.4 节那一套委托流程。

📝 本节和前面几节的关系

1.2.3 找到了翻译官;本篇看它怎么跑腿——消息长什么样、走哪条路。

一、查询消息三件套

名字(要查的域名)、类别(IN,指互联网体系)、 类型(A=名字换 IP,MX=换邮件服务器……)。 类型不同,换回来的东西就不同。

二、走的还是老路

解析器自己也会调 Socket 库委托协议栈发消息—— 这次用的是 UDP(53 端口),消息短、一来一回,开销小。 1.4 节将看到协议栈被委托时到底做什么。

三、动手 Demo:查询消息里写了什么

三件套怎么填,对照两种类型:

q = dict(name='www.lab.glb.com', cls='IN', typ='A')
print('查询:', q)
print('A  记录答: 172.20.1.1 (IP)')
print('MX 记录答: mail.lab.glb.com (邮件服务器)')

实跑输出:

--------------------------------------------------------------------
查询消息里写了什么
--------------------------------------------------------------------
  解析器发给 DNS 服务器的消息只有三件套:

  字段     本次填的值          为什么
  ------------------------------------------------
  名字     www.lab.glb.com     要查谁
  类别     IN                  走互联网这一套体系
  类型     A                   名字换 IP 就用 A
  ------------------------------------------------

  类型不同,换回来的东西就不同:

  类型      查询意图                 返回内容
  ---------------------------------------------------------
  A         域名 -> IP               172.20.1.1
  MX        这个域的邮件发给谁       邮件服务器名 + 优先级
  CNAME     另一个名字               别名指向的正式名
  PTR       IP -> 域名(反着查)     对应的名字
  ---------------------------------------------------------

注意【类别 IN】不是可选项的装饰——DNS 设计之初 就预留了多套网络体系并存的可能,互联网用 IN。

30 秒实验

  1. 用 nslookup www.qq.com 和 nslookup -type=mx qq.com 各查一次,对比。
  2. 在 Python 里跑 socket.getaddrinfo 一次,确认它不挑类型只给地址。
  3. 查一下 53 端口是干什么用的(UDP/TCP 都用)。

常见误区

  1. 以为 DNS 查询走 TCP——常规查询走 UDP,区域传送才用 TCP。
  2. 以为类型 A 是【所有记录都返回】——查什么类型答什么类型。
自测三问(点开对答案) 1. 查询消息的三件套是什么? —— 名字、类别、类型。 2. 常规 DNS 查询用哪个协议、哪个端口? —— UDP 53。 3. 类型 MX 查的是什么? —— 该域的邮件服务器。

相关笔记