본문 바로가기

개발

쉽게 설명하는 네트워크 (IP주소, DNS, 네트워크, 호스트, CIDR, Private IP, 포트포워딩)

반응형

IP 주소가 뭔가요?

IP 주소는 각각의 컴퓨터 기기가 서로 통신하기 위해 가지고 있는 네트워크 주소입니다. 우리가 우편주소로 집의 위치를 찾는 것처럼, 컴퓨터는 IP주소라는 주소체계를 통해 컴퓨터를 식별합니다.

IPv4와 IPv6

IP 주소체계는 IPv4와 IPv6로 나눌 수 있습니다.

IPv4

IPv4는 *8비트씩 4블럭으로 이루어져 있는 주소체계입니다. 현재 주로 활용되고 있는 주소체계입니다. 8비트는 10진수로 표현하면 0~255 (2^8 = 256) 까지의 값을 가집니다. 즉, 0~255가 4블럭으로 이루어졌다고 보셔도 됩니다. 이를 표현하면 아래와 같은 형태를 가지고 있습니다.

172.217.25.14

그렇다면 IPv4 주소체계로는 총 몇 개의 IP주소를 만들 수 있을까요? 8비트씩 4블럭이라고 했으니, IP는 총 32비트의 숫자로 이루어졌다고 볼 수 있습니다. 따라서 2^32 = 4,294,967,296개의 주소를 만들 수 있습니다. 약 42억 개의 주소를 만들 수 있는 셈입니다. 전 세계 인구가 약 80억 명인데, IP 주소는 42억 개 정도만 만들 수 있습니다. 더욱이, 요즘같이 스마트폰 등 IP주소를 할당받을 필요가 있는 기기가 증가하면서 사용 가능한 IPv4 주소는 빠르게 고갈되고 있습니다. 이런 문제를 해결하기 위해 나온 IP 주소체계가 IPv6입니다.

*8비트 : 1비트는 2진수(0과 1) 한 개 즉, 8비트는 2진수 8개로 구성

IPv6

IPv6는 16비트씩 8개의 블럭으로 이루어져 있는 주소체계입니다. 현재 많이 활용되고 있지는 않지만, IP주소 고갈 문제의 해결을 위한 미래를 위한 주소체계입니다. 아래와 같은 형태를 가지고 있습니다.

2001:0db8:0000:0000:8a2e:0370:7334

IPv6 주소는 2^128개의 주소를 만들 수 있습니다. 2^128은 340,282,366,920,938,463,463,374,607,431,768,211,456개 입니다. 우리가 아는 숫자 단위로 셀 수 없을 정도로 정말 큰 수입니다.

도메인 네임 시스템 (DNS)

위에 설명했던 IP주소는 기억하기 어렵습니다. 이를 해결하기 위해 나온 것이 DNS입니다. DNS를 통해 IP주소를 일일이 기억하지 않고, 사람이 쉽게 기억할 수 있는 도메인 네임을 통해 다른 컴퓨터(서버)에 접속할 수 있습니다.

자료: seobility wiki

위의 이미지와 같이 사용자가 도메인 네임으로 요청하게 되면, Domain Name Server가 해당 도메인을 가진 서버의 IP를 반환하게 되고, 해당 IP를 통해 웹서버의 콘텐츠를 받아오게 됩니다.

IPv4 자세히 알아봅시다.

현재 가장 많이 활용되고 있는 IPv4에 대해서 더 자세히 알아보도록 하겠습니다. 한 개의 IP 주소는 네트워크 ID호스트 ID로 나눌 수 있습니다.

네트워크 ID는 네트워크를 구분하여 주는 ID입니다. 네트워크 ID가 같다는 의미는 같은 네트워크 상에 있다는 의미로, 같은 네트워크 상에 있다면 서로 자유롭게 통신을 할 수 있습니다. 즉, 서로 ping을 날릴 수도 있고, 공유폴더를 만들 수도 있습니다. 하나의 네트워크 ID에는 여러 기기가 있을 수 있습니다. 호스트 ID는 해당 네트워크에 속한 사용자에게 부여하는 고유의 번호입니다.

IP주소로 네트워크 ID와 호스트 ID를 어떻게 알아내는지는 추후에 설명드리겠습니다.

IPv4의 클래스

IPv4는 A, B, C, D, E 총 5개의 클래스로 나눌 수 있습니다. 그중 D와 E는 실제로 사용되는 일이 거의 없고, A, B, C 클래스에 속한 IP가 주로 사용됩니다.

위의 그림에서 처럼 A클래스는 IP의 앞자리가 0 ~ 127, B클래스는 128.0 ~ 191.255, C클래스는 129.0.0 ~ 223.255.255로 구성됩니다. 그리고 이 앞자리는 각 클래스의 네트워크 ID를 의미합니다. 즉, A클래스에서는 IP의 첫 번째 블락만 같으면 같은 네트워크에 속해있다는 의미이고, B클래스는 두 번째 블락, C클래스는 세 번째 블락까지 같아야 같은 네트워크에 속해있다는 의미가 됩니다. 네트워크 주소를 제외하고 나머지는 Host ID로 해당 네트워크에서 몇 개의 IP가 만들어질 수 있는지를 결정합니다.

예를 들어, 130.34.xxx.xxx라는 IP 주소가 있다고 합시다. 이는 B클래스에 속하는 IP주소이고, 따라서 앞자리 130.34가 같은 IP들은 같은 네트워크에 있다는 의미입니다. 이론적으로 130.34.5.2130.34.3.35는 같은 네트워크 ID를 가지기 때문에 서로 자유롭게 통신할 수 있습니다. 그리고 130.34라는 네트워크 IP는 남은 두블럭을 호스트 ID로 가질 수 있고, 따라서 2^16=65,536개의 호스트 ID를 가질 수 있습니다.

서브넷 (Subnet)

위의 설명대로라면 A클래스의 네트워크에는 약 1600만 개(2^24)의 호스트를 할당할 수 있습니다. 하지만 만약 어떤 기관에서 필요한 IP개수가 200개라면 나머지 IP주소는 리소스 낭비가 됩니다. 이러한 문제를 해결하기 위해 서브넷이라는 개념이 등장했습니다.

서브넷은 네트워크 안의 네트워크라는 의미입니다. 하나의 네트워크를 나누어 네트워크를 효율적으로 분배할 수 있습니다. 비유적으로 표현하면, 한 사람당 피자를 한 판씩 나눠주면 피자를 버리게 되니, 피자 한판을 쪼개어서 나누어 주자는 것입니다.

그렇다면, 어떻게 네트워크를 나눌까요? 서브넷 마스크라는 개념으로 네트워크를 나눕니다. 얼굴에 마스크를 쓰면 얼굴이 가려집니다. 이처럼 서브넷에 마스크를 씌워서 필요 없는 IP는 가린다는 의미로 서브넷 마스크로 부르게 됩니다.

서브넷 마스크 (Subnet Mask)

서브넷 마스크는 IP주소처럼 8비트씩 4블럭, 총 32비트로 구성되어 있습니다. 다만, 2진수로 표현했을 때, 앞자리가 모두 1로 구성되고 뒷자리는 모두 0으로 구성됩니다. 이를 10진수로 표현하면 255.255.255.XXX 식으로 구성됩니다. 아래는 모두 서브넷 마스크의 예시입니다.

  • 11111111.00000000.00000000.00000000 = 255.0.0.0
  • 11111111.11111111.00000000.00000000 = 255.255.0.0
  • 11111111.11111111.11111111.10000000 = 255.255.255.128

그럼 서브넷 마스크를 통해 서브넷의 네트워크 ID(주소)를 구해봅시다. IP주소와 서브넷 마스크 주소를 AND 연산하면 네트워크 ID를 구할 수 있습니다. (2진법에서 AND 연산은 두 개의 수가 모두 1일 때는 1, 하나라도 0이면 0으로 표기합니다.) 아래와 같이 IP주소와 서브넷 마스크 주소가 있을 때, 새로운 네트워크 주소를 구해봅시다.

IP주소: 115.95.229.19601110011.01011111.11100101.11000100
서브넷 마스크: 255.255.255.011111111.11111111.11111111.00000000

위의 주소를 AND연산을 하게 되면, 01110011.01011111.11100101.00000000이 나오게 됩니다. 이는 115.95.229.0입니다. 즉, 새로운 네트워크 ID(주소)는 115.95.229.0입니다. 원래는 115.0.0.0이 네트워크 주소지만, 서브넷 마스크를 씌워서 네트워크 주소를 분리했습니다. 이렇게 서브넷 마스크를 씌우게 되면 이제는 115.95.229로 시작하는 주소만을 같은 네트워크에 있다고 인식하게 되고, 호스트 주소는 네트워크 주소 (115.95.229.0)와 브로드캐스팅 주소 (115.95.229.255)를 제외하고 254개 (2^8-2)를 가지게 됩니다.

CIDR

서브넷 마스크는 결국 2진수로 표현했을 때 앞자리를 모두 1로 만들면 됩니다. 그럼 1이 몇 개인지만 알면 해당 서브넷 마스크를 쉽게 알 수 있습니다. 이처럼 서브넷 마스크를 개수로 표현한 것을 CIDR라고 합니다. 네트워크 주소를 적고 /<개수>로 표기해주면 됩니다.

115.95.229.0/28은 28비트까지 서브넷 마스크라는 의미입니다. 115.95.229.0은 네트워크 주소이고 해당 네트워크는 115.95.229.0 ~ 115.95.229.15 (2^4)까지의 주소를 가지게 됩니다. 즉, 다음 IP주소는 115.95.229.16/28 이고 (115.95.229.16 ~ 115.95.229.32)까지의 주소를 가지게 됩니다.

AWS와 같은 클라우드 서비스에서는 아래와 같이, CIDR로 서브넷을 나누는 경우가 많습니다.

Private IP (사설 IP)

서브넷을 활용하여 IP를 효율적으로 배분할 수 있다는 것을 알았습니다. 하지만, 아무리 효율적으로 IP를 분배하더라도 이용 가능한 전체 IP개수가 약 42억 개로 제한되어 있는 건 마찬가지입니다. 이러한 문제에는 Private IP가 해결책이 될 수 있습니다. 내부에서만 사용할 수 있는 IP를 만든다면, 외부의 IP와 중복이 되어도 상관이 없습니다. 이렇게 내부에서만 사용할 수 있는 IP주소를 Private IP라고 합니다.

외부에서 접속할 수 있는 Public IP (공인 IP)만을 공유기에 할당하고, 공유기에 연결된 기기들은 내부에서만 사용할 수 있는 Private IP (사설 IP)를 할당하게 되면 하나의 IP를 가지고도 여러 기기들을 연결할 수 있습니다. 이를 통해 IP고갈을 조금 더 늦출 수 있습니다.

하지만, 아무런 IP나 Private IP로 사용할 수 있는 것은 아닙니다. Private IP로는 다음의 대역만을 사용할 수 있습니다.

  • 10.0.0.0 ~ 10.255.255.255
  • 172.16.0.0 ~ 172.31.255.255
  • 192.168.0.0 ~ 192.168.255.255 - 공유기에서 많이 보는 대역

Private IP 역시 앞에서 설명드렸던 네트워크의 원리가 그대로 적용됩니다. 같은 네트워크상이면 자유롭게 통신 가능합니다. 즉, 같은 서브넷에 속한 Private IP들은 서로 접속할 수 있습니다. Private IP이기 때문에 외부의 접속을 차단할 수도 있습니다.

포트포워딩 (Port Forwarding)

그렇다면 외부에서 Private IP에 접근이 필요할 때가 있습니다. Private IP를 할당받은 기기를 웹서버로 활용한다면 공유기로 들어온 요청을 해당 기기로 전달해줘야 합니다. 이럴 때 사용하는 것이 포트포워딩이라는 방법입니다. 공유기의 특정 포트로 들어온 접속을 Private IP의 특정 포트로 요청을 전달할 수 있습니다.

IPTIME의 경우 192.168.0.1로 접속하면 공유기 관리자 페이지로 접속할 수 있습니다. 해당 페이지에서 고급설정 > NAT/라우터 관리 > 포트포워드 설정을 통해 포트포워딩을 할 수 있습니다.

위의 이미지는 Public IP의 38080 포트로 들어온 요청을 192.168.0.38 내부 IP를 가진 기기의 8080포트로 전달해주는 예시입니다.


제가 준비한 글은 여기까지입니다. 쉽게 설명하려고 노력했는데, 잘 됐는지 모르겠네요. 혹시 궁금하신 점이나 보완해야 할 점이 있으면 댓글로 남겨주시면 감사하겠습니다. 😀

반응형