본문 바로가기

Coding Note

[Network] IPv4 Address & classful addressing

지난주는 정전사태로 리뷰만 하다가 휴강을 해버려서 글을 올리지 않았다.
이번주는 지난주의 공백을 매꾸시려는 듯 폭풍같은 수업을 진행해주셨다..

이번주 내용은 IPv4. 이게 무엇이냐면 IP 주소의 버젼 중 4번째라는 의미이다.(IP version 4)

그럼 본격적으로 IP의 네번째 버젼에 대해 알아보자.
우선 IP라는것은 TCP/IP 프로토콜에서 인터넷으로 연결되어있는 각각의 장비들을 구분해주는 주소라는것은 이제 충분히 이해했을것이다. 그런데 virsion 4의 IP address는 몇가지 특징이 있다.
(현재 대부분의 IP주소는 IPv4이니 아직까지는 알고있는 IP주소의 특징이 IPv4의 특징이라고 생각해도 될꺼같다.)

● IPv4 주소는 32-bit 길이의 주소체계이다.
● 요놈은 세계에서 '유일'하다 (그래야 Identifier의 역할을 할테니..)
● IPv4에 해당되는 주소의 양은 2 to the power of 32 (2의 32승, 2^32) 이고 4,294,967,296 개이다.
이 외에 밑을 2로하거나 16으로 하거나 256으로 하거나...  등등 특징이 있지만 중요한 세개부터 살펴보자.

먼저 첫번째. 말로 설명하기 전에 보고 시작하자

                              182.156.149.56                            (당연히 임의의 주소다.)

IP주소란 이렇게 생겼다. (엄밀히 말하면 IPv4주소란 이렇게 생겼다.)
자세히 보면 숫자를 써놓고 쩜을 찍어서 4개의 숫자로 구별해놨다. 그런데 이걸 조금 다른형태로 바꿔보면,

                        10110110.10011100.10010101.00111000

이렇게 이진수로 바꿔놓을 수 있다. 어라? 총 개수를 새어보니 32개쟌아?
그렇다 IPv4 주소는 32-비트의 길이를 갖는 주소인것이다. 그렇다면 이를 통해서 몇가지 특징을 더 알 수 있을것이다.
일단 32비트 길이이기때문에 세번째 특징인 'IPv4 주소의 개수는 2^32 이다' 는 충분히 이해가 됬을것이다.
그리고 또다른 특징으로 각 필드마다 8비트씩 끊어서 10진수로 변환하면, 

                                   0.0.0.0        ~          255.255.255.255

라는 IPv4 주소의 총 범위를 알 수 있을 것이다. 후아핫

그런데 한가지 궁금한건, IP 주소를 나누는데 버젼은 왜생긴걸까?
조금 전에 IPv4의 주소는 약 40억개 가량 된다고 했다. 상당히 많은 양이지만,, 네트워크를 관리했던 사람들은 이게 전부 사용되어서 더이상 IP를 할당받을 수 없는 장비가 나올것이라는 것을 예상했고, 실재로 거의 다 고갈되어버렸다.
그.래.서!! 개발자들은 IPv5(IP version 5)를 개발하기 시작했고, 그 탄성으로 IPv6까지 같이 개발해버렸다.(미래를 위해서)
그런데 조금 생각해보니.. IP 버젼을 한단계 올리는게 상상이상으로 비용이 많이드는게 아닌가? 시간적으로도 그렇고 물질적으로도 그렇고..  개발자들의 정신적으로도 말이다. 그래서 IPv5 단계는 건너뛰고 IPv6로 바로 변화하기로 정했다고 한다.
(혹시 IPv4와 IPv6를 알고있던 사람도 IPv5는 왜 없는지 궁금해 하지 않았을까 생각해본다...  나도 그랬으니 ㅎ)

IPv6는 128-bit 길이의 비트열을 가지고 놀기 때문에 무지막지하게 많은 주소를 만들어 낼 수 있고, 미래에 모든 장비들이 네트웍에 연결되어 작동하고 상호작용하는 영화같은 일들을 펼치기에도 부족하지 않은 수준이 된다.

하지만 아직은 IPv4를 더 알아봐야 할 때이니 IPv6는 잠시 묵혀두자.

IPv4 자체에 대해서는 사실 딱히 설명할게 없었다. 하지만 IPv4를 다루는 방식에 대해서는 조금 깊게 다루려고 한다.

주소체계를 다루는 이유는, 네트워크가 얽히고 섥혔을 때 아무런 방식 없이 40억개의 주소를 관리하려고 한다면 너도나도 미쳐버릴것이다. 이런 불상사를 막기위해서 처음 IP주소를 도입했을 때 '클래스' 라는 개념을 함께 만들었었다.
이렇게 주소를 클래스로 다루는 방법을 Classful addressing 이라고 한다. 이번글의 메인 주제는 요놈이라고 해도 되겠다.
(하지만 한가지 다룰 것은 이 아이는 1990년대에 classless addressing 이라는 아이로 대체됬다는 사실이다. 하지만 classless addressing 을 이해하기 전에, classful addressing이 어떤 기능을 했었는데 뭐가 문제길래 옮겨갔는지 알아야 할 필요가 있다고 본다. 이 둘을 비교한 좋은 글이 있어서 링크를 걸어둔다. Callful VS Classless Addressing )

classful 주소방식은 위에서도 언급했듯이 주소를 클래스별로 나누어서 관리하는 방식이다.
크게 A, B, C, D, E 클래스로 등급을 나누어서 관리하는데 이걸 나누는 기준은 꽤 단순하다.
내가 느끼기엔 나중일 생각안하고 그냥 대충 나눈듯한 느낌이 들지만..  뭐 만든 당사자에겐 내가 미처 알지못하는 다른 심오한 뜻이 있었겠지..

클래스는 IP 비트열의 맨 왼쪽비트(가장 큰 비트)부터 0~1까지 그후 그 아래비트 0~1까지.. 이렇게 구분하기 때문에 아래처럼 나오고 IPv4는 32비트 길이라는 점을 생각하면 각 클래스당 몇개의 주소가 있는지 알 수 있다.

      주소의 모양                                주소 개수                                    전체에서 차지하는 비율            십진수 범위
Class A 는 0... .... .... ....                   = 2^31 개 (약 21억개)                            50%                         0   ~ 127. . .
Class B 는 10.. .... .... ....                  = 2^30 개 (약 10억개)                             25%                        128 ~ 191. . .
Class C 는 110. .... .... ....                 = 2^29 개 (약 5억개)                              12.5%                      192 ~ 223. . .
Class D 는 1110 .... .... ....                 = 2^28 개 (약 2억 6천만개)                      6.25%                      224 ~ 239. . .
Class E 는 1111 .... .... ....                 = 2^28 개 ( D와 동일)                             6.25%                      240 ~ 255. . .

이렇게 구분된 클래스는 클래스 안에서 다시 가능한 갯수만큼(예를들어 Class B라면 약 10억개) 나누어 질 수 있다.
아래 그림을 보자.

클래스마다 Netid 라는것과 Hostid 라는 필드를 구별해 놨다. 느낌이 오듯 Netid 주소 하나당 Hostid주소 몇개.. 라는 식으로 다시 구분할 것 같다. 조금 더 자세히 설명하면 Netid는 여러 호스트들을 관리할 수 있는 주소집단의 식별자라고 할 수 있고, Hostid는 하나의 Netid에서 파생된 호스트들의 식별자라고 말할 수 있다.
(Class D와 E는 일반적인 용도로 사용되지 않는다. 이 중 E는 나중을 위해 남겨놨다고 되어있다.)

 예를들어보자. Class A의 IP주소로 어느 집단에게 IP주소들을 할당해 주려고 한다. 그러면 0.x.x.x ~ 127.x.x.x 사이의 Netid중 남는 하나를 골라낸다. 지금 상황에선 125.x.x.x 집단이 남는다고 하자. 그러면 이 집단에게 할당할 수 있는 호스트식별자는 남은 3바이트(.으로 구별된 세개의 필드; 필드 하나가 1바이트(8비트)이다.)만큼의 갯수대로 나누어 줄 수 있다. 3바이트면 무려 16,777,216개의 호스트에개 줄 수 있는 어마어마한 양이다! 때문에 Class A의 주소는 집단의 크기가 거대한 곳에 배정되게 된다.
그런데 한가지 살펴볼 점은 Class A의 가능한 Netid는 128개다.  그렇다면 이렇게 큰 집단이 129개가 있다면 129번째 집단은 자신이 아무리 강력한 힘을 가지고 있다고 해도 Class A의 Netid는 얻어올 수 없다.
(심지어 128번째의 집단이 집단안에 호스트가 10명이 채 안되는데도 Class A의 주소를 할당받았다고 해도 말이다.)
즉, IP주소를 할당하는 방식은, 각 클래스에서 남는주소만큼 아무렇게나 나눠주는게 아니라, Netid로 구별된 블럭단위로 호스트집단에게 나누어주게 되는것이다.
 그런데 이런 방식은 조금만 생각해보면 커다란 단점을 갖고있다는 것을 느낄 수 있다. 일단 위의 예에서만 봐도, 천6백만이 넘는 호스트 집단은 그렇게 많지 않다. 때문에 하나의 Netid 블럭 안에 많은양의 Hostid가 낭비되고만다.
(그렇다고 남는 Hostid들을 모아서 다른집단에게 줄 수는 없다. 이건 조금 후에 라우팅과함께 살펴보자)
비슷하게 Class B의 경우 가능한 Netid 블럭의 갯수는 16,384개이고, 하나의 Netid당 65,536개의 호스트할당이 가능하다. 마찬가지로 상당히 많은 주소가 낭비된다.
그런데 Class C의 경우 가능한 Netid 블럭이 2,097,132 개나 되면서 정작 하나의 블럭 안에는 256개의 호스트밖에 가질 수 없다. 적당히 큰 회사라면 Class C를 갖기엔 호스트 수가 너무 부족하다..

이런 문제로 인해서 IP가 모두 사용되어서 더이상 할당해줄 IP가 없다! 고 말하지만, 실상은 사용되지 못하고 있는 IP가 남아있는 상태였다. 이런 문제로 인해서 Classful addressing은 클래스를 사용하지 않는 Classless addressing으로 대체되게 된 것이다.
(하지만 완전한 대체는 아니기에, classful addressing도 알아봐야 하며, classless addressing은 다음 포스팅때 자세히 설명하겠다.)

IP주소를 클래스별로 구분짓고, 관리하는 방법을 알아봤다. 마치기 전에 Netid로 구분된 호스트집단은 또 어떻게 관리되는지 살펴보자. (위에서 보았듯이 Class A의 호스트는 엄청나게 많다. 당연히 관리해주는 방법이 체계화 되있다면 더 효율적일것이다.)

한가지 상황을 생각해보자.
대학으로 보내진 어떤 소포가 비행기를 타고 한국으로 들어왔다. 이를 확인하는 직원이 소포의 도착지를 보고 'South Korea ..." 라는 글귀만 확인한 후 바로 담당우체국에게 소포를 전달했다. 만약 맨 처음 글자가 다른나라의 이름이었다면 뒤의 주소는 확인할 필요도 없이 반송했을 것이다.

IP주소도 마찬가지이다. 어떤 패킷이 자신의 네트워크망에 들어오면 맨 먼저 Netid를 확인한다. 이때 이를 확인하는 아이가 라우터(Router) 이다. 라우터는 재미난 방식으로 필요한 Netid만 걸러내는데, 아래와 같이 두 비트를 AND연산해서 걸러내게된다.
                    
                                                             10110100.11010010.10100011.00001100 (Class B IP)
                                                             11111111.11111111.00000000.00000000 (Class B는 2byte가 Netid)
                                                  AND =  10110100.11010010.00000000.00000000
이렇게 걸러내는 방식을 마스킹(Masking)이라 하고, 이때 쓰인 마스크를 네트웤마스크(Network mask)라고 한다.

그런데 한국에 온 소포가 우체국으로 보내지고 그렇게 운반된 소포가 우리학교로 올 소포인지 다시 확인해줘야 한다. 공항에서처럼 우체부는 Inha Univ라는 부분을 확인하고 아래부분은 보지도 않고 학교근처의 다른우체국으로 소포를 보낼것이다.
이처럼 호스트 집단에서도 관리를 편하게 하기 위해서 작은 집단을 다시 만들 수가 있다. 이렇게 나누어진 작은 집단을 서브네트워크(Subnetwork)라고 부르며, 서브넷 또한 클래스를 나누듯 Hostid의 제일 왼쪽비트부터 사용하여 구별한다.
(한비트씩 사용하기 때문에 무조건 2^n개의 서브넷으로 만들어야 한다. 심지어 사용되지 않는 서브넷이 발생해도 말이다.)

이렇게 구분된 서브넷 또한 서브넷을 관리하는 라우터에 의해 서브넷마스크(Subnet mask)를 통해서 필터링되고, 목적지에 도착하게된다.

다소 복잡해 보이지만, 이를통해 IP의 할당 및 전송에의 관리가 수월해졌다. 물론 커다란 문제를 안고있지만, 이는 다음글에서 알아보도록 하고 이번글은 여기서 마치자.

'Coding Note' 카테고리의 다른 글

[Network] Special Address  (0) 2011.11.05
[Network] Supernetting & Classless addressing  (0) 2011.10.26
[Network] OSI 7 LAYER AND ROUTING (and MAC, IP address)  (1) 2011.09.10
[Network] 네트워크란?  (1) 2011.09.07
[Data Structure] Queue  (0) 2011.08.12