DNS消息相对简单:浏览器查询一个域名并获取一个IP地址。
如果DNS服务器无法识别域名,它会将查询传递给下一个DNS服务器。然后,在收到响应后,将响应传递给浏览器。
有兴趣了解DNS解析工作原理吗?希望这篇文章可以帮助。
这是查询消息的结构。
•事务ID:用于将响应与查询匹配•标志:指定所请求的操作和响应代码•问题数:查询部分中的条目数•答案RR数:答案部分中的条目数(RR代表“资源记录”)•授权RR数:授权部分中的条目数•附加RR数:附加部分中的条目数•查询:查询数据
需要关注的是问题数,答案RR和查询。
1*M0dhqc6xOFKuMzSsp0XUaw.png以下是针对image.google.com
的查询消息的示例。
•问题数:1
表示此消息在查询部分中有一个条目。•答案RR数:0
表示没有答案。这是因为查询消息只包含问题,没有答案。
接下来,让我们深入查询的条目结构,仅包括3个部分。
1*QU32LdxHT_DIAKyk00okKA.png•名称:域名•类型:DNS记录类型(例如A,CNAME和MX)•类:允许域名用于任意对象
通过查看示例,更容易理解结构。
1*OsTVgcbGT59H-VYs3GkwEg.png•名称
是请求的域名image.google.com
。•类型:A
表示它是一个A记录。A记录是最基本和最常用的DNS记录类型。•类:IN
是“互联网”的缩写。在浏览器上下文中没有太大意义。
有趣的部分是消息如何编码名称
字段。
使用.
作为分隔符,示例域名可以分为3个组。
•image
•google
•com
在蓝色标记的示例中,第一个字节是05
,表示接下来的5个字节是域名的第1组。
在屏幕截图中,字节以ASCII码呈现。我们可以轻松将其解码为字符。
•69
→ i•6d
→ m•61
→ a•67
→ g•65
→ e
我们得到了image
。
按照相同的规则,我们可以找到域名的其余部分——google
和com
。
最后,在域名的末尾,00
标志着该部分的结束。
这就是查询的全部内容。通过查询提供的所有必要信息,DNS服务器将发送一个响应消息。
响应消息与查询消息共享相同的标题和查询
部分,另外还有一个额外的答案
部分。
为什么响应消息包括原始的查询
部分?这是供参考的。我们将很快了解它。
以下是查询image.google.com
的响应示例。
在消息中,我们在答案
部分收到3个条目。因此,答案RRs
设置为3。
1.在第一个条目中,DNS服务器为初始查询返回了一个CNAME images.google.com
。2.然后,发送了一个新的查询以获取images.google.com
,在第二个条目中返回了另一个CNAME images.1.google.com
。3.最后,通过查询images.1.google.com
,客户端在最后一个条目中收到了IP地址172.217.1.14
。
除了查询条目中找到的相同的3个部分外,答案条目还有3个额外的部分。
•存活时间(TTL):记录可以存在的秒数•数据长度:数据的长度•数据:返回的数据,例如IP
地址或CNAME
让我们来看看名称
部分,它只有两个字节:c0 0c
。
域名如何在两个字节中编码?
原来,这些字节是偏移量,指向查询部分中编码的域名。
c0
是一个开始标记,而0c
是实际的偏移量,为12。
我们从消息的开始字节17
(在屏幕截图中以红色标记)开始数12个字节。最后,我们到达第13个字节05
,这是image.google.com
的开头,用黄色标记。
不复杂,对吧?接下来是一个复杂的例子。
1*cmP7VhijOm9bCQiWdQTfIw.png在答案的第二个条目中,名称
偏移量为2e
,即46个字节。
通过计算46个字节,我们找到了前一个条目的CNAME中编码的images
。
•06
→ 接下来的6个字节属于同一组•69
→ i•6d
→ m•61
→ a•67
→ g•65
→ e•73
→ s
在images
的末尾,我们看到另一个偏移量引用c0 12
。这是18个字节。
同样,通过计算18个字节,我们到达了绿色标记的引用部分——在前一个条目的名称
中的google.com
。
偏移量的想法是一个令人鼓舞的设计。有了它,消息可以节省大量空间。
1*4J9iLDIsJHsKtx7tqOkIGw.png最后,我们可以解码最后一个答案条目中的地址。
•ac
→ 172•d9
→ 217•01
→ 1•0e
→ 14
•DNS消息中需要注意的是问题数、答案RR数、查询和答案。前两者是计数,而其他两者是实际数据。•通过理解名称的编码方式,您可以轻松地读取消息的字节。