基于LWIP协议栈实现DNS服务

前言

TCP/IP协议是网络通信的基础,日常在对TCP/IP协议设置时会涉及到IP地址,子网掩码,默认网关和DNS这几个参数。这里咱们主要谈下IP地址和DNS这两个参数之间的关系。浏览器

首先计算机在网络中进行通信时只能识别“101.86.134.121”之类的IP地址,那么为何咱们平时在访问网站时只在浏览器地址栏中输入“www.baidu.com”之类的域名就能看到所须要的页面呢?这是由于DNS服务器在起到一个翻译的做用。这么作的缘由其实很容易理解,由于IP地址没有规律,很难记,可是访问网站必需要事先知道对方服务器的IP地址,那么就选择了像www.baidu.com,www.163.com这些有意义的字符串(域名)代替了IP地址,同时发明了DNS服务器对这些域名进行解析,DNS服务器知道全部域名对应的IP地址,当咱们访问www.baidu.com的时候,计算机会去向DNS服务器查询这个域名对应的IP地址,当计算机拿到IP地址后就能够访问该网站了。缓存


DNS查询

DNS 查询的过程以下:服务器

  • 在浏览器中输入http://www.baidu.com域名,计算机会先检查本身本地的hosts文件、本地DNS解析器缓存是否有这个网址映射关系,若是有则直接返回,完成域名解析。
  • 若是hosts与本地DNS解析器缓存都没有相应的网址映射关系,会经过TCP/IP参数中设置的首选DNS服务器进行查询,若是该服务器具备网址映射关系,则调用这个IP地址映射,完成域名解析。
  • 当以上的DNS服务器和缓存解析都失效了,则会将请求转发至上一级DNS服务器或根DNS进行解析,以此循环。该过程属于DNS服务器之间的交互查询。

使用浏览器请求网站,经过Wireshark抓包分析DNS数据包以下所示:DNS为应用层协议,在传输层UDP协议基础上实现,DNS目的端口(Dst Port)是53,域名为www.baidu.com,DNS服务器的IP地址是(172.20.1.2 在网络链接中配置)。做为DNS服务器,能够经过监听网卡53端口号的数据来得到DNS数据包,对应DNS协议格式进行解析。网络

图片描述


LWIP实现

接下来说述下LwIP协议栈对DNS服务的支持。LwIP是应用于嵌入式领域的轻量级开源以太网协议栈, 它使用C语言实现很是方便移植,并且支持socket接口,所以使用十分普遍。LwIP协议栈中涉及到DNS服务的代码为dns.c文件,主要功能是完成ipv4的客户端域名解析,不涉及复杂的服务器端的处理过程。客户端调用API接口能够实现DNS查询请求,解析DNS响应,创建本地缓存。socket

  • 宏定义开启DNS模块

图片描述

  • 配置DNS服务器地址,相似在网络链接中配置DNS服务器地址,也能够经过DHCP方式自动分配

图片描述

  • DNS初始化,其中包括建立UDP pcb,配置默认DNS服务器,若是有本地缓存则初始化缓存列表(该函数在初始化时执行)。

图片描述

  • 经过域名字符串解析出IP地址。客户端须要根据域名获取对应的IP地址时,若是不久前已经查询过该域名对应的IP地址,那么直接从本地DNS解析器缓存中获取(dns_lookup函数)。不然,客户端就以DNS客户的身份,向DNS服务器发出查询请求报文(dns_enqueue函数,此时返回状态ERR_INPROGRESS正在处理,后续dns_tmr函数会周期处理请求队列的内容)。

图片描述

  • 该函数须要周期处理,主要做用是处理向DNS服务器请求的队列

图片描述

  • 该函数向队列中加入一条向DNS服务器查询的请求,而且根据每条请求的状态进行对应的处理

图片描述

  • 接收函数在初始化时注册到UDP pcb中,用于处理接收到的DNS响应包。在接收函数中会将获取的IP地址保存至对应的dns_table[DNS_TABLE_SIZE]中

图片描述

图片描述

相关文章
相关标签/搜索