用 c 写网络编程本身就是一件非常蛋疼的事了。实现中文域名系统,要研究 udp, tcp, dns协议,实现中文的编码和解码,将各个字段按照各个协议的规定进行相应的层层封装并解析,最后把写好的程序在网络上跑一遍,程序的结果不仅仅要正确无误,还要用wireshark抓包,如果抓包结果能完美的识别出任何两台通信机器之间的协议并且抓包数据的解析完全正确,工作就算是完成了。

这份程序是去年写的,零零散散花了有一周时间,通过这次程序,意识到版本控制的重要性。尤其是有一个晚上,一口气写了30多个版本。为什么要写这样一个东西呢,因为经济危机每年都会发生啊o(╯□╰)o。“客户”是北邮的几个学生,最后他们本课程的成绩都是A+,对于这一点我还是比较欣慰的。

通过对DNS协议原理和流程的研究(其实计算机网络课本上就有),设计了如下网络拓扑模型:

 

网络拓扑

其实程序中体现的更为复杂一些,比如2nd Level DNS Server和3rd Level DNS Server分别有4个,并且加入了缓存机制,这样在迭代查询的时候更接近真实的情况。那么对应的,迭代查询过程如下:

迭代查询

 

具体查询流程如下:当用户要对一个特定类型(A,NS,MX,CNAME)的域名进行查询时,可以通过客户端程序基于UDP协议与本地服务器通信,然后本地服务器基于TCP协议通过迭代查询将查询结果返回客户端。具体来说,本地服务器首先会从根服务器进行查询,如果查询得到最终结果,即把查询到的结果立刻返回给客户端,否则,本地服务器会根据从根服务器查询得到的信息(更低级的服务器的ip地址)在更低级的服务器上进行查询,如此迭代往复,直至查到最终结果或者直到查询结束。在本流程中,最复杂度情况是client –> local server ->root server -> local server -> 2nd server -> local server -> 3rd server -> local server -> client.

详细设计如下,之后贴一下一个完整查询的程序(各级服务器都是单个的情况,多个的情况其实是一样的):

用于client和local server通信的关于UDP协议的一些数据结构(socket, 报文等)的定义:

client(客户端):

local server(服务器端):

用于定义local server和其他各级服务器通信的关于TCP协议的一些数据结构(socket,报文等)的定义:

local server(客户端):

root server(服务器端,以root server为例):

DNS报文格式定义:

 

查询类型数据结构声明:

local server 迭代查询核心算法流程:

 

要分文件贴代码了,运行结果截图什么的这里就不上传了,需要更详细信息需要解答以及存在问题的,可以mail我。

DNS.h

client.c

localServer.c

rootServer.c(其他各级服务器以此为例,不再赘述)