DIY一个DNS查询器:程序实现

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
简介:

上一篇文章《DIY一个DNS查询器:了解DNS协议》中讲了DNS查询协议的原理和数据结构。经过两个星期的开发,完成了该查询器的编写。期间也遇到了一些问题,如:

1资源记录(Resource Record)中的RDData内容的格式。

2关于压缩编码的指针问题。

3代码冗余结构不清晰。

尤其是压缩编码的问题,困扰了我很久,找了很多中文资料,都说到当长度的值为“192”的时候为指针,下一字节的内容即偏移的位置,但是在过程中却发现存在该值为“193”的情况,一直不解了好久。这里我给解释下:

 

假设第13字节内容为:05-6c-69-78-69-6e-02-6d-6e

翻译为“5-l-i-x-i-n-2-m-e”

而其后的某个地方,同样出现了lixin.me的字符串,那么就会使用指针编码:"c0-0c”。

c0十进制是192,代表下面的内容是一个指针,0c是个地址,指向了data[12]的位置。

而为什么会出现193呢,也好理解,因为用一个字节的内容来表示偏移,顶多也只能偏移256个字节,那么假设udp包有500个字节长,而要指向第300字节就无能为力了。因此实际上的偏移量不是由oc这个字节内容决定的,正确的偏移量是:(Cn-C0)*256+0c。

如果值为193,下一字节为1,那么具体偏移就是 (193-192)*256+1 。

还有一点要注意到就是可变长度的Name字段以什么为结尾。有3中结尾方式:

1.长度+内容+~+长度0

2. 偏移标识+偏移量

3.长度+内容+~+偏移标识+偏移量

能成功解决该问题,主要还是靠资料,虽然知道rfc1034和rfc1035里面一定有我要的内容,可惜外文比较难懂,一直看不下去,通过搜索得到的中文和少量外文资料也没说清楚。最后还得感谢《TCP-IP详解卷一:协议》的第14章Dns协议的介绍,虽然只有短短的17页,但还是帮我解决了问题。所以在同样搞协议的同学,不妨弄本先去瞧瞧,或者遇到问题也可以先去看看。

 

现在来说说这个程序了。

我按dns协议的结构把项目分成 MyDnsHeader.cs、MyDnsQuestion.cs、MyDnsRecord.cs 这样的3个大结构。

发送dns请求时只需要构造MyDnsHeader和MyDnsQuestion结构,然后通过GetBytes()函数得到构造好的字节数组,然后通过udp发送出去。然后接受来自服务器的响应,将接收到的字节数组通过Parse(byte[] recvData)方法让3个结构去解析,最后通过这些结构的属性字段获取相应的查询信息。

其中的资源记录,目前能分析 A记录、SOA记录、TXT记录、CNAME记录、MX记录、NS记录。

示例代码:

         MyDns mydns = new MyDns();//

         //想8.8.8.8域名服务器查询lixin.me这个域名的a记录, 
         if (!mydns.Search(“lixin.me”QueryType.A, “8.8.8.8”,null )) 
         {

             //如果服务器返回错误信息,则显示错误的内容

             MessageBox.Show(mydns.header.RCODE.ToString()); 
             return; 
         } 
         txtInfo.Clear(); 
         txtInfo.AppendText (string.Format ("回复记录数:{0}\n",mydns.header.ANCOUNT) ); 
         txtInfo.AppendText(string.Format("回复额外记录数:{0}\n", mydns.header.ARCOUNT )); 
         txtInfo.AppendText(string.Format("回复权威记录数:{0}", mydns.header.NSCOUNT ));

         txtContent.Clear(); 
         foreach (MyDnsRecord item in mydns.record.Records) 
         {

            //循环资源记录,并打印出来。 
             txtContent.AppendText(item.QType.ToString() + "   " + item.RDDate.ToString()+"\n"); 
         }

界面截图:

MydnsSearch

 

代码下载及浏览:

我把代码放在了CodePlex.com 上面了。地址为:http://mydnspackage.codeplex.com/

欢迎园友测试。如果发现错误,请告知我。

目录
相关文章
|
3月前
|
存储 Cloud Native 关系型数据库
Ganos实时热力聚合查询能力解析与最佳实践
Ganos是由阿里云数据库产品事业部与飞天实验室共同研发的新一代云原生位置智能引擎,集成于PolarDB-PG、Lindorm、AnalyticDB-PG和RDS-PG等核心产品中。Ganos拥有十大核心引擎,涵盖几何、栅格、轨迹等多种数据处理能力,实现了多模多态数据的一体化存储、查询与分析。本文重点介绍了Ganos的热力瓦片(HMT)技术,通过实时热力聚合查询与动态输出热力瓦片,无需预处理即可实现大规模数据秒级聚合与渲染,适用于交通、城市管理、共享出行等多个领域。HMT相比传统网格聚合技术具有高效、易用的优势,并已在多个真实场景中验证其卓越性能。
61 0
|
2月前
|
域名解析 网络协议 安全
DNS查询工具简介
DNS查询工具简介
125 4
|
2月前
|
SQL 安全 Windows
SQL安装程序规则错误解析与解决方案
在安装SQL Server时,用户可能会遇到安装程序规则错误的问题,这些错误通常与系统配置、权限设置、依赖项缺失或版本不兼容等因素有关
|
3月前
|
域名解析 网络协议 安全
DNS查询工具简介
DNS查询工具简介
93 4
|
2月前
|
SQL 数据可视化 BI
SQL语句及查询结果解析:技巧与方法
在数据库管理和数据分析中,SQL语句扮演着至关重要的角色
|
2月前
|
XML Java 数据格式
手动开发-简单的Spring基于注解配置的程序--源码解析
手动开发-简单的Spring基于注解配置的程序--源码解析
48 0
|
2月前
|
XML Java 数据格式
手动开发-简单的Spring基于XML配置的程序--源码解析
手动开发-简单的Spring基于XML配置的程序--源码解析
86 0
|
3月前
|
设计模式 存储 算法
PHP中的设计模式:策略模式的深入解析与应用在软件开发的浩瀚海洋中,PHP以其独特的魅力和强大的功能吸引了无数开发者。作为一门历史悠久且广泛应用的编程语言,PHP不仅拥有丰富的内置函数和扩展库,还支持面向对象编程(OOP),为开发者提供了灵活而强大的工具集。在PHP的众多特性中,设计模式的应用尤为引人注目,它们如同精雕细琢的宝石,镶嵌在代码的肌理之中,让程序更加优雅、高效且易于维护。今天,我们就来深入探讨PHP中使用频率颇高的一种设计模式——策略模式。
本文旨在深入探讨PHP中的策略模式,从定义到实现,再到应用场景,全面剖析其在PHP编程中的应用价值。策略模式作为一种行为型设计模式,允许在运行时根据不同情况选择不同的算法或行为,极大地提高了代码的灵活性和可维护性。通过实例分析,本文将展示如何在PHP项目中有效利用策略模式来解决实际问题,并提升代码质量。
|
4月前
|
SQL 数据库
|
4月前
|
Prometheus 监控 Cloud Native
Prometheus 查询语言(PromQL):深入解析
【8月更文第29天】Prometheus 是一款开源的监控系统和时间序列数据库,广泛应用于各种系统的监控和告警。PromQL(Prometheus Query Language)是 Prometheus 用来查询和聚合时间序列数据的一种强大语言。本文将详细介绍 PromQL 的功能和语法,包括基本查询、向量操作、聚合函数等,并提供具体的代码示例。
567 2

相关产品

  • 云解析DNS
  • 推荐镜像

    更多