欢迎来到天天文库
浏览记录
ID:14659696
大小:100.00 KB
页数:11页
时间:2018-07-29
《ddns 的工作原理及其在 linux 上的实现》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、简介: DDNS(DynamicDNS)扩展了DNS将客户端IP与其域名进行静态映射的功能,它可以将同一域名实时地解析为不同的动态IP,而不需要额外的人工干预。这在客户端IP地址不断发生变化的情况下,尤其是在无线网络和DHCP环境中,都有着极其重要的意义。本文通过分析DDNS的工作原理,简单演示了其在Linux网络协议栈的内核空间及用户空间创建netlink套接字、进行数据交换、并最终通过nsupate工具将更新消息发送给DNS服务器的过程。DDNS工作原理的分析DDNS的实现最根本的一点是当主机的IP地址发生变化的
2、时候,实现DNS映射信息的及时更新,应用程序需要及时地获得这一信息,主要的方法可分为两大类:·一类是轮询机制,即:应用程序每隔一定的时间,去从查询主机当前的IP地址,并与之前的进行比较,从而判断网络地址是否发生了变化。显然,这种方法不仅效率低下,而且对每次查询IP地址的时间间隔很难得到一个折中的数值。·第二类方法是异步实现方式,即:每当主机的IP地址发生变化的时候,应用程序能够被及时地通知到。这的确是一个简单而又高效的方法,但与此同时,另一个问题又产生了,那就是:通知源又应该由谁来担当呢?显然,这是处于用户空间的应用
3、程序无法胜任的。于是,我们想到了让内核来充当这一消息源。这样,在内核空间和用户空间之间就需要通过消息来进行通信了。在Linux下用户空间与内核空间的信息交互方式有许多种,比如:软中断、系统调用、netlink等等。关于这些通信方式的介绍以及其各自的优缺点并不在本文的讨论范围内,您可以自行查看参考资源。在这许多种通信方式中,netlink凭借其标准的socketAPI、模块化实现、异步通信机制、多播机制等等多种优势,成为了内核与越来越多应用程序之间交互的主要方式。在Linux的内核中,已经为我们封装了使用netlink
4、对特定网络状态变化进行消息通知的功能,这就是著名的rtnetlink。有关netlink在内核空间实现的详细代码以及其API参数的介绍,您可以自行查看参考资源,本文在此不作过多的赘述。本文讨论的重点是针对DDNS这一特定的应用,演示rtnetlink检测到IP地址发生了变化、并将消息告知用户空间的应用程序的整个过程,以及应用程序利用netlink套接字接收消息、并告知DNS服务器的实现方法。DDNS工作流程的简单介绍结合上述对DDNS工作原理的分析,我们可以将DDNS的工作流程简单地用图1来表示:图1.DDNS的工作
5、流程图花边厂http://www.stakhb.com/,酥油灯厂家http://www.chmingxing.com/从图1中可以看到,DDNS的工作流程主要有三个部分:1.应用程序实时感知到IP地址发生了变化,如上介绍,利用基于netlink的异步通知机制可以让应用程序及时得到内核空间对这些事件的“通知”,具体可以分为如下5个步骤:o1、内核空间初始化rtnetlink模块,创建NETLINK_ROUTE协议簇类型的netlink套接字;o2、用户空间创建NETLINK_ROUTE协议簇类型的netlink套接字
6、,并且绑定到RTMGRP_IPV4_IFADDR组播group中;o3、用户空间接收从内核空间发来的消息,如果没有消息,则阻塞自身;o4、当主机被分配了新的IPV4地址,内核空间通过netlink_broadcast,将RTM_NEWADDR消息发送到RTNLGRP_IPV4_IFADDR组播group中;o5、用户空间接收消息,进行验证、处理; 2.应用程序接收到“通知”后,把DNSupdate信息发送给DNS服务器,目的是将更新后的IP地址及时地通知DNS服务器,以便网络上的主机仍然能够通过原来的域名访问到自己,
7、通用的做法是利用开源软件nsupdate发送DNSupdate信息给DNS服务器以实现DNS信息的动态更新。3.最后,对应于第一部分netlink套接字的创建,用户空间和内核空间关闭所创建的netlink套接字。下文将详细阐述其中的每一环节及其实现。内核空间rtnetlink检测IP地址变化的实现与分析在我们开始利用netlink套接字、实现与内核通信的应用程序之前,先来分析一下内核空间的rtnetlink模块是如何工作的。内核空间rtnetlink的初始化清单1.rtnetlink的初始化/*花边厂http://w
8、ww.stakhb.com/,酥油灯厂家http://www.chmingxing.com/以下代码摘自Linuxkernel2.6.18,net/core/rtnetlink.c文件,并只选择了与本主题相关的最重要的部分,其他的都用省略号略过,之后的各清单也一样。*/void__initrtnetlink_init(void){......r
此文档下载收益归作者所有