사전 라우터
개념

라우터

gabury1

라우터는 서로 다른 망을 이어 줍니다. 한쪽에서 받은 데이터를 다른 쪽 망으로 넘깁니다. 목적지 주소를 보고 어디로 보낼지 한 번에 한 걸음씩 고릅니다. 웹 프레임워크에서 요청 경로를 보고 처리할 함수를 고르는 부품도 같은 이름으로 부릅니다.

쉽고 빠른 이해

라우터는 망과 망의 경계에 서서 한쪽에서 받은 데이터를 다른 쪽으로 넘기는 장비입니다. 집에서 웹사이트를 열면 그 요청은 집 안의 라우터를 지나 통신사의 라우터를 거쳐 나갑니다.

세상의 컴퓨터를 하나의 망에 다 담을 수는 없습니다. 그래서 망을 여럿으로 나눕니다. 나누고 나면 망을 건너가는 길이 사라집니다. 그 길을 놓는 장비가 라우터입니다.

같은 망 안끼리는 라우터를 거치지 않습니다. 밖으로 나갈 때만 거칩니다.

  1. 들어온 데이터에서 목적지 주소를 읽습니다
  2. 자기가 들고 있는 표에서 그 주소에 맞는 줄을 찾습니다
  3. 그 줄이 가리키는 다음 장비로 내보냅니다

대가는 거쳐 갈 때마다 시간이 든다는 것입니다. 라우터는 목적지까지의 길 전체를 모르고 다음 한 걸음만 압니다. 그래서 표가 잘못 채워지면 데이터가 엉뚱한 곳을 돌다가 사라집니다.

상세

택배 상자를 부치면 상자는 목적지까지 한 번에 가지 않습니다. 가까운 물류센터로 들어갑니다. 거기서 목적지 지역을 맡은 센터로 넘어가고, 다시 동네 영업소로 갑니다. 센터가 아는 것은 전국 주소가 아니라 「이 지역 상자는 저 센터로 넘긴다」는 것뿐입니다.

라우터가 하는 일이 이 센터와 같습니다. 라우터는 망과 망의 경계에 서는 장비입니다. 받은 데이터 덩어리(패킷)의 목적지 주소를 읽고 다음으로 넘길 곳을 하나 골라 내보냅니다. 브라우저에서 서버까지 가는 동안 패킷은 이런 라우터를 여럿 거칩니다.

패킷은 주고받을 데이터를 망이 나를 수 있는 크기로 잘라 담은 한 덩어리입니다. 덩어리마다 겉면에 보내는 쪽과 받는 쪽의 IP 주소(Internet Protocol address, 인터넷 프로토콜 주소)가 적힙니다. 라우터가 읽는 것은 이 겉면입니다. 안에 든 내용은 들여다보지 않습니다.

block-beta
columns 4
  a["보내는 쪽 IP 주소"] b["받는 쪽 IP 주소"] c["남은 걸음 수"] d["안에 든 데이터"]
  e["라우터가 읽는 겉면"]:3 f["안 들여다본다"]:1

겉면에는 주소 말고 남은 걸음 수도 실립니다. 라우터를 한 번 넘어갈 때마다 하나씩 줄어드는 수입니다. 무엇에 쓰는지는 「한 걸음씩 넘어가는 전달」에서 봅니다.

망을 여럿으로 나누는 까닭

한 망 안의 컴퓨터끼리는 곧바로 데이터를 주고받습니다. 그래서 같은 사무실 안의 다른 컴퓨터에 보낼 때는 라우터를 거치지 않습니다. 라우터가 필요해지는 것은 밖으로 나갈 때입니다.

그러면 모든 컴퓨터를 한 망에 담아 라우터를 없애면 될 것 같습니다. 그렇게는 못 합니다. 한 망 안에서는 상대를 찾을 때 모두에게 대고 묻는 신호를 뿌립니다. 식구가 늘수록 이 신호가 늘어나 망이 그것만으로 찹니다.

주인이 다른 망도 걸립니다. 회사 망과 통신사 망은 하나로 합칠 수 없습니다.

그래서 망을 작게 여럿으로 나눕니다. 나누고 나면 망을 건너가는 길이 없어집니다. 그 길을 놓는 장비가 라우터입니다.

컴퓨터는 밖으로 나가는 패킷을 넘길 라우터의 주소를 한 줄 적어 둡니다. 그 주소를 기본 게이트웨이라고 합니다.

flowchart TD
    subgraph LAN["사내망"]
        PC1["컴퓨터"]
        PC2["컴퓨터"]
    end
    PC1 --- PC2
    PC1 -->|기본 게이트웨이| R["라우터"]
    R --> OUT["밖의 망"]

사내망 안의 두 컴퓨터는 서로 곧바로 이어집니다. 밖으로 나가는 길만 라우터를 지납니다.

경로표와 다음 홉

라우터는 목적지까지의 길 전체를 모릅니다. 대신 「어떤 주소 범위는 어디로 넘긴다」를 적은 표 하나를 들고 있습니다. 이 표를 경로표라고 합니다. 표가 가리키는 바로 다음 장비는 다음 홉입니다.

주소 범위는 앞자리를 몇 개까지 맞춰 적느냐로 정해집니다. 이 앞자리를 프리픽스라고 합니다. 주소 뒤에 붙은 /16 은 앞에서 16비트, 곧 주소의 앞 두 마디까지 같으면 이 줄에 걸린다는 뜻입니다. 프리픽스를 길게 적을수록 걸리는 주소가 좁아집니다.

어느 회사 라우터의 경로표를 간추리면 이런 모양입니다.

목적지 주소 범위 다음 홉 내보낼 회선
10.1.0.0/16 없음. 상대에게 곧바로 사내망 회선
10.2.0.0/16 지사를 맡은 라우터 지사와 이은 전용선
0.0.0.0/0 통신사 라우터 통신사와 이은 회선

세 줄 다 「범위 → 넘길 곳」 한 쌍입니다. 목적지가 옆 지사의 10.2.7.9 라면 둘째 줄과 셋째 줄에 함께 걸립니다. 이렇게 여럿이 맞으면 라우터는 프리픽스를 더 길게 적은 줄, 곧 더 좁게 맞는 줄을 고릅니다. 이 규칙을 최장 프리픽스 매치라고 합니다.

셋째 줄은 프리픽스를 한 자리도 안 적어서 모든 주소에 걸립니다. 제일 넓으니 언제나 맨 나중에 걸리고, 아무 줄도 못 찾았을 때의 마지막 출구 노릇을 합니다. 이 줄을 기본 경로라고 부릅니다.

flowchart TD
    A["패킷의 목적지 주소를 읽는다"] --> B{"경로표에 맞는 줄이 있나"}
    B -->|여럿 맞는다| C["더 좁게 맞는 줄을 고른다"]
    B -->|하나만 맞는다| D["그 줄을 고른다"]
    B -->|하나도 없다| E["버리고 보낸 쪽에 알린다"]
    C --> F["줄에 적힌 다음 홉으로 내보낸다"]
    D --> F

셋째 갈래는 기본 경로조차 없을 때 탑니다. 라우터는 갈 곳을 못 정한 그 패킷을 버리고, 보낸 쪽에 닿을 수 없다는 알림을 돌려줍니다.

한 걸음씩 넘어가는 전달

다음 홉으로 넘어간 패킷은 그 라우터에서 같은 판단을 다시 받습니다. 목적지에 닿을 때까지 이 판단이 되풀이됩니다. 이렇게 한 번 넘어가는 것을 홉이라고 합니다.

flowchart TD
    A["보내는 컴퓨터<br/>밖으로 나가는 것은 집 라우터로"]
    A --> R1["집 라우터<br/>밖의 주소는 통신사로"]
    R1 --> R2["통신사 라우터<br/>이 범위는 옆 사업자로"]
    R2 --> R3["서비스망 라우터<br/>이 주소는 내 망 안에 있다"]
    R3 --> B["받는 서버"]

라우터는 저마다 한 걸음씩만 압니다. 전체 경로를 쥔 곳은 어디에도 없습니다. 길이 바뀌면 바뀐 구간의 라우터만 표를 고칩니다. 나머지는 안 바꿔도 됩니다.

대신 잘못된 표를 서로 믿으면 패킷이 라우터 둘 사이를 왔다 갔다 하게 됩니다. 이렇게 같은 구간을 맴도는 것을 라우팅 루프라고 합니다. 이런 패킷은 목적지에 못 가면서 회선만 차지합니다.

맴돎을 끊는 것이 앞에서 본 남은 걸음 수입니다. 라우터는 패킷을 넘길 때마다 이 수를 하나 줄입니다. 0이 되면 어딘가에서 길을 잘못 들었다고 보고 버린 뒤, 보낸 쪽에 알립니다.

이 수를 TTL(Time To Live, 살아 있는 시간)이라 부릅니다. IPv6(Internet Protocol version 6, 인터넷 프로토콜 6판)에서는 같은 수를 홉 제한이라고 부릅니다. 앞에서 말한 한 걸음, 곧 홉을 몇 번까지 허용하느냐는 뜻입니다.

경로를 보여 주는 traceroute 명령이 이 성질을 씁니다. 걸음 수를 하나부터 늘려 가며 패킷을 보내면 매번 다른 라우터가 「걸음 수가 다 됐다」는 알림을 보내 옵니다. 그 알림을 보낸 라우터들을 차례로 늘어놓으면 패킷이 지나간 길이 됩니다.

지나갈 수 있는 크기의 한도

라우터와 다음 장비를 잇는 회선은 한 번에 나를 수 있는 크기가 정해져 있습니다. 이 한도를 MTU(Maximum Transmission Unit, 최대 전송 단위)라고 합니다. 받은 패킷이 내보낼 회선의 한도보다 크면 그 패킷은 손대지 않고는 못 나갑니다.

길은 둘입니다. 하나는 패킷을 작은 조각으로 쪼개 여러 번에 나눠 보내는 것입니다. 이 쪼개는 일을 단편화라고 합니다. 다른 하나는 쪼개지 않고 버린 뒤 보낸 쪽에 너무 크다고 알려 주는 것입니다.

IPv6 에서는 중간 라우터가 쪼개는 길이 아예 없습니다. 쪼개는 일은 보내는 쪽만 하고, 라우터는 못 보내면 버리고 알림만 돌려줍니다. 보낸 쪽은 그 알림에 적힌 한도에 맞춰 크기를 줄여 다시 보냅니다. 이렇게 길 전체가 견디는 크기를 알아내는 절차가 경로 MTU 탐색입니다.

flowchart TD
    A{"받은 패킷이 내보낼 회선의 한도보다 큰가"} -->|아니다| B["손대지 않고 내보낸다"]
    A -->|IPv4 에서 크다| C["단편화해 나눠 보낸다"]
    A -->|IPv6 에서 크다| D["버리고 「너무 크다」를 알린다"]
    D --> E["보낸 쪽이 크기를 줄여 다시 보낸다"]
    E --> A

되돌아오는 화살표가 경로 MTU 탐색입니다. 보낸 쪽은 알림을 받을 때마다 크기를 줄여 다시 보내고, 더 알림이 안 오면 그 크기가 길 전체를 지나갈 수 있는 크기입니다.

경로표를 채우는 두 방법

첫째는 손으로 적는 것입니다. 라우터가 몇 대뿐이고 연결이 바뀔 일도 드물면 이 편이 단순합니다. 회선 하나가 끊겼을 때 사람이 가서 고쳐 적어야 한다는 것이 대가입니다.

둘째는 라우터끼리 자기가 아는 경로를 서로 알려 주게 하는 것입니다. 이 주고받는 규칙을 라우팅 프로토콜이라고 합니다. 회선이 끊기면 그 소식이 이웃으로 퍼지고, 소식을 받은 라우터들이 표를 다시 계산해 우회로로 갈아탑니다.

인터넷은 회사나 통신사가 저마다 맡은 덩어리로 나뉘어 있습니다. 이 덩어리 하나를 자율 시스템이라고 합니다.

덩어리끼리 경로를 주고받을 때 쓰는 규칙이 BGP(Border Gateway Protocol, 경계 경로 프로토콜)입니다. 한 덩어리 안에서 쓰는 프로토콜은 OSPF(Open Shortest Path First, 최단 경로 우선)처럼 따로 있습니다.

flowchart TD
    subgraph ASA["자율 시스템 A"]
        A1["라우터"] ---|OSPF| A2["라우터"]
    end
    subgraph ASB["자율 시스템 B"]
        B1["라우터"] ---|OSPF| B2["라우터"]
    end
    A2 ---|BGP| B1

집과 사무실에 있는 라우터

집에서 공유기라고 부르는 상자는 라우터 하나가 아닙니다. 여러 장비를 한 몸에 담아 둔 것입니다. 그중 하나가 라우터입니다.

같은 상자가 안쪽 기기들에게 쓸 주소를 나눠 줍니다. 이 나눠 주는 규칙이 DHCP(Dynamic Host Configuration Protocol, 동적 호스트 설정 프로토콜)입니다. 덕분에 노트북을 연결하기만 하면 주소를 손으로 적지 않아도 됩니다.

안쪽 기기들이 쓰는 주소는 집 밖에서는 통하지 않는 주소입니다. 그래서 상자는 밖으로 나가는 패킷의 출발지 주소를 통신사에게 받은 주소 하나로 바꿔 내보냅니다. 답이 오면 원래 기기로 되돌려 놓습니다. 이 주소 바꿔치기를 NAT(Network Address Translation, 망 주소 변환)라고 합니다.

이 바꿔치기 때문에 걸리는 일이 하나 있습니다. 집에 띄운 서버는 밖에서 부를 주소가 없어서 그냥은 안 열립니다. 「이 포트로 온 요청은 안쪽의 이 기기로 넘겨라」를 공유기에 따로 적어 줘야 합니다. 이 설정을 포트 포워딩이라고 합니다.

이름이 같은 소프트웨어 부품

웹 프레임워크에서 들어온 요청의 경로를 보고 어느 함수를 부를지 고르는 부품도 라우터라고 부릅니다. 상자에 든 장비가 아니라 서버 프로그램 안의 코드 한 덩이입니다.

둘은 고르는 재료가 다릅니다. 망의 라우터는 목적지 주소와 경로표를 봅니다. 프레임워크의 라우터는 들어온 /users/42 같은 요청 경로를, 미리 등록해 둔 /users/{id} 같은 패턴과 맞춰 봅니다.

대신 하는 일의 모양은 같습니다. 목적지 표시를 읽고 후보 중에서 넘길 곳 하나를 고르는 것입니다. 이 일 자체를 라우팅이라고 합니다.

두 라우터는 계층이 달라서 한 번의 요청에서 둘 다 일합니다. 브라우저가 보낸 요청은 망의 라우터 여럿을 거쳐 서버에 닿습니다. 서버에 닿은 뒤에는 프레임워크의 라우터가 그 요청을 받을 함수를 고릅니다. 그 함수가 만든 응답은 다시 패킷이 되어 망의 라우터들을 거쳐 돌아갑니다.

sequenceDiagram
    participant B as 브라우저
    participant N as 망의 라우터
    participant S as 서버
    participant F as 프레임워크의 라우터
    B->>N: 요청
    N->>S: 요청
    S->>F: 이 경로는 어느 함수가 받나
    F-->>S: 이 함수가 받는다
    S->>N: 응답
    N-->>B: 응답

관련 항목

라우터가 나르는 데이터 단위와 주소 형식

패킷 · 데이터그램 · 프레임 · IP 주소 · IPv4 · IPv6 · MAC 주소

라우터가 다음 홉을 고를 때 보는 구성 요소

경로표 · 다음 홉 · 기본 경로 · 최장 프리픽스 매치 · 프리픽스 · 서브넷 · 서브넷 마스크 · 네트워크

경로표를 채우는 프로토콜과 방식

라우팅 프로토콜 · BGP · OSPF · RIP · 정적 라우팅 · 동적 라우팅 · 자율 시스템

라우터가 하는 일을 가리키는 개념

라우팅 · 포워딩 · 홉 · 홉 제한 · TTL · 브로드캐스트 도메인

같은 길목에 서는 다른 장비

게이트웨이 · 기본 게이트웨이 · 스위치 · 공유기 · 모뎀 · 로드 밸런서 · 프록시

크기 한도에 걸린 패킷을 처리하는 절차

MTU · 경로 MTU 탐색 · 단편화 · ICMP · Packet Too Big · 블랙홀 라우터

집과 사무실의 라우터가 함께 맡는 기능

NAT · DHCP · 포트 포워딩 · 사설 IP · 방화벽 · 무선 랜

라우터가 지나온 경로를 확인하는 명령

traceroute · ping · tracepath · mtr

라우터 둘레에서 생기는 장애

라우팅 루프 · 패킷 손실 · 혼잡 · 큐잉 지연 · MTU 불일치

요청 경로를 보고 처리기를 고르는 소프트웨어 부품

URL 디스패처 · 경로 패턴 · 미들웨어 · 리버스 프록시 · 인그레스 · API 게이트웨이

다른 이름: router · 라우팅 장비