Write Your Own DNS Query
大部分人应该都知道 DNS 协议,以及它的用处。但是考虑过自己动手写 DNS message transmission 的应该不占多数。
我们不妨考虑如何自己实现一个简单的 DNS client,完成基本的 domain name query and response parsing。
因为 DNS 协议通常使用 UDP 作为其传输层协议,而且数据包是二进制包,所以实现一个这样简单的 demo 考虑用 golang 可能会省事儿不少。
DNS Message Format
大体上 DNS 不是一个复杂的协议(虽然各类坑实在不少),所有的消息,不管是 query 还是 reply,都共享一个消息格式:
1 | +---------------------+ |
- Header:消息头,包含一些参数、标志位
- Question:包含 query 的信息,例如需要查询的 domain
- Answer:reply 的信息
- Authority:如果有信息,则表明应答的服务器是 ultimate authority server。别忘了 DNS 服务器是树形结构,通常终端用户查询的 DNS 服务器都是 local DNS server。
- Additional:服务器传回的一些额外数据,非用户显式需要的
对于一个 query message,Answer
section 是空的;而对于一个 reply message,Question
保存着对应 query 的数据。
一般而言,终端设备收到的 reply 消息里,Authority
和 Additional
是空的。所以下面会跳过这两个 section 的描述。