앞선 포스트에서 IP는 대기업, 중기업, 소기업, 멀티캐스트, 미래를 위한 주소 이렇게 5개로 클래스가 나뉜다고 했다.
클래스 A의 경우에는 첫 비트가 0으로 시작하는 8bit를 Netid로 사용하고 나머지 24bit를 hostid로 사용한다. 이 클래스의 IP를 Dotted Decimal Address로 바꿨을 때의 IP 범위는 0.0.0.0 ~ 127.255.255.255 이다.
클래스 A는 Netid의 수가 적고, Hostid의 수가 훨씬 크기 때문에(2^7 << 2^24) IP 주소를 많이 사용하는 대기업에 할당된다. 통신사를 예를 들면 그 통신사에 가입한 사람들이 많을테니까 hostid가 많은 Class A를 사용한다.
그러나, 이렇게 많은 약 1600만개의 호스트가 하나의 LAN에 접속되어 있다고(즉, 1개의 스위치가 이 모든 호스트들을 담당할 때) 생각했을 때는 큰 문제가 발생한다. 너무 많은 사람들이 동시에 데이터를 보내면 충돌이 일어날 가능성이 높아지기 때문이다
하나의 LAN에 접속할 수 있는 기기의 수는 정해져있는데, 이유는 충돌이 일어나는 것을 방지하기 위함이다. 데이터를 보낼 때 너무 많은 사람들이 동시에 데이터를 보내려고 한다면 충돌이 일어나니까 데이터를 보낼 수도 없고 Throughput이 떨어지게 된다.
Throughput이란, 단위 시간 당 디지털 데이터 전송을 처리하는 양으로 BPS와 같은 데이터 전송률의 개념과 같다.
심지어, 1600만개의 호스트를 사용할 수 있지만 이 호스트 자리에 할당할 호스트의 수가 부족하여 사용하지 않는 주소들도 발생할 수 있다.
이런 단점들은 추후에 Subnetting, CIDR 등으로 해결이 가능하다.
클래스 B는 Netid의 수가 Class A보단 많지만, 그만큼 hostid의 수가 Class A보다 적다. 클래스 B는 첫 비트들이 10으로 시작한다. Netid는 14bit를 사용하여 2^14개의 네트워크를 할당할 수 있고, hostid는 2^16개의 host를 등록할 수 있다. IP 주소의 범위는 128.0.0.0 ~ 191.255.255.255이다.
역시 등록할 수 있는 host의 개수가 많아 하나의 LAN에 접속하게 되면, 충돌이 일어날 수 있고 역시 이 2^16개의 호스트에 접속할 수 있는 회사가 많지 않기 때문에, IP주소가 낭비되는 경우가 생길 수 있다.
클래스 C의 경우에서는 110으로 시작하고 192.0.0.0 ~ 223.255.255.255 의 IP 범위를 가진다. netid는 2^21개라서 접속할 수 있는 네트워크의 수는 많지만, hostid는 2^8개이기 때문에 등록할 수 있는 호스트의 수는 256개밖에 없다. 때문에, 등록할 기기의 수가 300개라고 한다면, Class C로는 커버가 안된다. 이러면 Class B를 사용해야 되는데, 이러면 또 낭비되는 IP의 개수가 너무 많아진다.
Multicast를 위한 IP 주소로, 1110으로 시작한다. 2^28개 만큼의 hostid를 가지며 Netid는 없다. IP 주소 범위는 224.0.0.0 ~ 239.255.255.255이다.

어떤 장치는 여러 개의 네트워크에 접속되어 있을 수 있다. 네트워크는 각 인터페이스와 연결되기 때문에 하나의 장치이더라도 인터페이스가 여러 개라면 이 인터페이스 각각마다 IP가 할당되어야 한다. 이렇게 IP가 인터페이스마다 할당되는 것은 라우터나 호스트 관계없이 모두 적용되는 사항이다.
라우터와 호스트의 차이
라우터는 다른 곳에서 받은 데이터를 다시 다른 곳으로 넘겨주지만, 호스트는 다른 곳에서 받은 데이터를 다른 곳으로 넘겨주지 않는다.
핫스팟처럼 호스트가 라우터 역할을 할 수 있도록 할 수도 있다.
이렇게 한 장치에 하나 이상의 주소가 할당된 것, 즉 한 장치가 여러 개의 네트워크에 가입되어 있는 장치을 Multihomed device라고 한다.
IP주소는 모든 주소를 다 사용할 수 없고 어떤 IP주소들은 특정한 목적을 위해 예약되어 이 목적으로 사용하는 것 이외에는 사용할 수 없다.

Network address는 특정 네트워크를 가리킨다. Hostid가 전부 0인 것이 특징이다.
그림에서처럼 Class B 네트워크를 가리키고 싶다면, 141.14.0.0 이렇게 Netid만 적고 Hostid는 0으로 통일시킨다.
이렇게 Hostid가 모두 0이다보니 특정 네트워크를 가리키는 특정 호스트에게 할당할 수 없는 IP이다.

Direct broadcast address는 Hostid를 전부 1로 설정하는 주소이다. 이 주소는 특정 네트워크에 있는 모든 host들에게 패킷을 보낼 때 사용된다. 이 역시 특정 네트워크에 있는 모든 호스트들을 지칭하는 주소이기 때문에 특정 호스트에게 할당할 수 없다.

이번에는 Netid가 전부 0인 주소이다. 이 주소는 패킷을 보내는 호스트가 속해있는 네트워크 안에서의 호스트를 가리킬 수 있다. 즉, 내가 속한 네트워크 내의 다른 호스트에게 메시지를 보낼 때 사용하는 IP이다.

이건 Netid와 Hostid 모두 1로 이루어진 주소이다. 이것 역시 broadcast address이기 때문에 특정 네트워크의 모든 호스트를 지칭하지만, Direct broadcast address와 달리 Limited broadcast address는 패킷을 보내는 호스트가 속해있는 네트워크 내의 전체 host를 지칭한다. 즉, 내가 속한 네트워크의 모든 호스트들에게 메시지를 보내고자 할 때 사용한다.
그림에 표현된 것처럼 라우터는 이 주소로 들어온 요청이 있으면 다른 곳으로 패킷을 보내지 않고 block시키기 때문에 해당 네트워크 안에서 broadcast하게 데이터를 보낼 수 있게 된다.

Limited broadcast address와 반대로 Netid와 Hostid 모두 0으로 이루어진 주소이다. 이 IP는 특이하게 Source address로만 사용되는 IP이다. 이 주소는 IP를 할당받기 전에 짧은 시간 동안 임시로 사용하는 주소이다. 이렇게만 말하면 어려우니 예를 통해 이해해보자.
예를 들어, 컴퓨터에서 랜선을 꽂은 후에 IP를 수동으로 할당하지 않고 자동으로 설정하는 상황에 대해 생각해보자. 이러면 아직 IP를 컴퓨터가 할당받지 못했기 때문에 이 컴퓨터는 가지고 있는 IP가 없다. 그러나, 이 상태로는 인터넷에 접속할 수 없기 때문에 컴퓨터는 IP를 할당받아오려고 한다. 이럴 때 임시로 0.0.0.0이라는 IP를 사용하여 네트워크 서버(Wifi 유무선 네트워크 서버 등)에 난 IP가 없으니까 내가 사용할 수 있는 IP주소를 달라고 요청한다.
서버는 0.0.0.0으로 들어온 요청에 대해 이 host가 IP를 할당받고 싶다는 것을 인지하고 사용할 수 있는 IP주소를 할당해준다.
위에서 언급한 예시처럼, This host on this network는 IP를 할당받기 전에 짧은 시간 동안 임시로 사용하는 주소이다.

Loopback address는 장치 내에서 소프트웨어의 테스트를 위해 사용되는 주소이다. 이 주소는 Destination address가 127로 시작한다. 예를 들어, 127.0.0.1의 localhost처럼 그 호스트 내에서만 사용된다. 우리가 localhost를 사용해 프로그램이 잘 됐나 안 됐나를 테스트하는 것처럼
이 주소를 사용하는 것은 이 호스트 밖으로 나가면 안되기 때문에, Application Layer에서 내려와서 Network Layer에서는 다시 Loopback 시켜서 다시 위의 Application Layer로 올려보낸다.

정리해보면, hostid에는 0을 모두 기입하는 Network address가 있고, hostid에 모두 1을 기입하는 Direct broadcast address라는 특수한 목적의 IP들이 있었다.
이렇게 되면 hostid가 가질 수 있는 주소 범위는 1부터 254까지이다.
한편, Netid만 모두 0으로 만들고 hostid는 특정 호스트를 지정하는 Specific host on this network가 있었고 Netid 첫 8비트를(Dotted Decimal Address에서 첫 자리를) 127로 사용하는 Loopback address가 있었다.
이렇게 되면 Netid가 가질 수 있는 주소 범위는 1부터 254까지이고 Netid의 첫 8비트에 한해서는 이 범위에 127도 제거하여 사용할 수 있다.
또한, 모든 IP값을 1로 만드는 Limited broadcast address와 모든 IP값을 0으로 만드는 This host on this network도 역시 존재한다.

이걸 아는 상태에서 저번 포스트의 표를 보면 이해가 간다. 이 표는 각 클래스의 network와 host의 수를 나타낸 것이다.
hostid에서 2를 빼는 이유는 0과 255를 제외하기 위함이라는 것을 알 수 있다.
또한, Netid에서 Class A가 2를 빼는 이유는 0을 빼고 127을 빼기 위함이다.
Class B와 Class C에서 2를 빼지 않는 이유는 시작을 0으로 하는 것은 이미 Class B는 10, Class C는 110으로 시작하기 때문에 불가능하고, 1로만 이루어진 것 역시 같은 이유로 불가능하다. 그리고 127이라는 특수 주소 또한 Class A의 범위에 해당하는 값이었기 때문에 Class B와 C와는 무관하다.

사설 네트워크는 인터넷 관리 기구의 허가를 받지 않고도 사용이 가능한 주소이다. 그러나, 이 주소는 인터넷 상에서 존재하면 안되는 주소이다. 그래서 특정 네트워크에서만 존재해야 하는데, 특정 네트워크 밖으로 빠져나와 인터넷으로 나온다면 이 주소를 다른 주소로 변환시키는 무언가가 필요하다. 이 변환 방법에 대해서는 추후에 다룰 예정이다.

위의 그림에서는 네트워크가 총 5개이다. Bus, Point-to-Point 등 여러 형태의 네트워크가 존재하고 있고, 이 네트워크들을 Router들이 연결하고 있는 WAN의 구조이다. 이렇게 네트워크가 여러 개 있으므로 각각의 네트워크마다 서로 다른 Netid로 할당해야 한다. 그 이후에는 그 네트워크에 접속되어 있는 호스트들에게 각각 hostid를 할당해 줘야 한다.
여기서 Rest of the Internet이라는 라우터는 외부로 나가는 인터넷을 담당하는 Router이다.