一、ARP Broadcast Enable簡介
ARP Broadcast Enable是一種網絡協議,它允許一個網絡通信設備(如交換機或路由器)通告它所管理的每個端口的MAC地址。
默認情況下,當一個網絡設備接入網絡時,它會向所有其他設備廣播一個ARP請求以驗證自己的MAC地址。當其他設備回復時,設備之間會通過識別來獲取一些信息,最終建立網絡連接,以實現數據傳輸。
int arpBroadcastEnable=1;
ioctl(socket_fd, SIOCSARP, &arpBroadcastEnable);
二、ARP Broadcast Enable的作用
ARP Broadcast Enable只在一些特定的網絡環境下非常有用,其中包括:
- 需要和其他位於同一網絡中的設備通信的DevOps工程師能夠利用ARP Broadcast Enable,跟蹤設備到其物理地址的映射。
- 在排查網絡問題時使用ARP Broadcast Enable,診斷網絡設備是否能夠接收來自其他設備的信息。
- 需要在網絡上自動配置設備的MAC地址時使用ARP Broadcast Enable。
三、如何配置ARP Broadcast Enable
在C語言中,可以藉助系統調用來配置ARP Broadcast Enable。例如,在Linux系統中,我們可以使用SIOCSARP命令來設置ARP Broadcast功能。下面是一個簡單的示例代碼:
#include <unistd.h>
#include <sys/ioctl.h>
#include <sys/socket.h>
int setArpBroadcastEnable(int socket_fd)
{
int arpBroadcastEnable=1;
int result=0;
result=ioctl(socket_fd, SIOCSARP, &arpBroadcastEnable);
if(result<0)
{
printf("ARP Broadcast Enable failed");
return -1;
}
return 0;
}
四、如何使用ARP Broadcast Enable
藉助於ARP Broadcast Enable,我們可以輕鬆地獲取所有與我們設備相連的MAC地址的映射關係。接下來是獲取ARP表的示例代碼:
#include <stdio.h>
#include <stdint.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <sys/socket.h>
#include <net/if.h>
#include <ifaddrs.h>
#define MAX_IFACES 64
#define MAX_ADDR_LEN 6
#define ETH_P_ARP 0x0806
struct arpheader
{
uint16_t htype;
uint16_t ptype;
uint8_t hlen;
uint8_t plen;
uint16_t oper;
uint8_t sha[MAX_ADDR_LEN];
uint8_t spa[4];
uint8_t tha[MAX_ADDR_LEN];
uint8_t tpa[4];
};
struct arpentry
{
uint8_t macAddress[MAX_ADDR_LEN];
struct in_addr ipAddress;
};
struct arpentry arpTable[256];
int arpTableIndex=0;
int getARPTableFromDevice(const char* device, struct arpentry* arpTable, int maxEntries)
{
struct ifreq ifr;
struct ifconf ifc;
if(maxEntries>256) maxEntries=256;
int fd = socket(AF_INET, SOCK_DGRAM, 0);
if (fd < 0) return -1;
ifc.ifc_len = sizeof(struct ifreq) * MAX_IFACES;
ifc.ifc_req = (struct ifreq*) malloc(ifc.ifc_len);
if(ioctl(fd, SIOCGIFCONF, &ifc)<0) return -1;
int interfaceIndex=-1;
int i;
for (i = 0; i < ifc.ifc_len; i += sizeof(struct ifreq))
{
strcpy(ifr.ifr_name, ifc.ifc_req[i].ifr_name);
if (ioctl(fd, SIOCGIFFLAGS, &ifr) == 0)
{
if (strcmp(ifr.ifr_name, device) == 0)
{
interfaceIndex=ifr.ifr_ifindex;
break;
}
}
}
if(interfaceIndex==-1) return -1;
struct sockaddr_ll socket_address;
memset(&socket_address, 0, sizeof(socket_address));
socket_address.sll_family = PF_PACKET;
socket_address.sll_protocol = htons(ETH_P_ARP);
socket_address.sll_ifindex = interfaceIndex;
// Bind the interface to the raw socket
if (bind(fd, (struct sockaddr*) &socket_address, sizeof(socket_address)) < 0)
{
perror("bind failed\n");
return -1;
}
const int SIOCGARP_BUFFER_SIZE = 4096;
struct arpreq* arpRequest = (struct arpreq*) malloc(SIOCGARP_BUFFER_SIZE);
memset(arpRequest, 0, SIOCGARP_BUFFER_SIZE);
for (i = 0; i arp_pa;
sin->sin_family = AF_INET;
sin->sin_addr.s_addr = htonl(i);
strncpy ( arpRequest->arp_dev, device, IFNAMSIZ - 1);
if(ioctl(fd, SIOCGARP, arpRequest)arp_ha;
struct arpentry* entry=&arpTable[arpTableIndex];
memcpy(entry->macAddress, arpRequest->arp_ha.sa_data, 6);
entry->ipAddress=sin->sin_addr;
arpTableIndex++;
if(arpTableIndex>maxEntries) break;
}
close(fd);
free(arpRequest);
return arpTableIndex;
}
五、ARP Broadcast Enable的缺點與注意事項
使用ARP Broadcast Enable時需要注意一下事項:
- ARP Broadcast Enable在交換機等大型網絡設備的環境中使用時會很有用,但在小型網絡環境中並不一定能提供什麼幫助。
- 在網絡通信方面,ARP Broadcast Enable能夠為緩存命中率帶來顯著的提升。但由於一次廣播會讓所有位於網絡上的設備都被激活,所以它也可能成為一種網絡干擾源。
- 需要注意交換機上的ARP Broadcast Enable設置可能會對整個網絡的性能產生影響。如果網絡過於擁擠,就應該謹慎使用ARP Broadcast Enable以避免影響網絡性能。
以上就是關於ARP Broadcast Enable在網絡開發中的應用的詳細介紹,希望能對大家有所幫助。
原創文章,作者:EJJO,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/135382.html