한양과학기술고등학교

에듀테크 프로젝트 대시보드

이더넷 프레임 & MAC 주소

이더넷 프레임 & MAC 주소

IP 주소보다 한 단계 아래, 실제로 랜선 위를 흐르는 건 MAC 주소가 붙은 이더넷 프레임이다. ARP가 "IP → MAC 변환"을 다룬다면, 이 글은 그 변환의 결과물인 MAC 주소 자체와 프레임 구조, 그리고 스위치가 그걸로 무슨 일을 하는지를 다룬다.

한 줄 요약: IP 주소가 "어느 동네 몇 호"(위치, 이동 가능)라면, MAC 주소는 "그 사람 주민등록번호"(신원, 장치에 새겨져 이동해도 안 바뀜)다. 스위치는 이 MAC 주소를 보고 어느 포트로 프레임을 보낼지 스스로 학습한다.

1. MAC 주소란 — 장치에 새겨진 신원

네트워크 카드(NIC)는 만들어질 때 공장에서 48비트(6바이트) 고유 번호를 하나씩 받는다. 이게 MAC(Media Access Control) 주소다. 보통 AA:BB:CC:DD:EE:FF처럼 16진수 6묶음으로 표기한다.

바이트 위치1~3바이트4~6바이트
이름OUI (제조사 식별자)장치 일련번호
예시AA:BB:CCDD:EE:FF
누가 정함IEEE 가 제조사에 할당제조사가 알아서 부여

중요한 건 IP 주소와의 차이다.

실제로는 랜카드를 ip link set eth0 address ... 같은 명령으로 소프트웨어적으로 바꿀 수도 있지만(MAC 스푸핑), 기본값은 공장 출고 시 고정된 값이다. 내 MAC은 Windows는 ipconfig /all, macOS/Linux는 ifconfig 또는 ip link로 확인한다.

2. 이더넷 프레임 구조 — 필드를 눌러보기

IP 패킷이 실제로 전선 위를 흐르려면 이더넷 프레임이라는 봉투에 담겨야 한다. OSI 모델에서 말하는 "2계층(데이터링크) 캡슐화"가 바로 이거다. 아래 필드를 하나씩 눌러 어떤 역할인지 확인해 보자.

목적지 MAC6바이트
출발지 MAC6바이트
Type2B
Payload (IP 패킷)46~1500바이트
FCS4B
필드를 클릭하면 설명이 여기 표시됩니다. (앞에는 동기화용 프리앰블 7바이트 + SFD 1바이트가 더 붙지만, 논리적인 프레임 내용은 위 5칸이다.)
EtherType 값의미
0x0800IPv4 패킷이 들어있음
0x0806ARP 메시지가 들어있음
0x86DDIPv6 패킷이 들어있음
OSI 모델과의 연결: 브라우저가 만든 HTTP 데이터는 TCP → IP를 거쳐 캡슐화되고, 그 IP 패킷 전체가 이더넷 프레임의 Payload 칸 안에 통째로 들어간다. 스위치는 이 Payload를 열어보지 않고 딱 목적지 MAC 하나만 보고 포워딩을 결정한다. 자세한 계층별 캡슐화 과정은 OSI 7계층 모델 참고.

3. 핵심 인터랙티브 — 스위치의 MAC 학습 & 플러딩

스위치는 처음 켜지면 MAC 테이블이 텅 비어 있다. "어느 MAC이 어느 포트에 연결돼 있는지" 전혀 모른다는 뜻이다. 이걸 알아내는 방법은 딱 하나 — 지나가는 프레임의 출발지 MAC을 훔쳐보고 학습하는 것. 아래에서 PC 4대(A·B·C·D)가 스위치 하나에 물린 작은 네트워크를 직접 움직여 보자.

P1 P2 P3 P4 SWITCH PC-A aa:aa:aa:00:00:0a Port P1 PC-B bb:bb:bb:00:00:0b Port P2 PC-C cc:cc:cc:00:00:0c Port P3 PC-D dd:dd:dd:00:00:0d Port P4
유니캐스트(정확히 한 포트로) 플러딩(모든 포트로)

스위치의 MAC 주소 테이블

MAC 주소포트상태
(비어 있음)

실제 스위치는 show mac address-table (Cisco) 같은 명령으로 이 표를 볼 수 있다. 일정 시간(보통 5분) 동안 안 쓰이면 항목이 지워진다(aging).

버튼을 눌러 프레임을 보내 보세요. 처음엔 테이블이 비어 있어 플러딩이 일어납니다.

순서대로 눌러보면 이렇게 된다:

4. 브로드캐스트 주소 — FF:FF:FF:FF:FF:FF

MAC 주소 중 딱 하나, FF:FF:FF:FF:FF:FF는 특별하다. "이 프레임은 이 네트워크에 있는 모든 장치에게 보내는 것"이라는 뜻이다. 스위치는 목적지 MAC이 이 값이면 무조건 (자기가 이미 알고 있어도) 모든 포트로 플러딩한다.

ARP 요청이 항상 브로드캐스트로 나가는 이유가 여기 있다. "이 IP 쓰는 사람 MAC 좀 알려줘!"라고 물을 때, 아직 상대의 MAC을 모르니 유니캐스트로 보낼 방법이 없다. 그래서 이더넷 목적지 칸에 FF:FF:FF:FF:FF:FF를 넣고 네트워크 전체에 뿌린 뒤, 해당 IP 주인만 유니캐스트로 답한다.

5. 이어서 보면 좋은 글

ARP (주소 결정 프로토콜) — 지금 배운 MAC 주소를 IP로부터 알아내는 과정 · OSI 7계층 모델 — 프레임이 캡슐화되는 전체 그림 · 스위치와 브리지 — 오늘 본 MAC 학습·플러딩을 장비 관점에서 더 깊게

6. 파이썬으로 보는 스위치 학습 로직

스위치의 핵심 동작은 딱 dict 하나로 요약된다 — "MAC → 포트" 매핑.

class Switch:
    def __init__(self):
        self.mac_table = {}   # { mac 주소: 포트 번호 }

    def receive_frame(self, in_port, src_mac, dst_mac, payload):
        # 1) 출발지 MAC을 보고 무조건 학습(또는 갱신)
        self.mac_table[src_mac] = in_port

        # 2) 목적지가 브로드캐스트거나, 아직 모르는 MAC이면 플러딩
        if dst_mac == "ff:ff:ff:ff:ff:ff" or dst_mac not in self.mac_table:
            return self.flood(in_port, payload)

        # 3) 알고 있으면 해당 포트로만 정확히 전달
        out_port = self.mac_table[dst_mac]
        return self.forward(out_port, payload)

    def flood(self, in_port, payload):
        return [p for p in self.all_ports() if p != in_port]

    def forward(self, out_port, payload):
        return [out_port]
한 줄 정리: MAC 주소는 장치에 새겨진 물리적 신원이고, 이더넷 프레임은 그 MAC 주소로 주고받는 2계층 봉투다. 스위치는 이 봉투의 출발지 MAC을 훔쳐보며 학습하고, 목적지를 모를 땐 플러딩으로 물어보며, 알고 나면 정확히 한 포트로만 조용히 전달한다.