Gratuitous ARP란?#
Gratuitous ARP는 다음의 경우에 사용된다.
1. IP 충돌을 감지할 때
2. 타장비들의 ARP 테이블을 갱신할 때
3. 스위치에게 해당 장비의 MAC 주소가 스위치의 특정 포트를 사용함을 알려줄 때
4. Ethernet 장비 또는 링크가 연결되었을 때
- Gratuitous ARP를 자주 발생하는 호스트의 경우 Ethernet 장비 또는 케이블의 문제가 발생했다고 볼수 있다.
Gratuitous ARP가 필요한 상황#
http://cafe.naver.com/neteg.cafe?iframe_url=/ArticleRead.nhn%3Farticleid=77389 의 두번째 경우와 같이 Stby/Active 라우터간 스위칭을 하기 위하여 사용하였다.
즉, A라는 상황에서는 Router 1로 전송해야 하며, B라는 상황에서 Router 2를 사용할 수 있도록 네트워크를 동적으로 제어하는데 사용하였다.
VxWorks에서의 구현예#
ipnet_cmd_arp API를 활용한다. 실제적으로 arpLib에 구현되어 있는 함수들은 다 ipnet_cmd_arp를 사용하였다고 한다.
gra_arp.cpp
- #include <stdio.h>
#include <unistd.h> // getOptServ is defined here
extern "C" STATUS ipnet_cmd_arp(int, char **);
// publish gratuitous ARP
void gra_arp(char *ipAddr, char *linkAddr)
{
char *tempArgv[6];
char **argv = tempArgv;
int argc;
char cmdString[50];
int status;
sprintf(cmdString, "-g -s %s %s", ipAddr, linkAddr);
printf("ARP CMD : %s\n", cmdString);
getOptServ(cmdString, 0, &argc, argv, 6);
status = ipnet_cmd_arp(argc, argv);
}
결과 화면#
1. Gratuitous ARP 발행전의 10.100.10.3에 대한 mac 주소는 00-01-02-03-04-05로 되어있다.
2. Vxworks에서 위에서 만든 API를 사용하여 Gratuitous ARP를 발행한다.
3. Wireshark로 Gratoitous ARP가 브로드캐스팅 됨을 확인한다.
4. 10.100.10.3에 대한 mac 주소가 의도대로 변경되었음을 확인한다.
이 글은 스프링노트에서 작성되었습니다.