八、W5100S/W5500+RP2040树莓派Pico<DNS>


1 前言

  为了更好地支持应用程序的性能和可用性,DNS优化技术将会得到进一步发展。这些技术可以帮助用户更快地访问其所需的网站或应用程序,从而提高用户体验。

  W5100S/W5500是一款集成全硬件 TCP/IP 协议栈的嵌入式以太网控制器,同时也是一颗工业级以太网控制芯片。本教程将介绍W5100S/W5500以太网DNS应用的基本原理、使用步骤、应用实例以及注意事项,帮助读者更好地掌握这一技术。

2 协议简介

2.1 什么是DNS

  DNS是域名系统(Domain Name System)的缩写,它是由域名解析服务器和域名服务器组成的。

  域名解析服务器靠它把要访问的网址找到然后把信息送到电脑上。域名服务器是指保存有该网络中所有主机的域名和对应IP地址,并具有将域名转换为IP地址功能的服务器。其中域名必须对应一个IP地址,而IP地址不一定有域名。域名服务器为客户机/服务器模式中的服务器方,它主要有两种形式:主服务器和转发服务器。将域名映射为IP地址的过程就称为“域名解析”。

  在Internet上域名与IP地址之间是一对一(或者多对一)的,域名虽然便于人们记忆,但机器之间只能互相认识IP地址,它们之间的转换工作称为域名解析,域名解析需要由专门的域名解析服务器来完成,DNS就是进行域名解析的服务器。DNS 命名用于Internet等TCP/IP网络中,通过用户友好的名称查找计算机和服务。

2.2 DNS的优点

  DNS的优点主要包括:

  1. 域名易记:DNS可以将难以记忆的IP地址转化为容易记忆的域名,使得在网络访问中使用域名成为可能,方便用户的使用。
  2. 监管方便:DNS可以配合服务器进行域名解析,提供监管和辨识度,方便网站管理员对网站进行管理和维护。
  3. 不依赖单个IP:DNS技术使得用户只需要访问网站域名,不需要知道网站的IP地址,这样可以使网络访问更加灵活。
  4. 容易实现负载均衡和容灾备份:DNS可以解析相同的域名到不同的IP地址,从而实现负载均衡。同时,不同的DNS服务器可以实现容灾备份,确保网络可靠性和稳定性。
  5. 可以解析其他服务:除了将域名解析为IP地址,DNS还可以解析为其他服务,如MX记录(邮件交换记录)、CNAME记录(别名记录)等,这使得网络管理更加方便和灵活。

2.3 DNS工作原理

在这里插入图片描述

  1. 客户机提出域名解析请求,并将该请求发送给本地的域名服务器。
  2. 当本地的域名服务器收到请求后,就先查询本地的缓存,如果有该纪录项,则本地的域名服务器就直接把查询的结果返回。
  3. 如果本地的缓存中没有该纪录,则本地域名服务器就直接把请求发给根域名服务器,然后根域名服务器再返回给本地域名服务器一个所查询域(根的子域)的主域名服务器的地址。
  4. 本地服务器再向上一步返回的域名服务器发送请求,然后接受请求的服务器查询自己的缓存,
  5. 如果没有该纪录,则返回相关的下级的域名服务器的地址。
  6. 重复前面的操作,直到找到正确的纪录。
  7. 本地域名服务器把返回的结果保存到缓存,以备下一次使用。
  8. 结果返回给客户机。

2.4 应用场景

在这里插入图片描述

1.容灾切换—全局流量管理

(1)多线路智能优化解析服务

  使用加权轮询、GeoDNS 等 DNS 路由技术,以及结合应用程序健康检查实现服务的自动故障屏蔽和 failover

(2)解决的问题:

  分布式健康检查、 多线路负载均衡、故障地址自动屏蔽

2. DNS 抗 DDOS 攻击

(1)具防御大流量 DDOS 攻击能力

  对于直播、视频、游戏、社交类型的用户,可以通过云解析内置高防DNS + 高防 IP 配合使用,在解析请求和网站站点两个方面都添加了防护措施,网站会更安全

(2)解决的问题:

  DDOS 攻击防御、宽带耗尽型的 DNS 反弹式拒绝服务攻击、10亿 + QPS 的解析请求

3.移动解析

(1)高效、流畅的 APP 访问体验

  为手游、手淘、移动 APP 业务,提供了移动低延迟解决方案,可让移动用户享有更高效更安全的解析请求体验。

(2)解决的问题:

  防劫持、 解析延迟、 本地解析生效慢

3 WIZnet以太网芯片

WIZnet 主流硬件协议栈以太网芯片参数对比

ModelEmbedded CoreHost I/FTX/RX BufferHW SocketNetwork Performance
W5100STCP/IPv4, MAC & PHY8bit BUS, SPI16KB4Max.25Mbps
W6100TCP/IPv4/IPv6, MAC & PHY8bit BUS, Fast SPI32KB8Max.25Mbps
W5500TCP/IPv4, MAC & PHYFast SPI32KB8Max 15Mbps
  1. W5100S/W6100 支持 8bit数据总线接口,网络传输速度会优于W5500。
  2. W6100 支持IPV6,与W5100S 硬件兼容,若已使用W5100S的用户需要支持IPv6,可以Pin to Pin兼容。
  3. W5500 拥有比 W5100S更多的 Socket数量以及发送与接收缓存。

4 DNS网络设置示例概述以及使用

4.1 流程图

  程序的运行框图如下所示:

在这里插入图片描述

4.2 准备工作核心

软件

  • Visual Studio Code
  • WIZnet UartTool

硬件

  • W5100SIO模块 + RP2040 树莓派Pico开发板 或者 WIZnet W5100S-EVB-Pico开发板
  • Micro USB 接口的数据线
  • TTL 转 USB
  • 网线

4.3 连接方式

  • 通过数据线连接PC的USB口(主要用于烧录程序,也可以虚拟出串口使用)
  • 通过TTL串口转USB,连接UART0 的默认引脚:
    • RP2040 GPIO0(UART0 TX) <----> USB_TTL_RX
    • RP2040 GPIO1(UART0 RX) <----> USB_TTL_TX
  • 使用模块连接RP2040进行接线时
    • RP2040 GPIO16 <----> W5100S MISO
    • RP2040 GPIO17 <----> W5100S CS
    • RP2040 GPIO18 <----> W5100S SCK
    • RP2040 GPIO19 <----> W5100S MOSI
    • RP2040 GPIO20 <----> W5100S RST
  • 通过PC和设备都通过网线连接路由器LAN口

4.4 主要代码概述

  我们使用的是WIZnet官方的ioLibrary_Driver库。该库支持的协议丰富,操作简单,芯片在硬件上集成了TCP/IP协议栈,该库又封装好了TCP/IP层之上的协议,我们只需简单调用相应函数即可完成协议的应用。

第一步:dns_client.c文件中加入对应的.h文件。

第二步:定义DHCP配置和DNS配置需要的宏。

第三步:网络信息的配置定义所要解析的域名。

#include <stdio.h>
#include "pico/stdlib.h"
#include "pico/binary_info.h"
#include "hardware/spi.h"

#include "wizchip_conf.h"
#include "bsp_spi.h"
#include "dns.h"
#include "dhcp.h"
#include "socket.h"

#define ETHERNET_BUF_MAX_SIZE (1024 * 2)
#define  DNS_RET_FAIL         0
#define  DNS_RET_SUCCESS      1
#define  DNS_RETRY            3                /* 3 times */
#define SOCKET_ID 0
#define ETHERNET_BUF_MAX_SIZE (1024 * 2)
#define DHCP_RETRY_COUNT 5               // DHCP retry times

wiz_NetInfo net_info = {
    .mac = {0x00, 0x08, 0xdc, 0x16, 0xed, 0x2e},   //Define MAC variables
    .ip = {192, 168, 1, 10},                       // Define IP variables  
    .sn = {255, 255, 255, 0},                     //Define subnet variables
    .gw = {192, 168, 1, 1},                       //Define gateway variables 
    .dns = {8, 8, 8, 8},                          //Define DNS  variables            
    .dhcp = NETINFO_DHCP};                      //Define the DNCP mode
wiz_NetInfo get_info;
static uint8_t ethernet_buf[ETHERNET_BUF_MAX_SIZE] = {0,};
uint8_t Domain_name[] = "www.baidu.com";           // The domain name that needs to be resolved 
uint8_t Domain_IP[4] = {0,};
static uint8_t dhcp_get_ip_flag = 0;         // Define the DHCP acquisition flag

第四步:编写定时器回调处理函数,用于 DHCP和DNS 1s滴答定时器处理函数。

第五步:主函数先是对串口和SPI的初始化,然后写入W5100S的网络配置参数,初始化DHCP后开始DHCP获取IP,获取到就打印获取到的IP,获取次数超过最大获取次数时就使用静态IP,然后进行判断DNS解析状态,解析成功则打印解析成功的IP,解析失败则继续解析,解析次数大于最大解析次数则解析失败。

int main()
{
    struct repeating_timer timer;  // Define the timer structure
    struct repeating_timer timer1; // Define the timer structure
    uint8_t dns_retry_cnt = 0;     // Number of parsings
    uint8_t dns_ok = 0;            // Parse success Peugeot

    /*mcu init*/
    stdio_init_all();     // Initialize the main control periphera
    wizchip_initialize(); // spi initialization

    /*dhcp init*/
    DHCP_init(SOCKET_ID, ethernet_buf);                                        // DHCP initialization
    add_repeating_timer_ms(1000, repeating_timer_callback_DHCP, NULL, &timer); // Add DHCP 1s Tick Timer handler

    printf("wiznet chip dns client example.\r\n");
    network_init(&net_info);              // Configuring Network Information
    print_network_information(&get_info); // Read back the configuration information and print it

    /*dns init*/
    DNS_init(0, ethernet_buf);                                                 // DNS client init
    add_repeating_timer_ms(1000, repeating_timer_callback_DNS, NULL, &timer1); // Add  DNS 1s Tick Timer handler
    printf("\r\n===== DNS Client Example =====\r\n");
    printf("> Example Domain Name : %s\r\n", Domain_name);

    while (true)
    {

        if ((dns_ok == 0) && (dns_retry_cnt < DNS_RETRY)) // Determine whether the parsing is successful or whether the parsing exceeds the number of times
        {
            switch (DNS_run(net_info.dns, Domain_name, Domain_IP)) // Read the DNS_run return value
            {
            case DNS_RET_FAIL: // The DNS domain name is successfully resolved
            {
                dns_retry_cnt++;
                printf("> DNS Failed\r\n");
            }
            break;
            case DNS_RET_SUCCESS: // DNS domain name resolution failed
            {
                dns_ok = 1;
                printf("> Translated %s to %d.%d.%d.%d\r\n", Domain_name, Domain_IP[0], Domain_IP[1], Domain_IP[2], Domain_IP[3]);
            }
            break;
            }
        }
    }
}

4.5 烧录验证

在这里插入图片描述

  1. 打开WIZ UartTool,填入参数:选择串口对应的COM Port,波特率115200,8位数据位,1位停止位,无校验位,无流控,填完参数后点击open打开。
  2. 按键复位键后,可以看到通过DHCP获取到IP之后,获取到了动态的DNS服务器。
  3. 用其对百度的域名进行解析。
  4. 可以看到成功解析出域名的IP,证明DNS解析域名成功。

5 注意事项

  • 解析的域名可能同时拥有多个IP地址,所以每次解析也不一定是完全一样的IP地址。
  • 如果想用WIZnet的W5500来实现本章的示例,我们只需修改两个地方即可:

​ (1)在library/ioLibrary_Driver/Ethernet/下找到wizchip_conf.h这个头文件,将_WIZCHIP_ 宏定义修改为W5500。

​ (2)在library下找到CMakeLists.txt文件,将COMPILE_SEL设置为ON即可,OFF为W5100S,ON为W5500。

6 相关链接

WIZnet官网

WIZnet官方库链接

本章例程链接

想了解更多,评论留言哦!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值