NodeMCU UDP DNS 请求格式

我正在查看一个内置在 NodeMCU 平台上的围栏门户网站的 示例,并试图理解 DNS 请求的工作原理。(相关的文件是 dns-liar.lua)我已经更多或更少地解码了响应,但不知道其中的每个部分是做什么的,我找不到任何在线资源显示类似的数据包结构。

NodeMCU 的 IP:

a.b.c.d

请求:

|A|B| ... |(第13个字节)\0 终止的字符串(str)|...

响应:(字节用“|”分开)

|A|B|x80|x00|x00|x01|x00|x01|x00|x00|x00|x00|str|x00|x01|x00|x01|xC0|x0C|x00|x01|x00|x01|x00|x00|x03|x00|x00|x04|a|b|c|d|

我了解 str 可能是要搜索的域名,abcd 仅是 NodeMCU 用其自己的 IP 地址响应每个请求,但我不确定其他任何字节在做什么。

点赞
用户6020403
用户6020403

哇!当人们决定预先格式化整个数据包时,特别是当它跨越 RFC 的几个子部分时,这总是棘手的。

无论如何,我已经 forked CaptiveIntraweb 并对 DNS 代码进行了注释。我还 提交了一个 PR ,希望我的更改在未来的版本中被上游接受。你可以在那里阅读整个内容(它详细介绍了每个 DNS 字段),但这里是作者正在做的亮点:

  1. 前两个字节是从请求解析的 ID 字段的副本
  2. 接下来的 10 个字节是预先制作的头,包括数据包类型等(..._str1)。
  3. 接下来的 X 个字节是从请求中请求的 NAME 的副本
  4. 接下来的 4 个字节是剩余的问题数据(类型/类),接下来的 14 个字节是压缩的 NAME,以及响应的类型/类/ttl/长度(..._str2)。
  5. 最后四个字节是节点的 IP。
2017-12-27 19:44:53