SylixOS DNS浅析

1. DNS 概述

网络通讯大部分是基于TCP/IP,而TCP/IP又基于IP地址。故计算机在网络上进行通讯时只能识别如“192.168.2.1”之类的IP地址,而无法识别域名。在访问网站时,更多的是在浏览器地址栏中输入域名,就能看到所需的页面,这是因为有一个叫“DNS服务器”的计算机自动把域名“翻译”成了相应的IP地址。

DNS(Domain Name System)是“域名系统”的英文缩写,是一种组织成域层次结构的计算机和网络服务命名系统,它用于TCP/IP网络,它所提供的服务是用来将主机名和域名转换为IP地址的工作。DNS就是这样的一位“翻译官”,它的基本工作原理如图 11所示。

图1-1 DNS工作原理

域名系统作为一个层次结构和分布式数据库,包含各种类型的数据,包括主机名和域名。通过主机名,最终得到该主机名对应的IP地址的过程叫做域名解析(或主机名解析)。在解析域名时,可以首先采用静态域名解析的方法,如果静态域名解析不成功,再采用动态域名解析的方法。可以将一些常用的域名放入静态域名解析表中,这样可以大大提高域名解析效率。

2. SylixOS DNS 技术实现

SylixOS实现了一个DNS主机名的IP解析器。

RealEvo-IDE中新建一个base工程,在该工程/libsylixos/SylixOS/net/lwip/src/core目录下有一个dns.c文件,dns.c文件具体实现了SylixOS  DNS功能。

2.1 实现DNS的初始化函数

dns.c文件中的初始化工作主要由dns_init函数和dns_setserver函数完成。
       1、 dns_init函数初始化解析器:建立UDP进程控制块和配置默认的服务器,函数具体实现如程序清单 2 1所示。

程序清单 2 1  dns_init函数

void dns_init(void)
{
#ifdef DNS_SERVER_ADDRESS
                                                                        /* 初始化默认DNS服务器地址 */
  ip_addr_t dnsserver;
  DNS_SERVER_ADDRESS(&dnsserver);
  dns_setserver(0, &dnsserver);
#endif                                                                  /* DNS_SERVER_ADDRESS     */

  LWIP_ASSERT("sanity check SIZEOF_DNS_QUERY",
    sizeof(struct dns_query) == SIZEOF_DNS_QUERY);
  LWIP_ASSERT("sanity check SIZEOF_DNS_ANSWER",
    sizeof(struct dns_answer) <= SIZEOF_DNS_ANSWER_ASSERT);
  LWIP_DEBUGF(DNS_DEBUG, ("dns_init: initializing\n"));
                                                                        /* 如果dns客户尚未初始化  */
#if ((LWIP_DNS_SECURE & LWIP_DNS_SECURE_RAND_SRC_PORT) == 0)
  if (dns_pcbs[0] == NULL) {
    dns_pcbs[0] = udp_new_ip_type(IPADDR_TYPE_ANY);
    LWIP_ASSERT("dns_pcbs[0] != NULL", dns_pcbs[0] != NULL);
    LWIP_ASSERT("For implicit initialization to work, DNS_STATE_UNUSED needs to be 0",
      DNS_STATE_UNUSED == 0);
    udp_bind(dns_pcbs[0], IP_ANY_TYPE, 0);                              /* 初始化DNS客户         */
    udp_recv(dns_pcbs[0], dns_recv, NULL);
  }
#endif
#if DNS_LOCAL_HOSTLIST
  dns_init_local();
#endif
}

2、dns_setserver函数初始化一个DNS服务器,函数具体实现如程序清单 2 2所示。

程序清单 dns_setserver函数

void dns_setserver(u8_t numdns, const ip_addr_t *dnsserver)
{
if (numdns < DNS_MAX_SERVERS) {
 if (dnsserver != NULL) {
      dns_servers[numdns] = (*dnsserver);
    } else {
      dns_servers[numdns] = *IP_ADDR_ANY;
   }
 }
}

2.2 实现DNS的报文格式

SylixOS DNS定义了一个用于查询和响应的报文格式。这个报文格式由12字节长的首部和4个长度可变的字段组成,如图 21所示。

图 2-1 DNS报文格式

标识字段:由客户程序设置并由服务器返回结果,客户程序通过它来确定响应与查询是否匹配;

标志字段:16bit的标字段被划分为若干子段,如图 22所示。

图 2-2 标志字段

3. SylixOS mDNS移植评估

mDNS即多播dns(Multicast DNS),在局域网中,设备和设备之前相互通信需要知道对方的IP地址,大多数情况下,设备的IP不是静态IP地址,而是通过dhcp协议动态分配的IP地址,如何发现设备呢,就需要mDNS大显身手。

以乐鑫mDNS为例,_mdns_server_init函数初始化mdns服务器,具体实现如程序清单 31所示。

程序清单 3 1 _mdns_server_init函数

esp_err_t _mdns_server_init(mdns_server_t * server)
{
    esp_err_t err = ESP_OK;
    tcpip_adapter_ip_info_t if_ip_info;
    err = tcpip_adapter_get_ip_info(server->tcpip_if, &if_ip_info);
    if (err) {
        return err;
    }
    ip_addr_t laddr;
IP_ADDR4(&laddr, 224, 0, 0, 251);

    ip_addr_t multicast_if_addr = IPADDR4_INIT(if_ip_info.ip.addr);
    if (igmp_joingroup((const struct ip4_addr *)&multicast_if_addr.u_addr.ip4, (const struct ip4_addr *)&laddr.u_addr.ip4)) {
        return ESP_ERR_INVALID_STATE;
    }
    struct udp_pcb * pcb = udp_new();
    if (!pcb) {
        return ESP_ERR_NO_MEM;
    }
    pcb->remote_port = MDNS_SERVICE_PORT;

    if (udp_bind(pcb, &multicast_if_addr, pcb->remote_port) != 0) {
        udp_remove(pcb);
        return ESP_ERR_INVALID_STATE;
    }
    pcb->mcast_ttl = 1;
    ip_addr_copy(pcb->multicast_ip, multicast_if_addr);
    ip_addr_copy(pcb->remote_ip, laddr);

    server->pcb = pcb;
    udp_recv(pcb, &_mdns_server_recv, server);
    return err;
}

mDNS主要实现了在没有SylixOS DNS服务器的情况下使用局域网内的主机实现相互发现和通信,使用的端口为5353,遵从DNS协议,使用现有DNS信息结构、名语法和资源记录类型,并且没有指定新的操作代码或相应代码。
       故SylixOS完全可以移植mDNS功能。

时间: 2024-12-04 21:17:37

SylixOS DNS浅析的相关文章

SylixOS 启动浅析

1.SylixOS启动概述 每个操作系统的启动都是多种多样,各有不同,SylixOS亦是如此,本文将浅析SylixOS启动层次和启动步骤两大方面. 2.SylixOS启动层次 在专用的嵌入式开发板上运行嵌入式操作系统(如SylixOS.Linux等)已经变得越来越流行,通常从一个嵌入式操作系统的软件角度来看,引导加载程序和操作系统内核便是两个重要的层次,下面就简单介绍关于SylixOS这两大层次的关键点. 2.1 层次一:Boot过程 一个裸机可执行程序的运行方法有两种: 1. 将程序代码入口放

SylixOS的RMS浅析

目 录 1. 知识简介    1 1.1 嵌入式实时操作系统    1 1.2 优先级调度算法    1 2. 技术实现    2 2.1 函数原型分析    2 2.2 使用流程    2 2.3 源码分析    3 2.4 示例演示    4 3. 参考资料    5 知识简介 嵌入式实时操作系统 SylixOS操作系统是实时多任务嵌入式操作系统,所谓实时,是指系统的正确性不仅仅依赖于计算机的逻辑结果而且依赖于结果产生的时间.结果产生的时间就是通常所说的截止期限,描述系统实时性的指标主要有:

SylixOS线程私有数据浅析

目录 1. 线程私有数据概述    1 2. 线程私有数据的相关API函数流程浅析    1 2.1    加入线程私有变量    1 2.2    删除线程私有变量    3 2.3    设置私有线程变量    6 2.4    获得线程私有变量值    8 3. 总结    10 4. 参考文献    10 线程私有数据概述 在SylixOS中为了满足多线程安全的要求,使得一种资源可以安全的被多个线程使用,采用了包括代码临界区保护和可重入性等方法.本文描述实现可重入的一种方法:线程私有数据

SylixOS中pthread_cancel函数浅析

1 知识简介 1.1 概述 取消一个线程要确保该线程能够释放其所持有的任何锁.分配的内存,使整个系统保持一致性.在很多复杂情况下要保证这种正确性是有一定困难的. 一种简单的线程取消:取消线程调用一个取消线程的函数,被取消线程死亡.在这种情况下,被取消线程所持有的的资源得不到释放.取消线程负责保证被取消者处于可安全取消状态,在一个要求可靠性高的系统中,这种保证非常困难或者无法实现.这种取消称为不受限制的异步取消. 还存在另外一种更安全的线程取消机制.一个线程可以以可靠的受控制的方式向进程的其他线程

SylixOS中DNS静态映射简介

1. DNS功能简介 DNS(Domain Name System,域名系统),因特网上作为域名和IP地址相互映射的一个分布式数据库,用户能够通过域名访问互联网,而不用去记住IP地址.通过域名得到其对应的IP地址的过程叫做域名解析.每个域名都对应一个IP地址,但一个IP地址可以对应多个域名. 2. SylixOS中DNS静态映射 主机名到IP地址的映射有两种方式: 1) 静态映射,每台设备上都配置主机到IP地址的映射,各设备独立维护自己的映射表,而且只供本设备使用: 2) 动态映射,建立一套域名

大话浅析DNS原理

★DNS 是啥? DNS 是洋文"Domain Name System"的缩写,直译过来就是"域名系统". ★DNS 有啥用? 咱们每天打交道的这个互联网,其底层的基石是"IP".IP 是"Internet Protocol"的缩写,中文就"互联网协议".咱们日常用的那些互联网软件(浏览器.聊天工具.下载工具等等)在工作时,必须依靠IP地址才能进行网络数据传输. "IP地址"是设计给软件

SylixOS的信号屏蔽浅析

1.信号介绍 信号是一种软中断,用于通过异步的方式对进程进行事件通知.信号分为实时信号和非实时信号,各个进程对于信号的处理方式不一,处理方式分为三类:忽略,捕捉,执行系统默认动作.进程可以选择屏蔽某个或某些信号. 2.信号屏蔽 SylixOS可以通过sigprocmask函数对某个信号集内的信号进行屏蔽.在信号被屏蔽的期间,进程对所屏蔽的大部分信号不会进行响应,只有解除屏蔽后才会响应. 2.1 sigprocmask函数 sigprocmask函数原型如程序清单 2-1所示. 程序清单 2-1 

SylixOS 虚拟设备文件浅析

目录 1.虚拟设备文件概述    1 2.虚拟设备文件eventfd    1 2.1    虚拟设备文件eventfd概述    1 2.2    打开虚拟设备文件eventfd    1 2.3    读取事件文件    3 2.4    写事件文件    3 3.参考文献    4 虚拟设备文件概述 Linux内核自2.6.22版本开始逐步增加了三个虚拟设备文件:eventfd.timerfd.signalfd.这三个文件让应用程序可以通过标准I/O操作的方式代替传统调用API的方式来使用

SylixOS线程堆栈大小浅析

目录 1. SylixOS线程.线程栈介绍    1 1.1    线程的介绍    1 1.2    线程栈的介绍    1 2. SylixOS线程栈大小的分配    1 2.1    线程.线程栈相关属性的设置    2 2.2    线程栈大小    2 2.3    线程堆栈警戒区    3 3. 总结    5 4. 参考资料    5 SylixOS线程.线程栈介绍 SylixOS是多线程操作系统,系统能够同时创建多个线程,具体最大线程数量取决于系统内存的大小以及编译SylixOS