컴퓨터 구조 운영체제 네트워크 자료구조 알고리즘 데이터베이스 내 학습
network · 11

ARP(주소 결정 프로토콜)

MAC링크계층ARP

같은 네트워크 안의 두 컴퓨터가 데이터를 주고받을 때, 우리는 보통 상대의 IP 주소로 통신한다고 생각합니다. 그런데 이더넷 같은 LAN에서 프레임이 실제로 전달되는 기준은 IP 주소가 아니라 네트워크 카드에 붙은 MAC 주소입니다. 상대의 IP 주소는 알지만 MAC 주소는 모를 때, 이 둘을 이어 주는 것이 ARP(Address Resolution Protocol, 주소 결정 프로토콜)입니다. ARP는 "이 IP 주소를 가진 장치는 자기 MAC 주소를 알려 달라"고 같은 네트워크 전체에 묻고, 주인이 답하면 그 대응을 잠시 저장해 두었다가 다음 전송에 다시 씁니다.

이 토픽에서는 ARP 요청이 왜 브로드캐스트로 나가고 응답은 왜 유니캐스트로 오는지, 한 번 알아낸 대응을 캐시에 저장하는 방식, 그리고 다른 네트워크의 목적지에는 목적지가 아니라 게이트웨이의 MAC 주소를 묻는다는 점을 단계별로 봅니다.

핵심 개념

IP 주소와 MAC 주소

IP 주소는 네트워크 계층에서 최종 목적지를 가리키고, MAC 주소는 링크 계층에서 같은 네트워크 안의 다음 장치를 가리킵니다. 이더넷 프레임의 목적지는 MAC 주소로 적습니다.

핵심 개념

ARP 요청

"이 IP 주소의 MAC 주소는 무엇인가"를 묻는 메시지입니다. 상대의 MAC 주소를 모르므로 목적지 MAC을 ff:ff:ff:ff:ff:ff(브로드캐스트)로 해서 같은 네트워크 전체에 보냅니다.

핵심 개념

ARP 응답

요청에 대한 ARP 응답은, 요청한 IP 주소의 주인이 자기 MAC 주소를 담아 요청한 장치에게만 유니캐스트로 보냅니다. 다른 장치는 자기 IP가 아니면 요청에 응답하지 않습니다.

핵심 개념

ARP 캐시

알아낸 IP와 MAC의 대응을 일정 시간 저장하는 표입니다. 캐시에 있으면 요청 없이 바로 프레임을 보내고, 일정 시간이 지나면 항목이 지워지거나 다시 확인됩니다.

핵심 개념

기본 게이트웨이

같은 네트워크 밖으로 가는 패킷을 대신 받아 전달하는 라우터입니다. 밖으로 보낼 때 ARP로 알아내는 MAC 주소는 최종 목적지가 아니라 이 게이트웨이의 것입니다.

핵심 개념

브로드캐스트 도메인

링크 계층의 브로드캐스트가 닿는 범위입니다. 라우터는 브로드캐스트 프레임을 다른 네트워크로 넘기지 않으므로, ARP는 보통 같은 네트워크 안에서만 동작합니다.

MAC은 한 홉, IP는 끝까지 — 프레임의 목적지 MAC은 구간마다 바뀌지만 IP 패킷의 최종 목적지 IP는 그대로입니다.
요청은 모두에게, 응답은 한 명에게 — 상대의 MAC을 모르니 요청은 브로드캐스트하고, 요청에 송신자의 MAC이 들어 있으므로 응답은 유니캐스트로 보냅니다.
캐시가 브로드캐스트를 줄입니다 — 한 번 알아낸 대응을 재사용해 매 전송마다 모든 호스트에게 묻지 않게 합니다.
밖으로 나갈 때는 게이트웨이를 묻습니다 — 목적지가 같은 네트워크 밖이면 ARP로 게이트웨이의 MAC을 알아내 그쪽으로 프레임을 보냅니다.
이 시각화에서 확인할 것 — "같은 네트워크" 탭에서 요청과 응답의 흐름을, "ARP 캐시" 탭에서 캐시 적중과 미스를, "게이트웨이 너머" 탭에서 게이트웨이의 MAC을 묻는 과정을 STEP으로 확인하세요.

ARP의 배경

ARP는 1982년 David Plummer가 RFC 826 "An Ethernet Address Resolution Protocol"으로 정의했습니다. 이더넷에서 IP 같은 상위 프로토콜의 주소를 48비트 이더넷 주소로 동적으로 대응시키는 방법을 정의한 문서입니다. 이 방식은 지금도 IPv4 네트워크의 기본 동작입니다. IPv6에서는 ARP 대신 이웃 탐색(Neighbor Discovery, NDP)이 같은 역할을 합니다.

숫자로 확인하기

주소의 크기 — MAC 주소는 48비트(6바이트), IPv4 주소는 32비트(4바이트)입니다.
ARP 메시지의 크기 — 이더넷과 IPv4 조합의 ARP 메시지는 28바이트입니다. 하드웨어 유형 2 + 프로토콜 유형 2 + 주소 길이 2 + 동작 2 + 송신자 MAC 6 + 송신자 IP 4 + 대상 MAC 6 + 대상 IP 4 = 28입니다. 이더넷 프레임에서는 유형 필드 값 0x0806으로 구분합니다.
이 시각화의 요청 수 — 호스트 4대(A, B, C, 라우터) 네트워크에서 A가 보낸 ARP 요청 한 번은 나머지 3대가 모두 받고, 이 가운데 IP가 맞는 1대만 응답합니다.
캐시 효과 — 첫 전송에는 요청과 응답 2개의 프레임이 먼저 오가고, 캐시 적중 뒤의 전송은 데이터 프레임 1개로 끝납니다.

자주 하는 오해

ARP는 도메인 이름을 IP로 바꾼다 — 그것은 DNS의 일입니다. ARP는 IP 주소를 MAC 주소로 바꿉니다.
ARP로 인터넷 너머 서버의 MAC을 알아낸다 — ARP는 보통 같은 네트워크 안에서만 동작합니다. 밖으로 가는 패킷은 게이트웨이의 MAC만 알아내면 됩니다.
ARP 응답도 브로드캐스트다 — 요청에 송신자의 MAC 주소가 들어 있으므로 요청에 대한 응답은 요청한 장치에게만 유니캐스트로 갑니다. 요청 없이 자기 주소를 알리는 gratuitous ARP는 별개의 용도입니다.
ARP는 안전한 프로토콜이다 — ARP에는 인증이 없어서 거짓 응답을 보내 다른 장치의 캐시를 속이는 ARP 스푸핑이 가능합니다. 스위치의 보안 기능이나 고정 항목 등으로 대응합니다.

면접에서 이렇게 물어요

면접 질문

ARP는 무엇이고 왜 필요한가요?

IP 주소를 알 때 같은 네트워크 안의 그 장치의 MAC 주소를 알아내는 프로토콜입니다. LAN에서 프레임은 MAC 주소로 전달되므로 IP 통신 전에 MAC 주소가 필요합니다.

면접 질문

ARP 요청은 왜 브로드캐스트인가요?

상대의 MAC 주소를 모르기 때문에 특정 장치에게 보낼 수 없고, 같은 네트워크 모두에게 묻습니다. 자기 IP가 맞는 장치만 응답합니다.

면접 질문

다른 네트워크의 서버에 접속할 때 ARP는 어떻게 동작하나요?

목적지 IP가 같은 서브넷 밖이면 기본 게이트웨이로 보내야 하므로 게이트웨이의 IP에 대한 MAC 주소를 ARP로 알아냅니다. 프레임의 목적지 MAC은 게이트웨이이고, IP 목적지는 최종 서버입니다.

면접 질문

ARP 스푸핑이란 무엇인가요?

공격자가 다른 장치의 IP에 자기 MAC을 대응시키는 거짓 ARP 응답을 보내 캐시를 오염시키는 공격입니다. 트래픽이 공격자를 거치게 되어 도청이나 변조에 쓰일 수 있고, 스위치의 동적 ARP 검사 같은 기능으로 막습니다.

실제 시스템에서는

리눅스 — ip neigh 명령으로 이웃(ARP) 캐시를 보고, arp -a로도 확인할 수 있습니다. arping은 ARP 요청을 직접 보내 응답을 확인하는 도구입니다.
패킷 캡처 — tcpdump나 Wireshark로 ARP 요청과 응답을 직접 볼 수 있습니다. 요청은 who-has, 응답은 is-at으로 표시됩니다.
IP 충돌 검사 — 장치가 IP 주소를 쓰기 전에 ARP로 같은 주소의 사용 여부를 확인하는 방법이 RFC 5227에 정의되어 있고, 자기 주소를 알리는 gratuitous ARP(RFC 5227은 ARP Announcement라 부름)도 이 문서에서 다룹니다.
IPv6 — ARP를 쓰지 않고 ICMPv6 기반의 이웃 탐색 프로토콜(NDP)로 같은 일을 합니다.

함께 보면 좋은 토픽

OSI 7계층 — MAC 주소가 쓰이는 링크 계층과 IP의 네트워크 계층을 구분해 봅니다.
TCP/IP — IP 패킷이 이더넷 프레임에 담겨 전달되는 흐름을 봅니다.
라우팅 — 게이트웨이와 다음 홉으로 패킷이 전달되는 방식을 봅니다.
DNS — 도메인 이름을 IP 주소로 바꾸는, ARP와 혼동하기 쉬운 프로토콜입니다.

참고 자료

리눅스 셸 — ARP 캐시 보기와 ARP 요청 보내기

# 이웃(ARP) 캐시 보기
ip neigh show

# net-tools의 arp 명령으로 보기
arp -a

# 192.168.0.20의 MAC 주소를 ARP 요청으로 직접 확인 (root 권한)
sudo arping -I eth0 -c 3 192.168.0.20

ip neigh show는 커널이 가진 이웃 캐시를 보여 주며, IPv4에서는 IP 주소에 대응하는 MAC 주소(lladdr)와 항목의 상태(REACHABLE, STALE 등)가 나옵니다. arp -a는 net-tools의 명령으로 같은 정보를 보여 줍니다. arping은 지정한 인터페이스로 ARP 요청을 직접 보내고 응답한 장치의 MAC 주소와 응답 시간을 보여 줍니다. ping과 달리 IP 계층이 아니라 링크 계층에서 동작해, 방화벽이 ICMP를 막아도 같은 네트워크 안의 장치가 켜져 있는지 확인할 수 있습니다(ARP 응답까지 막는 설정이 없다면). 인터페이스 이름 eth0과 IP 주소는 환경에 맞게 바꿔야 하고, 위 옵션은 iputils의 arping 기준이며 다른 구현(Habets arping)은 인터페이스를 -i로 지정합니다.

tcpdump — ARP 요청과 응답 캡처

# arp 패킷만 이더넷 헤더와 함께 출력 (root 권한)
sudo tcpdump -i eth0 -n -e arp

# 출력 예 (시각은 생략)
02:00:00:00:00:0a > ff:ff:ff:ff:ff:ff, ethertype ARP (0x0806), length 42:
    Request who-has 192.168.0.20 tell 192.168.0.10, length 28
02:00:00:00:00:0b > 02:00:00:00:00:0a, ethertype ARP (0x0806), length 42:
    Reply 192.168.0.20 is-at 02:00:00:00:00:0b, length 28

tcpdump의 arp 필터는 ARP 패킷만 잡고, -e 옵션은 이더넷 헤더(출발지 MAC, 목적지 MAC, 유형)를 함께 보여 줍니다. 위 출력은 시각화와 같은 값으로 쓴 예시입니다. 요청은 목적지 MAC이 ff:ff:ff:ff:ff:ff(브로드캐스트)이고 who-has 192.168.0.20 tell 192.168.0.10으로 표시됩니다. 응답은 요청한 장치의 MAC으로 직접 가고 is-at 뒤에 알아낸 MAC 주소가 나옵니다. ARP 메시지 자체가 28바이트이고 이더넷 프레임은 그에 헤더가 붙은 크기(여기서는 42바이트로 표시)입니다. 실제 출력의 형식은 tcpdump 버전에 따라 조금 다를 수 있습니다.

Python (scapy) — ARP 요청을 직접 만들기

from scapy.all import ARP, Ether, srp

# 브로드캐스트 프레임에 ARP 요청 실어 보내기 (root 권한)
pkt = Ether(dst="ff:ff:ff:ff:ff:ff") / ARP(pdst="192.168.0.20")
ans, _ = srp(pkt, timeout=2, verbose=False)

for sent, recv in ans:
    print(recv.psrc, recv.hwsrc)   # 응답한 IP와 MAC

scapy는 패킷을 직접 만들어 보내는 파이썬 라이브러리로, 별도로 설치해야 합니다. Ether(dst=...)는 이더넷 헤더를 만들고 ARP(pdst=...)는 "이 IP의 MAC은?"이라는 ARP 요청을 만들며, / 연산자로 계층을 쌓습니다. srp는 링크 계층 프레임을 보내고 응답을 받아 오는 함수이고, 응답의 psrc와 hwsrc가 각각 응답한 장치의 IP 주소와 MAC 주소입니다. 직접 만든 ARP는 자신이 속한 네트워크에서 자기가 관리하는 장치에만 써야 합니다. 허락 없이 다른 네트워크에 ARP를 보내거나 거짓 응답을 만드는 것은 ARP 스푸핑과 같은 공격이 될 수 있습니다.

Q1

ARP(Address Resolution Protocol)의 목적은?

같은 네트워크 안에서 프레임을 전달하려면 MAC 주소가 필요합니다.
같은 LAN 안에서는 프레임을 MAC 주소로 전달합니다. ARP는 통신할 상대의 IP 주소만 알 때, 그 IP를 가진 장치의 MAC 주소를 알아내는 프로토콜입니다.

Q2

ARP 요청(Request) 메시지는 어떤 방식으로 전송될까?

상대의 MAC 주소를 모르니 특정 상대에게 보낼 수 없습니다.
상대의 MAC 주소를 아직 모르므로, "이 IP 주소를 가진 장치는 MAC 주소를 알려달라"는 요청을 같은 네트워크 전체에 브로드캐스트합니다.

Q3

ARP 응답(Reply)은 어떻게 전달될까?

요청자의 MAC 주소는 요청 메시지에 이미 들어 있습니다.
요청에 포함된 요청자의 주소로, 해당 IP의 주인이 자신의 MAC 주소를 유니캐스트로 응답합니다. 요청자는 이 결과를 ARP 캐시에 저장해 재사용합니다.