brunch

You can make anything
by writing

C.S.Lewis

by swimjiy Jul 25. 2022

그림으로 쉽게 보는 IP 주소 (하)

클래스, CIDR로 IP 주소 더 알뜰하게 쓰기

앞서 그림으로 쉽게 보는 IP 주소 (상)에서 우리는 IP 주소가 무엇인지, 어떤 구조로 되어 있는지 알아봤습니다. 그리고 IP주소 만으로는 어디까지가 네트워크 부분이고 호스트 부분인지 찾기 힘들다는 것도 배웠죠. 이 말은 즉 192.168.123.132이라는 IP 주소에서 192까지만 네트워크 부분일 수 있고 아니면 192.168까지가 네트워크 부분일 수도 있는 겁니다.

그럼 왜 IP는 네트워크 부분과 호스트 부분의 구분 점을 고정하지 않았을까요? 또 어떻게 하면 이 둘을 구분할 수 있을까요?

이번 포스팅에서는 이 질문들에 대한 해답을 찾아보겠습니다.




미니 돈가스는 4개만?

학교에서 급식을 먹는다고 생각해 봅시다. 만약 한 번 배식할 때마다 정해진 양만큼만 받을 수 있다면 어떨까요? 가령 미니 돈가스는 한 번 받을 때마다 4개씩만 주는 거죠.

그렇게 되면 밥을 많이 먹고 싶은 친구는 여러 번 급식을 받느라 왔다 갔다 해야 해서 불편할 테고, 밥을 조금만 먹고 싶은 친구는 불필요하게 많은 음식을 받게 되니 먹고 남은 일부를 버려야 하는 상황이 생기겠죠.

IP 주소의 상황 또한 이와 비슷합니다. IPv4에서 만들 수 있는 IP 개수는 한정적이다 보니 아껴서 사용해야 하는데 IP 주소 당 호스트 주소의 개수를 고정하게 되면 호스트가 많은 조직의 경우 한 개의 IP 주소만으로 충분하지 않으니 여러 개의 IP 주소를 사용할 테고, 반대로 가정집 정도로 호스트가 적은 경우엔 사용하지 않아 낭비되는 호스트 주소가 생기게 되기 때문이죠.


이렇게 네트워크 부분과 호스트 부분을 고정하게 되었을 때의 문제점을 해결하기 위해 IP 주소에서 네트워크 부분과 호스트 부분을 유동적으로 조절하고자 하는 움직임이 생겼고, 그 결과 클래스(class)라는 개념이 탄생합니다.




필요에 맞게, 클래스

클래스는 하나의 IP 주소에서 네트워크 부분과 호스트 부분을 나누는 방법이자 약속입니다. 하나의 네트워크에 몇 개의 호스트 주소를 가져갈 수 있는지에 따라 클래스를 나누었습니다. 단순하게 이제는 급식을 먹을 때 적게/중간/많이 같은 선택지가 생긴 거죠.

클래스의 종류는 A, B, C, D, E  5개가 있지만 D, E 특수용이기 때문에 이번 포스팅에서는 A, B, C  클래스를 위주로 다루도록 하겠습니다. 그럼   클래스별로 살펴볼까요?


먼저 A클래스는 첫 번째 옥텟만 네트워크 영역을 나타내고 나머지 부분은 호스트 영역을 나타냅니다. 따라서 하나의 네트워크가 가질 수 있는 호스트 수가 약 1,600만 개로 세 클래스 중 가장 많습니다.

B클래스는 두 번째 옥텟까지 네트워크 영역을 나타내며 약 6만 5천 개의 호스트 영역을 가질 수 있습니다.

마지막 C클래스는 세 번째 옥텟까지 네트워크 영역을 나타내며 A, B클래스에 비해 상대적으로 적은 약 250개의 호스트 주소를 가질 수 있습니다.

이렇게 보니 각 클래스별로 차이가 크죠? 아무래도 IP 주소를 옥텟 별로 잘라 구분하다 보니 세부적으로 나누기엔 무리가 있었기 때문입니다.


그럼 이 클래스가 다른 건 어떻게 알아볼 수 있을까요? 이건 IP 주소의 첫 번째 옥텟을 보면 알 수 있습니다.



첫 번째 옥텟이 0~127 범위면 A클래스입니다. 그 이유는 A클래스의 경우 IP 주소를 2진수로 풀었을 때 맨 앞이 무조건 0으로 시작하기 때문이죠. 그럼 맨 앞 옥텟이 00000000부터 01111111까지 올 수 있는데 이를 다시 10진수로 변환하면 0과 127이 됩니다. 다만 IP 주소에서 127로 시작하는 경우는 자기 자신을 의미하는 루프백(loopback) 주소로 사용하기 때문에 실제로 A클래스에서 사용할 수 있는 첫 번째 옥텟 범위는 0~126까지입니다.

B클래스는 첫 번째 옥텟이 128~191까지입니다. 2진수로 설명하면 B클래스는 맨 앞이 10으로 시작하기 때문에 10000000부터 10111111까지이며 이를 10진수로 변환했을 때 128, 191이 나옵니다.

마지막 C클래스는 첫 번째 옥텟이 192~223 범위 내에 있는 네트워크입니다. C클래스의 경우는 2진수에서 맨 앞이 110으로 시작하기 때문에 11000000 ~ 11011111까지 올 수 있고, 이를 10진수로 표현했을 때 192부터 223입니다.


예시로 한 번 알아볼까요? 만약 130.101.12.12 4라는 IP 주소가 있다고 가정합시다. 이 주소는 맨 앞 옥텟이 130이기 때문에 범위가 128부터 191인 B클래스로 볼 수 있겠죠? 그리고 B클래스의 경우 두 번째 옥텟까지가 네트워크 주소, 나머지가 호스트 주소이기 때문에 130.101이 네트워크 주소, 나머지 12.12 4가 호스트 주소입니다. 집으로 예를 들자면 방이 약 6만 5천 개가 있는 아파트 ‘130.101’이 있고, 우리는 그중 ‘12.124’호에서 살고 있는 겁니다.




클래스의 한계

다만 이렇게 클래스별로 네트워크를 구분하는 방식은 그리 오래가지 못했습니다. 그 이유는 앞서 언급했듯 클래스의 종류가 실질적으로 3개만 있다 보니 각 클래스별로 할당할 수 있는 호스트의 개수 차이가 컸기 때문입니다. 대부분의 사이트가 클래스 C에 들어가기엔 크다 보니 클래스 B를 많이 할당받았고, 때문에 약 16,000개 밖에 없던 클래스 B가 급속도로 소진되게 되었습니다. 예를 들어 클래스 B를 할당받고 나서 1,000개의 호스트만 사용한다면 남은 약 15,000개의 호스트 주소는 낭비되는 것처럼요.

IP 주소가 차고 넘친다면 별문제가 되지 않았겠지만, 실제로는 IP 주소가 급격히 소진되는 중이었기에 이 낭비 문제는 빠르게 해결해야만 했습니다.

그러던 중, 1993년에 기존의 IP 주소 할당 방식이었던 클래스를 대체하는 새로운 할당 방법이 나타납니다. 바로 CIDR가 등장한 거죠.




클래스가 필요 없는 CIDR

CIDR(Classless Inter-Domain Routing)는 클래스 없는 도메인 간 라우팅 기법으로, 쉽게 말해 클래스가 없이도 IP 주소를 할당할 수 있는 새로운 방식입니다. 클래스 기반 할당 방식은 선택지가 한정적이어서 필요한 호스트 주소 개수에 맞게 할당받기 힘들다는 한계가 있었죠. 이 문제를 해결하기 위해 CIDR에서는 네트워크 부분과 호스트 부분의 구분 점을 2진수의 한 자릿수, 그러니까 1비트 단위까지 가능케 해 호스트 주소를 더 유연하게 할당할 수 있게 했습니다.


가령 클래스 방식에서는 배식할 때 많이, 중간, 적게 이렇게 3가지 선택지가 주어졌다면 CIDR에서는 거의 한 숟갈 단위로 세세하게 담을 수 있게 된 셈입니다. 이렇게 되면 원하는 만큼만 음식을 받을 수 있으니 먹는 사람도 만족스럽고 버려지는 잔반도 줄일 수 있겠죠.


실제 IP 주소로 생각해 볼까요? 만약 192.168.10.1이라는 주소가 있다고 생각해 봅시다.


원래대로라면 이 IP 주소는 맨 앞 옥텟이 192이기 때문에 클래스 C에 해당하며, 따라서 클래스 C의 규칙에 따라 3 옥텟만큼인 192.168.10까지가 네트워크 부분, 나머지 1이 호스트 부분이라고 유추할 수 있습니다.

하지만 CIDR 방식이라면 클래스를 무시하고 비트 단위로 네트워크 부분과 호스트 부분을 구분하기 때문에 2진수로 0001까지, 아니면 1010.00000001까지가 호스트 부분일 수도 있습니다. 만약 내가 1,000개 정도만 호스트 주소가 필요하다면 2의 10승이 1024이니 10비트인 10.00000001까지가 호스트 부분이면 좋겠죠?


이렇게 CIDR를 도입한 뒤 기존 클래스 할당 방식보다 더 잘게 IP 주소를 쪼개 사용함으로써 사용자들은 필요한 호스트 개수만큼만 사용할 수 있게 되었고 부족한 IP 주소도 더 효율적으로 활용할 수 있게 되었습니다.




서브넷 마스크로 네트워크 주소 찾기

그런데 이쯤에서 궁금한 점이 하나 생깁니다. 클래스에서는 각 클래스별로 어디까지가 네트워크 부분이고 어디까지가 호스트 부분인지 명확하게 정해져 있었기 때문에 이를 파악하는 데 큰 문제가 없었는데요. 그렇다면 CIDR에서는 어떻게 비트 단위로 주소를 쪼개면서 네트워크 부분과 호스트 부분을 구분할 수 있을까요?

이를 가능케 하는 게 바로 서브넷 마스크(subnet mask)입니다.


서브넷 마스크는 네트워크와 호스트 부분을 구분해주는 역할로 원래 클래스 기반 할당 방식일 때에도 있었던 개념입니다. 다만 클래스 기반에서는 IP 주소만 보고도 네트워크 부분과 호스트 부분을 쉽게 파악할 수 있었기 때문에 CIDR로 넘어오며 서브넷 마스크의 역할이 더욱 중요해진 거죠.

서브넷 마스크의 표기 방식은 IPv4 주소와 같게 32비트로 표현합니다. 아래의 그림을 보면 확실히 IP 주소와 비슷하죠?

그럼 서브넷 마스크로 어떻게 IP 주소의 네트워크 부분과 호스트 부분을 알 수 있을까요? 바로 서브넷 마스크와 IP 주소를 2진수로 바꾸고 나란히 놓았을 때, 서브넷 마스크의 1이 연속한 자릿수를 IP 주소의 네트워크 부분, 나머지 0이 있는 자릿수를 호스트 부분으로 구분할 수 있습니다.

한 번 예시를 통해 자세히 알아볼까요?


여기 서브넷 마스크와 IP 주소가 하나씩 있습니다. 이 IP 주소의 네트워크 부분은 어디까지일까요? 앞서 서브넷 마스크를 2진수로 바꿨을 때 1에 해당하는 영역이라고 했으니 2진수로는 11000000.10101000.0001010까지, 10진수로는 192.168.10까지가 네트워크 영역이 되겠네요. 그리고 서브넷 마스크의 0에 해당하는 영역이 호스트 부분이니 이 IP 주소의 호스트 부분은 2진수로 00000001, 10진수로는 1이 되겠습니다.


이때 중요한 건 서브넷 마스크의 1은 연속되어 있어야 한다는 점입니다. 만약 11110011 이런 식으로 1과 0이 섞여 있다면 어디까지가 네트워크 부분인지 정확히 알 수 없으니까요.




CIDR 표기법으로 더 편하게

앞서 서브넷 마스크는 연속된 1의 자릿수를 보고 네트워크 부분을 파악한다고 이야기했습니다. 그렇다면 굳이 매번 긴 숫자를 일일이 입력하거나 확인하지 않고, 단순히 연속된 1의 개수가 몇 개인지만 알면 더 쉽게 네트워크 부분을 파악할 수 있지 않을까요?

이런 맥락에서 CIDR는 IP 주소와 서브넷 마스크를 함께 적는 특별한 표기법을 사용하고 있습니다.


한 번 앞서 소개한 IP 주소와 서브넷 마스크를 CIDR 표기법으로 바꿔볼까요?

우선 원래 IP 주소였던 192.168.10.1을 그대로 작성하고 그 뒤에 빗금(/)을 붙입니다. 그리고 2진수 서브넷 마스크에서 1이 연속된 자릿수를 표기해 마무리합니다. 예시의 경우 서브넷 마스크에서 1이 총 24개가 있어서 /24를 붙인 거죠.

이렇게 CIDR 표기법을 이용하면 IP 주소와 서브넷 마스크를 한눈에 파악할 수 있다는 장점이 있습니다.




마무리

IP는 네트워크 개념 중에서도 따로 책이 있을 정도로 내용이 많다 보니, 나름 꼭 필요한 부분만 설명하는 데 여기까지 걸렸던 것 같네요. 모쪼록 IP를 이해하는데 조금이나마 도움이 되셨길 바라며 여기까지 읽어주신 분들께 다시 한번 감사의 인사를 드립니다.

그럼 다음 포스팅에선 새로운 주제로 찾아뵙겠습니다.



참고 자료

고재성, 이상훈, 『IT 엔지니어를 위한 네트워크 입문』 (서울: 길벗, 2020)

TCP/IP 주소 및 서브넷 - Windows Client | Microsoft Docs

네트워크 클래스 - 위키백과, 우리 모두의 백과사전

사이더 (네트워킹) - 위키백과, 우리 모두의 백과사전

브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari