라우팅
라우팅은 패킷이 출발지에서 목적지까지 최적의 경로를 찾아 이동하는 과정입니다. 라우터는 라우팅 테이블을 참조해 다음 홉(Next Hop)을 결정하며, RIP·OSPF·BGP 같은 라우팅 프로토콜이 이 테이블을 동적으로 갱신합니다.
핵심 개념
정적 vs 동적 라우팅
정적 라우팅은 관리자가 수동으로 경로를 설정합니다. 오버헤드가 없고 예측 가능하지만 네트워크 변화에 자동 대응이 불가능합니다. 동적 라우팅은 프로토콜이 자동으로 경로를 학습하고 갱신합니다. 장애 발생 시 대체 경로를 자동으로 찾습니다.
핵심 개념
RIP (거리 벡터)
Routing Information Protocol. 목적지까지의 홉(Hop) 수를 메트릭으로 사용합니다. 주기적으로(30초) 인접 라우터에 라우팅 테이블을 알립니다(RIPv1은 브로드캐스트, RIPv2는 멀티캐스트). 최대 홉 수 15로 소규모 네트워크에 적합합니다. 수렴 속도가 느리고 라우팅 루프 문제가 있습니다.
핵심 개념
OSPF (링크 상태)
Open Shortest Path First. 링크마다 설정하는 비용(Cost)을 메트릭으로 사용하며, 구현은 보통 대역폭에서 자동으로 계산합니다. 각 라우터가 전체 네트워크 토폴로지를 파악하고 다익스트라 알고리즘으로 최단 경로를 계산합니다. 변화가 생기면 LSA를 전파해 빠른 수렴을 얻고, 계층(Area) 설계로 확장성을 높입니다.
핵심 개념
BGP (경계 게이트웨이)
Border Gateway Protocol. 인터넷의 AS(자율 시스템) 간 라우팅을 담당합니다. 경로 속성(AS-PATH, NEXT-HOP, MED 등)을 기반으로 정책적 라우팅을 수행합니다. 인터넷의 핵심 라우팅 프로토콜로 전 세계 AS 간 경로 정보를 교환합니다.
핵심 개념
라우팅 테이블
목적지 네트워크, 서브넷 마스크, 게이트웨이(Next Hop), 인터페이스, 메트릭으로 구성됩니다. 패킷 수신 시 목적지 IP와 가장 길게 일치하는 항목(Longest Prefix Match)을 선택합니다. 기본 경로(0.0.0.0/0)는 일치 항목이 없을 때 사용하는 최후의 수단입니다.
핵심 개념
AS와 IGP/EGP
AS(Autonomous System)는 단일 관리 체계 아래 있는 라우터 집합입니다. IGP(Interior Gateway Protocol)는 AS 내부 라우팅으로 RIP·OSPF·EIGRP가 있습니다. EGP(Exterior Gateway Protocol)는 AS 간 라우팅으로 인터넷에서는 BGP를 씁니다.
라우팅과 포워딩
라우터는 패킷의 목적지 주소를 보고 자기 테이블에서 다음에 보낼 곳을 고릅니다. 경로 전체를 정하는 것이 아니라 한 홉씩 이어 가는 방식입니다. 테이블을 만드는 일을 라우팅, 테이블을 보고 패킷을 내보내는 일을 포워딩이라고 구분해 부릅니다. 인터넷은 자율 시스템(AS)이라는 관리 단위가 BGP로 서로 연결된 구조입니다.
숫자로 확인하기
자주 하는 오해
면접에서 이렇게 물어요
면접 질문
거리 벡터와 링크 상태 방식은 어떻게 다른가요?
거리 벡터(RIP)는 이웃에게 받은 거리 정보를 이어 붙여 경로를 학습하고, 링크 상태(OSPF)는 모든 라우터가 같은 토폴로지 정보를 갖고 각자 최단 경로를 계산합니다. 링크 상태가 수렴이 빠르지만 정보를 더 많이 관리합니다.
면접 질문
OSPF와 BGP는 어떻게 다른가요?
OSPF는 한 AS 안에서 최단 경로를 구하는 IGP이고, BGP는 AS 사이에서 경로 속성과 정책으로 경로를 고르는 EGP입니다. 같은 조직의 네트워크 안은 OSPF, 인터넷의 AS 사이는 BGP를 씁니다.
면접 질문
가장 긴 접두사 일치는 무엇인가요?
목적지 주소와 일치하는 항목이 여러 개일 때 접두사 길이가 가장 긴, 곧 가장 구체적인 항목을 고르는 규칙입니다. 이 덕분에 큰 대역 안의 일부만 다른 경로로 보낼 수 있습니다.
면접 질문
라우팅 루프는 왜 생기고 어떻게 막나요?
거리 벡터 방식에서 장애 뒤 서로 상대를 통해 갈 수 있다고 잘못 알려 주며 경로가 돌 수 있습니다. 분할 지평선은 경로를 배운 방향으로 되돌려 광고하지 않고, 홉 수의 상한이 무한 증가를 끊습니다.
실제 시스템에서는
ip route show로 라우팅 테이블을, ip route get 주소로 특정 목적지에 쓰이는 경로를 볼 수 있습니다(ip-route(8) 매뉴얼).
함께 보면 좋은 토픽
참고 자료
Java — 다익스트라 알고리즘으로 OSPF 최단 경로 구현
import java.util.*; public class OspfDijkstra { // 라우터 그래프: 인접 리스트 (노드, 비용) static final int INF = Integer.MAX_VALUE / 2; static int N = 6; // A=0, B=1, C=2, D=3, E=4, F=5 static List<int[]>[] buildGraph() { List<int[]>[] graph = new List[N]; for (int i = 0; i < N; i++) graph[i] = new ArrayList<>(); // {인접노드, OSPF비용} int[][] edges = { {0,1,1}, {1,2,1}, {2,5,1}, // A-B, B-C, C-F {0,3,5}, {3,4,1}, {4,5,1}, // A-D(비용5), D-E, E-F {1,4,2}, // B-E(비용2) }; for (int[] e : edges) { graph[e[0]].add(new int[]{e[1], e[2]}); graph[e[1]].add(new int[]{e[0], e[2]}); } return graph; } // 다익스트라: src에서 모든 노드까지 최단 비용 static int[] dijkstra(List<int[]>[] graph, int src) { int[] dist = new int[N]; int[] prev = new int[N]; // 경로 역추적용 Arrays.fill(dist, INF); Arrays.fill(prev, -1); dist[src] = 0; // {비용, 노드} — 최소 힙 PriorityQueue<int[]> pq = new PriorityQueue<>( Comparator.comparingInt(a -> a[0]) ); pq.offer(new int[]{0, src}); while (!pq.isEmpty()) { int[] cur = pq.poll(); int cost = cur[0], node = cur[1]; if (cost > dist[node]) continue; // 이미 처리됨 for (int[] next : graph[node]) { int newCost = dist[node] + next[1]; if (newCost < dist[next[0]]) { dist[next[0]] = newCost; prev[next[0]] = node; pq.offer(new int[]{newCost, next[0]}); } } } return dist; // dist[5] = A→F 최단 비용 } public static void main(String[] args) { var graph = buildGraph(); int[] dist = dijkstra(graph, 0); // A=0 출발 String[] names = {"A","B","C","D","E","F"}; for (int i = 0; i < N; i++) System.out.printf("A→%s: %d%n", names[i], dist[i]); // A→F: 3 (A→B→C→F = 1+1+1) } }
OSPF가 내부적으로 실행하는 SPF(Shortest Path First) 알고리즘은 다익스트라와 동일합니다.
우선순위 큐를 사용해 O((V+E)logV) 복잡도로 최단 경로를 찾습니다.
A-D 링크 비용이 5로 높아 D를 경유하는 경로는 선택되지 않습니다.
실제 OSPF에서 비용은 10^8/대역폭(bps)으로 계산하므로 빠른 링크일수록 비용이 낮습니다.
prev 배열로 경로를 역추적합니다. dst에서 src까지 prev를 따라가면 최단 경로를 복원할 수 있습니다.
실제 OSPF 구현에서는 Area 개념, DR/BDR 선출, LSA 플러딩 등 추가 메커니즘이 있습니다.
Python — RIP 거리 벡터 시뮬레이션
from copy import deepcopy # 그래프: 인접 행렬 (RIP는 홉 수만 사용, 비용은 모두 1) INF = float('inf') N = 6 # A=0, B=1, C=2, D=3, E=4, F=5 adj = [[INF]*N for _ in range(N)] for i in range(N): adj[i][i] = 0 for a, b in [(0,1),(1,2),(2,5),(0,3),(3,4),(4,5),(1,4)]: adj[a][b] = adj[b][a] = 1 # RIP: 홉 수 = 1 # RIP 거리 벡터: 각 라우터의 라우팅 테이블 # dist[i][j] = 라우터 i에서 j까지의 홉 수 dist = [[adj[i][j] for j in range(N)] for i in range(N)] def rip_update(): """벨만-포드 기반 거리 벡터 갱신 (한 라운드)""" changed = False new_dist = deepcopy(dist) for i in range(N): # 각 라우터 for j in range(N): # 목적지 for k in range(N): # 인접 라우터를 통한 경로 if adj[i][k] < INF and dist[k][j] < INF: via_k = adj[i][k] + dist[k][j] if via_k < new_dist[i][j]: new_dist[i][j] = via_k changed = True dist[:] = new_dist return changed # 수렴할 때까지 반복 names = list("ABCDEF") for round_num in range(1, 16): # 최대 15홉 (RIP 제한) if not rip_update(): print(f"라운드 {round_num}에서 수렴") break # A(0)의 최종 라우팅 테이블 print("A의 라우팅 테이블:") for j in range(N): print(f" → {names[j]}: {dist[0][j]}홉") # → F: 3홉 (A→B→C→F 또는 A→B→E→F 또는 A→D→E→F)
RIP는 벨만-포드 알고리즘을 기반으로 합니다. 각 라우터가 자신의 거리 벡터를 인접 라우터와 교환하고, 더 짧은 경로를 발견하면 갱신합니다.
수렴에 최대 N-1 라운드가 필요합니다. 네트워크가 클수록 수렴이 느려지는 것이 RIP의 단점입니다.
OSPF의 다익스트라는 한 번의 계산으로 모든 최단 경로를 구합니다.
실제 RIP는 30초마다 전체 라우팅 테이블을 브로드캐스트합니다. 대규모 네트워크에서는 불필요한 트래픽이 많아집니다.
분할 지평선(Split Horizon)을 추가하면 라우팅 루프를 방지할 수 있습니다.
경로를 배운 인터페이스로 같은 경로를 다시 광고하지 않는 기법입니다.
Q1
RIP(Routing Information Protocol)이 최적 경로를 판단하는 기준은?
Q2
RIP(Routing Information Protocol)이 최적 경로를 판단하는 기준은?
Q3
OSPF가 RIP보다 대규모 네트워크에 더 적합한 이유는?
Q4
OSPF가 RIP보다 대규모 네트워크에 더 적합한 이유는?
Q5
라우팅에서 '비용이 싼 링크'를 선호하는 이유는?
Q6
라우팅에서 '비용이 싼 링크'를 선호하는 이유는?