本节,我们基于上一节理论的基础上,用代码实现DNS数据包的发送和解析。这里有两点需要重复,一是我们将使用DNS的递归式传输模式,也就是消息的发送如下图:
也就是我们将在数据包中的特定数据段内设置标志位,要求第一台域名解析服务器帮我们实现所有的查询流程,然后把最终结果返回给我们,这样我们可以省却多种数据交互和解析流程,一般而言第一台域名解析服务器都是路由器。
第二个值得我们了解的要点是DNS数据包的基本格式:
它包括固定的头部,以及相应的消息体部分。由于头部内容固定不变,因此我们可以在代码实现中写死,它的基本组成结构如下:
重要的是有两个可变的数据部分需要我们掌握,一个是Question数据格式,它包含了客户端向服务器请求的内容格式,它的组成如下:
当我们想要解析某个域名对应的IP时,我们需要按照上面的结构组织信息发布给服务器,服务器顺利解读后会给我们发送如下格式的应答信息:
由此我们代码的目的是构造包头,然后将要查询的域名信息按照上面给出的Question数据格式组织好发送给路由器并等待其回复,拿到回复数据包之后,我们再按照上头anwser resource格式解析服务器返回的数据。