1. 개요# ARP (Address Resolution Protocol)는 같은 LAN 안에서 IP 주소에 해당하는 MAC 주소를 알아내는 프로토콜이다.
통신은 IP 로 시작하지만, 실제로 선 위에서 프레임을 건넬 때는 받는 MAC 을 적어야 한다. 그래서 보내기 전에 “이 IP 의 MAC 은?” 을 LAN 전체에 브로드캐스트(같은 LAN 의 모두에게 보내기)로 묻고, 그 IP 를 가진 기기만 답한다.
노트북 .112 공유기 .1 폰 .77 TV .220 ① Request · 브로드캐스트 who-has 192.168.0.1 tell 192.168.0.112 같은 동네는 질문을 모두 듣는다 · 답은 주인만 ② Reply · 유니캐스트 — 192.168.0.1 is-at 11:22:33:… 질문은 동네 전체에 브로드캐스트하고, 답은 그 IP 의 주인만 묻는 쪽에게 직접 보낸다
2. 프로토콜 계층# ARP 는 IP 위에서 동작하지 않는다. IP 와 나란히, Ethernet 에 바로 실린다. 이 차이 때문에 ARP 는 라우터를 넘지 못한다.
ping (ICMP) Ethernet EtherType 0x0800 IP 헤더 도착 IP 있음 ICMP → 라우터가 IP 를 보고 넘김 ARP Ethernet EtherType 0x0806 IP 헤더 없음 ARP 28B ✕ 라우터에서 끝 · EtherType 0x0806 은 "안에 ARP 가 들었다" 는 표시다 — IP 를 거치지 않고 Ethernet 에 바로 실린다 · IP 헤더가 없으니 라우터가 다음 칸을 정할 근거가 없다 — 그래서 같은 LAN 안에서만 들린다 · 보통 L2(링크 계층)로 분류한다. 내용물이 IP 주소라서 L2 와 L3 사이(L2.5)라고도 부른다 ARP 는 IP 위가 아니라 IP 옆에 있다 — Ethernet 이 바로 실어 나르고, 라우터는 넘기지 않는다
3. 메시지 구조# ARP 메시지는 28바이트다. 앞 8바이트는 무엇을 묻는지, 뒤 20바이트는 주소 네 칸이다.
앞 8바이트 — 무엇을 묻는지 HTYPE 1 = Ethernet PTYPE 0x0800 = IPv4 HLEN 6 PLEN 4 OPER 1 질문 · 2 답 HTYPE · PTYPE — 어떤 종류의 주소를 묻나 HLEN · PLEN — 그 주소가 몇 바이트인가 OPER — 질문(1)인가 답(2)인가 뒤 20바이트 — 주소 네 칸 보내는 쪽 MAC (SHA) 11:22:33:… (나) 보내는 쪽 IP (SPA) 192.168.0.112 찾는 쪽 MAC (THA) 00:00:00:00:00:00 (빈칸) 찾는 쪽 IP (TPA) 192.168.0.1 이 28바이트가 Ethernet 헤더(EtherType 0x0806) 안에 바로 실린다 최소 프레임 길이를 맞추려고 뒤를 18바이트 채워서, tcpdump 에는 length 46 으로 보인다 질문할 때는 찾는 쪽 MAC 칸이 빈칸이다 — 그 빈칸을 채워 달라는 게 ARP 의 전부다
4. 질문과 답의 값# 같은 형식을 질문과 답이 함께 쓴다. 답하는 쪽은 빈칸을 채우고 보내는 쪽과 찾는 쪽을 뒤바꿔 돌려준다.
① 질문 (Request) — 노트북이 LAN 전체에 브로드캐스트 SHA 보내는 MAC 노트북 MAC SPA 보내는 IP 192.168.0.112 THA 찾는 MAC 00:00:00:00:00:00 TPA 찾는 IP 192.168.0.1 공유기 MAC 11:22:33:… 192.168.0.1 노트북 MAC 192.168.0.112 ② 답 (Reply) — 공유기가 노트북에게만 · 답하는 쪽은 빈칸이던 MAC 자리에 자기 MAC 을 넣고, 보내는 쪽과 찾는 쪽을 뒤바꿔 돌려준다 (점선) · 질문을 받은 공유기는 SHA · SPA 를 보고 노트북의 MAC 을 바로 캐시에 적는다 — 곧 답장할 테니까 초록 칸이 질문의 답이다 — 공유기 IP 의 주인이 자기 MAC 을 채워 넣었다
5. 찾는 대상# ARP 로 찾는 건 늘 최종 목적지의 MAC 이 아니다. 같은 서브넷이면 상대의 MAC, 다른 서브넷이면 다음 칸인 게이트웨이의 MAC 이다. 같은 서브넷인지는 DHCP 로 받은 마스크로 판단한다.
보낼 도착 IP 내 서브넷 안인가? 마스크로 앞부분 비교 예 → 그 IP 로 ARP 상대 기기의 MAC 을 받아 직접 보낸다 아니요 → 게이트웨이 IP 로 ARP 공유기 MAC 으로 보냄 · 도착 IP 는 그대로 ARP 는 라우터를 못 넘는다 — 그래서 멀리 있는 서버의 MAC 은 물어볼 수도, 알 필요도 없다 같은 서브넷이면 상대를, 아니면 다음 칸(게이트웨이)을 찾는다
6. ARP 캐시# 패킷마다 묻지는 않는다. 기기마다 ARP 캐시가 있어서, 한 번 알아낸 MAC 을 한동안 기억해 두고 쓴다. 다만 MAC 은 바뀔 수 있어서 오래된 항목은 다시 확인하거나 지운다.
Linux — 이웃 표의 상태 (ip neigh) INCOMPLETE 물어보는 중 답 기다림 답 옴 REACHABLE 최근 확인됨 바로 사용 시간 지남 STALE 오래됨 그래도 사용 보낼 일 생김 DELAY 보내면서 잠깐 대기 확인 안 됨 PROBE 직접 확인 유니캐스트로 FAILED 답 없음 → 지움 macOS — 상태 대신 시간으로 관리한다. 20분(1200초)이 지나면 지운다 sysctl net.link.ether.inet.max_age 캐시는 영원하지 않다 — MAC 이 바뀔 수 있어서 오래된 항목은 다시 확인하거나 지운다
6.1. 라우터의 ARP 캐시# 라우터의 ARP 캐시에는 바로 옆 이웃의 MAC 만 들어간다. 인터넷 한가운데 라우터는 보통 포트 하나에 이웃 하나라서 이 표는 작다. 크기가 큰 건 서브넷 단위로 길을 적은 라우팅 테이블 쪽이다.
라우터 안 ① 라우팅 테이블 — 이 IP 는 어느 쪽? 142.250.0.0/15 → 다음 칸 10.0.0.2 203.0.113.0/24 → 다음 칸 10.0.1.2 default → 상위 통신사 서브넷 단위 · 핵심 라우터는 약 100만 줄 · BGP 로 채움 ② ARP 캐시 — 그 이웃의 MAC 은? 10.0.0.2 → aa:bb:cc:… 10.0.1.2 → dd:ee:ff:… 바로 옆 이웃만 · 수십 줄 · 약 20분 뒤 만료 들어온 패킷 도착 142.250.1.1 나간 프레임 받는 MAC aa:bb:… ③ ① 큰 표로 방향을 정하고 → ② 작은 표로 옆 칸 MAC 을 찾고 → ③ 새 Ethernet 헤더를 붙여 내보낸다 노트북도 같은 두 표를 갖고 있다 — netstat -rn (라우팅 테이블), arp -a (ARP 캐시) 멀리는 서브넷 단위의 큰 표로 길을 찾고, 바로 옆은 작은 표로 MAC 을 찾는다 — 그래서 패킷마다 ARP 를 하지 않는다
7. 특수한 ARP# Gratuitous ARP (ARP Announcement)
묻지도 않았는데 "이 IP 는 이 MAC" 이라고 알린다. 주소를 새로 받았거나 장비를 바꿨을 때 이웃의 캐시를 고친다
ARP Probe
출발 IP 를 0.0.0.0 으로 두고 "이 IP 쓰는 기기 있나" 를 묻는다. 받은 주소가 이미 쓰이는지 확인한다 (RFC 5227). 쓰이고 있으면 DHCP DECLINE
Proxy ARP
라우터가 다른 서브넷 기기 대신 자기 MAC 으로 답한다. 마스크가 틀린 기기도 통신은 되게 하지만, 잘못된 설정을 숨긴다
ARP 스푸핑
가짜 답으로 남의 IP 를 자기 MAC 에 묶어 트래픽을 가로챈다. ARP 는 답을 검증하지 않아서 생기는 문제다. 스위치의 ARP 검사 기능 등으로 막는다
8. IPv6 의 NDP# IPv6 에는 ARP 가 없다. 같은 일을 NDP(Neighbor Discovery Protocol)가 한다. 그래서 IPv6 에서 ICMP 를 막으면 이웃 찾기부터 깨진다.
ARP (IPv4)
Ethernet 에 바로 실린다 (0x0806) · LAN 전체에 브로드캐스트로 묻는다 · 이웃 MAC 찾기만 한다
NDP (IPv6)
IPv6 안의 ICMPv6 로 묻는다 · 해당 주소용 멀티캐스트 그룹에만 묻는다 · 이웃 찾기에 더해 라우터 찾기, 주소 중복 확인까지 한다
9. 확인 명령# # macOS
arp -a # ARP 캐시 전체
arp -n 192.168.0.1 # 특정 IP 의 항목
sudo tcpdump -i en0 -nn arp # 오가는 ARP 보기
sysctl net.link.ether.inet.max_age # 캐시 유지 시간 (초)
# Linux
ip neigh show # 이웃 표와 상태 (REACHABLE, STALE …)
sudo tcpdump -i eth0 -nn arp # 오가는 ARP 보기
arping -I eth0 192.168.0.1 # 특정 IP 에 직접 ARP 질문 (설치 필요)
10. 관련 문서# 11. 출처# 메시지 형식은 RFC 826 에, 캐시를 비우는 장치가 필요하다는 요구는 RFC 1122 에, 주소 충돌 확인은 RFC 5227 에, IPv6 의 대체 프로토콜은 RFC 4861 에 근거한다.
“(ar$tha) Hardware address of target of this packet (if known).”
“An implementation of the Address Resolution Protocol (ARP) MUST provide a mechanism to flush out-of-date cache entries.”
“This document describes (i) a simple precaution that a host can take in advance to help prevent this misconfiguration from happening”
“IPv6 nodes on the same link use Neighbor Discovery to discover each other’s presence, to determine each other’s link-layer addresses, to find routers, and to maintain reachability information about the paths to active neighbors.”