RIP
고친 사람 github-actions[bot]
RIP 는 한 조직의 네트워크 안에서 라우터들이 목적지로 가는 길을 서로 알려 주게 합니다. 라우터마다 30초에 한 번씩 자기가 아는 목적지와 거기까지의 거리를 이웃에게 알립니다. 거리는 자기 자신을 포함해 목적지까지 지나는 라우터 수로 잽니다. 구조가 단순해서 작은 네트워크에서 씁니다.
쉽고 빠른 이해
RIP 는 라우터끼리 「어디까지 몇 단계면 간다」를 주고받게 합니다. 사무실 세 곳을 라우터 세 대로 이으면, 각 라우터가 옆 라우터에게 들은 거리에 하나를 더해 자기 표에 적습니다.
사람이 표를 손으로 적어 두면 회선 하나가 끊겨도 라우터는 그 사실을 모릅니다. 끊긴 길로 계속 패킷을 보냅니다. RIP 를 켜 두면 라우터가 스스로 길을 배웁니다. 길이 사라지면 표에서 지웁니다.
어떻게 도나:
- 라우터가 켜지면 이웃에게 아는 길을 전부 달라고 묻습니다
- 그 뒤로는 30초마다 자기 표를 통째로 이웃에게 보냅니다
- 이웃이 알려 준 거리에 하나를 더해, 더 가까운 길이면 표를 고칩니다
- 한 이웃에게서 한동안 소식이 없으면 그 이웃을 거치는 길을 지웁니다
대가도 있습니다. 거리가 16 이면 갈 수 없는 것으로 쳐서 큰 네트워크에는 못 씁니다. 길이 바뀐 소식이 한 라우터씩 건너 퍼져서 모두가 맞춰지기까지 오래 걸립니다. 회선 속도는 보지 않고 거치는 라우터 수만 봅니다.
상세
RIP(Routing Information Protocol, 라우팅 정보 프로토콜)는 라우터끼리 길 정보를 주고받는 규칙입니다. 패킷을 받아 목적지 쪽으로 넘겨주는 장비가 라우터입니다. 라우터는 목적지마다 어디로 넘길지 적어 둔 표를 들고 있습니다. 이 표가 경로표입니다.
경로표를 사람이 손으로 채우는 방식을 정적 라우팅이라고 합니다. 회선이 끊기거나 새 네트워크가 붙으면 사람이 표를 다시 고쳐야 합니다. 라우터끼리 정보를 주고받아 표를 스스로 채우게 하는 규칙이 라우팅 프로토콜입니다. RIP 는 그 가운데 하나입니다.
이 절은 RIP 가 거리를 어떻게 전하는지에서 출발합니다. 이어서 거리를 재는 단위, 주고받는 메시지, 길을 지우는 타이머를 봅니다. 뒤쪽에서는 이 방식이 빠지는 함정과 그 대책, 두 판의 차이, RIP 가 맞는 네트워크를 짚습니다.
거리 벡터 방식
RIP 의 라우터는 네트워크 전체의 모양을 모릅니다. 아는 것은 자기 경로표 하나뿐입니다. 라우터는 이 표에 적힌 목적지와 거리를 이웃에게 알립니다. 이웃이 알려 온 것으로는 자기 표를 고칩니다. 이렇게 목적지별 거리만 주고받는 방식을 거리 벡터 라우팅이라고 합니다.
다음 홉은 패킷을 넘겨줄 바로 다음 라우터입니다. RIP 의 경로표 한 줄에는 목적지, 거기까지의 거리, 그리고 이 다음 홉이 적힙니다.
목적지는 주소 하나가 아니라 주소 묶음입니다. 10.3.0.0/16 은 앞 16비트가 10.3 으로 같은 주소를 한 묶음으로 친다는 표기입니다. 경로표의 목적지 한 줄이 이런 묶음 하나입니다.
라우터 A, B, C 가 한 줄로 이어져 있다고 해 봅시다. C 에는 묶음 10.3.0.0/16 이 직접 붙어 있습니다. 직접 붙은 네트워크는 거리 1 로 칩니다. 라우터를 하나 건널 때마다 1 씩 더합니다.
C 는 이 묶음까지 거리 1 이라고 B 에게 알립니다. B 는 1 을 더해 거리 2 로 적습니다. 다음 홉은 C 로 적습니다.
flowchart TD
N["네트워크 10.3.0.0/16"]
C["라우터 C · 거리 1 · 직접 붙어 있다"]
B["라우터 B · 거리 2 · 다음 홉 C"]
A["라우터 A · 거리 3 · 다음 홉 B"]
N --- C
C -->|"거리 1 을 알린다"| B
B -->|"거리 2 를 알린다"| A
그림에서 거리는 한 라우터를 건널 때마다 1 씩 늘어납니다. A 는 C 가 있는 줄도 모릅니다. B 가 알려 준 2 만 믿고 3 으로 적습니다.
표를 고치는 규칙은 둘입니다. 같은 목적지를 여러 이웃이 알려 오면 합한 거리가 작은 쪽을 고릅니다. 지금 다음 홉인 이웃이 알려 온 소식은 거리가 늘어도 그대로 받아 적습니다. 그 이웃을 거치는 길이 실제로 멀어졌다는 뜻이기 때문입니다.
이 계산은 벨만-포드 알고리즘을 라우터들이 나눠 돌리는 꼴입니다. 벨만-포드 알고리즘은 이웃까지의 거리를 더해 가며 가장 짧은 거리를 좁혀 가는 계산 방법입니다.
홉 수로 재는 거리
RIP 가 재는 거리는 목적지까지 지나는 라우터의 수입니다. 자기 자신도 하나로 셉니다. 앞 예에서 C 가 1, A 가 3 인 까닭입니다. 라우터 하나를 지나는 것을 홉이라 부르므로 이 거리를 홉 수라고 합니다.
길을 견주려고 매기는 값을 라우팅 메트릭이라고 합니다. RIP 의 메트릭은 홉 수 하나뿐입니다. 회선의 속도는 보지 않습니다.
10Mbps 회선 하나로 곧장 가는 길과 1Gbps 회선 둘을 거쳐 가는 길이 있다고 해 봅시다. RIP 는 10Mbps 쪽을 고릅니다. 홉이 하나 적기 때문입니다.
16 은 갈 수 없다는 뜻
RIP 에서 쓸 수 있는 거리는 1 부터 15 까지입니다. 거리 16 은 「갈 수 없음」을 뜻합니다. 흔히 무한대라고 부릅니다. 그래서 끝에서 끝까지 15홉이 넘는 네트워크에는 RIP 를 쓸 수 없습니다.
상한을 이렇게 낮게 둔 까닭은 뒤의 「무한 카운트」 소절에서 봅니다. 잘못된 거리가 계속 오르는 사고가 나도 16 에서 멈추게 하려는 것입니다.
주고받는 메시지
RIP 의 메시지는 둘입니다. 길을 달라고 묻는 Request 와 길 목록을 싣는 Response 입니다. Response 한 통에는 목적지와 거리의 쌍이 25개까지 실립니다. 목록이 더 길면 여러 통으로 나눠 보냅니다.
메시지는 UDP(User Datagram Protocol, 사용자 데이터그램 프로토콜)의 520번 포트로 오갑니다. UDP 는 보낸 것이 도착했는지 확인하지 않는 전송 방식입니다. RIP 는 어차피 30초마다 표를 다시 보내므로, 한 통이 빠져도 다음 주기에 메워집니다.
sequenceDiagram
participant 새 as 막 켜진 라우터
participant 이웃 as 이웃 라우터
새->>이웃: Request · 아는 길을 전부 달라
이웃-->>새: Response · 목적지와 거리 목록
Note over 새,이웃: 이후 30초마다 되풀이
이웃->>새: Response · 표 전체
새->>이웃: Response · 표 전체
그림처럼 막 켜진 라우터는 Request 를 보내 표를 빨리 채웁니다. 그 뒤로는 묻지 않아도 30초마다 서로 Response 를 보냅니다. 새 소식이 없어도 표 전체를 보내므로, 이 Response 는 「나 아직 살아 있다」는 신호 노릇도 합니다.
길을 지우는 두 타이머
라우터는 경로표의 줄마다 마지막으로 소식을 들은 때를 기억합니다. 한 줄에 대해 180초 동안 새 Response 가 오지 않으면 그 길이 만료됐다고 봅니다. 30초 주기를 여섯 번 놓친 셈입니다.
만료된 길은 바로 지우지 않습니다. 먼저 거리를 16 으로 바꿔 두고 120초를 더 기다립니다. 그동안 이웃에게는 「이 길은 이제 갈 수 없음」을 알립니다. 곧바로 지우면 이웃에게 사라졌다는 소식을 전할 기회가 없기 때문입니다.
stateDiagram-v2
[*] --> 유효: Response 로 길을 배움
유효 --> 유효: 30초마다 새 소식
유효 --> 만료: 180초 동안 소식 없음
만료 --> 유효: 더 나은 길을 새로 들음
만료 --> [*]: 120초 뒤 표에서 지움
만료 상태의 길은 거리 16 으로 표에 남아 이웃에게 알려집니다. 120초 안에 다른 이웃이 쓸 만한 길을 알려 오면 그 길로 되살아납니다.
무한 카운트
거리 벡터 방식에는 잘 알려진 함정이 있습니다. 목적지가 사라졌는데 라우터 둘이 서로를 믿고 거리를 한 칸씩 올려 가는 현상입니다. 이 현상을 무한 카운트(count to infinity)라고 부릅니다.
앞의 A, B, C 예에서 C 와 10.3.0.0/16 사이 회선이 끊겼다고 해 봅시다. C 가 이 소식을 알리기 전에 B 의 정기 Response 가 먼저 C 에 닿으면 일이 꼬입니다. 아래에서는 이 묶음을 줄여 10.3 이라고 적습니다. B 는 「10.3 까지 거리 2」라고 알립니다. C 는 그 말을 듣고 B 너머에 길이 있다고 믿습니다.
sequenceDiagram
participant B as 라우터 B
participant C as 라우터 C
Note over C: 10.3 으로 가는 회선이 끊긴다
B->>C: 10.3 까지 거리 2
Note over C: 다음 홉 B · 거리 3 으로 적는다
C->>B: 10.3 까지 거리 3
Note over B: 다음 홉 C 의 소식이라 늘어도 받는다 · 거리 4
B->>C: 10.3 까지 거리 4
Note over B,C: 16 에 닿을 때까지 되풀이
B 의 거리 2 는 원래 C 를 거친 길이었습니다. C 는 그 사실을 모르고 자기 길을 B 에게서 다시 배운 것입니다. 이제 B 는 C 를, C 는 B 를 다음 홉으로 적습니다. 그 사이 10.3 으로 가는 패킷은 둘 사이를 맴돕니다. 이런 상태가 라우팅 루프입니다.
거리는 주고받을 때마다 하나씩 오르다 16 에서 멈춥니다. 16 에 닿아야 둘 다 「갈 수 없음」으로 정리합니다. 30초 주기에 맞춰 한 칸씩 오르면 몇 분이 걸릴 수 있습니다. 상한이 없으면 이 수가 끝없이 오르므로, RIP 는 상한을 16 으로 낮게 잡았습니다.
무한 카운트를 줄이는 장치
RIP 는 이 함정을 줄이는 장치 셋을 씁니다. 셋 다 「받은 길을 준 쪽에 되돌려 주지 않기」 또는 「길이 사라진 소식을 서둘러 퍼뜨리기」에 해당합니다.
| 장치 | 하는 일 |
|---|---|
| 스플릿 호라이즌 | 어떤 이웃에게서 배운 길을 그 이웃에게는 알리지 않는다 |
| 포이즌 리버스 | 그 이웃에게 알리되 거리를 16 으로 적어 알린다 |
| 트리거 업데이트 | 길이 바뀌면 30초를 기다리지 않고 바로 알린다 |
앞 예에서 B 는 10.3 으로 가는 길을 C 에게서 배웠습니다. 스플릿 호라이즌을 켜면 B 는 이 길을 C 에게 알리지 않으므로, C 가 B 너머에 길이 있다고 착각할 일이 없습니다. 포이즌 리버스는 여기서 한발 더 나가 「네가 알려 준 그 길은 내 쪽으로는 갈 수 없다」고 못 박습니다.
아래는 포이즌 리버스를 켠 B 가 C 에게 보내는 Response 한 통을 줄마다 풀어 적은 것입니다. 그 아래 두 줄은 A 와 B 쪽 네트워크입니다.
Response · B 가 C 에게
10.3.0.0/16 거리 16 // C 에게 배운 길
10.1.0.0/16 거리 2 // A 너머
10.2.0.0/16 거리 1 // B 에 붙음
첫 줄이 포이즌 리버스입니다. C 에게서 배운 길을 거리 16 으로 돌려주므로 C 는 이 줄을 믿고 B 를 거쳐 가지 않습니다. 트리거 업데이트는 C 가 회선이 끊긴 소식을 30초 기다리지 않고 바로 보내게 해서, B 의 옛 소식이 먼저 닿는 틈을 좁힙니다.
세 장치로도 모든 루프가 막히지는 않습니다. 라우터 셋 이상이 고리 모양으로 이어져 있으면, 소식이 돌아서 들어와 여전히 거리가 오를 수 있습니다. 그때 마지막으로 멈추는 장치가 앞의 상한 16 입니다.
RIPv1 과 RIPv2
RIP 에는 두 판이 있습니다. 처음 판을 RIPv1, 뒤에 고친 판을 RIPv2 라고 부릅니다. 가장 큰 차이는 서브넷 마스크를 싣느냐입니다. 서브넷 마스크는 주소의 앞 몇 비트까지가 네트워크 번호인지 알려 주는 값입니다.
RIPv1 은 목적지 주소만 싣습니다. 마스크는 싣지 않습니다. 그래서 받은 쪽은 주소의 첫 부분을 보고 묶음 크기를 짐작합니다. 주소 첫 부분으로 묶음 크기가 정해지던 옛 방식을 클래스풀 주소 체계라고 합니다.
이 방식에서는 10 으로 시작하는 주소를 앞 8비트까지 한 묶음으로 봅니다. 그러면 10.3.0.0/16 과 10.1.0.0/16 처럼 잘게 나눈 묶음이 10.0.0.0/8 하나로 뭉개집니다. 오늘날처럼 묶음 크기를 자유롭게 나눠 쓰는 네트워크에서는 이 짐작이 틀립니다.
RIPv2 는 목적지마다 마스크를 함께 싣습니다. 그래서 /16 이든 /24 든 묶음 크기를 바꾸지 않고 전할 수 있습니다.
메시지를 받는 쪽도 다릅니다. RIPv1 은 같은 네트워크의 모든 장비에게 한꺼번에 보내는 브로드캐스트를 씁니다. RIPv2 는 정해진 무리에게만 보내는 멀티캐스트를 씁니다. RIP 라우터만 듣는 주소 224.0.0.9 로 보내므로, 같은 네트워크의 다른 컴퓨터는 이 메시지를 받지 않습니다.
판마다 달라진 점을 모으면 아래와 같습니다.
| RIPv1 | RIPv2 | |
|---|---|---|
| 서브넷 마스크 | 안 싣는다 | 목적지마다 싣는다 |
| 받는 쪽 | 같은 네트워크의 모든 장비 | RIP 라우터만 |
| 인증 | 없다 | 메시지에 인증 정보를 실을 수 있다 |
| 다음 홉 | 보낸 라우터로 친다 | 다른 라우터를 다음 홉으로 적어 보낼 수 있다 |
표의 셋째 줄인 인증은 아무 장비나 가짜 Response 를 보내 길을 바꾸지 못하게 막는 장치입니다. RIPv1 에는 이 장치가 없습니다. 같은 네트워크에 붙은 장비라면 누구든 거짓 거리를 알려 길을 틀 수 있습니다.
넷째 줄의 다음 홉은 한 네트워크에 라우터가 여럿 붙어 있을 때 쓰입니다. RIPv1 에서는 Response 를 보낸 라우터가 곧 다음 홉입니다. 같은 네트워크에 더 나은 출구 라우터가 따로 있어도, 패킷은 보낸 라우터를 한 번 거친 뒤에야 그리로 갑니다. RIPv2 는 그 출구 라우터의 주소를 다음 홉으로 적어 보낼 수 있어서, 받은 쪽이 패킷을 그리로 바로 넘깁니다.
IPv6(Internet Protocol version 6, 인터넷 프로토콜 6판) 주소를 다루는 판은 따로 있습니다. 이 판을 RIPng(RIP next generation, 차세대 RIP)라고 부릅니다. 움직이는 방식은 RIPv2 와 같습니다.
RIP 가 맞는 네트워크
RIP 는 한 조직 안에서 쓰는 라우팅 프로토콜입니다. 이런 프로토콜을 묶어 IGP(Interior Gateway Protocol, 내부 게이트웨이 프로토콜)라고 합니다. 조직과 조직 사이, 곧 인터넷의 큰 네트워크끼리는 BGP(Border Gateway Protocol, 경계 게이트웨이 프로토콜)가 맡습니다.
RIP 가 맞는 곳은 라우터가 몇 대뿐인 작은 네트워크입니다. 설정이 짧습니다. 동작도 단순해서 따라가기 쉽습니다. 그래서 네트워크 교육과 실습에서 라우팅 프로토콜의 첫 예로 자주 나옵니다.
라우터가 많거나 회선 속도가 제각각인 네트워크에서는 OSPF(Open Shortest Path First, 개방형 최단 경로 우선)를 씁니다. OSPF 는 라우터마다 네트워크 전체의 지도를 들고 회선 비용으로 길을 계산합니다. 이런 방식을 링크 상태 라우팅이라고 합니다. 홉 수 한계가 없습니다. 길이 바뀐 소식이 모두에게 곧장 퍼져서 빨리 맞춰집니다.
백엔드 개발자가 RIP 를 설정할 일은 드뭅니다. 만나는 곳은 주로 네트워크 교재와 오래된 사내 망입니다.
길이 바뀐 뒤 모든 라우터의 표가 새 길에 맞춰지는 과정을 수렴이라고 합니다. 사내 망에서 회선 하나가 끊긴 뒤 몇 분 동안 일부 서버에 닿지 않다가 저절로 풀렸다면, RIP 의 더딘 수렴을 의심해 볼 수 있습니다.
관련 항목
RIP 가 속하는 라우팅 방식의 분류
거리 벡터 라우팅 · 동적 라우팅 · 정적 라우팅 · 라우팅 프로토콜 · IGP
RIP 와 역할을 나누거나 겨루는 라우팅 프로토콜
OSPF · IS-IS · EIGRP · IGRP · BGP · 링크 상태 라우팅 · 경로 벡터 라우팅
RIP 가 길을 계산하는 바탕
벨만-포드 알고리즘 · 라우팅 메트릭 · 홉 · 최단 경로 · 다익스트라 알고리즘
RIP 가 채우는 라우터 안의 표
경로표 · 다음 홉 · 기본 경로 · 최장 프리픽스 매치 · 라우터
RIP 에서 나는 장애
무한 카운트 · 라우팅 루프 · 수렴 · 블랙홀 경로 · 경로 플래핑
RIP 가 루프를 줄이는 장치
스플릿 호라이즌 · 포이즌 리버스 · 트리거 업데이트 · 홀드다운 · 타이머
RIP 메시지를 나르는 전송 수단
UDP · 포트 · 멀티캐스트 · 브로드캐스트 · IP 주소
RIP 판마다 달라지는 주소 표기
서브넷 마스크 · 클래스풀 주소 체계 · CIDR · 프리픽스 · 서브넷 · IPv4 · IPv6
RIP 의 판을 가리키는 이름과 표준 문서
RIPv1 · RIPv2 · RIPng · RFC 2453 · RFC 2080
RIP 가 속하는 상위 분류
다른 이름: Routing Information Protocol · 라우팅 정보 프로토콜 · RIPv2 · RIP-2