컴퓨터 구조 운영체제 네트워크 자료구조 알고리즘 데이터베이스 내 학습
network · 05

라우팅

네트워크라우팅IP

라우팅은 패킷이 출발지에서 목적지까지 최적의 경로를 찾아 이동하는 과정입니다. 라우터는 라우팅 테이블을 참조해 다음 홉(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를 씁니다.

다익스트라 알고리즘 (OSPF) — OSPF는 각 라우터가 링크 상태 데이터베이스(LSDB)를 기반으로 다익스트라 SPF 알고리즘을 실행해 최단 경로 트리를 계산합니다. 비용(Cost)은 기준 대역폭을 링크 대역폭으로 나눈 값으로 정하는 것이 일반적이며, 많은 구현의 기본 기준 대역폭 100Mbps에서 100Mbps 링크의 비용은 1입니다.
라우팅 루프와 분할 지평선 — RIP에서 A→B→C 경로 장애 시 B와 C가 서로를 통해 A로 갈 수 있다고 잘못 학습하는 루프가 발생할 수 있습니다. 분할 지평선(Split Horizon)은 경로를 배운 방향으로 다시 광고하지 않아 이를 방지합니다.
ECMP (Equal-Cost Multi-Path) — 같은 비용의 경로가 여러 개일 때 트래픽을 분산합니다. OSPF와 EIGRP 모두 지원하며, 보통 패킷 순서가 바뀌지 않도록 흐름 단위 해시로 분산합니다. 링크 활용도를 높이고 장애 내성을 강화합니다.
SDN (소프트웨어 정의 네트워킹) — 제어 평면(Control Plane)을 데이터 평면(Data Plane)에서 분리해 중앙에서 라우팅을 제어합니다. OpenFlow 프로토콜로 스위치·라우터를 프로그래밍합니다. 일부 데이터센터와 클라우드 네트워크에서 쓰입니다.

라우팅과 포워딩

라우터는 패킷의 목적지 주소를 보고 자기 테이블에서 다음에 보낼 곳을 고릅니다. 경로 전체를 정하는 것이 아니라 한 홉씩 이어 가는 방식입니다. 테이블을 만드는 일을 라우팅, 테이블을 보고 패킷을 내보내는 일을 포워딩이라고 구분해 부릅니다. 인터넷은 자율 시스템(AS)이라는 관리 단위가 BGP로 서로 연결된 구조입니다.

숫자로 확인하기

가장 긴 접두사 일치 — 목적지가 10.1.2.3이고 테이블에 10.0.0.0/8, 10.1.0.0/16, 10.1.2.0/24, 0.0.0.0/0이 있으면 앞의 24비트가 일치하는 10.1.2.0/24가 가장 길게 일치하므로 이 항목을 씁니다. 0.0.0.0/0은 길이가 0이라 모든 주소와 일치하지만 가장 마지막 순위입니다.
/24의 크기 — 접두사 길이가 24이면 호스트 부분이 8비트라서 주소가 2⁸ = 256개이고, 네트워크 주소와 브로드캐스트 주소를 빼면 일반적인 /24에서 호스트 254개를 둡니다(/31, /32 같은 특수 용도는 예외입니다).
OSPF 비용 계산 — 기준 대역폭이 100Mbps인 흔한 기본 설정에서 비용은 100Mbps / 링크 대역폭입니다. 10Mbps 링크는 10, 100Mbps 링크는 1이고, 1Gbps 링크는 계산값이 1보다 작아지는데, 구현에 따라 비용이 같은 1로 처리되어 100Mbps와 구별되지 않을 수 있습니다. 그래서 고속 링크가 있는 망은 기준 대역폭을 올려 씁니다.
RIP의 홉 한계와 AS 번호 — RIP는 홉 15개까지만 유효하고 16이면 도달 불가로 봅니다. AS 번호는 처음 16비트(65,536개)였다가 RFC 6793에서 32비트(4,294,967,296개)로 늘었습니다.

자주 하는 오해

라우터가 출발지에서 목적지까지 전체 경로를 안다 — 라우터는 다음 홉만 압니다. 링크 상태 프로토콜은 토폴로지를 알지만 패킷은 각 라우터의 판단으로 홉마다 이어집니다.
BGP는 가장 짧은 경로를 고른다 — BGP는 정책을 반영합니다. RFC 4271은 경로마다 선호도(degree of preference, AS 내부에서는 LOCAL_PREF로 전달)를 먼저 정하고, 선호도가 같을 때 AS-PATH 길이 등으로 가린다고 설명합니다.
라우팅과 포워딩은 같은 말이다 — 라우팅은 테이블을 만드는 제어 과정이고 포워딩은 테이블을 보고 패킷을 내보내는 데이터 과정입니다.
정적 라우팅은 구식이다 — 경로가 단순하고 바뀌지 않는 곳에서는 지금도 흔히 쓰이며, 기본 경로(0.0.0.0/0) 설정이 대표적입니다.

면접에서 이렇게 물어요

면접 질문

거리 벡터와 링크 상태 방식은 어떻게 다른가요?

거리 벡터(RIP)는 이웃에게 받은 거리 정보를 이어 붙여 경로를 학습하고, 링크 상태(OSPF)는 모든 라우터가 같은 토폴로지 정보를 갖고 각자 최단 경로를 계산합니다. 링크 상태가 수렴이 빠르지만 정보를 더 많이 관리합니다.

면접 질문

OSPF와 BGP는 어떻게 다른가요?

OSPF는 한 AS 안에서 최단 경로를 구하는 IGP이고, BGP는 AS 사이에서 경로 속성과 정책으로 경로를 고르는 EGP입니다. 같은 조직의 네트워크 안은 OSPF, 인터넷의 AS 사이는 BGP를 씁니다.

면접 질문

가장 긴 접두사 일치는 무엇인가요?

목적지 주소와 일치하는 항목이 여러 개일 때 접두사 길이가 가장 긴, 곧 가장 구체적인 항목을 고르는 규칙입니다. 이 덕분에 큰 대역 안의 일부만 다른 경로로 보낼 수 있습니다.

면접 질문

라우팅 루프는 왜 생기고 어떻게 막나요?

거리 벡터 방식에서 장애 뒤 서로 상대를 통해 갈 수 있다고 잘못 알려 주며 경로가 돌 수 있습니다. 분할 지평선은 경로를 배운 방향으로 되돌려 광고하지 않고, 홉 수의 상한이 무한 증가를 끊습니다.

실제 시스템에서는

Linux에서 보기 — ip route show로 라우팅 테이블을, ip route get 주소로 특정 목적지에 쓰이는 경로를 볼 수 있습니다(ip-route(8) 매뉴얼).
BGP 사고 사례 — 2008년 한 사업자가 YouTube의 주소 대역을 잘못 광고해 트래픽이 엉뚱한 곳으로 향한 사건을 RIPE NCC가 BGP 수집 데이터로 분석해 공개했습니다.
애니캐스트 — CDN이나 DNS 루트 서버처럼 같은 주소를 여러 곳에서 광고하는 서비스는 BGP로 사용자를 가까운 곳으로 보냅니다. 이때 가깝다는 것은 BGP 경로 기준이며 지리적 거리와 다를 수 있습니다.

함께 보면 좋은 토픽

OSI 7계층 — 라우터가 동작하는 네트워크 계층의 위치를 봅니다.
TCP/IP — IP 주소와 패킷 전달의 기본을 봅니다.
DNS — 루트 서버의 애니캐스트와 BGP의 관계를 봅니다.
CDN — 애니캐스트로 가까운 엣지를 고르는 방식을 봅니다.
로드 밸런서 — 라우팅과 다른 층에서 트래픽을 나누는 방식을 봅니다.
유니 / 멀티 / 브로드캐스트 — 한 명, 그룹, 같은 네트워크 모두에게 보내는 세 가지 전송 방식을 봅니다.

참고 자료

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)이 최적 경로를 판단하는 기준은?

거쳐가는 라우터 개수를 셉니다.
RIP은 목적지까지 거치는 라우터 수(홉 수)가 가장 적은 경로를 최적 경로로 선택하는 거리 벡터 기반 프로토콜입니다.

Q2

RIP(Routing Information Protocol)이 최적 경로를 판단하는 기준은?

거쳐가는 라우터 개수를 셉니다.
RIP은 목적지까지 거치는 라우터 수(홉 수)가 가장 적은 경로를 최적 경로로 선택하는 거리 벡터 기반 프로토콜입니다.

Q3

OSPF가 RIP보다 대규모 네트워크에 더 적합한 이유는?

단순히 개수만 세는 게 아니라 '비용'을 고려합니다.
OSPF는 링크 상태(대역폭 등 비용)를 기반으로 최단 경로를 계산하는 링크 상태 프로토콜로, RIP보다 정교하고 대규모 네트워크에서 수렴 속도도 빠릅니다.

Q4

OSPF가 RIP보다 대규모 네트워크에 더 적합한 이유는?

단순히 개수만 세는 게 아니라 '비용'을 고려합니다.
OSPF는 링크 상태(대역폭 등 비용)를 기반으로 최단 경로를 계산하는 링크 상태 프로토콜로, RIP보다 정교하고 대규모 네트워크에서 수렴 속도도 빠릅니다.

Q5

라우팅에서 '비용이 싼 링크'를 선호하는 이유는?

홉 수는 적어도 느린 회선일 수 있습니다.
홉 수가 적어도 그 구간이 저속 회선이면 오히려 느릴 수 있으므로, OSPF처럼 비용(대역폭, 지연 등)을 반영하는 방식이 실제 성능에 더 유리한 경로를 찾을 수 있습니다.

Q6

라우팅에서 '비용이 싼 링크'를 선호하는 이유는?

홉 수는 적어도 느린 회선일 수 있습니다.
홉 수가 적어도 그 구간이 저속 회선이면 오히려 느릴 수 있으므로, OSPF처럼 비용(대역폭, 지연 등)을 반영하는 방식이 실제 성능에 더 유리한 경로를 찾을 수 있습니다.