경로표
고친 사람 github-actions[bot]
경로표는 패킷을 어느 쪽으로 내보낼지 알려 줍니다. 목적지 주소 범위마다 다음에 넘길 장비를 한 줄씩 적어 둡니다. 라우터뿐 아니라 망에 붙은 컴퓨터도 저마다 이 표를 하나씩 들고 있습니다. 표가 알려 주는 것은 바로 다음 한 걸음뿐입니다.
쉽고 빠른 이해
패킷을 받을 때마다 「이 목적지면 누구에게 넘기나」를 알려 주는 표입니다. 목적지가 사내 주소면 사내망 쪽으로, 그 밖의 주소면 통신사 쪽으로 보내라고 적혀 있는 식입니다.
장비마다 목적지까지의 길 전체를 알 수는 없습니다. 길은 회선이 끊기거나 새로 놓일 때마다 바뀝니다. 표에는 바로 다음 장비만 적습니다. 그래서 길이 바뀌어도 바뀐 구간의 표만 고치면 됩니다.
경로표가 제 몫을 하는 것은 망과 망 사이를 건널 때입니다. 같은 망 안에서 데이터를 나르는 스위치는 이 표를 보지 않습니다. 장치마다 붙은 하드웨어 번호를 보고 곧바로 나릅니다.
어떻게 도나:
- 패킷의 목적지 주소를 읽습니다
- 그 주소가 드는 범위의 줄을 표에서 찾습니다. 여럿이면 범위가 가장 좁은 줄을 고릅니다
- 그 줄에 적힌 다음 장비에게 패킷을 넘깁니다
대가도 있습니다. 패킷 하나마다 표를 찾아야 해서 표가 커질수록 찾는 비용과 메모리가 늡니다. 장비마다 표를 따로 들고 있습니다. 표끼리 어긋나면 패킷이 엉뚱한 곳으로 가거나 같은 구간을 맴돕니다.
상세
작은 회사 라우터의 경로표 하나를 놓고, 한 줄에 무엇이 적히고 패킷이 어느 줄을 고르는지 봅니다.
한 걸음만 적는 표
패킷은 망으로 보내는 데이터를 잘라 담은 한 덩어리입니다. 인터넷에서 패킷은 여러 라우터를 거쳐 목적지에 닿습니다. 라우터는 서로 다른 망을 잇는 장비입니다. 받은 패킷을 옆 망으로 넘깁니다.
그런데 어느 장비도 목적지까지의 길 전체를 들고 있지 않습니다. 길 전체를 들고 있으려면 모든 목적지로 가는 길을 알아야 합니다. 그 길은 회선이 끊기거나 새로 놓일 때마다 바뀝니다. 장비마다 그 변화를 매번 전부 받아 적어야 합니다.
그래서 장비는 한 걸음만 압니다. 「이 범위의 주소로 가는 패킷은 저 장비에게 넘긴다」를 적은 표를 들고 있습니다. 이 표가 경로표입니다. 영어 이름을 따라 라우팅 테이블이라고도 부릅니다.
넘겨받은 장비도 자기 표를 보고 같은 일을 합니다. 한 걸음씩 넘기다 보면 패킷이 목적지에 닿습니다. 아래 그림의 상자마다 적힌 한 줄이 그 장비가 이 패킷에 쓴 경로표의 줄입니다.
flowchart TD
A["보내는 컴퓨터<br/>밖의 주소는 회사 라우터로"]
A --> R1["회사 라우터<br/>밖의 주소는 통신사로"]
R1 --> R2["통신사 라우터<br/>이 범위는 서비스 회사 쪽으로"]
R2 --> R3["서비스 회사 라우터<br/>이 범위는 내 망 안에 있다"]
R3 --> B["받는 서버"]
어느 상자도 길 전체를 모릅니다. 길이 바뀌면 바뀐 구간의 장비만 표를 고치면 됩니다. 나머지 장비의 표는 손대지 않아도 됩니다.
표 한 줄의 생김새
표의 한 줄은 「어디로 가는 패킷이면 누구에게 넘기나」 한 쌍입니다. 작은 회사 라우터의 표를 간추리면 이렇습니다.
| 목적지 범위 | 다음 홉 | 나가는 인터페이스 |
|---|---|---|
10.1.0.0/16 |
없음. 곧바로 보낸다 | 사내망 쪽 |
10.2.0.0/16 |
10.9.0.2 |
지사와 이은 전용선 쪽 |
0.0.0.0/0 |
203.0.113.1 |
통신사 쪽 |
세 칸이 무엇인지 하나씩 봅니다.
첫 칸은 목적지 주소의 범위입니다. 주소 하나마다 한 줄씩 적으면 표가 주소 수만큼 커집니다. 그래서 주소 여러 개를 범위 하나로 묶어 한 줄에 적습니다. 범위를 적는 법은 바로 아래 소절에서 봅니다.
둘째 칸은 패킷을 넘겨받을 바로 다음 장비입니다. 이 장비를 다음 홉이라고 부릅니다.
인터넷에서 장비를 찾아가는 번호를 IP 주소(Internet Protocol address, 인터넷 프로토콜 주소)라고 합니다. 다음 홉 칸에는 그 장비의 IP 주소가 적힙니다.
첫 줄처럼 다음 홉이 비어 있는 줄도 있습니다. 목적지가 이 장비와 같은 망에 붙어 있다는 뜻입니다. 그때는 누구를 거치지 않고 목적지에 곧바로 보냅니다.
셋째 칸은 패킷을 내보낼 출입구입니다. 장비가 회선에 이어진 출입구를 네트워크 인터페이스라고 합니다. 라우터는 인터페이스가 여럿이라 다음 홉만 알아서는 부족합니다. 그 다음 홉이 어느 인터페이스 너머에 있는지도 적어야 합니다.
표에는 흔히 칸이 하나 더 붙습니다. 같은 범위로 가는 길이 둘 이상일 때 어느 쪽을 쓸지 가르는 비용 값입니다. 값이 작은 길을 먼저 씁니다. 이 값을 메트릭이라고 부릅니다.
주소 범위를 적는 법
IPv4(Internet Protocol version 4, 인터넷 프로토콜 4판) 주소는 32비트입니다. 여덟 비트씩 네 덩어리로 끊어 10.2.7.9 처럼 적습니다. 여덟 비트 한 덩어리를 옥텟이라고 부릅니다.
범위는 주소의 앞부분을 몇 비트까지 맞춰 보느냐로 적습니다. 10.2.0.0/16 의 /16 은 앞 16비트(앞 두 옥텟)가 10.2 인 주소 전부라는 뜻입니다. 뒤 두 옥텟은 무엇이든 이 줄에 듭니다.
이렇게 맞춰 보는 앞부분을 프리픽스라고 합니다. / 뒤의 숫자는 프리픽스 길이입니다. 길이가 길수록 맞춰 보는 비트가 많아서 이 줄에 드는 주소가 좁아집니다.
| 적은 범위 | 맞춰 보는 비트 | 이 줄에 드는 주소 |
|---|---|---|
10.2.7.0/24 |
앞 24비트 | 10.2.7.0 ~ 10.2.7.255 · 256개 |
10.2.0.0/16 |
앞 16비트 | 10.2.0.0 ~ 10.2.255.255 · 65,536개 |
0.0.0.0/0 |
없음 | 모든 주소 |
길이가 여덟 줄어들 때마다 드는 주소가 256배로 늘어납니다. 맨 아래 줄은 한 비트도 맞춰 보지 않으니 모든 주소가 듭니다.
이 표기를 CIDR(Classless Inter-Domain Routing, 클래스 없는 도메인 간 라우팅) 표기라고 부릅니다. 예전에는 주소 범위를 크기가 정해진 몇 등급(클래스)으로만 나눴습니다. 「클래스 없는」은 그 등급 대신 프리픽스 길이를 비트 단위로 정한다는 뜻입니다. 클라우드의 방화벽 규칙이나 서브넷 설정에서 보는 /24 가 이 표기입니다.
한 패킷이 줄을 고르는 과정
목적지가 10.2.7.9 인 패킷이 들어왔다고 해 봅니다. 라우터는 표의 줄마다 이 주소가 그 범위에 드는지 봅니다.
첫째 줄 10.1.0.0/16 에는 안 듭니다. 둘째 줄 10.2.0.0/16 에는 듭니다. 셋째 줄 0.0.0.0/0 에도 듭니다.
든 줄이 둘입니다. 이렇게 여럿이 맞으면 프리픽스가 가장 긴 줄을 고릅니다. 가장 좁게 맞는 줄입니다. 이 규칙을 최장 프리픽스 매치라고 부릅니다.
flowchart TD
P["목적지 10.2.7.9"]
subgraph T["경로표"]
R1["10.1.0.0/16 · 안 든다"]
R2["10.2.0.0/16 · 든다 · 16비트 · 가장 긴 줄"]
R3["0.0.0.0/0 · 든다 · 0비트"]
end
P --> T
R2 --> N["다음 홉 10.9.0.2 에게 넘긴다"]
좁은 줄을 고르는 까닭은 그 줄이 목적지를 더 자세히 알기 때문입니다. 넓은 줄은 「이쪽 어딘가」까지만 압니다. 좁은 줄은 「지사 망은 저 장비 너머」까지 압니다. 그래서 이 패킷은 16비트 줄을 따라 10.9.0.2 에게 넘어갑니다.
아무 줄에도 안 드는 패킷은 갈 곳이 없습니다. 라우터는 그 패킷을 버리고 보낸 쪽에 닿을 수 없다고 알립니다. 이 알림은 ICMP(Internet Control Message Protocol, 인터넷 제어 메시지 프로토콜)라는 오류 알림 메시지에 실려 갑니다.
모든 주소에 드는 줄
셋째 줄 0.0.0.0/0 에는 어떤 주소든 듭니다. 프리픽스가 가장 짧으니 다른 줄이 하나도 안 맞을 때만 뽑힙니다.
이 줄을 기본 경로라고 부릅니다. 「모르는 곳은 전부 저쪽으로」라는 마지막 출구입니다. 이 줄이 있어서 작은 망의 표는 인터넷의 모든 주소 범위를 적지 않아도 됩니다.
컴퓨터의 표에서 기본 경로의 다음 홉은 따로 기본 게이트웨이라고 부릅니다. 네트워크 설정 화면에서 보던 게이트웨이 주소가 이것입니다.
서버도 들고 있는 표
경로표는 라우터만 들고 있는 것이 아닙니다. 망에 붙어 패킷을 주고받는 컴퓨터를 호스트라고 합니다. 호스트도 경로표를 하나씩 들고 있습니다. 서버 한 대도 패킷을 내보낼 때마다 자기 표를 먼저 봅니다.
서버의 표는 대개 짧습니다. 자기가 붙은 망으로 곧바로 가는 줄 하나와 기본 경로 한 줄이면 끝나는 경우가 많습니다. 리눅스 서버에서 ip route 명령을 치면 이 표가 나옵니다. 간추리면 이런 두 줄입니다.
$ ip route
default via 10.0.0.1 dev eth0 // 기본 경로
10.0.0.0/24 dev eth0 // 같은 망
첫 줄의 default 가 기본 경로입니다. via 뒤의 10.0.0.1 이 기본 게이트웨이입니다. dev 뒤의 eth0 은 내보낼 인터페이스입니다. 둘째 줄에는 via 가 없습니다. 같은 망이라 곧바로 보낸다는 뜻입니다.
VPN(Virtual Private Network, 가상 사설망)을 켜면 이 표에 줄이 늘어납니다. 회사 주소 범위로 가는 줄이 생깁니다. 그 줄은 VPN 이 만든 가상 인터페이스를 가리킵니다. VPN 을 켠 뒤로 어떤 주소에만 안 닿으면 이 표부터 봅니다.
줄이 들어오는 세 길
표의 줄은 저절로 생기지 않습니다. 들어오는 길이 셋 있습니다.
| 들어오는 길 | 누가 적나 | 예 |
|---|---|---|
| 직접 연결 | 장비가 스스로 | 인터페이스에 주소를 달면 그 망으로 가는 줄이 생긴다 |
| 정적 경로 | 사람이 손으로 | 「지사 범위는 지사 라우터로」를 설정에 적는다 |
| 동적 경로 | 라우팅 프로토콜 | 이웃 라우터가 알려 준 경로가 들어온다 |
직접 연결 줄은 따로 적을 일이 없습니다. 인터페이스에 10.0.0.5/24 같은 주소를 달면, 장비는 10.0.0.0/24 가 자기 옆에 붙은 망이라는 것을 압니다. 앞의 ip route 둘째 줄이 이렇게 생긴 줄입니다.
손으로 적는 줄은 정적 경로라고 합니다. 장비가 몇 대뿐인 망에서는 이 방법이 단순합니다. 연결이 바뀔 일이 드물 때 특히 그렇습니다. 단점은 회선이 끊겨도 표가 그대로라는 것입니다. 사람이 고쳐 적기 전까지 패킷은 끊긴 쪽으로 계속 갑니다.
라우터끼리 자기가 아는 경로를 서로 알려 주게 할 수도 있습니다. 이 주고받는 규칙이 라우팅 프로토콜입니다. 회선이 끊기면 그 소식이 이웃으로 퍼집니다. 소식을 받은 라우터들은 표를 다시 계산해 우회로로 갈아탑니다.
대신 소식이 다 퍼지기까지 시간이 걸립니다. 그동안에는 라우터마다 표가 서로 다른 길을 가리킬 수 있습니다. 모든 라우터의 표가 다시 맞춰지는 과정을 수렴이라고 부릅니다.
후보를 모은 표와 전달에 쓰는 표
줄이 세 길로 들어오다 보니 같은 범위에 줄이 둘 이상 쌓이기도 합니다. 손으로 적은 줄과 라우팅 프로토콜이 알려 준 줄이 같은 범위를 가리키는 경우입니다. 라우터는 범위마다 하나를 골라 실제 전달에 씁니다.
그래서 라우터는 흔히 표를 둘로 나눠 둡니다. 들어온 후보를 전부 모아 둔 표가 RIB(Routing Information Base, 라우팅 정보 베이스)입니다. 라우팅 프로토콜이 계산할 때는 이 표를 봅니다.
RIB 에서 범위마다 고른 줄만 추린 표가 FIB(Forwarding Information Base, 포워딩 정보 베이스)입니다. 패킷이 들어올 때마다 찾는 표는 이쪽입니다. 그래서 포워딩 테이블이라고도 부릅니다.
flowchart TD
C["직접 연결"] --> RIB
S["정적 경로"] --> RIB
D["라우팅 프로토콜"] --> RIB
RIB["RIB · 후보를 전부 모은 표"] -->|"범위마다 하나를 고른다"| FIB["FIB · 전달에 쓰는 표"]
FIB --> P["들어온 패킷마다 이 표를 찾는다"]
두 표를 나누는 까닭은 하는 일이 달라서입니다. RIB 는 후보를 많이 담습니다. 바뀌는 일은 가끔입니다. FIB 는 패킷마다 읽힙니다. 그래서 고른 줄만 담아 작게 둡니다. 넓게 경로표라고 하면 둘을 다 가리킵니다.
이 둘에 맞춰 낱말도 갈립니다. 표를 채우고 고르는 과정을 라우팅이라고 부릅니다. FIB 를 보고 패킷 하나를 넘기는 동작은 포워딩이라고 부릅니다.
찾는 비용
FIB 는 패킷 하나마다 한 번씩 찾아집니다. 그래서 한 번 찾는 데 드는 시간이 장비가 1초에 넘길 수 있는 패킷 수를 정합니다.
걸리는 시간은 빅오 표기법으로 적습니다. O(n) 은 줄 수 n 에 비례해 시간이 는다는 뜻입니다. O(W) 는 줄 수와 상관없이 주소의 비트 수 W(IPv4 는 32)에만 비례한다는 뜻입니다.
가장 단순한 방법은 줄을 처음부터 끝까지 훑는 것입니다. 드는 줄을 다 찾은 뒤 그중 프리픽스가 가장 긴 것을 고릅니다. 줄이 n 개면 O(n) 입니다.
해시테이블로 한 번에 찾는 방법은 안 통합니다. 해시테이블은 키와 똑같은 값을 찾는 구조입니다. 경로표에서는 주소 하나가 길이가 다른 여러 줄에 함께 듭니다. 그중 가장 긴 줄을 골라야 합니다.
그래서 흔히 트라이를 씁니다. 트라이는 키를 앞에서부터 한 조각씩 따라 내려가는 트리입니다. 경로표에서는 주소를 앞에서부터 따라 내려갑니다. 프리픽스가 끝나는 노드에는 그 줄을 달아 둡니다.
앞의 표에 10.0.0.0/8 과 10.2.5.0/24 두 줄을 더한 표를 트라이로 그리면 이렇습니다. 보기 쉽게 한 옥텟(여덟 비트)씩 내려가게 그렸습니다. 한 비트씩 내려가게 짜도 찾는 방법은 같습니다.
flowchart TD
R["시작 · 0.0.0.0/0 줄"] --> A["10 · 10.0.0.0/8 줄"]
A --> B1["1 · 10.1.0.0/16 줄"]
A --> B2["2 · 10.2.0.0/16 줄"]
B2 --> C1["5 · 10.2.5.0/24 줄"]
10.2.7.9 를 찾아 봅니다. 시작에서 10 으로, 거기서 2 로 내려갑니다. 2 아래에는 7 로 가는 가지가 없어서 멈춥니다.
내려오면서 줄이 달린 노드를 셋 지났습니다. /0 · /8 · /16 입니다. 마지막으로 지난 줄이 가장 긴 프리픽스이므로 /16 줄이 답입니다. 그림처럼 여덟 비트씩 내려가면 많아야 네 번입니다. 한 비트씩 내려가면 표에 줄이 몇 개든 많아야 W 번입니다.
IPv4 라면 많아야 32번입니다. IPv6(Internet Protocol version 6, 인터넷 프로토콜 6판) 주소는 128비트라 많아야 128번입니다.
찾기뿐 아니라 줄을 넣고 지우는 비용, 표가 차지하는 메모리도 견줘 보면 이렇습니다.
| 재는 것 | 줄을 훑을 때 | 트라이 |
|---|---|---|
| 찾기 | O(n) | O(W) |
| 줄 넣기 | O(1) · 끝에 붙인다 | O(W) |
| 줄 지우기 | O(n) · 먼저 찾아야 한다 | O(W) |
| 공간 | 줄 수에 비례 | 많게는 줄 수 × W 에 비례 |
줄을 훑는 표는 새 줄을 끝에 붙이기만 하면 됩니다. 지울 때는 그 줄을 먼저 찾아야 해서 O(n) 입니다. 트라이는 넣든 지우든 그 프리픽스를 따라 많아야 W 번 내려가면 됩니다.
트라이가 치르는 값은 메모리입니다. 한 비트씩 내려가면 줄 하나가 노드를 W 개까지 새로 만들 수 있습니다. 줄 수에 W 가 곱해지는 까닭입니다.
표가 틀렸을 때
경로표는 장비마다 따로 들고 있습니다. 그래서 표끼리 어긋날 수 있습니다. 어긋나면 패킷이 엉뚱한 곳으로 갑니다.
라우터 A 의 표는 B 에게 넘기라 하고 B 의 표는 A 에게 넘기라 하면, 패킷은 둘 사이를 오갑니다. 이렇게 같은 구간을 맴도는 것을 라우팅 루프라고 합니다. 앞에서 본 수렴이 끝나기 전에 흔히 생깁니다.
맴도는 패킷이 영원히 남지는 않습니다. 패킷에는 앞으로 몇 번 더 넘어갈 수 있는지를 적은 수가 붙어 있습니다. 장비를 지날 때마다 하나씩 줄고 0이 되면 버려집니다. 이 수를 TTL(Time To Live, 살아 있는 시간)이라고 부릅니다. 이름은 시간이지만 실제로는 넘어갈 수 있는 횟수로 씁니다.
다음 홉이 이미 꺼졌는데도 표가 아직 그쪽을 가리킬 때가 있습니다. 그러면 그 줄로 가는 패킷은 거기서 사라집니다. 보낸 쪽은 알림도 못 받고 응답만 기다리게 됩니다.
경로표를 보지 않는 전달
한 망 안에서 데이터를 나르는 장비는 스위치입니다. 스위치는 경로표를 보지 않습니다.
네트워크 장치마다 붙은 하드웨어 번호를 MAC 주소(Media Access Control address, 매체 접근 제어 주소)라고 합니다. 스위치는 IP 주소가 아니라 이 번호를 보고 데이터를 나릅니다.
스위치가 보는 표는 「이 MAC 주소는 몇 번 포트에 있다」를 적은 MAC 주소 테이블입니다. 경로표는 망과 망 사이를 건널 때 쓰입니다. MAC 주소 테이블은 한 망 안에서 쓰입니다.
경로표의 다음 홉 칸에는 IP 주소가 적힙니다. 그런데 회선에 실어 보내려면 그 장비의 MAC 주소가 있어야 합니다. IP 주소로 MAC 주소를 알아내는 절차가 ARP(Address Resolution Protocol, 주소 결정 프로토콜)입니다.
두 표는 한 번의 전달 안에서 이 순서로 이어집니다.
- 경로표에서 다음 홉의 IP 주소를 얻습니다
- ARP 로 그 IP 주소의 MAC 주소를 알아냅니다
- 그 MAC 주소를 받는 쪽으로 적어 회선에 내보냅니다
- 가는 길의 스위치가 MAC 주소 테이블을 보고 내보낼 포트를 고릅니다
관련 항목
경로표 한 줄을 이루는 구성 요소
프리픽스 · 서브넷 마스크 · CIDR · 다음 홉 · 네트워크 인터페이스 · 라우팅 메트릭
경로표에서 줄을 고르는 규칙
최장 프리픽스 매치 · 기본 경로 · 기본 게이트웨이 · 관리 거리 · 등가 다중 경로
경로표에 줄을 채우는 방식
정적 라우팅 · 동적 라우팅 · 라우팅 프로토콜 · OSPF · BGP · RIP · IS-IS · 수렴
경로표를 담고 찾는 자료구조
RIB · FIB · 포워딩 테이블 · 트라이 · 패트리샤 트리 · TCAM · 해시테이블
경로표를 들고 패킷을 넘기는 장비
라우터 · 호스트 · 게이트웨이 · L3 스위치 · 방화벽 · 로드 밸런서
경로표가 어긋날 때 나는 장애
라우팅 루프 · TTL · ICMP · 블랙홀 라우팅 · 경로 플래핑
경로표와 헷갈리는 이웃 표
MAC 주소 테이블 · ARP 테이블 · ARP · 스위치 · 페이지 테이블
경로표를 들여다보는 명령
ip route · netstat · traceroute
경로표가 속하는 상위 분류
다른 이름: routing table · 라우팅 테이블 · 라우팅 표