검색 엔진의 방문이 늘어나고 있군...

Posted
Filed under 네트워크
관련 글: [네트워크] IPv4 어드레싱

  서브네팅은 IP 라우팅과 관련된 것을 논하기 전에 반드시 알아야 하는 지식입니다. 서브네팅이란 A, B, C 클래스에 속한 하나의 네트워크 주소를 더 작은 네트워크로 쪼개는 것을 말합니다. 즉, 이전에 설명한 A, B, C 클래스에 속한 하나의 네트워크가 국가급 규모라면 서브네팅은 그 하나의 국가를 다시 여러 도시로 나누는 것으로 비유할 수 있습니다.

  네트워크 주소란 특정 호스트 주소 범위를 대표하는 주소라고 할 수 있는데 현실적으로 체감할 수 있게 예를 들면 어떤 호스트의 IP 주소가 C클래스 주소인 222.121.111.222이고 서브네팅을 하지 않았다고 가정하면 해당 호스트는 222.121.111.0 네트워크에 속해 있다고 할 수 있습니다. 이 네트워크에 속하는 IP 주소 범위는 222.121.111.0 ~ 222.121.111.255입니다.(단, IP 주소 222.121.111.0은 지금 설명한 '네트워크 주소'라는 특수한 역할을 하고 222.121.111.255도 브로드캐스트라는 이미 예약된 특수한 주소이기 때문에 호스트에 할당할 수 없습니다.)

  이미 설명한 바와 같이 서브네팅을 하지 않아도 서브넷 마스크라는 것은 기본적으로 어느 IP에든 존재합니다. 각 클래스별 네트워크 부분의 주소 범위와 기본 서브넷 마스크는 다음과 같습니다.

  서브네팅에 대해 알기 전에 먼저 서브넷 마스크의 기본 개념에 대해 알아봅시다. '마스크(Mask)'라는 단어는 전산에서 '어떤 문자 패턴 일부분의 유지 또는 소거를 제어하기 위해 사용되는 문자 패턴'이라는 뜻을 지닙니다. 이름에서 풍기듯 서브넷 마스크는 IP 주소에서 네트워크와 호스트 부분을 나누는 기준을 나타내는 값입니다. 서브넷 마스크로 네트워크와 호스트 부분을 나누는 작업은 2진수로 이뤄집니다. 서브넷 마스크를 2진수로 바꿨을 때 1은 네트워크 부분, 0은 호스트 부분을 지칭합니다. IP 주소와 서브넷 마스크를 2진수로 바꾼 후 각 자리마다 부울 AND 연산을 해서 나온 결과가 '네트워크 주소'라는 값이 됩니다. 이렇게 각 자리마다 비트 연산을 하는 것을 Bitwise 부울 연산이라고 합니다. A, B, C 클래스의 IP 주소를 각 클래스에 해당하는 디폴트 서브넷 마스크로 연산하여 네트워크 주소를 구하는 예를 들어보겠습니다. 읽기 좋게 각 옥텟마다 띄어쓰기를 했습니다.

1. A 클래스 IP: 15.100.211.40(A 클래스의 디폴트 서브넷 마스크: 255.0.0.0)
00001111 01100100 11010011 00101000     <- 15.100.211.40   IP 주소
&&&&&&& &&&&&&& &&&&&&& &&&&&&&     <- Bitwise 부울 AND 연산
11111111 00000000 00000000 00000000     <- 255.0.0.0            서브넷 마스크
----------------------------------------------------------
00001111 00000000 00000000 00000000     <- 15.0.0.0              네트워크 주소

2. B 클래스 IP: 182.153.231.222(B 클래스의 디폴트 서브넷 마스크: 255.255.0.0)
10110110 10011001 10011001 11011110     <- 182.153.231.222   IP 주소
&&&&&&& &&&&&&& &&&&&&& &&&&&&&     <- Bitwise 부울 AND 연산
11111111 11111111 00000000 00000000     <- 255.255.0.0       서브넷 마스크
----------------------------------------------------------
10110110 10011001 00000000 00000000     <- 182.153.0.0       네트워크 주소

3. C 클래스 IP: 222.129.12.110(C 클래스의 디폴트 서브넷 마스크: 255.255.255.0)
11011110 10000001 00001100 01101110     <- 222.129.12.110   IP 주소
&&&&&&& &&&&&&& &&&&&&& &&&&&&&     <- Bitwise 부울 AND 연산
11111111 11111111 11111111 00000000     <- 255.255.255.0       서브넷 마스크
----------------------------------------------------------
11011110 10000001 00001100 00000000     <- 222.129.12.0       네트워크 주소

  위의 계산 과정을 보면 한 가지 흥미로운 사실을 알 수 있습니다. 2진수의 AND 연산은 비교하는 두 값이 모두 1일 때만 결과가 1이 됩니다. 그렇기 때문에 2진수로 서브넷 마스크가 1인 부분과 대응하는 IP 주소 부분은 그대로 자신의 값이 결과 값이 됩니다. 더 쉽게 말하면 값이 255인 서브넷 마스크 옥텟과 대응하는 IP 주소 옥텟은 따로 연산할 필요가 없이 그대로 자기 자신의 값이 결과가 됩니다. 같은 이유로 값이 0인 서브넷 마스크 옥텟과 대응하는 IP 주소 옥텟은 무조건 결과가 0이 됩니다. 이로 인해 서브네팅이 되지 않은(즉, 디폴트 서브넷 마스크를 쓰는) IP 주소는 별도의 계산이 필요 없이 바로 해당 IP 주소의 네트워크 주소를 구할 수 있습니다.

  또한 서브넷 마스크는 반드시 2진수로 1의 연속 후 0의 연속으로 이뤄져 있어야 합니다. 1과 0이 섞여 있으면 서브넷 마스크 값이 될 수 없습니다. 그렇기 때문에 255.255.64.0(2진수로 11111111 11111111 01000000 00000000) 같은 서브넷 마스크 값은 존재할 수 없습니다. 이러한 규칙 때문에 서브넷 마스크를 더 간단히 표현할 수 있는 방법이 있는데 이것을 프리픽스 표기법(Prefix Notation) 또는 CIDR(Classless Inter-Domain Routing) 표기법이라고 부릅니다. 이것은 슬래쉬(/) 문자 뒤에 서브넷 마스크를 2진수로 만들었을 때 나오는 1의 개수를 적어 표기하는 겁니다. 예를 들어 IP 주소가 192.168.0.24이고 서브넷 마스크가 255.255.255.0이라면 CIDR로 표기할 경우 '192.168.0.24/24'가 됩니다. 또한 2진수를 기준으로 서브넷 마스크의 첫 번째 비트는 반드시 1로 시작합니다. 그러므로 서브넷 마스크의 첫 번째 옥텟은 128 이상의 값을 가집니다.

  지금까지 서브네팅을 하지 않은 IP 주소들에 대해 다뤘습니다. 그렇다면 서브네팅을 하면 과연 어떤 모양이 될까요? 바로 아래의 그림처럼 됩니다.

클래스풀 어드레싱(Classful Addressing)

  이렇게 IP 주소를 네트워크, 서브넷, 호스트로 나누는 것을 클래스풀 어드레싱(Classful Addressing)이라고 부릅니다. 이렇게 불리는 이유는 주소의 네트워크 부분이 A, B, C 클래스를 토대로 결정되기 때문입니다. 그런데 라우팅의 관점으로 보면 네트워크 부분과 서브넷 부분은 결국 해당 주소가 어느 네트워크에 속해 있는지를 알려주기 위해 존재합니다. 즉, 같은 목적을 가진 하나의 존재로 볼 수 있는 것이죠. 이렇게 네트워크 클래스와 서브넷을 하나로 합쳐서 보는 개념을 클래스리스 어드레싱(Classless Addressing)이라고 합니다. 클래스리스 어드레싱은 IP 주소를 네트워크 부분과 호스트 부분만으로 나눕니다. 그리고 그 네트워크 부분을 '서브넷'이나 '프리픽스'라고 부릅니다.

클래스리스 어드레싱(Classless Addressing)

  그럼 서브네팅을 했을 때의 모습도 대강 살펴봤으니 본격적으로 서브네팅에 대해 알아보겠습니다. 서브네팅의 궁극적인 목표는 결국 IP 주소를 아끼는 겁니다. 아래 그림을 봅시다.

서브네팅을 하지 않은 경우

  그림처럼 각 네트워크마다 B 클래스 네트워크 주소를 하나씩 할당했다고 합시다. 물론 IP 할당을 총괄하고 있는 기관인 ICANN에서 절대로 4개씩이나 되는 B 클래스 네트워크 주소를 저렇게 낭비하게 할당해주지도 않겠지만 일단 서브네팅의 유용함을 강조하기 위해 극단적인 예를 들어보겠습니다. 하나의 B 클래스 네트워크는 65,534개의 호스트 주소를 가지고 있습니다. 그런데 실제로 사용하고 있는 주소는 150.1.0.0, 150.2.0.0, 150.3.0.0에서 각각 2개씩, 150.4.0.0에서 3개를 사용하여 총 9개만 사용하고 있습니다. 그림에서 4개의 B 클래스 네트워크 주소(150.1.0.0 ~ 150.4.0.0)를 사용하고 있으므로 사용할 수 있는 호스트 주소는 총 262,136개이고 그 중 9개만 사용하고 있어 262,127개의 IP 주소를 낭비하고 있는 겁니다. 이번에는 서브네팅을 사용하는 그림을 보도록 하겠습니다.

서브네팅을 한 경우

  이번에는 150.1.0.0이라는 하나의 B 클래스 주소를 가지고 서브네팅을 하여 사용한 그림입니다. 서브네팅을 하지 않았을 때와 달리 이번에는 하나의 B 클래스 네트워크만 사용했으므로 65,525개의 주소만 낭비하게 됩니다. 예가 극단적이라 여전히 낭비가 크지만 262,127개에 비하면 훨씬 적게 낭비하는 셈입니다.

  서브네팅의 방법 자체는 별거 없습니다. 위에서 설명했던 디폴트 클래스 서브넷을 통해 네트워크 주소를 구하는 것과 방법은 동일합니다. 다만, 서브네팅을 할 때는 네트워크와 호스트의 경계를 옥텟 단위로 자르는 것이 아니라 호스트 부분을 자유자재로 자르기 때문에 계산이 좀 더 복잡해집니다. 일단 가장 기본이 되는 2진수->10진수와 10진수->2진수 변환에 대해 알 필요가 있습니다.

  2진수로 표현된 IP를 10진수로 바꿀 때는 먼저 각 옥텟이 8자리의 2진수라는 것을 알고 있어야 합니다. 2진수일 때 각 자리별 값을 10진수로 나타내면 아래와 같습니다.

10000000 = 128
01000000 = 64
00100000 = 32
00010000 = 16
00001000 = 8
00000100 = 4
00000010 = 2
00000001 = 1

  이거 하나만 정확히 알고 있으면 2진수와 10진수 사이의 변환을 문제 없이 할 수 있습니다. 만약 2진수 '10110010'을 10진수로 바꾸려면? 위에 나온 것을 참조하면서 1로 된 부분에 해당하는 값을 하나하나 더하기만 하면 됩니다. 그러므로 답은 128+32+16+2=178이 되겠습니다. 10진수 178을 2진수로 바꾸고 싶다면? 178은 128 이상이므로 '1'을 적고 128을 뺍니다. 그 결과를 다음 값인 64와 비교합니다. 결과인 50은 64 미만이므로 '0'을 적습니다. 이런 식으로 위의 순서대로 차례차례 비교하여 적어나가면 결국 8자리의 2진수 '10110010'가 완성됩니다.

  서브네팅은 한 클래스의 네트워크를 더 작은 네트워크로 나눠서 쓰는 것이기 때문에 얼마나 작게 나눌 것인지 계획하고 그에 맞게 서브넷 마스크를 정하는 방법을 알아야 합니다. 서브네팅은 호스트 주소 부분 중 일부를 뺏아서 하위 네트워크인 서브넷으로 이용하는 것이기 때문에 서브넷을 많이 만들수록 각 서브넷 당 호스트 주소는 줄어들게 됩니다. 이는 이미 위에서 나온 A, B, C 클래스의 클래스풀 어드레싱 그림을 통해서도 확인할 수 있습니다.

  서브넷 부분으로 사용하는 비트 수로 서브넷의 개수를 알 수 있고 호스트 부분으로 사용하는 비트 수로 서브넷당 호스트 주소의 개수를 알 수 있습니다. 서브넷 부분의 비트 수를 s, 호스트 부분의 비트 수를 h라고 한다면 공식은 아래와 같습니다.
  • 서브넷의 개수 = 2^s(제로 서브넷과 브로드캐스트 서브넷을 활용하지 않을 경우 2^s - 2)
  • 서브넷당 호스트 주소의 개수 = 2^h - 2
  서브넷당 호스트 주소의 개수에서 2개를 제외하는 이유는 호스트 부분의 비트가 전부 0인 '네트워크 주소'와 호스트 부분의 비트가 전부 1인 '브로드캐스트 주소'는 호스트에 할당할 수 없는 예약된 주소이기 때문입니다. 그런데 이와 비슷한 개념의 주소가 서브넷에도 2개 있습니다. 호스트에서 사용할 수 없는 주소와 마찬가지로 모든 서브넷의 비트가 0인 경우와 1인 경우입니다. 단, 주의할 것은 호스트 부분의 해당 주소들은 무조건 사용할 수 없는 것과 달리 이 2개의 서브넷 주소는 디폴트로 사용할 수 있는 주소입니다. 즉, 별도의 설정을 하지 않으면 사용할 수 있습니다. 이 2개의 특별한 서브넷 주소에 대해서는 잠시 후에 알아보겠습니다.

  먼저 서브넷의 개수를 구하는 방법을 알아봅시다. 150.150.0.0이라는 B 클래스 네트워크 주소를 가지고 100개의 서브넷을 만든다고 가정하겠습니다. 2의 제곱 중 원하는 서브넷 개수를 처음으로 만족하는 제곱 수를 구합니다. 2^1=2, 2^2=4, 2^3=8, 2^4=16, 2^5=32, 2^6=64, 2^7=128, 2^8=256이므로 7제곱이 지금 구하는 조건에 가장 최적이 됩니다. 이 제곱의 수만큼 '1'을 아래처럼 B 클래스의 디폴트 서브넷 마스크 뒤에 붙이면 됩니다.

11111111 11111111 00000000 00000000   <- B 클래스의 디폴트 서브넷 마스크(255.255.0.0)
                                       11111110 00000000   <- 1을 7개 채운 뒤 나머지를 0으로 채운다.
----------------------------------------------------------
11111111 11111111 11111110 00000000   <- 완성된 서브넷 마스크(255.255.254.0)

  이래서 서브넷 마스크는 2진수로 1의 연속 후 0의 연속으로 이루어지는 것입니다. 완성된 서브넷 마스크를 10진수로 표기하면 '255.255.254.0'이 되고 이것을 CIDR 표기법으로 표기하면 '/23'이 됩니다. 남은 호스트 비트가 9비트이므로 각 서브넷당 호스트의 개수는 2^9 -2 = 510개가 됩니다. 만약 위의 상황에서 서브넷을 500개 만들고 싶다면? 2^9=512가 이 조건에 가장 근접하므로 서브넷 마스크는 '255.255.255.128'이 될 것이며 CIDR로 '/25'가 될 것입니다. 남은 호스트 비트는 7개이므로 각 서브넷당 호스트의 개수는 2^7 - 2 = 126개가 됩니다.

  위의 접근법과 반대로 만약 서브넷당 호스트가 10개 정도가 되도록 만드려면 어떻게 할까요? 2의 제곱 중 10 이상이면서 가장 가까운 수는 2^4=16입니다. 서브넷당 2개의 호스트 주소를 쓸 수 없으므로 여기서 2를 뺍니다. 그 결과 값은 14이며 그래도 여전히 10 이상의 값이므로 조건에 만족합니다. 이제 2의 제곱의 수만큼 낮은 자리에 0을 붙이고 나머지 높은 자리에는 1을 붙입니다..

11111111 11111111 00000000 00000000   <- B 클래스의 디폴트 서브넷 마스크(255.255.0.0)
                                      11111111 11110000   <- 맨 뒤에 0을 4개 채운 뒤 나머지를 1로 채운다.
----------------------------------------------------------
11111111 11111111 11111111 11110000   <- 완성된 서브넷 마스크(255.255.240.0)

  이거면 필요한 서브넷, 호스트의 개수를 기준으로 적절한 서브넷 마스크를 만들 수 있습니다. 하지만 안타깝게도 여기서 끝이 아닙니다. 서브네팅에서 가장 귀찮은 것이 남았는데 바로 각 서브넷의 시작 주소와 마지막 주소를 구하는 것입니다. 먼저 192.168.11.0의 C 클래스 네트워크를 255.255.255.240의 서브넷 마스크로 나누겠습니다. CIDR로 표기하면 192.168.11.0/28이 되겠네요. 서브넷 부분이 4비트, 호스트 부분이 4비트이므로 서브넷이 16개, 서브넷당 호스트가 14(16-2)개입니다. 그렇다면 각 서브넷당 호스트의 주소들은 어떻게 될까요?

192.168.11.0/28 서브네팅

  192.168.11.0/28로 서브네팅된 네트워크는 위와 같은 모습이 됩니다. 약간 복잡해 보인다면 2진수로 바꾼 각 서브넷 주소들의 마지막 옥텟을 비교해봅시다.

첫 번째 서브넷 주소의 4번째 옥텟 : 00000000 = 10진수 0
두 번째 서브넷 주소의 4번째 옥텟 : 00010000 = 10진수 16
세 번째 서브넷 주소의 4번째 옥텟 : 00100000 = 10진수 32
네 번째 서브넷 주소의 4번째 옥텟 : 00110000 = 10진수 48

  느낌이 오십니까? 당연하지만 서브넷을 이루는 비트가 마지막 옥텟의 상위 4비트이므로 이 값이 하나씩 증가할 때마다 다음 서브넷으로 넘어가게 됩니다. 나머지 하위 4비트는 호스트의 주소를 표현하는데 사용합니다. 물론 모든 비트가 0이면 서브넷 자체를 나타내므로 사용할 수 없고 모든 비트가 1이어도 브로드캐스트 주소가 되므로 사용할 수 없습니다. 이 개념들을 잘 기억하고 서브넷 계산을 반복해서 연습하면 쉽게 익숙해질 수 있습니다.

  사실 각 서브넷을 구하는데는 쉬운 계산법이 있습니다. 서브넷 마스크의 각 옥텟 값을 보면 255나 0이 아닌 값이 하나 있을 겁니다. 위에서 사용한 서브넷 마스크 값인 255.255.240.0을 예로 들면 240이 여기에 해당합니다. 이 값을 256에서 뺍니다. 그 결과의 배수가 각 서브넷의 주소입니다. 0, 16, 32, 48...위와 딱 들어맞죠? 당연히 256 이전의 배수까지만 유효합니다. 여기서 한 가지 예외가 있다면 서브넷 비트의 길이가 한 옥텟을 넘는 경우입니다. 만약 150.150.0.0을 255.255.255.240으로 서브네팅(150.150.0.0/28)한다면 어떻게 해야 할까요? 일단 배수는 16으로 동일합니다. 이전의 예처럼 똑같이 16의 배수로 각 서브넷 주소를 구합니다. 그러다가 256이 되는 순간이 옵니다. 이때 앞의 옥텟의 값을 1 증가시키고 마지막 옥텟을 0으로 초기화 합니다. 즉, 150.150.0.240의 다음 서브넷 주소는 150.150.1.0이 됩니다. 이것을 계속하여 B 클래스의 네트워크 주소가 바뀌기 전의 주소가 마지막 서브넷 주소(=브로드캐스트 서브넷)가 됩니다. 이 경우엔 150.150.255.240이 되겠군요.

  마지막으로 아까 설명을 마치지 못했던 2개의 특별한 서브넷 주소에 대해서 알아보겠습니다. 설정에 따라서 서브넷 주소에도 호스트 주소처럼 사용하지 못하는 주소가 2개 있으며 해당 주소들은 다음과 같습니다.

  1. 제로 서브넷(Zero Subnet) 또는 서브넷 제로(Subnet Zero) : 모든 서브넷 비트가 0인 서브넷. 제로 서브넷의 서브넷 주소는 항상 클래스풀 네트워크 주소와 같다는 특징이 있습니다. 예를 들어 B클래스 네트워크인 150.120.0.0를 서브네팅했다면 어떻게 서브네팅을 했던 간에 서브넷 부분의 모든 비트가 0이므로 제로 서브넷 주소는 언제나 150.120.0.0이 됩니다. 그렇기 때문에 150.120.0.0이라고 하면 이게 150.120.0.0이란 B 클래스 네트워크 전체를 말하는 것인지, 아니면 150.120.0.0을 (어떻게든)서브네팅한 상태의 첫 번째 서브넷 주소인가가 혼돈되기 때문에 네트워크 초기에는 사용하지 않았지만 이것은 많은 주소를 낭비하는 결과를 초래했기 때문에 현재는 기본으로 사용하도록 되었습니다.
  2. 브로드캐스트 서브넷(Broadcast Subnet) : 모든 서브넷 비트가 1인 서브넷. 이 주소는 네트워크 브로드캐스트 주소와 동일하게 서브넷의 모든 호스트로 패킷을 전송하는 주소로 예약된 주소였었습니다. 만약 150.120.0.0을 255.255.240.0으로 서브네팅한 B 클래스 네트워크가 있다고 가정합시다. 만약 150.120.255.255로 패킷을 보낸다면 이 패킷은 150.120.0.0 네트워크 전체의 호스트에게 보내는 패킷이 될까요? 아니면 150.120.240.0 서브넷에 속한 호스트들에게 보내는 패킷이 될까요? 이런 애매함 때문에 예전에는 사용할 수 없는 주소였지만 제로 서브넷과 같은 이유로 현재는 기본으로 사용하고 있습니다.
  이 2개의 주소를 일반적인 서브넷 주소로 사용하려면 라우터에서 전역 설정 명령어인 'ip subnet zero'를 설정되어 있어야 하는데 사실 디폴트로 설정되어 있습니다. 그러므로 'no ip subnet zero' 명령어를 사용하지 않는다면 기본적으로 위에서 설명한 제로 서브넷과 브로드캐스트 서브넷을 일반적인 서브넷 주소로 사용할 수 있습니다.


참고 도서: CCENT / CCNA ICND1 Official Exam Certification Guide
2010/08/19 16:50 2010/08/19 16:50