http://www.ibm.com/developerworks/cn/linux/1305_wanghz_ddns/index.html

DDNS (Dynamic DNS) 扩展了 DNS 将客户端 IP 与其域名进行静态映射的功能,它可以将同一域名实时地解析为不同的动态 IP,而不需要额外的人工干预。这在客户端 IP 地址不断发生变化的情况下,尤其是在无线网络和 DHCP 环境中,都有着极其重要的意义。本文通过分析 DDNS 的工作原理,简单演示了其在 Linux 网络协议栈的内核空间及用户空间创建 netlink 套接字、进行数据交换、并最终通过 nsupate 工具将更新消息发送给 DNS 服务器的过程。

DDNS 工作原理的分析

DDNS 的实现最根本的一点是当主机的 IP 地址发生变化的时候,实现 DNS 映射信息的及时更新,应用程序需要及时地获得这一信息,主要的方法可分为两大类:

  • 一类是轮询机制,即:应用程序每隔一定的时间,去从查询主机当前的 IP 地址,并与之前的进行比较,从而判断网络地址是否发生了变化。显然,这种方法不仅效率低下,而且对每次查询 IP 地址的时间间隔很难得到一个折中的数值。
  • 第二类方法是异步实现方式,即:每当主机的 IP 地址发生变化的时候,应用程序能够被及时地通知到。这的确是一个简单而又高效的方法,但与此同时,另一个问题又产生了,那就是:通知源又应该由谁来担当呢?显然,这是处于用户空间的应用程序无法胜任的。于是,我们想到了让内核来充当这一消息源。这样,在内核空间和用户空间之间就需要通过消息来进行通信了。

在 Linux 下用户空间与内核空间的信息交互方式有许多种,比如:软中断、系统调用、netlink 等等。关于这些通信方式的介绍以及其各自的优缺点并不在本文的讨论范围内,您可以自行查看参考资源。

在这许多种通信方式中,netlink 凭借其标准的 socket API、模块化实现、异步通信机制、多播机制等等多种优势,成为了内核与越来越多应用程序之间交互的主要方式。在 Linux 的内核中,已经为我们封装了使用 netlink 对特定网络状态变化进行消息通知的功能,这就是著名的 rtnetlink。有关 netlink 在内核空间实现的详细代码以及其 API 参数的介绍,您可以自行查看参考资源,本文在此不作过多的赘述。

本文讨论的重点是针对 DDNS 这一特定的应用,演示 rtnetlink 检测到 IP 地址发生了变化、并将消息告知用户空间的应用程序的整个过程,以及应用程序利用 netlink 套接字接收消息、并告知 DNS 服务器的实现方法。

更多相关文章

  1. 【Linxu内核设计与实现】-第7章 中断和中断处理
  2. Linux2.6内核调度器介绍
  3. Linux 3.4.39内核编译配置选项介绍
  4. ubuntu14.04下qemu调试linux内核
  5. ATT汇编与Intel汇编的区别,摘自《深入分析linux内核源码》一书
  6. libpcap丢包原理分析及Fedora 9 内核2.6.25.14下安装PF-RING的详
  7. TCP在Linux内核中调用流
  8. Linux内核中的container_of函数简要介绍
  9. linux 内核模块学习

随机推荐

  1. 使用Maven时,不要将JAR添加到Google Cloud
  2. Xstream把xml转换成java对象的异常:java.l
  3. RxJava学习模块之Schduler
  4. JAVA面向对象基础
  5. JAVA生成带LOGO的二维码
  6. Java 编程下的同步代码块(售票员)
  7. 如何指定休眠连接映射?
  8. 在扑克游戏中显示卡片的图像
  9. JavaFX窗口自适应
  10. JAVA实现二进制和16进制之间的互相转换,8