TCP/IP协议学习之四(DNS协议)

在实际的访问互联网资源的时候,我们会使用域名进行访问,比如www.baidu.com、www.defense.gov等等。但是,实际的数据传输的时候,我们知道是通过ip地址与端口建立连接的,那么怎么把域名翻译成ip地址,这里用到的协议就是DNS协议。解析域名时候,在Unix环境高级编程中,遇到过两个函数分别是gethostbyname和gethostbyaddr,第一个函数通过主机名字返回IP地址,第二个函数通过ip地址返回主机名。

一般情况下,一个网络系统中至少有两个域名解析服务器,一个主,一个从,这样做的目的是如果主服务器发生故障,从服务器可以立即启用,以便不影响这个区域域名解析服务的使用。当一个新主机添加到一个网络区域的时候,添加相关信息到主服务器的磁盘文件中,然后更新它的配置文件,从服务器一般每隔一段时间(ps:一般情况下是3小时)会向主服务发起询问,数据有没有发生改变,如果改变就把主服务器上的数据同步到从服务器上。然后我们进行域名解析的时候,如果本地的域名服务器中无法满足客户端的请求,也就是说本地没有客户端想要域名所对应的ip地址,这时候主服务器需要与根域名服务联系,然后根域名服务器再告诉下一级的域名在那个服务器上,就这样一级一级地寻找,最终找到所需要的域名,然后本地的主域名服务器会将这个结果进行缓存。域名的树形结构如下:
TCP/IP协议学习之四(DNS协议)_第1张图片
说起顶级域名,不得不提一下,全球有13个顶级域名服务器,其地址可以直接登录:ftp://ftp.rs.internic.net/domain/named.root进行查看。
DNS数据报的格式如下:
TCP/IP协议学习之四(DNS协议)_第2张图片

这里我们首先看一下查询时候,查询问题的格式:

TCP/IP协议学习之四(DNS协议)_第3张图片

查询名是要查找的名字,它是一个或多个标识符的序列。每个标识符以首字节的计数值来说明随后标识符的字节长度,每个名字以最后字节为0结束,长度为0的标识符是根标识符。计数字节的值必须是0~63的数,因为标识符的最大长度仅为63,该字段无需以整32bit边界结束,即无需填充字节。一个域名存储的结构如下:

TCP/IP协议学习之四(DNS协议)_第4张图片

每次查询的时候,都有一个类型:

TCP/IP协议学习之四(DNS协议)_第5张图片

对于查询类,通常设为1,指的是互联网地址。

响应问题的格式如下:

TCP/IP协议学习之四(DNS协议)_第6张图片

主要看下后面三个字段:

生存时间字段是客户程序保留该资源记录的秒数,资源记录通常的生存时间值为2天。

资源数据长度说明资源数据的数量。该数据的格式依赖于类型字段的值。对于类型1资源数据是4字节的IP地址。

有了上面的了解后,那么DNS数据包完整的格式如下:
TCP/IP协议学习之四(DNS协议)_第7张图片

在Linux系统下要查看本地网络系统域名服务器的地址可以查看这个文件:
/etc/resolv.conf
在访问某个主机的时候,先到域名服务器获取主机的ip地址,然后再发起访问。
我们利用tcpdump抓取数据包进行分析这一个过程:
tcpdump -i eth0 -vnn port 53
另外若只是查询域名,可以使用host命令获取域名,还有nslookup,还可以使用dig命令进行域名的查询,具体的使用可以使用man进行查看。




你可能感兴趣的:(TCP/IP协议学习之四(DNS协议))