IP는 Internet Protocal의 약자로, IP 주소는 Host에 대한 식별자이다.
현재 IP 주소는 IPv4, IPv6 버전을 가지고 있으며, 이 둘의 가장 큰 차이점은 주소의 길이이다. IPv4는 32 bit 주소 길이를 가지며, IPv6는 128 bit 주소 길이를 가진다. 일반적으로는 IPv4 환경을 사용한다.
IPv4주소는 일반적으로 192.168.123.132
와 같이 마침표로 구분된 4개의 숫자가 있는 10진수의 형식으로 표시되지만, 이는 사실 2진수 숫자를 10진수로 표현한 것에 불과하다. 위의 IPv4 주소를 32비트로 표현하자면 11000000.10101000.01111011.10000100
가 될 것이다. 즉, IPv4 주소는 8 bit 씩 끊어서 표시하는 것이다.
8개의 비트를 묶은 세션을 옥텟(octet)이라고 하는데, 이 옥텟을 변환한 수가 우리가 익히 아는 IP주소의 형태를 띄는 것이다.
이러한 IP 주소는 아래 명령어를 통해 확인할 수 있다.
ipconfig
ifconfig
IPv4의 경우 32 bit 체계를 가지고 있으므로 약 43억개의 경우의 수를 가진다. 따라서 IPv4를 사용할 경우 인터넷에 Host로 참여할 수 있는 Host의 개수는 약 43억개로 제한된다. 이는 단순하게 생각해봐도 매우 부족하다.
따라서 이런 문제를 해결하기 위해 IP를 사용하는 네트워크 장치 수에 따라 효율적으로 사용할 수 있는 Network ID와 HostID가 등장하였다.
IP 주소는 Network ID, Host ID 두 부분으로 나뉘어진다.
그런데 IP 주소에서 네트워크 ID와 호스트 ID를 구분하는 경계점이 고정되어있지 않다. 따라서 필요한 호스트 IP 개수에 따라 네트워크의 크리를 다르게 할당할 수 있다록 클래스(class)라는 개념을 도입하였다.
클래스는 A, B, C, D, E 클래스가 존재하며, 각각의 클래스에 할당되는 IP 주소 갯수와 역할이 다르다.
C 클래스는 멀티캐스트를 위해 사용되고, E 클래스는 예약 되어있는 클래스이기 때문에 A, B, C 클래스와는 구분된다.
대표적으로 많이 사용되는 A, B, C 클래스들의 IP 주소의 갯수는 대략 다음과 같다.
각각의 클래스에서 네트워크 주소와 호스트 주소를 나누는 기준은 아래와 같다.
A 클래스 -> 네트워크.호스트.호스트.호스트
B 클래스 -> 네트워크.네트워크.호스트.호스트
C 클래스 -> 네트워크.네트워크.네트워크.호스트
이러한 클래스들을 구분하기 위한 클래스 구분법은 맨 앞 옥텟의 주소가 무엇인지만 보면 구분할 수 있다. 각 클래스마다 가지는 맨 앞자리 옥텟은 아래와 같다.
A 클래스 -> 1~127.0.0.0 (로컬호스트)
B 클래스 -> 128~191.0.0.0
C 클래스 -> 192~223.0.0.0
D 클래스 -> 224~239.0.0.0
그런데 사실 클래스 기반으로 네트워크를 분할하는 기법은 현재는 사용하지 않는다. 클래스 기반보다 네트워크 주소를 세밀하게 분할하고 할당하기 위해서 네트워크 크기에 맞춰 1 bit 단위로 네트워크를 상세히 분할하는 방법을 사용한다.
과거 클래스 기반의 IP 주소 체계를 클래스풀(Classful)이라고 하는 반면 현재는 클래스 개념 자체를 버리는 클래스리스(Classless) 기반의 주소 체계를 사용한다.
그리고 이 클래스리스 기반 주소 체계를 사용하기 위해 도입된 것이 서브넷 마스크(Subnet Mask)이다.
서브넷(Subnet)은 부분 망이라는 뜻이다. IPv4 주소에서 네트워크 영역을 부분적으로 나눈 부분 망, 즉 부분 네트워크를 뜻하는 것이다.
이러한 서브넷을 만들 때 사용되는 것이 서브넷 마스크(Subnet Mask)이다. 이 서브넷 마스크를 이용하여 IP주소 체계의 Network ID와 Host ID를 서브넷 마스크를 통해 분리할 수 있다.
서브넷 마스크의 형태는 기본적으로 IPv4 주소와 같은 32 bit 이진수이며, IPv4와 같은 xxx.xxx.xxx.xxx 와 같은 형태를 가지고 있다. 이러한 서브넷 마스크를 이용해 IPv4 주소와 AND 연산하여 Network ID를 걸러낸다.
서브네팅(Subnetting)은 네트워크 관리자가 네트워크 성능을 향상시키기 위해, 자원을 효율적으로 분배하는 것이다. 다시 말해, IP 주소 낭비를 방지하기 위해 원본 네트워크를 여러개의 서브넷으로 분리하는 과정을 뜻한다.
네트워크적인 측면에서 말하자면, 너무 큰 브로드캐스트 도메인은 네트워크 환경에서 패킷전송을 느리게하고 성능저하를 발생시킨다. 따라서 네트워크를 쪼개서 통신 성능을 보장하는 것이다.
또한 IPv4 주소는 한정적이기 때문에 서브넷마스크를 이용해 필요한 네트워크 주소만 호스트 ID로 할당 할 수 있게 만들어 네트워크 낭비를 방지하는 것이다.
서브네팅의 반대는 슈퍼네팅이라고 한다.
서브넷팅은 서브넷 마스크의 bit 수를 증가시키는 것이라고 생각하면 이해가 편하다. 서브넷마스크의 bit 수를 1씩 증가시키면 할당할 수 있는 네트워크가 2배로 증가하고 호스트 수는 2배로 감소한다.
예를 들어 C클래스인 192.168.32.0/24
를 서브넷 마스크의 bit 수를 1 증가시켜서 192.168.32.0/25
로 변경한다고 하자.
192.168.32.0/24
는 원래 하나의 네트워크였다. 이때 할당 가능한 host의 수는 이다.
여기서 2개를 빼는 이유는 첫번째 주소인 192.168.32.0
은 Network Address로 쓰이고 마지막 주소인 192.168.32.255
는 Broadcast로 쓰이기 때문에 호스트에 할당할 수 없기 때문이다.
이 때 서브넷 마스크의 bit 수를 1증가시켜서(서브넷팅) 192.168.32.0/25
로 변경하게 되면 Network ID부분을 나타내는 부분이 24비트에서 25비트로 증가하고 Host ID를 나타내는 부분이 8개 비트에서 7개 비트로 줄어든다.
즉 할당 가능한 네트워크 수가 2개로 증가하고 각 네트워크(서브넷)당 할당가능한 호스트수는 개로 줄어든다. 또한 서브넷 마스크가 255.255.255.128
로 변한 것을 확인할 수 있다.
이런 식으로 효율적으로 IP 주소를 사용할 수 있게 만드는 것이다.
네트워크 주소(Network address)는 호스트 주소가 모두 0인 주소**로, 네트워크를 구별하기 위한 네트워크 주소로 사용되기 때문에 각 기기들이 통신하기 위한 고유 번호로는 사용되지 않는다.
브로드캐스트 주소(Broadcast adddress)는 반대로 호스트 부분이 모두 1인 주소를 말하며, 특정 네트워크에 속하는 모든 호스트/클라이언트들이 듣게 되는 주소이다.
목적이 있는 주소이기 때문에, 이 또한 각 기기들이 통신하는 고유 번호로 사용되지 않는다.
사설 IP는 전세계적으로 고유한 IP가 아닌, **네트워크 내에서 자유롭게 할당해서 쓰는 IP주소, 또는 대역으로 각 클래스마다 사설 IP대역이 존재((한다.
10.0.0.0~10.255.255.255 (A 클래스 사설 IP 대역)
172.16.0.0~172.31.255.255 (B 클래스 사설 IP 대역)
192.168.0.0~192.168.255.255 (C 클래스 사설 IP 대역)
이 사설 IP는 라우터에 의해 로컬 네트워크 상에서 PC나 장치에 할당되기 때문에 하나의 네트워크 안에서는 유일하나, 전체 네트워크 상에서는 유일하지 않다. 또한 사설 IP로는 인터넷에 직접 연결할 수 없다.