MAC 주소
고친 사람 github-actions[bot]
MAC 주소는 같은 망에 붙은 장비들이 서로를 가려 부르게 해 주는 번호입니다. 데이터를 바로 옆 장비에게 건네줄 때 받을 쪽과 보낸 쪽을 이 번호로 적습니다. 네트워크 카드마다 하나씩 붙어 나오기 때문에 컴퓨터를 켜자마자 쓸 수 있습니다.
쉽고 빠른 이해
MAC 주소는 같은 공유기에 물린 장비들이 서로를 알아보는 이름표입니다. 노트북이라면 유선용 네트워크 카드에 하나, 무선용 네트워크 카드에 또 하나가 따로 붙습니다.
이름표가 없으면 같은 망에 있는 장비가 남의 데이터까지 전부 받아 들게 됩니다. 받을 장비를 콕 집어 적어야 나머지가 그 데이터를 버릴 수 있습니다.
어떻게 도나:
- 보낼 데이터 앞에 받을 장비와 보내는 장비의 번호를 적습니다
- 같은 망에 있는 장비들이 받을 번호를 보고 자기 것인지 가립니다
- 자기 것이 아니면 버리고, 자기 것이면 안에 든 데이터를 꺼내 씁니다
대가는 이 번호가 같은 망 안에서만 뜻을 갖는다는 것입니다. 번호만 보고는 그 장비가 세상 어디에 있는지 알 수 없습니다. 망을 건너가려면 다른 번호가 따로 있어야 합니다.
상세
카페에서 음료가 나오면 직원이 이름을 부릅니다. 그 소리는 카페 안 모두에게 닿지만 자기 이름이 아닌 사람은 흘려듣습니다. 이름만 들어서는 그 사람이 어느 탁자에 앉아 있는지 알 수 없어서, 자리까지 갖다주려면 직원이 이름마다 탁자 번호를 적어 두어야 합니다.
MAC 주소는 네트워크 장비 하나하나를 가려내려고 붙이는 48비트짜리 번호입니다. 이름은 Media Access Control address, 곧 매체 접근 제어 주소를 줄인 말입니다.
매체 접근 제어는 여럿이 함께 쓰는 선이나 전파를 누가 언제 쓸지 다루는 일입니다. 이 번호는 그 일을 맡는 링크 계층이 쓰는 이름표입니다. 이 번호를 쓰는 대표 기술이 이더넷과 Wi-Fi입니다.
「같은 망」이란 망과 망을 잇는 라우터를 거치지 않고 데이터가 그대로 건네지는 범위를 말합니다. 한 공유기에 물린 장비들이 그런 범위입니다.
여섯 바이트로 된 번호
MAC 주소는 6바이트, 곧 48비트입니다. 사람이 읽을 때는 한 바이트를 16진수 두 글자로 적고 여섯 덩이를 이어 붙입니다. 덩이를 끊는 기호는 장비와 프로그램마다 다릅니다.
00:1B:44:11:3A:B7 // 콜론으로 끊는 꼴
00-1B-44-11-3A-B7 // 붙임표로 끊는 꼴
001B.4411.3AB7 // 네 글자씩 끊는 꼴
세 줄은 모두 같은 값입니다. 끊는 기호만 다를 뿐 48비트의 내용은 그대로라, 어느 꼴로 적어도 한 장비를 가리킵니다.
이 48비트는 앞 세 바이트와 뒤 세 바이트로 나뉩니다. 앞쪽은 장비를 만든 회사의 몫입니다. 뒤쪽은 그 회사가 자기 제품에 매기는 일련번호입니다.
block-beta columns 6 a["00"] b["1B"] c["44"] d["11"] e["3A"] f["B7"] g["만든 회사 몫 · OUI · 3바이트"]:3 h["회사가 매긴 번호 · 3바이트"]:3
앞쪽만 보면 어느 회사가 만든 장비인지 짐작할 수 있습니다. 이 앞 세 바이트 덩이를 OUI(Organizationally Unique Identifier, 조직 고유 식별자)라고 부릅니다. 뒤쪽은 그 회사 안에서만 겹치지 않으면 됩니다.
앞 세 바이트를 나눠 주는 곳
OUI 를 회사마다 떼어 주는 일은 표준화 단체인 IEEE(Institute of Electrical and Electronics Engineers, 전기전자기술자협회)가 맡습니다. 회사는 한 번 받아 둔 OUI 뒤에 자기 일련번호를 붙여 제품마다 다른 번호를 만듭니다.
두 토막으로 나눈 덕분에 세상의 장비가 서로 겹치지 않는 번호를 갖게 됩니다. 한 곳이 48비트를 통째로 관리하면 장비를 한 대 만들 때마다 번호를 타 와야 합니다. 앞 세 바이트만 나눠 주면 뒤쪽은 회사가 알아서 매기면 끝납니다.
다만 이것은 겹치지 않게 만드는 규칙일 뿐, 겹치는 일이 없다는 보장은 아닙니다. 번호를 잘못 매긴 제품도 있습니다. 소프트웨어로 덮어쓸 수도 있습니다.
프레임 헤더에 적히는 두 주소
프레임은 링크 계층이 한 번에 실어 보내는 데이터 덩이입니다. 그 맨 앞 헤더에 MAC 주소 둘이 나란히 적힙니다. 받을 장비의 번호가 먼저 오고 보내는 장비의 번호가 그다음입니다.
block-beta columns 3 a["받을 MAC 주소 · 6바이트"] b["보내는 MAC 주소 · 6바이트"] c["안에 든 데이터"]
받는 쪽은 맨 앞 여섯 바이트만 읽어도 이 데이터가 자기에게 온 것인지 가릴 수 있습니다.
한 장비에게 · 여러 장비에게 · 모두에게
받을 주소 칸에 장비 하나를 가리키는 번호만 들어가는 것은 아닙니다. 무엇이 들어가는지는 번호의 첫 바이트가 정합니다.
첫 바이트를 이진수 여덟 자리로 펼쳐 적으면 오른쪽 끝의 비트 둘이 따로 뜻을 집니다. 맨 끝 비트는 이 데이터를 하나에게 보내는지 여럿에게 보내는지를 가릅니다. 그 옆 비트는 이 번호를 회사에서 받아 온 것인지 그 망에서 따로 매긴 것인지를 가릅니다.
block-beta columns 8 a["0"] b["0"] c["0"] d["0"] e["0"] f["0"] g["0"] h["0"] i["만든 회사 몫 · 여섯 비트"]:6 j["회사에서 받은 번호인가"]:1 k["하나인가 여럿인가"]:1
앞 그림에서 「만든 회사 몫 · OUI · 3바이트」라고 한 칸의 첫 바이트가 이렇게 생겼습니다. 그 세 바이트가 통째로 회사 몫은 아닙니다. 맨 끝 두 비트는 위의 두 가지를 알리는 데 씁니다.
맨 끝 비트가 0이면 받을 주소가 장비 하나를 가리키고, 1이면 여럿을 가리킵니다.
| 보내는 범위 | 받을 주소에 적는 값 | 받아서 데이터를 꺼내 쓰는 장비 |
|---|---|---|
| 유니캐스트 | 장비 하나의 번호 | 그 장비 하나 |
| 멀티캐스트 | 무리를 가리키는 번호 | 그 무리에 든 장비 모두 |
| 브로드캐스트 | 48비트가 전부 1인 번호 | 같은 망의 장비 전부 |
장비가 어느 무리에 들지는 그 장비의 소프트웨어가 정해 둡니다. 그 무리 번호로 온 프레임만 골라 받고 나머지는 버립니다.
48비트가 전부 1인 번호는 FF:FF:FF:FF:FF:FF 로 적습니다. 상대가 누구인지 아직 모를 때 이 번호로 물어봅니다.
어디에 적히고 어떻게 바뀌나
프레임 헤더에 적힌 두 번호는 끝까지 그대로 가지 않습니다. 라우터는 받은 프레임을 벗기고 다음 망에서 프레임을 새로 씁니다. 그래서 두 번호는 구간을 지날 때마다 바뀝니다.
라우터는 붙어 있는 망마다 MAC 주소를 하나씩 갖습니다. 구간이 바뀌어도 끝까지 살아남는 목적지는 프레임 안에 든 IP 주소(Internet Protocol address, 인터넷 프로토콜 주소)입니다.
flowchart TD
A["내 컴퓨터 · MAC 00:1B:44:11:3A:B7 · IP 192.0.2.10"]
R["라우터 · 안쪽 MAC 00:1B:44:22:9C:01 · 바깥쪽 MAC 00:1B:44:22:9C:02"]
B["상대 장비 · MAC 00:1B:44:33:7F:20 · IP 198.51.100.7"]
A -->|"받을 MAC 00:1B:44:22:9C:01 · 보내는 MAC 00:1B:44:11:3A:B7<br/>IP 192.0.2.10 → 198.51.100.7"| R
R -->|"받을 MAC 00:1B:44:33:7F:20 · 보내는 MAC 00:1B:44:22:9C:02<br/>IP 192.0.2.10 → 198.51.100.7"| B
구간 둘을 지나는 동안 MAC 주소 네 개가 갈아 끼워집니다. IP 주소 두 개는 두 구간에서 같은 값입니다.
아래 표는 두 번호가 어떻게 갈리는지를 견준 것입니다.
| MAC 주소 | IP 주소 | |
|---|---|---|
| 가리키는 범위 | 같은 망 안의 장비 하나 | 망을 건너서도 통하는 목적지 |
| 누가 매기나 | 장비를 만든 회사 | 망 관리자나 주소를 나눠 주는 서버 |
| 구간을 지나면 | 구간마다 새로 적힌다 | 끝까지 바뀌지 않는다 |
두 번호는 같은 일을 두 번 하는 것이 아니라 일을 나눠 맡습니다. 어느 망으로 갈지는 IP 주소가 정합니다. 그 망 안에서 어느 장비에게 건넬지는 MAC 주소가 정합니다.
상대의 번호를 알아내기
보내려는 상대의 IP 주소는 알아도 MAC 주소는 모르는 때가 많습니다. 두 번호를 이어 주는 표가 미리 있는 것이 아니라서 같은 망에 대고 직접 물어봐야 합니다.
그 물음을 ARP(Address Resolution Protocol, 주소 결정 프로토콜)가 맡습니다. 모두에게 가는 번호로 이 주소를 쓰는 장비가 누구냐고 묻습니다. 그 주소를 쓰는 장비가 자기 MAC 주소로 답합니다.
같은 망에 장비 둘이 있다고 해 봅시다. 한 번 보낸 물음이 둘 다에게 닿습니다. 자기 IP 주소가 아닌 장비 A 는 그냥 버립니다. 그 주소를 쓰는 장비 B 만 답합니다.
sequenceDiagram
participant 내컴퓨터
participant 장비A
participant 장비B
내컴퓨터->>장비A: 이 IP 주소를 쓰는 장비가 누구냐
내컴퓨터->>장비B: 이 IP 주소를 쓰는 장비가 누구냐
Note over 장비A: 내 주소가 아니라 버린다
장비B-->>내컴퓨터: 내 MAC 주소는 이것이다
내컴퓨터->>장비B: 그 번호를 적어 프레임을 보낸다
한 번 받은 답은 ARP 캐시라는 표에 잠깐 적어 둡니다. 같은 상대에게 보낼 때마다 되묻지 않으려는 것입니다. IPv6(Internet Protocol version 6, 인터넷 프로토콜 6판)에서는 같은 일을 이웃 탐색이 맡습니다.
이 번호만으로는 못 하는 일
MAC 주소는 평평합니다. 번호 안에 지역이나 망을 가리키는 토막이 없습니다. 번호만 보고는 그 장비가 어느 망에 있는지 알 수 없습니다.
그래서 같은 망의 장비들을 이어 주는 스위치는 케이블을 꽂는 구멍 하나하나, 곧 포트마다 어느 번호가 물려 있는지를 표로 적어 둡니다. 물린 장비가 하나 늘면 이 표에 줄이 하나 늘어납니다.
flowchart TD
subgraph SW["스위치가 적어 두는 표"]
P1["포트 1 · 장비 A 의 번호"]
P2["포트 2 · 장비 B 의 번호"]
P3["포트 3 · 장비 C 의 번호"]
end
P1 --> A["장비 A"]
P2 --> B["장비 B"]
P3 --> C["장비 C"]
번호에서 어느 망인지를 읽어 낼 수 없으니 물린 것만큼 줄을 적어 두는 수밖에 없습니다. 이 표를 세상 전체로 키울 수는 없습니다. 망을 건너가는 일은 IP 주소와 라우팅이 맡습니다.
번호를 바꿀 수도 있습니다. 카드에 박혀 나온 값이 있어도 운영체제가 보낼 프레임에는 다른 값을 적을 수 있습니다. 그래서 이 번호를 신분 증명으로 삼으면 곤란합니다.
첫 바이트의 끝에서 둘째 비트가 여기서 쓰입니다. 요즘 무선 네트워크 카드는 새 망에 붙을 때마다 번호를 무작위로 만들어 쓰기도 합니다. 그때 이 비트를 1로 만들어 회사에서 받은 번호가 아니라고 알립니다.
이렇게 하는 까닭은 가게나 공항이 손님의 번호를 적어 두고 같은 사람이 다시 왔는지 세는 것을 막으려는 것입니다.
관련 항목
MAC 주소가 적히는 프레임과 그 부품
프레임 · 헤더 · EtherType · FCS · 페이로드 · 프리앰블 · 트레일러
MAC 주소를 이름표로 쓰는 링크 계층 기술
링크 계층 · 이더넷 · Wi-Fi · IEEE 802.3 · 무선 랜 · VLAN
MAC 주소와 IP 주소를 이어 주는 프로토콜
ARP · ARP 캐시 · 이웃 탐색 · RARP · DHCP
MAC 주소와 나란히 쓰이는 다른 식별자
IP 주소 · IPv4 · IPv6 · 포트 번호 · 호스트 이름 · 식별자 · 링크 계층 주소
받을 범위를 가르는 주소 갈래
유니캐스트 · 멀티캐스트 · 브로드캐스트 · 브로드캐스트 주소 · 브로드캐스트 도메인
MAC 주소를 보고 프레임을 넘기는 장비
스위치 · 허브 · 브리지 · 라우터 · 네트워크 카드 · 네트워크 인터페이스 · MAC 주소 테이블
MAC 주소를 건드려 생기는 보안 문제
ARP 스푸핑 · MAC 스푸핑 · MAC 플러딩 · MAC 주소 무작위화 · 포트 보안
MAC 주소가 못 닿는 망 밖을 맡는 상위 개념
다른 이름: MAC address · 맥 주소 · 하드웨어 주소 · 이더넷 주소