networking - 深入了解 DNS 查询的工作原理
问题描述
现在是凌晨 04:40,我被困在我根本不明白的事情上。我正在尝试使用 DNS 协议直接查找域的名称服务器。如果我发送一个host -t ns google.com 1.1.1.1
并用 Wireshark 监控它,我可以看到 DNS 查询的完整查询。但是,我想不通,为什么一次使用某些 ASCII 字符,而不是另一次。这是一个例子:
0000 70 4d 7b 94 dd e0 00 d8 61 a9 c5 ec 08 00 45 00 pM{.....a.....E.
0010 00 38 d6 ff 00 00 80 11 9f 50 c0 a8 01 bb 01 01 .8.......P......
0020 01 01 e8 40 00 35 00 24 a0 19 9e f7 01 00 00 01 ...@.5.$........
0030 00 00 00 00 00 00 06 67 6f 6f 67 6c 65 03 63 6f .......google.co
0040 6d 00 00 02 00 01 m.....
在此 DNS 查询中,我正在查找google.com
. 实际查询从 开始06 07
。
06
在 ASCII 中是 ACK/确认。
现在,如果我们看一下gmail.com
:
0000 70 4d 7b 94 dd e0 00 d8 61 a9 c5 ec 08 00 45 00 pM{.....a.....E.
0010 00 37 d7 00 00 00 80 11 9f 50 c0 a8 01 bb 01 01 .7.......P......
0020 01 01 e8 58 00 35 00 23 8f cc 6f e2 01 00 00 01 ...X.5.#..o.....
0030 00 00 00 00 00 00 05 67 6d 61 69 6c 03 63 6f 6d .......gmail.com
0040 00 00 02 00 01 .....
查询开始于05 67
。
05
是 ENQ/查询。
为什么它们不同?如果我尝试发送06
而不是05
DNS 服务器给我没有响应但 Wireshark 告诉我:
未知的扩展标签
我见过05
, 06
,09
到目前为止。09
是我有史以来最大的“wat”,因为它是 HT/Horizontal Tab。
有很多DNS知识的人可以在这里帮助我吗?我不是在寻找“只使用 dig/nslookup/host 命令”。我目前正在尝试对DNS协议进行一些研究,这是我不明白的事情。
很好的阅读,我得到了很多帮助:http ://dev.lab427.net/dns-query-wth-netcat.html
解决方案
对于这样的二进制协议,您不能假设每个字节都对应于匹配的 ASCII 字符。
查看 DNS RFC ( https://www.ietf.org/rfc/rfc1035.txt ) 的第 4.1.2 节。
DNS 请求中的域名被分解为“标签”。对于每个标签,第一个字节是标签的长度,然后写入字符串的字节。
对于您的 Google.com 示例,标签是“google”和“com”。06
是第一个标签中的字节数。后面是“google”的字节。然后03
是“com”标签中的字节数。在“com”字节之后,该00
字节是用于标记结束的 NULL 标签。
推荐阅读
- c++ - 用于嵌入式系统的独立于硬件的 C++ HAL
- javascript - Javascript 文件与其他 javascript 冲突
- javascript - 有没有一种简单的方法可以使用 PHP 将非公共 IP 摄像机流式传输到网站?
- node.js - 内部错误(具体信息不可用):[client 10.132.46.153:54838] AH01102: error reading status line from remote server *** referer
- r - loadNamespace (j <- i[[1L]], c(lib.loc, .libPaths()), versionCheck = vI[[j]]) 中的“mxnet”的包或命名空间加载失败:找不到对象“vI”
- java - 无法创建嵌入式 h2 数据库
- wordpress - 在 Wordpress 中创建 iframe 在父窗口中打开链接
- machine-learning - 连接到 Keras 中的每个时间戳
- ios - 如何在表格视图中访问多个 nib(表格视图单元格)
- proxy - Windows pod 无法解析服务