廈門做企業(yè)網(wǎng)站站長收錄
文章目錄
- 1 前言
- 2 簡介
- 2 .1 什么是ARP?
- 2.2 ARP的優(yōu)點(diǎn)
- 2.3 ARP工作原理
- 2.4 ARP應(yīng)用場景
- 3 WIZnet以太網(wǎng)芯片
- 4 ARP網(wǎng)絡(luò)設(shè)置示例概述以及使用
- 4.1 流程圖
- 4.2 準(zhǔn)備工作核心
- 4.3 連接方式
- 4.4 主要代碼概述
- 4.5 結(jié)果演示
- 5 注意事項(xiàng)
- 6 相關(guān)鏈接
1 前言
??隨著網(wǎng)絡(luò)安全越來越受到重視,ARP攻擊防護(hù)軟件的市場需求也在不斷增加。ARP還提供了去中心化的應(yīng)用分發(fā)解決方案,包括代碼完全開源、訂單互相開放以及利潤共享等。這些特點(diǎn)使得ARP在未來的發(fā)展中具有廣闊的應(yīng)用前景。
??W5100S/W5500是一款集成全硬件 TCP/IP 協(xié)議棧的嵌入式以太網(wǎng)控制器,同時(shí)也是一顆工業(yè)級以太網(wǎng)控制芯片。本教程將介紹W5100S/W5500以太網(wǎng)DHCP應(yīng)用的基本原理、使用步驟、應(yīng)用實(shí)例以及注意事項(xiàng),幫助讀者更好地掌握這一技術(shù)。
2 簡介
2 .1 什么是ARP?
??ARP(Address Resolution Protocol)是地址解析協(xié)議,是根據(jù)IP地址獲取物理地址的一個(gè)TCP/IP協(xié)議。它用于將網(wǎng)絡(luò)中的IP地址解析為具體的硬件地址(MAC地址)。在計(jì)算機(jī)網(wǎng)絡(luò)中,當(dāng)一臺主機(jī)需要發(fā)送數(shù)據(jù)包給另一臺主機(jī)時(shí),它需要知道目標(biāo)主機(jī)的MAC地址。然而,在大多數(shù)情況下,主機(jī)只知道目標(biāo)主機(jī)的IP地址,因此需要使用ARP協(xié)議來將IP地址轉(zhuǎn)換為MAC地址。
2.2 ARP的優(yōu)點(diǎn)
??ARP的優(yōu)點(diǎn)主要包括:
- 可以將IP地址解析為以太網(wǎng)MAC地址,從而方便網(wǎng)絡(luò)設(shè)備之間的通信。
- ARP表項(xiàng)學(xué)習(xí)和ARP報(bào)文處理的限制、檢查等措施能夠保證網(wǎng)絡(luò)設(shè)備的安全性。
- ARP的簡單、易用性。
2.3 ARP工作原理
ARP的工作原理可以概括為以下幾點(diǎn):
- 每臺主機(jī)都會在自己的ARP緩沖區(qū)中建立一個(gè)ARP列表(地址轉(zhuǎn)換表),以存儲IP地址與MAC地址的對應(yīng)關(guān)系。
- 當(dāng)源主機(jī)需要發(fā)送數(shù)據(jù)到目的主機(jī)時(shí),首先會檢查自己的ARP列表,看是否已存在目的主機(jī)的IP地址對應(yīng)的MAC地址。如果存在,就直接將數(shù)據(jù)包發(fā)送到該MAC地址;如果不存在,就會向本地網(wǎng)段發(fā)起一個(gè)ARP請求的廣播包,查詢目的主機(jī)對應(yīng)的MAC地址。
- ARP請求數(shù)據(jù)包中會包含源主機(jī)的IP地址、硬件地址,以及目的主機(jī)的IP地址。網(wǎng)絡(luò)中的所有主機(jī)收到這個(gè)ARP請求后,會檢查數(shù)據(jù)包中的目的IP地址是否與自己的IP地址一致。
- 如果源主機(jī)一直沒有收到ARP響應(yīng)數(shù)據(jù)包,表示ARP查詢失敗。如果源主機(jī)收到ARP響應(yīng)數(shù)據(jù)包,就會將獲得的目的主機(jī)的IP地址和MAC地址添加到自己的ARP列表中,并利用此信息開始數(shù)據(jù)的傳輸。
2.4 ARP應(yīng)用場景
ARP協(xié)議在很多網(wǎng)絡(luò)場景中都有應(yīng)用,最常見的應(yīng)用場景包括:
- 網(wǎng)絡(luò)通信:在局域網(wǎng)中,ARP協(xié)議可以幫助計(jì)算機(jī)通過IP地址獲取其對應(yīng)的MAC地址,從而實(shí)現(xiàn)計(jì)算機(jī)之間的通信。
- 路由選擇:ARP協(xié)議可以幫助路由器找到目標(biāo)設(shè)備的MAC地址,這在路由選擇方面非常有用。
- 交換機(jī)學(xué)習(xí)MAC地址:交換機(jī)可以通過ARP協(xié)議學(xué)習(xí)到每臺計(jì)算機(jī)的MAC地址,并建立MAC地址表,從而可以直接轉(zhuǎn)發(fā)數(shù)據(jù)包,提高局域網(wǎng)的通信效率。
3 WIZnet以太網(wǎng)芯片
WIZnet 主流硬件協(xié)議棧以太網(wǎng)芯片參數(shù)對比
Model | Embedded Core | Host I/F | TX/RX Buffer | HW Socket | Network Performance |
---|---|---|---|---|---|
W5100S | TCP/IPv4, MAC & PHY | 8bit BUS, SPI | 16KB | 4 | Max.25Mbps |
W6100 | TCP/IPv4/IPv6, MAC & PHY | 8bit BUS, Fast SPI | 32KB | 8 | Max.25Mbps |
W5500 | TCP/IPv4, MAC & PHY | Fast SPI | 32KB | 8 | Max 15Mbps |
- W5100S/W6100 支持 8bit數(shù)據(jù)總線接口,網(wǎng)絡(luò)傳輸速度會優(yōu)于W5500。
- W6100 支持IPV6,與W5100S 硬件兼容,若已使用W5100S的用戶需要支持IPv6,可以Pin to Pin兼容。
- W5500 擁有比 W5100S更多的 Socket數(shù)量以及發(fā)送與接收緩存。
4 ARP網(wǎng)絡(luò)設(shè)置示例概述以及使用
4.1 流程圖
??程序的運(yùn)行框圖如下所示:
4.2 準(zhǔn)備工作核心
軟件
- Visual Studio Code
- WIZnet UartTool
硬件
- W5100SIO模塊 + RP2040 樹莓派Pico開發(fā)板 或者 WIZnet W5100S-EVB-Pico開發(fā)板
- Micro USB 接口的數(shù)據(jù)線
- TTL 轉(zhuǎn) USB
- 網(wǎng)線
4.3 連接方式
-
通過數(shù)據(jù)線連接PC的USB口(主要用于燒錄程序,也可以虛擬出串口使用)
-
通過TTL串口轉(zhuǎn)USB,連接UART0 的默認(rèn)引腳:
- RP2040 GPIO0(UART0 TX) <----> USB_TTL_RX
- RP2040 GPIO1(UART0 RX) <----> USB_TTL_TX
-
使用模塊連接RP2040 進(jìn)行接線時(shí)
- RP2040 GPIO16 <----> W5100S MISO
- RP2040 GPIO17 <----> W5100S CS
- RP2040 GPIO18 <----> W5100S SCK
- RP2040 GPIO19 <----> W5100S MOSI
- RP2040 GPIO20 <----> W5100S RST
-
通過PC和設(shè)備都通過網(wǎng)線連接路由器LAN口
4.4 主要代碼概述
??我們使用的是WIZnet官方的ioLibrary_Driver庫。該庫支持的協(xié)議豐富,操作簡單,芯片在硬件上集成了TCP/IP協(xié)議棧,該庫又封裝好了TCP/IP層之上的協(xié)議,我們只需簡單調(diào)用相應(yīng)函數(shù)即可完成協(xié)議的應(yīng)用。
第一步:arp_run.c文件中加入對應(yīng)的.h文件。
第二步:定義DHCP配置需要的宏。
第三步:網(wǎng)絡(luò)信息的配置,開啟DHCP模式。
第四步:編寫定時(shí)器回調(diào)處理函數(shù),用于 DHCP 1s滴答定時(shí)器處理函數(shù)。
第五步:主函數(shù)先是定義了一個(gè)定時(shí)器結(jié)構(gòu)體參數(shù)用來觸發(fā)定時(shí)器回吊函數(shù),對串口和SPI進(jìn)行初始化,然后寫入W5100S的網(wǎng)絡(luò)配置參數(shù),初始化DHCP后開始DHCP獲取IP,獲取到就打印獲取到的IP,獲取次數(shù)超過最大獲取次數(shù)時(shí)就使用靜態(tài)IP,然后主循環(huán)發(fā)起ARP請求,所需參數(shù)是socket的號、緩存buff、以及目標(biāo)IP。獲取到就答應(yīng)目標(biāo)IP的MAC地址。
#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 "dhcp.h" // Use dhcp
#include "socket.h" // Use socket
#include "arp.h" // Use arp#define SOCKET_ID 0 // Socket number
#define ETHERNET_BUF_MAX_SIZE (1024 * 2) // Send and receive cache size
#define DHCP_RETRY_COUNT 5 // DHCP retry times/*** @brief Timer callback processing function, used for dhcp timing processing* @param repeating :Timer structure* @return bool*/
bool repeating_timer_callback(struct repeating_timer *t);/*** @brief Initialization of chip network information* @param conf_info :Static configuration information* @return none*/
void network_init(wiz_NetInfo *conf_info);/* Network information to be configured. */
wiz_NetInfo net_info = {.mac = {0x00, 0x08, 0xdc, 0x1e, 0xed, 0x2e}, // Configured MAC address.ip = {192, 168, 1, 10}, // Configured IP address.sn = {255, 255, 255, 0}, // Configured subnet mask.gw = {192, 168, 1, 1}, // Configured gateway.dns = {8, 8, 8, 8}, // Configured domain address.dhcp = NETINFO_DHCP}; // Configured dhcp model,NETINFO_DHCP:use dhcp; NETINFO_STATIC: use static ip.static uint8_t ethernet_buf[ETHERNET_BUF_MAX_SIZE] = {0,
}; // Send and receive cachestatic uint8_t destip[4]={192, 168, 1, 2}; // udp destination ip
static uint8_t dest_ip[4] = {192, 168, 1, 2}; // UDP IP address
static uint8_t breakout_flag = 0; // Define the DHCP acquisition flagint main()
{struct repeating_timer timer; // Define the timer structurewiz_NetInfo get_info;/* MCU init */stdio_init_all(); // Initialize the main control peripheralwizchip_initialize(); // Initialize the chip interface/*dhcp init*/DHCP_init(SOCKET_ID, ethernet_buf); // DHCP initializationadd_repeating_timer_ms(1000, repeating_timer_callback, NULL, &timer); // Add DHCP 1s Tick Timer handlerprintf("wiznet chip tcp server example.\r\n");network_init(&net_info); // Configuring Network Informationprint_network_information(&get_info); // Read back the configuration information and print itwhile (true){do_arp(SOCKET_ID, ethernet_buf, dest_ip); //run arp}
}void network_init(wiz_NetInfo *conf_info)
{int count = 0;uint8_t dhcp_retry = 0;if (conf_info->dhcp == NETINFO_DHCP){while (true){switch (DHCP_run()) // Do the DHCP client{case DHCP_IP_LEASED: // DHCP resolves the domain name successfully{if (breakout_flag == 0){printf("DHCP success\r\n");getIPfromDHCP((*conf_info).ip);getGWfromDHCP((*conf_info).gw);getSNfromDHCP((*conf_info).sn);getDNSfromDHCP((*conf_info).dns);wizchip_setnetinfo(conf_info); // Configuring Network Informationclose(SOCKET_ID); // After dhcp close the socket, avoid errors in later usebreakout_flag = 1;}break;}case DHCP_FAILED:{printf(" DHCP failed \r\n");count++;if (count <= DHCP_RETRY_COUNT) // If the number of times is less than or equal to the maximum number of times, try again{printf("DHCP timeout occurred and retry %d \r\n", count);}else if (count > DHCP_RETRY_COUNT) // If the number of times is greater than DHCP fails{breakout_flag = 1; // if DHCP fail, use the staticDHCP_stop(); // Stop processing DHCP protocolconf_info->dhcp = NETINFO_STATIC;wizchip_setnetinfo(conf_info); // Configuring Network Informationbreak;}break;}}if (breakout_flag){printf("config succ\r\n");break;}}}else{wizchip_setnetinfo(conf_info); // Configuring Network Information}
}bool repeating_timer_callback(struct repeating_timer *t)
{DHCP_time_handler(); // DHCP 1s Tick Timer handlerreturn true;
}
4.5 結(jié)果演示
1.打開WIZ UartTool,填入?yún)?shù):選擇串口對應(yīng)的com port,波特率115200,8位數(shù)據(jù)位,1位停止位,無校驗(yàn)位,無流控,填完參數(shù)后點(diǎn)擊open打開。
2.打開串口后,按下復(fù)位鍵可以看到串口打印DHCP獲取到的信息,其中IP為192.168.1.123。
3.然后開始ARP請求192.168.1.2獲取MAC,獲取到MAC地址之后表示成功。
5 注意事項(xiàng)
- socket號必須選擇socket0,并使其工作在MACRAM模式下。
- 如果想用WIZnet的W5500來實(shí)現(xiàn)本章的示例,我們只需修改兩個(gè)地方即可:
? (1)在library/ioLibrary_Driver/Ethernet/下找到wizchip_conf.h這個(gè)頭文件,將_WIZCHIP_ 宏定義修改為W5500。
? (2)在library下找到CMakeLists.txt文件,將COMPILE_SEL設(shè)置為ON即可,OFF為W5100S,ON為W5500。
6 相關(guān)鏈接
WIZnet官網(wǎng)
WIZnet官方庫鏈接
本章相關(guān)例程鏈接
想了解更多,評論留言哦!