본문 바로가기

네트워크

CIDR(Classless Inter-Domain Routing)

728x90

이 포스트에서는 CIDR에 대해 설명한다.

CIDR(Classless Inter-Domain Routing)

CIDR은 1993년 이전에 IP를 할당하는 방법인 Classful Addressing(네트워크 클래스)를 대체하기 위해 나온 기법이다. 그래서 Classless라는 이름이 붙는다.

 

이 기법은 RFC 1518 도입되었다.

CIDR의 도입 배경

CIDR가 있기 전 인터넷은 그 규모가 작아 네트워크 클래스로도 운용이 가능했지만 규모가 빠르게 커짐에 따라 여러 문제가 지적되었다.

IP 주소 낭비

네트워크 크기에 맞지 않는 과도한 주소를 할당한다.

라우팅 테이블 증가

네트워크 클래스는 Supernetting이 어려운 이유로 라우팅 테이블이 커지게 된다.

인터넷의 성장

네트워크의 규모가 커지면서 먼저 언급한 IP 주소의 부족 및 라우팅 부담이 증가되었다.

 

이를 해결하기 위해 CIDR를 도입하게 된다.

CIDR의 표현

출처: ICPC 2021 New York H

 

CIDR은 네트워크 주소와 서브넷 마스크의 조합으로 이루어지며 xx.xx.xx.xx/yy와 같은 형식을 가진다.

 

xx.xx.xx.xx는 공통 그룹에 해당하는 네트워크 주소를 나타내며, yy는 32비트에서 MSB부터 시작하여 첫 yy개가 1로 채워진 마스크를 가진다는 뜻이다.

 

예를 들어 CIDR이 192.168.0.0/24인 경우를 살펴보자.

 

이 주소의 네트워크 그룹은 마스크가 1111111111111111111111100000000이고 이를 192.168.0.0을 32비트로 합쳐 비트 AND를 적용해 보면 192.168.0.0을 얻을 수 있다.

 

이때 최초 24비트만 취한 부분 192.168.0 부분이 이 네트워크의 그룹이 되며 나머지 8비트 [192.168.0.1, 192.168.0.255]까지의 주소까지 네트워크의 호스트가 된다.

CIDR의 경로 요약(Aggregation)

이런 표현 방법을 통해 여러 네트워크를 하나의 접두사로 묶는 경로 요약을 할 수 있다.

 

예를 들어, 192.168.0.0/24 ~ 192.168.3.0/24으로 표현되는 네트워크들은 다시 192.168.0.0/22로 묶을 수 있다.

 

이를 통해 라우팅 정보를 줄이는 이점을 가져간다.

VLSM (Variable Length Subnet Mask)

VLSM은 같은 네트워크에서 서브넷을 나눠 사용하는 기법이다. 192.168.1.0/24에서 /26이나 /28같이 서브넷 내에서 더 쪼갤 수 있다.

CIDR의 장점

  • IP 주소를 효율적으로 사용 가능
  • 경로 요약을 통한 라우팅 테이블의 크기 감소
  • 다양한 크기의 서브넷을 활용할 수 있어 유연한 네트워크 설계 가능
  • 인터넷 확장성 향상

CIDR의 서브넷 마스크 구하기

ICPC New York 2021에서는 최대 65535개의 ip에 대해 최대로 경로 요약하는 서브넷 마스크를 구하는 문제가 있어 직접 실습해 볼 수 있다.

 

https://www.acmicpc.net/problem/24743

 

구현은 어렵지 않다. 주어진 ip를 32비트 정수로 변환한 다음 /32부터 /1까지 반복문을 돌려 서브넷 마스크를 비트 AND한 결과가 같은 네트워크 그룹을 가지는지 확인하면 된다.

 

문제에서는 공통 네트워크 그룹이 없을 경우에 32를 출력하라고 했으니 이를 주의해서 구현하면 된다.

 

파이썬으로 다음과 같이 풀 수 있다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
import sys
 
 
lt = list()
 
 
def solve():
    n = int(input())
    for _ in range(n):
        ip = sys.stdin.readline()
        bits = list(map(int, ip.split('.')))
        mask = 0
        for j in range(4):
            mask |= bits[j]
            if j != 3:
                mask <<= 8
        lt.append(mask)
 
    ans = 32
    for i in range(320-1):
        st = set()
        target_mask = (1 << 32- 1
        target_mask &= ~((1 << (32 - i)) - 1)
 
        for ip in lt:
            st.add(ip & target_mask)
 
        if len(st) == 1:
            ans = i
            break
    print(ans)
 
 
if __name__ == "__main__":
    solve()
cs

 요약

CIDR은 IP 주소를 보다 효율적으로 할당하고 라우팅하기 위해 도입된 표준이다.

 

CIDR은 네트워크 주소와 서브넷 마스크 형식으로 표현된다. (xx.xx.xx.xx/yy 네트워크 주소 뒤에 /숫자를 붙이는 형식)

 

CIDR 표기법에서 /yy에 해당하는 부분은 프리픽스 길이로, 네트워크 부분의 비트 개수를 의미한다. 나머지 부분은 호스트의 개수를 결정한다.

728x90