网络浏览器如何将 DNS 名称各部分的原始字节解析为人类可读的形式?

网络浏览器如何将 DNS 名称各部分的原始字节解析为人类可读的形式?

我的重点是使用 Python 以编程方式解析 DNS 数据包的结构。想象一下我的浏览器通过管道发送一个大域名而没有任何抱怨的情况。 在此处输入图片描述

让我们仔细看看字节字符串: b'\x03www99dksjfhkdfgh534534534dkfghkldfhglksdfhg435634634dkfghlkd\x03com\x00' 在此处输入图片描述

我可以用这样的逻辑用 Python 编程编写代码

在此处输入图片描述

所以我的问题是:Web 浏览器如何将 DNS 名称每个部分的原始字节解析为人类可读的形式? 欢迎任何形式的建议/帮助。

答案1

名称的线格式在 DNS 协议中是(举例来说):

该名称www.example.com.分为四个标签:

“www”、“example”、“com”和“”(末尾总有一个空标签,代表树的根)。

每个标签都用一个前缀进行编码,该前缀指定了标签的长度(单字节,前两位保留,得到一个六位整数),后面跟着标签的原始内容(与前缀指定的字节数一样多)。

上面的示例名称是(如果我们对不一定可读的字节值\x03www\x07example\x03com\x00使用正常格式,则值为十六进制)。\xNN

当以有线格式读取名称时,您将从第一个字节开始,查看它指定下一个标签的长度,读取与该标签相同的字节数,重复此过程,直到到达代表树的根(和名称的末尾)的零长度标签。

然而,在一包中,也有可能压缩名称(通过参考以前的标签)。

除非目的是为了学习,否则你可能需要看看例如python 的而不是从零开始。

相关内容