1,这个项目主要使用go的原生net包和github.com/miekg/dns这个dns工具包来实现mdns的。我们需要实现mdns的服务端和客户端的代码,可以从开源项目里找过来用的。
数据包主要用到了网络层的icmp差错控制协议来返回响应数据包的,它里面携带了一个mdns响应数据包。这里可以实现icmp协议ping/ping.c · rogerbowu/iputils - Gitee.com。
ControlMessage结构体中有一个叫 IfIndex int // interface index, must be 1 <= value when specifying 的参数,它从1开始计数,是linux中网卡设备的编号。
2,如何解析dns协议的报文格式。
mdns 即多播DNS(Multicast DNS),MDNS主要实现了在没有传统DNS服务器的情况下使局域网内的主机实现相互发现和通信,使用的端口为5353,遵从dns协议,
使用现有的DNS信息结构、名语法和资源记录类型。并且没有指定新的操作代码或响应代码。所以解析mdns协议数据包就是解析dns协议数据包。我们根据协议报文规定的
字段和选项,就可以构建和解析到我们想要的数据字段。
等到client端解析收到的mdns响应信息,解析完成后就是这样:
想要了解应用层的dns协议,不如自己手动写一个demo,按照dns协议的报文格式填充请求数据包,发送,再把dns响应数据包按照协议格式解析出来。
和windows上的差不多就对了
和抓包结果符合
ps:
阮一峰老师的dns协议:http://www.ruanyifeng.com/blog/2016/06/dns.html
mdns介绍:https://blog.csdn.net/u013258415/article/details/77947610
dns报文解析:https://www.pianshen.com/article/37201216095/
linux dns编程:https://blog.csdn.net/qq_21539375/article/details/123457623,