본문 바로가기

Coding Note

[Network] Supernetting & Classless addressing

지난 글에서 Classfull addressing의 특징을 알아봤고, 이 방식의 치명적인 문제점에대해서 알아봤다.
classful addressing은 IP주소를 각각의 클래스로 나누고, 호스트마다 적절한 클래스의 덩어리(블럭)를 할당해 주는 방식이었는데, 클래스 사이의 블럭사이즈 갭이 너무나 커서 문제가 됬다고 했었다.

그렇다면 이 문제를 해결하려면 어떻게 해야할까?
이를 해결하기 위해서 처음 도입된 방식이 subnetting의 반대인 Supernetting이다.
서브넷의 반대라니 무슨말일까?

서브넷팅은 하나의 블럭이 너무 큰 경우(B클래스 같이..) 좀더 작은 서브넷으로 분할해서 호스트들을 관리하는 방식이었다.
그런데 이 개념을 반대로 생각하면, 클래스의 사이즈가 너무 작은경우(C클래스 같이..) 여러개의 C클래스들을 묶어서 조금 더 큰 호스트들을 관리할 수 있지 않을까 하는 생각에서 비롯된 방식이 supernetting이다.

예를들어 1000개의 호스트를 관리해야 하는 회사가 있다고 생각해보자.
그런데.. 129.145.10011000.0~255 라는 호스트 IP집단이 있다고 했을 때
이는 C클래스의 주소이므로 3바이트 까지가 마스크가 되고, 마지막 4바이트 부분으로 호스트를 식별할 주소를 만들어내기때문에 256개의 호스트밖에 관리할 수 없다. 그렇다고 B클래스를 사기엔 회사의 비용부담이 너무 크다..

이때 
129.145.10011000.0~255
129.145.10011001.0~255
129.145.10011010.0~255
129.145.10011011.0~255
이렇게 4개의 C클래스 블럭을 몽땅 산 후 같이 관리하겠다고 생각할 수 있을것이다. 이렇게 하면 B클래스를 샀을때 낭비할 IP들을 걱정하지 않아도 되고, 255*4=1020개의 꽤 적당한 갯수만큼 사용할 수 있으니 얼마나 효율적인가?

그리고 이렇게 사놓은 클래스블럭들을 관리하기 위해서 마스크를 하나 준비했는데, 그게 바로 Supernet mask 이다.
그러면 슈퍼넷마스크를 위의 클래스블럭들에게 적용시켜보자.

만약에 패킷의 목적지가 129.145.10011010.123 이라는 호스트라고 하자. 그러면 여기에 슈퍼넷 마스크인,
SUPERNET MASK :: 11111111.11111111.11111100.00000000
를 씌운다.
11111111.11111111.11111100.00000000
    129    .    145   .10011010.123
-----------------------------------
    129  .  145   .10011000.0

AND연산시 이 회사의 클래스묶음 군에 속한다는것을 확인할 수 있다.
그러면 우리회사로 온 패킷이 맞으니 흘려보내게 되는것이다.
즉, 네트웍마스크 대신에 슈퍼넷 마스크를 사용해서 우리 회사에 온 패킷이 맞는지 확인하고, 네트웍마스크를 통해서 몇번째 군락에 온 패킷인지 확인을 하는것이다.(네트웍마스크가 서브넷마스크처럼 쓰이는 상태라고 볼 수 있다.)

이렇게 임시방편으로 classful addressing으 문제점을 해결할 수 있는듯 보였다.
그런데 supernetting에도 문제점이 남아있었다.
1. 연속되어야 한다.
2. ...00 부터 시작되어야 하고,
3. 2^n 개의 군락을 한꺼번에 사야했다.

여전히 남아있는 문제점들...    이를 classful 주소체계에서 해결하기란 불가능해 보였다.
그래서! 아예 엎어버리고 새로운 방식의 주소체계가 등장했는데, 이게 바로 Classless addressing 이다!

CLASSLESS ADDRESSING
서브넷과 슈퍼넷 모두 classful 방식의 문제점을 완벽하게 해결하지 못하고 있는 와중에, 이를 해결하기 위해서 주소체계를 완전히 바꿔놓는다는 특단의 조치를 취하게 되었다.
classful 주소방식은 클래스의 크기가 고정되어있기 때문에 나타난 문제였다. 때문에 classless 주소방식에서는 블럭의 길이가 가변적인 방식을 택하게 되었다.

그러면 블럭의 길이가 가변적일때 어떻게 주소를 확인하고, 라우팅할 수 있는지 차근차근 알아보자.

(개요)
@모양
[=========prefix==][===suffix====]
prefix : 란 네트워크 주소를 결정하는 부분( 비트의 앞부분)
suffix : 호스트의 주소를 결정하는 부분 (비트의 뒷부분)

그렇다면 n-bit의 prefix일때 가능한 호스트수 정도는 구할 수 있을것이다.
총 32bit의 길이이므로 가능한 호스트 수는 2^(32-n)개.

이렇게 비트별로 관리를 하게되고, classfull addressing 이 가졌던 문제를 어느정도 해결할 수 있게되었다.
(classful ->byte별로, classless-> bit 별로 끊는다. )
물론 bit단위로 관리하는 만큼 classfull 보다 조금 복잡하다(복잡보단 귀찮이 맞겠지만..) 

@prefix와 suffix를 구분하기 위한 방법 prefix의 길이를 명시
 그런데 아무런 정보없이 126.32.149.46    이렇게만 주소를 주면.. 어디까지가 prefix인지 알 길이 없다.
그래서 prefix의 길이를 명시하기 위한 슬래쉬n(/n) 표기를 하게되었다.

byte.byte.byte.byte/n
                           ↑↑
                  Slash┘└ prefix length

@어떤 주소와 /n을 알때 이 주소가 속한 네트워크안에서 첫번째 주소, 마지막 주소 찾기 
받은 주소를 보고 그 네트워크의 첫주소를 찾으려면..  두가지 방법이 있다.(근본적으론 같습니다.)
삵쾡은 두번째 방법을 사용하지만,,  사실 두번째 방법은 1번 방법을 머릿속에서 암산하는 거랑 별반 다를게 없으므로 1번방법만 설명하겠다.
1. bit 별로 적어가면서 (이건 귀찮치만 쉬움, 그리고 가장 일반적인 방법)
첫번째 주소 : 왼쪽부터 n-bit 1 로 채워진 네트웍마스크와 주어진 주소를 AND연산
마지막 주소 : 네트웍마스크의 1의보수와 주어진 주소를 OR연산

2. 2의 승수니 그걸보고 적당히..(이건 뭐라고 설명할 수가 없네..)

@특정한 양의 호스트가 필요할 때 블럭을 잘라주는 방법
 classfull 과 classless의 가장 큰 차이점이라면, classless addressing에선 원하는 크기만큼 호스트블럭을 잘라줄 수 있다는 점이다.(물론 2의 승수갯수로 잘라줘야 하지만, 터무니없이 비효율적인 classful보단 낳다.)
x 개의 호스트가 필요하다고 하면,
2^(32-n) > x  를 만족하는 가능한 작은 n을 구하고,
주어진 주소의 /n 이 prefix이고, 그 아래 32-n이 surfix가 된다.
(쉽다!)

@classless addressing 에서의 서브네트워킹
서브넷을 구성할 땐, 각 서브넷의 처음주소(서브넷 주소)와 /subn (서브넷의 prefix)를 구하는게 주된 목적이라 할 수있겠다. 
일단 계산의 편의를 위해 n = 네트워크의 prefix(/n), N = 전체호스트 사이즈, Nsub_i = i번째 서브넷의 사이즈 라 하자.
a. 일정한 사이즈의 서브넷을 만들 때
      1. 서브넷의 /m 에서 의 m 구하기 :
                   m = n + log(N/Nsub) 가 된다.
                   Nsub는 서브넷의 사이즈가 일정하기 때문에 원하는 서브넷의 수 만큼 N을 나눠주면 된다.
                   (단, 서브넷의 갯수는 무조건 2의 승수형태여야한다.)
      2. 각 서브넷의 시작주소 :
                   이건 각 서브넷의 /m을 보고 네트워크의 시작주소 및 마지막 주소를 구하는 방법과 같다.
                   주의할 점은, i번째 서브넷의 시작주소는, 제일 처음 주소(네트워크 주소)에 Nsub*(i-1)한 수를 더해준것이라는 점                     이다. (말이 어려운거지, 직접해보면 별거없다.)

b. 임의의 사이즈로 서브넷 들을 만들 때
      1. 각 서브넷의 /m_i 구하기 :
                   m_i = n + log(N/Nsub_i) 가 된다.
                   물론 Nsub_i도 2의 승수형태로 올려줘야 한다.
      2. 각 서브넷의 시작주소 :
                   각 서브넷의 사이즈가 다르기 때문에, i번째의 서브넷 시작주소를 알고싶으면,
                   그 전까지의(i-1 번째) 서브넷의 크기를 네트워크 주소에 더해줘야한다. 그 후 /m_i를 적용해주면 된다.
      3. 각 서브넷의 사이즈 :
                   이건 /m_i를 보면 쉽게 알 수 있을것이다.

@서브넷 안에 또 서브넷!!
 하하.. 사실 서브넷 안의 서브넷은 그 서브넷을 네트워크 주소라고 생각한 다음 서브넷을 구하는거랑 다를게 없다. (단지 서브넷의 서브넷의 prefix 인 /mm을 구하는데 조금 다르다는 점 뿐..)


시험기간이었다보니, 제대로 정리하지 못한부분이 많다.
그림도 하나없이 100% 텍스트다보니 눈에 잘 안들어오는 점도 있다..
(게다가 3주치가 밀려버려서 매우 당황스럽다..  전부 매꿔넣긴 힘들꺼같다)