前言

本文分析dns工作过程及原理,给一个简单的dns实现代码流程,并针对linux及android

下实现dns的不同,分别分析,供学习dns参考。

一、DNS功能

DNS(Domain Name System,域名系统),dns用于进行域名解析,说白了,就是给出一个

主机名,你给我找出该主机名对应的ip地址。例如:给你www.baidu.com的主机名,你给
我查出对应的ip地址:163.177.151.109。一些主机名还会有别名,如www.baidu.com就
有别名www.a.shifen.com,甚至不止一个别名,或一个别名有2个ip地址。在linux机子
上,运行nslookup(name service lookup)就是进行域名解析。如下面:

~$ nslookup www.baidu.com
Server:         127.0.0.1
Address:        127.0.0.1#53Non-authoritative answer:
www.baidu.com   canonical name = www.a.shifen.com.
Name:   www.a.shifen.com
Address: 163.177.151.109
Name:   www.a.shifen.com
Address: 163.177.151.110

二、DNS的原理

上面介绍了dns的功能,那要实现dns的功能,dns需要做什么工作?主要就3点:1、记录dns
  • 服务器的ip地址(请求进行域名解析的地方);2、向dns服务器请求进行域名解析(dns

实质工作),3、缓存已经解析过的主机名与ip地址对应关系(这样已缓存的就不需要再向
dns服务器请求解析了)。
一个dns的解析过程如下:
1、 应用程序请求一个主机名解析,如:应用程序跟dns说,我需要知道www.baidu.com
的ip地址,你给我查一下;
2、 Dns先在本地缓存中查询,若查到,返回ip地址给应用,流程结束。若没查到, 进行
下一步;
3、 Dns把需要查询的主机名打包进dns数据包,然后把dns数据包发送到dns服务;
4、 DNS服务器返回查询的主机名的dns数据包;
5、 Dns解析数据包,把主机名对应的ip地址返回给应用程序;
下图为网卡抓到的dns数据包的收发,请求www.baidu.com的ip地址:

下图为dns运行流程:

上面是从本机看到的情况,实际上在向DNS服务器请求时,所请求的DNS服务器也不一
定知道主机名对应的ip地址,就会向上一级DNS请求,更多资料请自行查找dns协议。

下面代码片段为freescale小系统上的dns处理过程,看起来流程还是比较清晰简单的:

wiced_result_t dns_client_hostname_lookup( const char* hostname, wiced_ip_address_t* address, uint32_t timeout_ms )
{/* 省略部分代码*/.../* Create socket to send packets */if ( wiced_udp_create_socket( &socket, WICED_ANY_PORT, WICED_STA_INTERFACE ) != WICED_SUCCESS ){return WICED_ERROR;}while ( ipv4_address_found == WICED_FALSE && remaining_time > 0){/* Send DNS query messages */for ( a = 0; a < dns_server_address_count; a++ ){wiced_ip_address_t host_ipv6_address;uint16_t           available_space;/* 创建dns数据包 */if ( wiced_packet_create_udp( &socket, (uint16_t) ( sizeof(dns_message_header_t) + sizeof(dns_question_t) + hostname_length ), &packet, (uint8_t**) &iter.header, &available_space ) != WICED_SUCCESS ){goto exit;}/* 省略部分代码*/.../* 发送dns数据包 */if ( wiced_udp_send( &socket, &dns_server_address_array[a], DNS_PORT, packet ) != WICED_SUCCESS ){wiced_packet_delete( packet );goto exit;}/* 省略部分代码*/...}/* Attempt to receive response packets */while ( ipv4_address_found == WICED_FALSE && remaining_time > 0 ){/* 省略部分代码*/.../* 接收dns数据包 */if ( wiced_udp_receive( &socket, &packet, remaining_time ) == WICED_SUCCESS ){uint16_t     data_length;uint16_t     available_data_length;wiced_bool_t answer_found = WICED_FALSE;/* Extract the data */result = wiced_packet_get_data( packet, 0, (uint8_t**) &iter.header, &data_length, &available_data_length );if ( ( result != WICED_SUCCESS ) || ( data_length < sizeof(dns_message_header_t) ) ){goto exit;}/* 解析dns数据包,解析出主机名的ip地址 *//* 省略部分代码*/...wiced_packet_delete( packet );}/* 省略部分代码*/...}}exit:wiced_udp_delete_socket( &socket );/* 省略部分代码*/...if ( ipv4_address_found == WICED_TRUE ){*address = resolved_ipv4_address;return WICED_SUCCESS;}/* 省略部分代码*/...return WICED_ERROR;
}

三、Linux的dns实现

网上搜索Linux dns时,都是一些linux dns怎么配置的,配置host.conf,

resolv.conf文件,配置完后,重启一下network就好了,至于为什么配置这些文件,dns
又是在哪里执行的,都没有说明。
在Linux上执行nslookup(name service lookup)或ping(ping主机名,如:ping
www.baidu.com)都会执行dns的动作。执行dns时都是调用gethostbyname函数,
gethostbyname函数,传入主机名,dns执行成功后,返回主机名对应的ip地址。
而gethostbyname函数的实现是在c库中完成的,也就是dns的整个执行过程都是由c库实
现,c库中dns实现过程与上一节介绍的流程原理是相同的,只是还多了一些配置文件用于
设置参数、dns ip地址什么的,就是前面提到的host.conf,resolv.conf文件,这就是为什
么Linux的dns只需要配置host.conf,resolv.conf文件,不需要再做其它工作的原因,因为
c库已经替你完成dns的实际工作。在Linux嵌入式系统中,若发现dns不能正常工作,那就
看一下host.conf,resolv.conf等文件是否配置正确,还有就是dns运行使用的c库在机子上
有没有。
想了解c库怎么实现dns的,请自行下载c库源码分析:http://www.gnu.org/software/libc/

四、Android的dns实现

Android也是搭建在Linux之上,而在Android下就没见到host.conf,resolv.conf这

些文件,但Android的dns也是能正常工作的。这是因为Android重写了libc库的dns实现
部分,重写的dns代码在android\bionic\libc\dns目录。重写后的dns,请求dns的接口,
有gethostbyname(兼容以前的c库接口)及android_gethostbynamefornet(给
android使用)接口,但根据不同的dns请求发起者,走的流程有点不一样,其中还涉及到
了netd的处理。Android java层请求dns时,是通过netd进行,netd调用
android_gethostbynamefornet接口。而Android下编译的ping程序是不通过netd而直
接调用gethostbyname接口,但最终还是要走到netd,由netd调用
android_gethostbynamefornet接口。Android下dns的请求流程如下图:

gethostbyname_internal中判断是否为netd调用下来的依据是,
  • 1
  • 2

getenv(“ANDROID_DNS_MODE”)返回是否不为NULL并且值为“local”,而netd启动
时会设置setenv(“ANDROID_DNS_MODE”, “local”, 1),而ping程序不会。

五、Linux的dns缓存

Linux的dns,在配置resolv.conf文件的时候,第一个dns ip地址配置为nameserver 

127.0.0.1,也就是从本地dns缓存中查找,查找不到时再根据第二个、第三个dns ip地址
进行dns请求。

六、第三方dns库

有时候我们不想使用编译工具中libc自带的dns库,也可以移植第三

方的dns库,如c-ares dns库,该dns库支持多种平台。例如:linux
平台上,它与linux的配置完全兼容,可以在现有的linux dns配置文
件上,直接编译c-ares库放到机子上即可使用。

dns工作过程及原理 (linux dns及android dan的实现相关推荐

  1. 详解DNS工作流程及原理 ( 域名、IP与DNS的关系)

    一.DNS服务概述 DNS是Domain Name System的缩写,即域名系统.其实,DNS是internet的一项服务,一般叫域名服务或者域名解析服务,主要提供网站域名与IP地址的相互转换的服务 ...

  2. dns解析服务器原理,DNS解析过程及原理

    本词条缺少信息栏.概述图,补充相关内容使词条更完整,还能快速升级,赶紧来编辑吧! DNS=本地域名服务器,当用户访问一个网址,计算机就会提出域名解析请求,并发给本地域名服务器,本地域名服务器收到请求后 ...

  3. 完整版:交换机工作过程和原理

    随着企业网络的发展,越来越多的用户需要接入到网络,交换机可以提供大量的接入端口,并能够很好地满足这一企业需求.同时,交换机也彻底解决了困扰早期以太网的冲突问题,极大地提升了以太网的性能,同时也提高了以 ...

  4. dns解析过程_DNS原理总结及其解析过程

    点击上方蓝色字体,关注我们 前言 域名系统(英语:Domain Name System,缩写:DNS)是互联网的一项服务.它作为将域名和IP地址相互映射的一个分布式数据库,使人更方便地访问互联网.DN ...

  5. Linux内核中makefile有什么作用?深入解析makefile工作过程和原理

    Table of Contents Makefile 中的变量 常用的变量有以下几类: 1) 版本信息 2) CPU 体系结构:ARCH 3) 路径信息:TOPDIR, SUBDIRS 4) 内核组成 ...

  6. linux下DNS配置及域名解析服务,linux DNS域名解析服务

    DNS域名解析服务 (一)Dns软件包安装 Bind:提供域名服务的主要程序及相关文件 Bind-utils:测试dns工具(nslookup.host) Yum仓库安装软件 Yum install ...

  7. DNS工作原理及过程讲解

    0x00前言 想必大家都知道当今上网浏览web页面或访问其他服务一般都是用域名来访问的,这是由于IP地址不容易记住而且使用不方便,这时候科学家们就发明了域名,从而衍生出了各种大大小小的域名解析服务器( ...

  8. 描述DNS解析的工作过程

    DNS工作过程如下: 1.用户机提出域名解析请求,并且发送给本地的域名服务器: 2.当本地的域名服务器收到请求后,先查询本地的缓存,如果有该记录,则本地的域名服务器就直接把查询的结果返回: 3.如果本 ...

  9. DNS劫持详细过程及原理

    DNS劫持详细过程及原理 一.DNS劫持原理 1: DNS劫持又称域名劫持,是指在劫持的网络范围内拦截域名解析的请求 2: 局域网劫持, 攻击者通过伪装成网关, 劫持受害者的网络请求, 将网络请求拦截 ...

  10. tcpdump 识别成dns_1.6.3 使用tcpdump观察DNS通信过程

    1.6.3 使用tcpdump观察DNS通信过程 为了看清楚DNS通信的过程,下面我们将从ernest-laptop上运行host命令以查询主机www.baidu.com对应的IP地址,并使用tcpd ...

最新文章

  1. OSI 七层参考模型
  2. DL之DNN优化技术:采用三种激活函数(sigmoid、relu、tanh)构建5层神经网络,权重初始值(He参数初始化和Xavier参数初始化)影响隐藏层的激活值分布的直方图可视化
  3. 进程间通信(5) 命名管道
  4. java 格式化解析_java日期格式化、解析
  5. linux小小输入法 不能中文,在centos 下安装小小输入法存在的问题
  6. GCC 链接时出现undefined reference to “...”时可能解决办法
  7. html-其他常见标签的使用
  8. python list 元素位置_Python将list中某个元素移至末尾
  9. 无法读取源文件或磁盘_系统监控之磁盘和网络监控工具
  10. 一系列JavaScript的基础工具
  11. 数学智力题 武士数独题目_数学智力题九宫格
  12. 魔兽争霸---------常见简称
  13. 80 多个免费编程字体,你喜欢哪种?
  14. pert计算公式期望值_PERT网络分析法
  15. 群晖之邮件服务器搭建
  16. 2020上传透明头像易语言源码 附成品
  17. 爬取今日头条街拍美图
  18. 利用Nodemcu+Arduino nano+TB6612+点灯科技APP制作简易麦克纳姆轮Wi-Fi遥控小车
  19. 云原生安全攻防|使用eBPF逃逸容器技术分析与实践
  20. Problem:跳房子

热门文章

  1. jquery 判断checkbox是否为空的三种方法
  2. node.js express安装问题
  3. 符号“”和const在函数里不同位置的用法
  4. 回味手写三层-增删改查
  5. freebsd安装linux网卡驱动,FreeBSD安装后的网卡配置
  6. 那些花儿,从零构建Vue工程(webpack4 Eslint git hooks...)
  7. 使用PS创造非凡动物形象
  8. 域渗透TIPS:获取LAPS管理员密码
  9. 线程程序编译错误注意加-lpthread
  10. jquery设置元素的readonly和disabled