📄 一句话概括
解析器把【名字+类别+类型】三件套装进查询消息,委托协议栈用 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 秒实验
- 用 nslookup www.qq.com 和 nslookup -type=mx qq.com 各查一次,对比。
- 在 Python 里跑 socket.getaddrinfo 一次,确认它不挑类型只给地址。
- 查一下 53 端口是干什么用的(UDP/TCP 都用)。
常见误区
- 以为 DNS 查询走 TCP——常规查询走 UDP,区域传送才用 TCP。
- 以为类型 A 是【所有记录都返回】——查什么类型答什么类型。
自测三问(点开对答案)
1. 查询消息的三件套是什么? —— 名字、类别、类型。 2. 常规 DNS 查询用哪个协议、哪个端口? —— UDP 53。 3. 类型 MX 查的是什么? —— 该域的邮件服务器。- ☐ 下一节(1.2.5 解析器的内部原理)
相关笔记
- 网络的电话簿(域名解析、主机名、DNS) —— 12 课的电话簿总览
- 只对传输给应用程序的数据进行分发(UDP) —— 为什么 UDP 够用
- 数据收发操作概览 —— 被委托的协议栈在做什么
- 🔌 网络是怎样连接的 · 索引