직접 라우팅
고친 사람 github-actions[bot]
직접 라우팅은 패킷을 라우터에게 맡기지 않고 목적지 컴퓨터에게 곧장 건네는 전달 방식입니다. 목적지가 보내는 쪽과 같은 망에 있을 때 이 방식을 탑니다. 멀리 가는 패킷도 마지막 한 구간은 언제나 직접 라우팅으로 닿습니다.
쉽고 빠른 이해
직접 라우팅은 같은 망 안의 상대에게 데이터를 중간 장비 없이 바로 보내는 일입니다. 예를 들어 애플리케이션 서버가 같은 망의 데이터베이스 서버에 쿼리를 보내면 그 데이터는 라우터를 들르지 않고 곧장 데이터베이스 서버로 갑니다.
이게 없으면 바로 옆 장비로 가는 데이터도 전부 라우터를 한 번 들렀다 와야 합니다. 길이 그만큼 길어집니다. 라우터는 하지 않아도 될 일까지 떠맡습니다. 먼 곳으로 간 데이터도 끝에는 누군가 목적지에게 직접 건네야 합니다.
어떻게 도는가:
- 보내는 컴퓨터가 목적지 주소를 보고 같은 망인지 판단합니다
- 같은 망이면 목적지 장비의 하드웨어 주소를 물어서 알아냅니다
- 그 하드웨어 주소를 받는 쪽으로 적어 데이터를 바로 내보냅니다
대가는 같은 망 안에서만 쓸 수 있다는 것입니다. 같은 망인지 가르는 설정이 틀리면 닿을 수 있는 상대에게도 못 닿습니다.
상세
같은 사무실 동료에게 서류를 줄 때는 우편실에 맡기지 않습니다. 걸어가서 그 사람 책상에 바로 올려 둡니다. 우편실을 찾는 것은 받을 사람이 다른 건물에 있을 때뿐입니다.
네트워크로 보내는 데이터는 패킷이라는 덩어리로 나뉘어 갑니다. 패킷마다 목적지 주소가 적혀 있습니다. 그래서 덩어리 하나하나가 따로 목적지를 찾아갈 수 있습니다.
호스트는 네트워크에 붙어 패킷을 보내고 받는 컴퓨터입니다. 애플리케이션 서버도, 그 서버가 붙는 데이터베이스 서버도 호스트입니다.
한 공유기나 한 스위치에 함께 물린 호스트들은 하나의 망을 이룹니다. 같은 망 안의 호스트끼리는 다른 장비의 도움 없이 서로 곧장 닿습니다.
라우터는 망과 망 사이를 잇는 장비입니다. 한 망에서 받은 패킷을 다른 망으로 넘겨 줍니다. 망이 여럿으로 나뉘어 있어도 패킷이 건너갈 수 있는 것은 라우터 덕분입니다.
직접 라우팅(direct routing)은 패킷을 목적지 호스트에게 곧장 건네는 전달입니다. 중간에 라우터가 끼지 않습니다. 직접 전달(direct delivery)이라고도 합니다. 반대편은 라우터에게 먼저 맡기는 간접 라우팅입니다.
애플리케이션 서버와 데이터베이스 서버가 같은 망에 있을 때가 흔한 예입니다. 애플리케이션 서버가 보낸 쿼리는 데이터베이스 서버에게 그대로 건네집니다.
직접 라우팅을 따로 두는 까닭은 길을 줄이기 위해서입니다. 이웃 호스트로 가는 패킷까지 라우터에 맡기면 패킷마다 라우터를 한 번 들렀다 나옵니다. 그만큼 길이 늘어납니다. 라우터도 맡지 않아도 될 패킷까지 처리하게 됩니다.
먼 곳으로 가는 패킷에도 직접 라우팅이 필요합니다. 라우터를 몇 개 건너든 마지막 라우터는 목적지에게 패킷을 직접 건네야 합니다(아래 「라우터가 끝내는 마지막 구간」).
같은 망인지 가르는 판정
보내는 호스트는 패킷을 내보내기 전에 목적지가 같은 망에 있는지부터 봅니다. 이 판정에는 패킷에 적힌 목적지 주소를 씁니다.
그 주소가 IP 주소입니다. 네트워크에서 호스트 하나를 가리키는 번호입니다. 10.0.1.15 처럼 점으로 나눈 네 마디로 적습니다.
이름의 IP 는 IP(Internet Protocol, 인터넷 프로토콜)를 줄인 말입니다. 인터넷에서 패킷을 나르는 규칙의 이름입니다.
IP 주소의 앞부분은 망을 가리킵니다. 뒷부분은 그 망 안의 호스트를 가리킵니다. 앞부분이 어디까지인지는 서브넷 마스크라는 값이 정합니다. 255.255.255.0 이면 앞 세 마디가 망입니다.
앞부분이 같은 IP 주소들이 모여 한 망을 이룹니다. 이렇게 주소의 범위로 나타낸 망 하나가 서브넷입니다. 큰 주소 블록을 잘게 나눈 조각 하나가 서브넷 하나입니다.
호스트는 자기 주소와 목적지 주소에 같은 마스크를 대어 봅니다. 마스크가 255 인 마디는 그대로 남깁니다. 0 인 마디는 0 으로 지웁니다. 남은 값이 같으면 직접 라우팅입니다. 다르면 간접 라우팅입니다.
주소가 10.0.1.15, 서브넷 마스크가 255.255.255.0 인 애플리케이션 서버가 두 목적지를 판정하면 다음과 같습니다. 이 서버 자신의 주소에서 남는 값은 10.0.1.0 입니다.
| 목적지 | 목적지 주소 | 남은 값 | 내 값과 | 판정 |
|---|---|---|---|---|
| 데이터베이스 서버 | 10.0.1.30 | 10.0.1.0 | 같다 | 직접 라우팅 |
| 바깥의 결제 서버 | 203.0.113.5 | 203.0.113.0 | 다르다 | 간접 라우팅 |
첫 줄의 데이터베이스 서버는 같은 망에 있습니다. 애플리케이션 서버는 패킷을 데이터베이스 서버에게 바로 보냅니다. 둘째 줄의 결제 서버는 다른 망에 있어서 라우터에게 맡깁니다.
받을 장비를 적는 MAC 주소
패킷은 한 망 안을 지날 때 프레임이라는 봉투에 담깁니다. 프레임 머리에는 그 망에서 이 봉투를 받을 장비의 주소를 적습니다. 사무실 유선 랜을 이루는 이더넷이 이런 프레임을 쓰는 흔한 예입니다.
프레임에 적는 주소는 MAC 주소(Media Access Control address, 매체 접근 제어 주소)입니다. 네트워크 카드마다 하나씩 붙어 나오는 번호입니다. 같은 망 안에서 프레임을 받을 장비를 가리킵니다.
주소는 두 군데에 적힙니다. 패킷 안의 목적지 IP 주소와 프레임의 받을 MAC 주소입니다. 직접 라우팅에서는 이 두 주소가 같은 호스트를 가리킵니다. 간접 라우팅과 나란히 놓으면 차이가 드러납니다.
| 칸 | 직접 라우팅 | 간접 라우팅 |
|---|---|---|
| 패킷 안의 목적지 IP 주소 | 목적지 호스트 | 목적지 호스트 |
| 프레임의 받을 MAC 주소 | 목적지 호스트 | 라우터 |
두 칸이 서로 다른 장비를 가리키는 것은 간접 라우팅뿐입니다.
ARP 로 목적지의 MAC 주소 알아내기
보내는 호스트는 처음에 목적지의 IP 주소만 압니다. 프레임을 만들려면 MAC 주소도 있어야 합니다. 둘을 이어 주는 것이 ARP(Address Resolution Protocol, 주소 결정 프로토콜)입니다.
ARP 는 먼저 망 안의 다른 장비 모두에게 한꺼번에 묻습니다. 이렇게 모두에게 보내는 것이 브로드캐스트입니다. 물음은 「10.0.1.30 을 쓰는 장비는 MAC 주소를 알려 달라」입니다. 그 주소를 쓰는 장비만 답합니다.
sequenceDiagram
participant A as 애플리케이션 서버
participant L as 같은 망의 다른 장비들(데이터베이스 서버 포함)
participant D as 데이터베이스 서버
Note over A: 10.0.1.30 은 같은 망이다
A->>L: ARP 물음 · 10.0.1.30 의 MAC 주소는
Note over L,D: 데이터베이스 서버만 답한다
D-->>A: ARP 답 · 내 MAC 주소
A->>D: 프레임 · 받을 MAC 은 데이터베이스 서버
답을 받은 애플리케이션 서버는 그 MAC 주소를 받을 주소로 적어 프레임을 내보냅니다. 받은 답은 ARP 캐시라는 표에 한동안 남겨 둡니다. 그래서 같은 상대에게 다시 보낼 때는 묻지 않고 바로 보냅니다.
간접 라우팅이라면 ARP 로 묻는 상대가 라우터입니다. 직접 라우팅은 목적지 자신에게 묻습니다.
직접의 뜻과 스위치
직접 라우팅의 「직접」은 케이블 한 가닥으로 붙어 있다는 뜻이 아닙니다. 두 호스트 사이에 스위치가 몇 대 있어도 직접 라우팅입니다.
스위치는 프레임 머리의 MAC 주소만 보고 프레임을 옮깁니다. 패킷 안의 IP 주소를 보고 다음 망을 고르는 일은 하지 않습니다. 「직접」이 빼는 장비는 라우터 하나뿐입니다.
라우팅 테이블의 직접 줄
호스트와 라우터는 판정 결과를 라우팅 테이블에 적어 두고 씁니다. 라우팅 테이블은 목적지 망마다 패킷을 누구에게 넘길지 적은 표입니다. 패킷을 보낼 때마다 이 표에서 목적지에 맞는 줄을 찾습니다.
표의 목적지 칸은 10.0.1.0/24 처럼 적습니다. /24 는 서브넷 마스크 255.255.255.0 을 줄여 적은 것입니다. 마스크의 255 는 한 마디의 8비트가 전부 켜진 값입니다. 그런 마디가 셋이라 24비트입니다.
망을 가리키는 주소의 앞부분이 프리픽스입니다. /24 는 프리픽스가 24비트라는 뜻입니다.
프리픽스가 짧을수록 망이 잡는 주소 범위는 넓어집니다. 같아야 하는 앞부분이 짧아지는 만큼 호스트에 쓰는 뒷부분이 길어지기 때문입니다. /16 은 앞 두 마디만 같으면 같은 망이라서 /24 보다 범위가 넓습니다.
마디 중간에서 끊기는 마스크도 있습니다. 255.255.255.128 은 넷째 마디에서 맨 앞 비트 하나만 켜진 마스크입니다. 프리픽스로 적으면 /25 입니다. /24 범위를 반으로 나눈 좁은 망을 잡습니다. 이럴 때는 같은 판정을 비트 단위로 합니다.
라우팅 테이블에서 목적지 칸 옆에는 다음 홉을 적습니다. 다음 홉은 패킷을 넘길 바로 다음 장비입니다. 애플리케이션 서버 10.0.1.15 의 표를 간추리면 다음과 같습니다.
| 목적지 망 | 다음 홉 | 전달 |
|---|---|---|
| 10.0.1.0/24 | 없음 | 직접 라우팅 |
| 0.0.0.0/0 | 10.0.1.1 | 간접 라우팅 |
직접 줄은 다음 홉 칸이 빕니다. 목적지 자신에게 건네므로 사이에 넘길 장비가 없습니다.
직접 줄은 사람이 적지 않습니다. 네트워크 카드에 주소 10.0.1.15 와 마스크 255.255.255.0 을 붙이면 운영체제가 이 줄을 만듭니다. 이렇게 생긴 망을 직접 연결된 망(directly connected network)이라고 합니다.
둘째 줄 0.0.0.0/0 은 기본 경로입니다. 프리픽스 길이가 0 이라 비교할 앞부분이 없습니다. 그래서 모든 주소에 맞습니다.
이 줄의 다음 홉 10.0.1.1 은 이 망에 붙은 라우터입니다. 같은 망 밖으로 나가는 패킷을 맡는 이 라우터를 기본 게이트웨이라고 부릅니다.
목적지 10.0.1.30 은 두 줄에 다 맞습니다. 이럴 때는 프리픽스가 더 긴 줄을 고릅니다. 이 규칙이 최장 프리픽스 매치입니다. 덕분에 같은 망의 목적지는 직접 줄을 탑니다.
리눅스에서는 ip route 명령이 이 표를 보여 줍니다. 출력을 줄이면 다음과 같습니다.
default via 10.0.1.1 dev eth0 # 간접
10.0.1.0/24 dev eth0 scope link # 직접
via 뒤에 다음 홉이 붙은 줄이 간접 라우팅입니다. via 없이 scope link 가 붙은 줄이 직접 라우팅입니다. scope link 는 라우터 없이 곧장 닿는 망이라는 표시입니다. eth0 은 패킷을 내보낼 네트워크 카드의 이름입니다.
라우터가 끝내는 마지막 구간
라우터도 패킷을 넘길 때 같은 판정을 합니다. 라우터는 망 여러 개에 동시에 붙어 있습니다. 목적지가 그 가운데 한 망에 있으면 라우터는 목적지에게 패킷을 직접 건넵니다. 아니면 다음 라우터에게 맡깁니다.
그래서 먼 목적지로 가는 패킷의 여정은 간접 라우팅 여러 번 뒤에 직접 라우팅 한 번으로 끝납니다. 같은 망 안의 통신은 처음부터 끝까지 직접 라우팅 한 번뿐입니다.
판정이 틀렸을 때
직접 라우팅은 서브넷 마스크에 기댑니다. 마스크가 틀리면 같은 망인지 아닌지를 잘못 가립니다.
| 틀린 것 | 호스트가 하는 일 | 증상 |
|---|---|---|
마스크가 잡는 범위가 실제보다 넓음(/24 여야 할 곳이 /16) |
다른 망의 목적지를 같은 망으로 보고 직접 보냄 | 그 목적지 불통 · ARP 물음에 답하는 장비 없음 |
마스크가 잡는 범위가 실제보다 좁음(/24 여야 할 곳이 /25) |
같은 망의 목적지를 다른 망으로 보고 라우터에게 맡김 | 닿기는 함 · 라우터를 한 번 돌아감 |
첫 줄은 이렇게 드러납니다. 애플리케이션 서버의 마스크가 /16 으로 잘못 붙으면 다른 망의 10.0.2.40 도 같은 망으로 보입니다.
서버는 그 주소에 대고 ARP 로 묻습니다. 그 호스트는 다른 망에 있어서 물음을 못 듣습니다. 연결은 시간 초과로 끝납니다.
둘째 줄은 잘 안 드러납니다. 라우터가 패킷을 받아 같은 망으로 되돌려 보내 주면 통신은 됩니다. 길만 한 번 돌아갑니다.
로드 밸런서의 직접 라우팅
로드 밸런서에도 직접 라우팅이라는 이름의 전달 방식이 있습니다. 로드 밸런서는 들어온 요청을 서버 여러 대에 나눠 주는 장비입니다. 이 방식에서는 서버가 응답을 로드 밸런서에게 돌려주지 않고 클라이언트에게 바로 보냅니다.
이름이 같은 데는 까닭이 있습니다. 로드 밸런서는 요청 패킷 안의 목적지 IP 주소에 손대지 않습니다. 프레임의 받을 MAC 주소만 고른 서버의 것으로 바꿔 같은 망에 내보냅니다. 위에서 다룬 직접 라우팅을 로드 밸런서와 서버 사이 한 구간에 쓰는 셈입니다.
그래서 로드 밸런서와 서버들은 같은 망에 있어야 합니다.
클라이언트는 로드 밸런서가 내건 대표 IP 주소 하나로 요청을 보냅니다. 패킷이 서버에 닿아도 목적지 IP 주소는 그 대표 주소 그대로입니다. 서버가 그 주소를 자기 것으로 여기지 않으면 남의 패킷으로 보고 버립니다. 그래서 서버마다 대표 IP 주소를 자기 주소로도 받아들이게 설정해 둡니다.
리눅스의 LVS(Linux Virtual Server)가 이 방식을 직접 라우팅이라는 이름으로 부릅니다.
응답이 서버에서 클라이언트로 곧장 돌아간다는 데 무게를 두면 직접 서버 반환(Direct Server Return, DSR)이라고도 합니다.
관련 항목
직접 라우팅과 나란히 서는 라우팅 방식
간접 라우팅 · 정적 라우팅 · 동적 라우팅 · 소스 라우팅
같은 망인지 가르는 주소 체계
IP 주소 · 서브넷 · 서브넷 마스크 · 네트워크 주소 · CIDR · 프리픽스 · IPv4 · IPv6 · 로컬 원격 판정
직접 라우팅이 거치는 처리 단계
경로표 · 최장 프리픽스 매치 · 기본 경로 · ARP · ARP 캐시 · 브로드캐스트 · 포워딩
직접 라우팅의 한 구간을 나르는 링크 계층 요소
MAC 주소 · 프레임 · 이더넷 · 링크 계층 · 네트워크 카드 · 스위치 · 브로드캐스트 도메인 · VLAN
직접 라우팅이 건너뛰는 중계 장비
라우터 · 기본 게이트웨이 · 게이트웨이 · 다음 홉 · 공유기
직접 라우팅에서 나는 장애
ICMP 리다이렉트 · 목적지 도달 불가 · IP 주소 충돌 · ARP 스푸핑 · 패킷 손실
직접 라우팅을 들여다보는 명령
ip route · ip neigh · ping · traceroute · tcpdump
로드 밸런서의 직접 라우팅을 이루는 구성 요소
로드 밸런서 · LVS · 직접 서버 반환 · 가상 IP · 루프백 인터페이스
직접 라우팅이 속하는 상위 분류
다른 이름: direct routing · direct delivery · 직접 전달