이 사이트의 실습은 자바스크립트를 켜야 움직입니다. 아래는 같은 내용을 글로 적은 것입니다.
공부 › 네트워크 › 주소와 이름
스위치와 라우터
받는 IP는 서버인데 왜 라우터의 MAC 주소로 보내나
같은 네트워크 안의 기기에게는 그 기기의 MAC 주소로 직접 보내고, 스위치가 그 주소를 보고 전달합니다. 다른 네트워크의 기기에게는 직접 닿을 수 없으므로 게이트웨이(라우터)에게 맡깁니다. 라우터를 하나 지날 때마다 프레임의 MAC 주소는 새로 쓰이지만 IP 주소는 그대로이고, TTL은 1씩 줄어듭니다.
개념 모형 · RFC 826, 791, 1122, 1812의 규칙을 옮긴 개념 모형. 실제 장비로는 대조하지 못했고, 같은 규칙을 다른 방법으로 계산한 값과 열여덟 가지 조합에서 대조
이 실습에 나오는 개념
- MAC 주소와 ARP
- MAC 주소는 랜카드 같은 네트워크 장치마다 붙어 있는 48비트 주소로, 같은 네트워크 안에서 프레임을 누구에게 건넬지 가리키는 데 쓰인다. IP 주소가 최종 목적지를 가리킨다면 MAC 주소는 바로 다음에 건네받을 기기를 가리킨다. ARP는 IP 주소를 가지고 그 주인의 MAC 주소를 알아내는 규약이다. "이 IP 주소의 주인은 MAC 주소를 알려 달라"는 요청을 같은 네트워크의 모든 기기에게 보내면 주인만 응답하고, 알아낸 결과는 ARP 캐시에 한동안 보관된다. ARP 요청은 라우터를 넘어가지 못하므로 다른 네트워크에 있는 기기의 MAC 주소는 알아낼 수 없다.
- 스위치와 라우터
- 스위치는 같은 네트워크 안의 기기들을 이어 주는 장비로, 프레임의 받는 MAC 주소를 보고, 그 기기가 어느 포트에 연결됐는지 아는 경우 그 포트로만 내보낸다. IP 주소는 보지 않으며 프레임의 내용을 고치지 않는다. 라우터는 서로 다른 네트워크를 이어 주는 장비로, 패킷의 받는 IP 주소와 라우팅 표를 보고 다음에 넘길 곳을 정한다. 라우터를 지날 때 프레임은 새로 만들어져 MAC 주소가 바뀌지만 IP 주소는 보통 그대로이고(가정용 공유기처럼 주소를 바꿔 주는 NAT는 예외) TTL이 1 줄어든다. 가정용 공유기는 라우터와 스위치, 무선 접속 장치를 한 기계에 합친 것이다.
- 기본 게이트웨이
- 컴퓨터가 자기 네트워크 밖으로 패킷을 보낼 때 맡기는 라우터의 주소다. 컴퓨터는 받는 IP 주소와 자기 IP 주소를 서브넷 마스크로 견주어, 같은 네트워크면 상대에게 직접 보내고 아니면 기본 게이트웨이에게 보낸다. 이때 패킷의 받는 IP 주소는 원래 목적지 그대로 두고, 프레임의 받는 MAC 주소만 게이트웨이의 것으로 적는다. 기본 게이트웨이가 잘못 설정되면 같은 네트워크 안의 기기와는 통신이 되는데 인터넷으로는 나가지 못한다.
- IP 패킷의 TTL
- IP 패킷이 지날 수 있는 라우터 수의 한도를 적은 헤더의 숫자다. 보내는 쪽이 처음 값을 정하고, 라우터는 패킷을 전달할 때마다 이 값을 1 줄인다. 0이 되면 라우터는 패킷을 버리고 보낸 쪽에 "시간 초과"를 알리는 ICMP 메시지를 돌려보낸다. 경로 설정이 잘못되어 패킷이 라우터 사이를 끝없이 맴도는 일을 막기 위한 장치다. traceroute는 TTL을 1부터 하나씩 늘려 보내면서 응답한 라우터를 차례로 확인하는 도구다. 캐시나 DNS에서 말하는 TTL(보관 시간)과는 이름만 같은 다른 개념이다.
- OSI 7계층
- 네트워크 통신 과정을 역할에 따라 일곱 단계로 나눈 모델이다. 아래부터 물리, 데이터 링크, 네트워크(IP), 전송(TCP/UDP), 세션, 표현, 응용(HTTP) 계층이다. 각 계층은 바로 아래 계층의 기능을 이용해 자신의 역할을 수행한다. 장비나 문제의 위치를 "몇 계층"이라고 부르는 기준이 된다.
이렇게 바꿔 보세요
- 처음 설정으로 — 서버 C에게 보냅니다. 받는 IP는 서버 C인데 첫 프레임의 받는 MAC은 라우터입니다.
- 같은 네트워크 안에서 — 라우터를 거치지 않고 MAC 주소만으로 전달됩니다.
- 라우터 둘을 건너 — MAC 주소는 두 번 바뀌고 TTL은 2 줄어듭니다.
- TTL이 모자라면 — 처음 TTL이 2면 둘째 라우터에서 버려집니다.
- TTL 1로 같은 네트워크에 — 라우터를 지나지 않으므로 TTL 1로도 도착합니다.
- MAC 주소를 이미 알면 — ARP 요청 없이 바로 보냅니다.
처음 설정으로 실행하면
- PC A의 판단: 받는 IP 192.168.2.30과 자기 IP 192.168.1.10을 서브넷 마스크 255.255.255.0으로 견줍니다. 마스크가 255인 앞의 세 칸이 서로 다르므로(PC A는 192.168.1, 받는 쪽은 192.168.2) 다른 네트워크입니다. PC A가 직접 닿을 수 없는 곳이므로, 설정에 적힌 기본 게이트웨이 192.168.1.1(라우터 R1)에게 맡기기로 합니다.
- PC A의 ARP 요청: 프레임을 보내려면 건네받을 기기의 MAC 주소가 필요한데, PC A는 192.168.1.1의 MAC 주소를 아직 모릅니다. "IP 주소 192.168.1.1의 주인은 MAC 주소를 알려 달라"는 ARP 요청을, 받는 MAC을 "모두"(브로드캐스트)로 해서 보냅니다. 스위치는 이것을 네트워크 A의 모든 기기에게 내보냅니다. 묻는 IP가 서버 C의 것이 아니라 게이트웨이의 것입니다. ARP 요청은 라우터를 넘어가지 못하므로, 다른 네트워크에 있는 기기의 MAC 주소는 알아낼 수 없고 알 필요도 없습니다.
- ARP 응답: 그 IP 주소의 주인인 라우터 R1만 PC A에게 답합니다. 답의 내용은 "내 MAC 주소는 00:00:5E:00:53:11"입니다. PC B도 요청을 받았지만 자기 IP 주소가 아니므로 답하지 않습니다. PC A는 알아낸 주소를 ARP 캐시에 적어 두고 한동안 다시 묻지 않습니다.
- PC A가 프레임을 보냅니다: 겉에는 받는 MAC …:11(라우터 R1), 보내는 MAC …:0A(PC A)를 적고, 그 안에 IP 패킷(보내는 IP 192.168.1.10, 받는 IP 192.168.2.30, TTL 64)을 넣습니다. 받는 IP는 서버 C의 것인데 받는 MAC은 라우터 R1의 것입니다. IP 주소는 마지막에 받을 곳을, MAC 주소는 이번 구간에서 건네받을 기기를 가리킵니다.
- 스위치: 프레임의 받는 MAC 주소만 보고, 그 주소의 기기(라우터 R1)가 연결된 포트로만 내보냅니다. 안에 든 IP 패킷은 열어 보지 않고, 프레임을 고치지도 않습니다.
- 라우터 R1의 수신: 프레임의 받는 MAC 주소가 자기 것이므로 받아들이고, MAC 주소가 적힌 겉을 벗겨 냅니다. 안에 든 IP 패킷의 받는 IP(192.168.2.30)는 자기 주소가 아닙니다. 다른 곳으로 전달해야 할 패킷입니다. 스위치는 MAC 주소만 보고 넘기지만, 라우터는 이렇게 IP 주소를 보고 길을 정합니다.
- 라우터 R1의 TTL 처리: 전달하기 전에 TTL을 1 줄입니다(64 → 63). TTL은 패킷이 지날 수 있는 라우터 수의 한도입니다. 경로가 잘못 설정돼 패킷이 라우터 사이를 맴돌더라도 언젠가 0이 되어 사라지게 하는 장치입니다.
- 라우터 R1의 길 찾기와 ARP: 라우팅 표를 보니 받는 IP가 속한 192.168.2.0/24는 이 라우터에 직접 연결된 네트워크 B입니다. 서버 C에게 바로 건넬 수 있습니다. 네트워크 B에 ARP 요청을 보내 192.168.2.30의 MAC 주소(…:0C)를 알아냅니다.
- 라우터 R1의 전달: 같은 IP 패킷을 새 프레임에 담아 보냅니다. 겉의 받는 MAC은 …:0C(서버 C), 보내는 MAC은 …:12(R1의 네트워크 B 쪽)로 둘 다 바뀌었습니다. 안의 보내는 IP 192.168.1.10과 받는 IP 192.168.2.30은 그대로이고, TTL만 63입니다.
- 서버 C의 수신: 프레임의 받는 MAC 주소가 자기 것이고, 안에 든 패킷의 받는 IP도 자기 주소입니다. 도착했습니다. 도착했을 때의 TTL은 63입니다. 라우터 1개를 지나 처음 값 64에서 1만큼 줄었습니다.
실행 결과
- 다른 네트워크로 보낼 때 PC A가 ARP로 묻는 것은 받는 기기가 아니라 게이트웨이의 MAC 주소입니다. 그래서 기본 게이트웨이 설정이 틀리면 같은 네트워크 안에서는 통신이 되는데 바깥으로는 나가지 못합니다.
- 라우터를 지날 때마다 프레임은 새로 만들어져 MAC 주소가 1번 바뀌었습니다. 보내는 IP와 받는 IP는 처음부터 끝까지 같았습니다. MAC 주소는 한 구간 안에서만 쓰이는 주소이고, IP 주소는 출발지에서 목적지까지 쓰이는 주소입니다.
- ARP 요청은 구간마다 한 번씩, 모두 2번 있었습니다. 한 번 알아낸 MAC 주소는 캐시에 남으므로 이어지는 패킷은 묻지 않고 보냅니다.
코드
// PC A의 네트워크 설정
const me = '192.168.1.10';
const mask = '255.255.255.0'; // 255인 앞의 세 칸이 네트워크를 나타낸다
const gateway = '192.168.1.1'; // 다른 네트워크로 나가는 문 (라우터 R1)
// 보내려는 IP 패킷
const packet = { from: '192.168.1.10', to: '192.168.2.30', ttl: 64 }; // 서버 C에게
// 보내는 컴퓨터의 규칙: 이번 프레임을 누구의 MAC 주소로 보낼까
const nextHop = sameNetwork(me, packet.to, mask) ? packet.to : gateway;
const frame = { toMac: arp(nextHop), fromMac: myMac, payload: packet };
// 라우터의 규칙: 다른 곳으로 가는 패킷을 받으면
packet.ttl -= 1;
if (packet.ttl === 0) discardAndReportTimeExceeded(packet); // 버리고 보낸 쪽에 알린다
else forwardInNewFrame(packet); // MAC 주소만 새로 써서 다음 구간으로. IP 주소는 그대로
이 모형의 전제
실제 장비로 실행한 결과가 아니라 표준 문서의 규칙을 옮긴 개념 모형입니다. 이 PC 한 대로는 스위치와 라우터 두 대를 거치는 길을 만들 수 없어 실행으로 대조하지 못했습니다. 그 대신 모형의 결과를, 같은 규칙을 다른 방법(기기마다 IP 주소, 마스크, 라우팅 표, ARP 표를 두고 패킷을 넘겨 가는 계산)으로 옮긴 계산과 열여덟 가지 조합에서 대조했습니다. 근거로 삼은 문서: 보내는 컴퓨터가 마스크로 같은 네트워크인지 판단해 직접 보내거나 게이트웨이로 보내는 것은 RFC 1122 3.3.1.1절, IP 주소로 MAC 주소를 알아내는 ARP는 RFC 826, TTL의 뜻은 RFC 791 3.2절, 라우터가 전달할 때 TTL을 줄이고 0이 되면 버리며 ICMP 시간 초과를 보내는 것은 RFC 1812 5.3.1절과 RFC 792, 받는 컴퓨터는 TTL이 작아도 받는다는 것은 RFC 1122 3.2.1.7절입니다. 스위치가 MAC 주소로 전달하는 방식은 IEEE 802.1D의 내용입니다. 단순화한 것: 네트워크 B와 C에도 스위치가 있지만 그리지 않았고, 스위치가 어느 포트에 어느 MAC 주소가 있는지 배우는 과정, 라우터가 TTL을 줄인 뒤 IP 헤더의 체크섬을 다시 계산하는 일, 주소 변환(NAT)은 다루지 않았습니다. 집에서 쓰는 공유기를 지날 때는 NAT 때문에 보내는 IP 주소도 바뀝니다. IP 주소는 사설 대역(192.168.x.x), MAC 주소는 문서용으로 예약된 대역(RFC 7042, 지금은 RFC 9542)의 값이며 실제 기기의 주소가 아닙니다. 처음 TTL은 운영체제마다 다릅니다.
앞 실습: IP 주소와 서브넷 · 다음 실습: 소켓과 포트