CS/Computer network

IPv4 Addresses (2)

ys_cs17 2022. 5. 14. 19:08
반응형

Subnet도 mask가 존재한다. 이를 subnetid를 가지고 mask를 결정한다.

만약 주소 class B에 속하는 주소 1개에 대해 4개의 subnet을 나눈다고 가정을 하면 총 $16 + log {2^{4}} = 18$ 개의 bit까지 확인을 해야 한다. 주소가 주어지면 subnet mask와 AND 연산을 하면 네트워크의 주소가 나온다.

 

Supernet

Class A, B, C에 속하는 주소들의 gap은 너무 큰데, 이를 해결하고자 supernet이라는 것이 제안되었다.

이는 class를 묶어서 하나로 표현한 것이다. 예를 들어 class C 주소가 200.3.128.0이고, 다음 주소가 200.3.129.0, 200.3.130.0,...이라고 가정하면 이를 이진수로 200.3.10000000.0, 200.3.10000001.0, 2003.10000010,... 이런 식으로 표현을 할 수 있는데 이를 보면 22bit까지는 같은 수를 가진 모습을 볼 수 있다. 따라서 22bit 이후만 바꾸면 되는데, 이를 구현한 것이 supernet이다.

Supernet을 사용하려면 전제 조건이 존제한다. 위 그림과 같이 000으로 끝나는 것부터 연달아 bit가 바뀌어야지 supernet을 사용할 수 있다.

 

Classeless Addressing

Classful의 단점을 없애기 위해 subnet, supernet 등을 만들었다. 하지만 이것도 부족해서 새로운 개념을 만들었는데, 이를 classless addressing이라고 한다.

기존 class는 전체 중 50%가 class A, 25%가 class B 등으로 할당이 되었는데, classless에서는 이 개념을 사용하지 않고 bit 단위로 끊어서 읽는 방법을 사용한다.

Classless addressing에서는 Prefix와 Suffix라는 개념이 나온다. 이는 NetID, HostID와 같은 개념이다. 따라서 Prefix는 위 그림과 같이 1~32 bit가 될 수 있다.

 

여기서 만약 block 1개로 4,294,967,296개의 주소를 만들려면 Prefix의 길이는 0, suffix는 32 이여야 한다.

반대로 block을 4,294,967,296개로 나누고, 각 block에 주소를 1개씩 할당하려면 Prefix는 32, Suffix는 0 이여야 한다.

기존 Class 방식에서는 주소를 보고 Class를 분류해야 했지만, Classless addressing에서는 / 기호를 통해 Prefix의 길이를 알 수 있다.

따라서 무조건 slash를 써야 첫 번째 주소, 마지막 주소를 알 수 있다.

 

만약 167.199.170.82/27이라는 주소가 주어졌을 때 이 주소의 처음 주소를 구하려면 다음과 같다.

Prefix가 27이기 때문에 27 bit까지 mask을 씌운다.

위와 같이 이진수로 변환한 후 AND 연산을 통해 첫 주소를 알 수 있다.

 

마지막 주소를 찾는 방법은 나머지 5 bit에 대해 mask를 씌운 후 OR 연산을 진행한다..

 

만약 block 1개가 1024개의 주소가 필요하면 $2^{10}$개를 suffix로 할당해야 되기 때문에 prefix는 22, suffix는 10이 된다.

따라서 주소가 18.14.12.0으로 주어진다면 첫 주소는 18.14.12.0/22가 되고, 마지막 주소는 18.14.15.255/22가 된다.

 

Classeless Addressing's Subnet

어떤 기관의 주소가 130.34.12.127/26으로 할당받았고, 이를 통해 4개의 subnet을 만든다고 가정해보자. 그리고 같은 host 번호를 갖고 있다고 하자.

130.34.12.01000000/26에서. 01까지는 모두 같게 하고, 그 뒤를 00, 01, 10, 11로 총 4개로 나누면 된다.

첫 번째 subnet: 130.34.12.01000000/28 = 130.34.12.64/28

두 번째 subnet: 130.34.12.01010000/28 = 130.34.12.80/28

세 번째 subnet: 130.34.12.01100000/28 = 130.34.12.96

네 번째 subnet: 130.34.12.01110000/28 = 130.34.12.112/28

Prefix length도 변화하는 것도 중요하다.

 

87.105.43.95/23 주소가 속한 네트워크를 8개의 subnet으로 나누면 다음과 같다.

 

다음은 subnet을 만드는데 각자 크기가 다른 경우에 대해 알아보자.

14.24.74.0/24라는 주소를 다음과 같이 서브넷을 구성한다고 생각해보자.

1. 120개를 가진 subnet

2. 60개의 주소를 가진 subnet

3. 10개의 주소를 가진 subnet

 

120개를 가지려면 $2^{7} = 128$개가 필요하다.

60개를 가지려면 $2^{6}= 64$개가 필요하다.

16개를 가지려면 $2^{4} = 16$개가 필요하다.

 

따라서 120개의 경우부터 보면 subnet의 범위는 다음과 같다.

14.24.74.00000000/25

14.24.74.01111111/25

prefix 부분을 보면 1개가 늘어난 것을 볼 수 있다. 우리는 128 비트에 대한 주소를 보장해야 되기 때문이다.

 

60개의 범위는 다음과 같다.

14.24.74.10000000/26

14.24.74.1011111/26 

prefix를 보면 26이 된 것을 볼 수 있다. 이는 위 128개에 대한 주소의 범위와 겹치지 않기 위해 25번째 비트를 1로 설정한 것을 볼 수 있다.

 

16개의 범위는 다음과 같다.

14.24.74.11000000/28

14.24.74.11001111/28

위와 같은 내용으로 총 16개의 주소에 대해 보장할 수 있다.

 

이번에는 역순으로 진행해보자.

10개의 범위는 다음과 같다.

14.24.00000000/28

14.24.00001111/28

이는 이전에 했던 것과 같이 16개에 대해 주소를 보장할 수 있다.

 

60개의 범위는 다음과 같다.

14.24.74.01000000/26

14.24.74.01111111/26

이를 통해 온전한 6개의 비트를 가진 주소를 사용할 수 있다.

 

120개의 범위는 다음과 같다.

14.24.74.10000000/25

14.24.74.11111111/25

이를 통해 124개의 주소를 사용할 수 있다.

 

실제로는 혼란이 발생할 수 있기 때문에 많은 주소를 가진 subnet부터 할당을 시작한다.

위에서 구한 subnet의 범위를 시각화하면 다음과 같다. n는 mask의 범위이다.

 

 

Special adderess

이번에는 특별하게 사용되는 주소들에 대해 살펴보자.

 

All-zero address

0.0.0.0인 all-zero address는 IP를 할당 받지 않은 컴퓨터의 주소를 의미한다.

DHCP는 보통 가정 집에서는 고정 ip를 사용하지 않고 유동 ip를 사용한다. 이때 누군가가 ip를 할당해줘야 하는데, 우리는 DHCP server를 통해 ip를 할당받는다. 보통은 공유기가 DHCP 역할을 한다.

DHCP한테 ip 헤더가 보내지는데, 이때까지는 우리의 컴퓨터는 아직 본인의 주소를 모르니 출발지를 0.0.0.0로 하고 목적지를 255.255.255.255로 설정하여 보낸다. 여기서 255.255.255.255는 여기서 DHCP server의 주소라고 생각하면 된다.

사실은 여기에 MAC 주소도 DHCP server에게 보낸다. 이러한 디테일 한 것들이 DHCP 프로토콜에 정의가 되어 있다.

Limited broadcast address

이는 다 1로 되어 있는 주소로 위에서 설명한 255.255.255.255 주소이다. 한 컴퓨터에서 해당 주소로 패킷을 보내면 모든 컴퓨터에게 다 전송이 된다. 연결되어 있는 다른 컴퓨터들은 이를 받고 DHCP의 주소인 것을 알고 무시하고, DHCP server만 이에 대해 응답을 해준다.

여기서 라우터의 역할이 중요한데, packet을 다른 곳으로 보내지 않고 local안에서 block을 해주는 역할을 한다. 그래서 해당 주소의 이름이 limited broadcast address라고 부른다.

 

127로 시작하는 주소는 loopback address이고, 주로 테스트할 때 사용한다.

 

Private network

private network는 사설망이라고 부르는데, 회사 같은 경우 회사 내에서만 사용되는 네트워크들의 주소는 본인들이 정의한 주소를 막 붙여서 사용한다. 하지만 이렇게 만든 주소들이 바깥이랑 연결하게 되면 이 주소가 마음대로 만들어진 주소인지, 아니면 제대로 할당된 주소인지 인지하기 힘들다.

따라서 처음부터 사설망 주소의 개념을 정립해서 밖으로 나갈 때 다른 장비를 통해 외부와 소통을 잘하게 해준다.

보통 90% 정도는 192.168로 시작하는 사설망을 사용한다.

 

Directed broadcast address

Directed broadcast address는 suffix에 해당하는 주소 값이 다 1인 경우를 말한다. 보통 라우터가 많이 보낸다. 위 그림과 같이 네트워크의 주소는 시작 주소이다. 또한 맨 마지막 주소도 할당하지 않고 broadcast 용도로 사용한다.

이를 통해 network 안에 있는 모든 컴퓨터에게 데이터를 보낼 때 사용한다.

 

private network를 사용하기 위해서는 NAT이 꼭 필요하다.

위 그림 오른쪽과 같이 private address를 할당했다고 가정하자. 그리고 이 주소들이 외부 네트워크와 통신할 때 사용하는 ip는 138.76.29.7만 있다고 하자. 이를 통해 컴퓨터 3개 중 하나가 특정한 서버로 접속하고 싶은 경우에 대해 어떻게 동작하는지 알아보자.

도착지 주소는 128.119.40.186이고 port는 80이라고 하자.

10.0.0.1은 우선 임의의 포트 번호인 3345를 할당받고 라우터에게 간다. 이 경우에는 source: 10.0.0.1, 3345이고 destination: 128.119.40.186, 80이다.

라우터에 도착한 데이터들은 여기서부터 외부에게 전송을 해야 하는 데 source를 변경하여 간다.

여기서 source: 138.76.29.7, 5001로 변경되고 detination은 같다.

만약 여기서 3개의 컴퓨터가 동시에 같은 도착지로 가려면 source를 구분해줘야 하는데, 이를 구분하기 위해 port 번호가 붙는 것이다.

아무튼 외부로 데이터를 보낼 때 5001과 같이 port number를 할당하게 되는데, 이때 NAT은 출발 주소와, private address를 위 그림과 같이 테이블에 저장한다. 상대가 데이터를 보내면 NAT은 테이블을 보고 해당하는 컴퓨터에게 전달을 해준다.

따라서 network 안으로 들어오면 테이블과 같이 주소가 변화한다. 이러한 기술을 hole punching이라고 부른다.

 

여기서 5001번 포트를 네트워크 안에서는 192.108.0.1, 3456 바꿔서 보내는 것을 포트 포워딩이라고 한다.

현재 IPv4는 고갈이 된 상태이지만 private address를 꾸리면 주소를 매우 많이 만들 수 있다.

 

반응형