[Article] IP주소와 서브넷 마스크

Seungrok Yoon (Lethe)·2021년 8월 26일
2
post-thumbnail

😁어떻게 서버의 응답은 내 기기로 정확히 도착할 수 있을까?

🤣TCP는 이제 알겠는데 IP를 모르겠네?

오늘 스터디 발표 주제는 "HTTPS와 SSL/TLS인증서" 였다. 준비를 나름 잘 했다고 생각했고, 발표 내용에 나오는 개념도 잘 이해를 했기에 전달을 잘 할 수 있을 것만 같았지만, 실제로 발표할 때 참 많이 버벅였다.

모두의 발표가 끝나고 Q&A시간에 나에게 폭풍같이 질문이 들어왔다. 그 중에서, 내가 답변을 제대로 하지 못한 인상깊은 질문이 있었는데,오늘 TIL에서는 이 질문과 관련한 개념에 대해 자세하게 써보고자 한다.

SJ님께서 나에게 던지신 질문은 "어떻게 서버가 내 디바이스를 특정해서 응답메시지를 전달했고, 또 공유기를 사용하는 경우에 어떻게 그 응답이 요청을 보냈던 디바이스로 정확하게 도달할 수 있는지?"였다.

그...그러게요...IP주소....우물쭈물... 하며 나는 말문이 막혀버렸다.

그렇다. 이 짧은 IP주소로 어떻게 내 디바이스는 수많은 호스트들 중, 목적지 서버 호스트로 패킷을 전달할 수 있을까? 그 반대로 서버는 어떻게 내 기기(클라이언트 호스트)의 정확한 위치를 특정해서 패킷을 보낼 수 있었을까? 심지어 공유기를 거쳐서 패킷이 전달되는데도...?

정말 궁금했다. 나는 궁금한 점이 있으면 해결될 때까지 다음 작업을 하지를 못하는 좋지만 나쁜 습관이 있는데, 수많은 삽질을 통해서 다행히 답을 찾을 수 있었다. 간단히 정리하자면 아래와 같다.

  • IP주소는 내가 속해 있는 네트워크 주소와 내 기기를 특정할 수 있는 호스트 주소로 이루어져있다.
  • 공유기를 사용하는 경우에 나의 IP주소는 절대적인 주소가 아니다. 그래서 나의 패킷이 공유기를 통해서 나갈 때, 공유기의 게이트웨이에서 나의 패킷 송신자를 공용IP로 바꿔서 내보내준다.
  • 이 때 게이트웨이는 내부에 갖고 있는 테이블에 이를 기록해 둔다. (1)어떤 프로토콜을 사용했는지, (2)어떤 사설IP 에서 (3)어떤 공인IP주소로 변환되어 (4)어떤 목적지 IP주소로 발신되었는지를 기록한 후, 발신지로부터 응답 패킷이 되돌아오면 물론 응답 패킷의 목적지는 내 공유기의 공인 IP일 것이다. (5) 그 값을 찾아서 해당하는 사설망 기기에게 발신해 주는 것이다.
    (원하시는 답변이었을까요 SJ님...?)

🦕 IP주소와 서브넷 마스크

지금부터는 SJ님의 질문에 대한 답을 찾던 중에 새로 알게 된 내용을 정리하는 부분이다. Microsoft홈페이지에 게시되어 있는 Understand TCP/IP addressing and subnetting basics을 일부 번역하여 가져온 내용이 주를 이룰 것이다. 그럼 시작!

개발자가 아니더라도 "IP주소"는 많이 들어봤을 것이다. 그렇다면 도대체 IP는 무엇일까?

IP는 TCP/IP 네트워크나 인터넷 상에서 '네트워크 패킷'을 보낼 때 사용하는 네트워크 프로토콜이다.

그래서 IP 주소는 TCP/IP 네트워크나 인터네트워크의 호스트(통신을 하는 주체, 그냥 컴퓨터라고 이해하자)에 대한 고유한 32비트 길이의 주소이다. 네트워크 상에서 내 컴퓨터의 주소인 셈이다.

내 컴퓨터의 IP주소는 꽤나 알기 쉽다. windows운영체제 커맨드 창에 ipconfig 명령어를 입력하면 아래와 같은 내용들이 주루룩 나오고, IPv4주소가 바로내 IP주소이다.

그런데 IP주소 말고도 다른 용어들이 보인다. 서브넷 마스크, 기본 게이트웨이 등등. 차근차근 알아보자.

아래 세 가지는 TCP/IP프로토콜 구성 세팅시에 필요한 정보들이다.

  • IP 주소
  • 서브넷 마스크
  • 디폴트 게이트웨이

서브넷 마스크는 IP주소를 2 부분으로 나눈데 사용된다.

  • Host 컴퓨터와
  • Host 컴퓨터가 속해 있는 네트워크

IP주소 = 네트워크 주소 + 호스트 주소

(원문 번역)
IP주소는 보통 192.168.123.132 와 같이 4개의 10진법 숫자가 . 으로 연결되어 있는 형태를 띠고 있다. 그렇지만 서브넷 마스크가 어떻게 동작하는 지 이해하기 위해서는 우리는 IP주소를 2진수로 표현해 볼 필요가 있다. 위에 예를 든 IP주소를 32비트짜리 이진수로 표기하면 110000000101000111101110000100 이다.

8개의 비트 구역은 옥텟(octet)이라 불리는데, 2진수로 표기한 IP주소를 octet을 기준으로 .을 찍으면 11000000.10101000.01111011.10000100 가 된다. 각 octet을 10진수로 변환하면 192.168.123.132로 되돌릴 수 있다.

TCP/IP 에서 네트워크 사이에 패킷을 전달하는 라우터들은 패킷의 정보가 향하는 호스트(목적지에 있는)의 정확한 위치를 알 수 없다. 다만 라우터들은 해당 호스트가 속해 있는 네트워크만을 알 뿐이라, 목적지 호스트가 속해있는 네트워크까지만 패킷을 전달한다. 이후 패킷은 추가 과정을 거쳐서 호스트로 전달된다.

이렇게 라우터가 호스트가 속해있는 네트워크를 알 수 있는 이유는 바로 IP주소가 두 부분으로 나뉘어 있기 때문이다.

예를 들어 192.168.123.132 는 192.168.123.0과 0.0.0.132 부분으로 분리될 수 있다.

IP주소에서 네트워크 주소를 알 수 있게 해주는 Subnet Mask

(원문 번역)
TCP/IP가 작동하기 위해 꼭 필요한 두 번째 아이템은 서브넷 마스크이다.

TCP/IP에서는 두 부분으로 IP주소를 분리 할 수 있다고 말했었다. 그렇지만 이렇게 두 부분으로 나눈 IP주소 중 어떤 것이 네트워크 주소이고 호스트 주소인지는 추가 정보 없이는 결정할 수 없다. 그래서 네트워크 주소를 식별하기 위해 추가적으로 32 비트의 숫자가 제공되고, 이 숫자가 바로 Subnet Mask이다.

서브넷 마스크가 IP주소에서 네트워크 주소를 식별해내는 원리는 매우 단순하다.가령,

11000000.10101000.01111011.10000100 - IP address (192.168.123.132)
11111111.11111111.11111111.00000000 - Subnet mask (255.255.255.0)

인 경우를 생각해보자. 각 비트를 AND연산을 하게되면 네트워크 주소만 튀어나오게 된다. 자, 이제 서브넷 마스크의 도움으로, 네트워크 주소는 192.168.123.0로 결정된 것을 확인 할 수 있다. 호스트 주소는 IP주소-호스트주소로 0.0.0.132 임을 할 수 있다.😁

우리가 웹브라우저에서 URL도메인 주소를 브라우저에 입력하면서 요청을 보내면, 먼저 로컬의 hosts 파일에서 찾은 후, 없다면 DNS Server에 Domain 이름의 IP를 요청하고 받습니다.URL주소는 DNS서버를 통해 IP주소로 변환되고, 이 IP주소는 서브넷 마스크의 도움으로 호스트와, 호스트가 속한 네트워크 주소를 알 수 있게 분리될 수 있다.

반대로 우리가 CMD창에서 ipconfig 명령어를 통해 알 수 있는 우리의 IP주소도 사실은 내가 속한 네트워크 주소와, 호스트로서의 나의 주소가 합쳐져 있는 것이다.

어? 그러면 같은 네트워크에 연결된 다른 기기(호스트)는 네트워크 주소는 내 기기와 같고, 호스트 주소만 다르겠네요?**

정답이다. IP주소가 세 자리 옥텟까지 동일할 것이다.

그러면 제가 제 집의 와이파이에 접속했다가 카페의 와이파이 공유기에 접속하면 IP주소가 달라지나요?

정답니다. IP주소가 달라진다. 사실 우리가 ipconfig를 통해서 확인 할 수 있는 IP주소는 절대적인 공용(public) IP주소가 아닌, 사설(private) IP주소이다.

공인 IP주소는 전 세계에서 유일한 IP주소이지만, 사설 IP주소(로컬 IP, 가상 IP주소)는 ISP 업체로부터 할당된 IP 주소(공인 주소)를 공유기에 설정하고 그 공유기에 각 컴퓨터를 연결하면, 컴퓨터에 각각의 IP 주소(사설 주소)가 자동 할당되어 각 컴퓨터가 공유기를 거쳐 동시에 인터넷에 접속되는 것이다.

즉, 공유기는 단일 공유 IP에서 다수의 하위 클라이언트(PC, 모바일 폰, 태블릿PC) 등등이 인터넷 연결을 가능하게 하기 위해 NAT를 수행하여 해주는 장치이다. NAT(Network Address Translation-네트워크 주소 변환)기술은 부족한 공인IP를 사설IP로 분배하여 각 PC에 나눠 주는 기술이다.

이미지출처

이때 공유기는 공인 IP 주소를 가상 IP 주소(인터넷→공유기→컴퓨터)로, 또는 그 반대로(컴퓨터→공유기→인터넷) 변환해주는 역할을 하는데, 이를 네트워크 용어로 ‘NAT(Network Address Translation)’라 한다. 즉, 네트워크 IP 주소를 상황에 따라 번역/변환한다는 의미다.

그래서 공유기를 사용하는 환경에서 각 컴퓨터의 IP 주소를 확인해 보면, 대부분 192.168.xxx.xxx와 같은 가상 IP 주소 형식이 적용된다. 이 가상 IP 주소는 공유기가 설치된 그 환경에서만 통용되는 주소다. 예를 들어 A 공유기에 연결한 컴퓨터의 IP 주소가 192.168.0.10이라면, B 공유기의 컴퓨터에도 동일한 주소가 존재할 수 있다.

아니 그러면, 내 기기에서 패킷을 송신할 때 송신자 IP는 공유기 바깥의 네트워크에서는 인식을 못하는 IP이군요?

그렇다. 아까 말했듯이, 지금 공유기를 통해서 할당받은 내 IP값은 다른 공유기의 컴퓨터에도 할당될 수 있는, 로컬 영역의 IP주소이다.

내 패킷이 공유기를 무조건 거쳐서 외부 네트워크로 빠져 나가가고, 들어오는 패킷 또한 공유기를 거쳐서 내 기기에 도달한다. 그리고 이 사실은 공유기 쪽에서 무엇인가 내 패킷 안의 IP주소에 해당하는 곳에 무언가 추가 작업을 하고 있다는 것을 암시한다. 이 작업을 이해하기 위한 개념은 '기본 게이트웨이(default gateway)'와 '네트워크 주소 변환(NAT, Network Address Translation)' 이다.

아래 참조되어있는 두 사이트는 NAT과 NAPT의 원리에 대해 정말 잘 설명되어있는 포스팅 주소입니다. 추천드립니다!
1. 우당탕탕 런잇메이트 님의 'NAT(Network Address Translation) 통신과정 끝판왕(feat. 총정리)'
2. _미니 _님의 'NAT와 NAPT의 개념과 원리'

Network Class

(번역)
인터넷 주소는 InterNIC라는 곳에서 할당되는데, 이 IP 주소들은 클래스(계급)별로 나뉜다. 대부분의 인터넷 주소들은 A,B,C 클래스에 해당한다. 각각의 주소 클래스는 서로 다른 기본 서브넷 마스크 값을 가지고 있다. IP주소의 클래스는 첫 번째 octet을 확인함으로써 알 수 있다.

Class A Network:
- 기본 서브넷 마스크: 255.0.0.0
- 첫 번째 octet: 0-127
- 예시: IP주소 10.52.36.11는 class A 주소이다.
Class B Network:
- 기본 서브넷 마스크: 255.255.0.0
- 첫 번째 octet: 128-191
- 예시: IP주소 172.16.52.63는 class B 주소이다.
Class C Network:
- 기본 서브넷 마스크: 255.255.255.0
- 첫 번째 octet: 192-223
- 예시: IP주소 192.168.123.132는 class C 주소이다.

Default gateways

(번역)
만약 TCP/IP 컴퓨터가 네트워크 상의 다른 호수트와 통신을 하려고 한다면, 라우터라고 불리는 기기를 통해 보통 통신이 이루어진다. TCP/IP 용어들 중에서, 호스트의 서브넷을 다른 네트워크로 연결해주는 라우터를 특별히 'defulat gateway'라고 부른다. 그럼 이제부터 어떻게 게이트웨이가 네트워크 상의 다른 컴퓨터로 패킷을 보낼지 말지를 결정하는지를 알아보자.

호스트가 TCP/IP를 이용하여 다른 네트워크의 호스트와 통신을 시도할 때, 호스트는 자신의 IP주소와 서브넷 마스크, 그리고 목적지 호스트의 IP주소와 서브넷 마스크를 이용해서 비교한 뒤, 해당 목적지 호스트가 로컬 네트워크 내부의 호스트인지, 아니면 다른 네트워크(원격)에 있는 호스트인지를 판별한다.

만약 이 비교 작업 결과, 목적지 호스트가 로컬 호스트임이 판별되면, 로컬 서브넷(서브넷 마스크가 아니다!)으로 패킷을 보낸다. 그렇지만 만약 목적지 호스트가 원격 호스트인 것으로 판별되면 컴퓨터는 컴퓨터의 TCP/IP 속성에서 결정되어 있는 기본 게이트웨이(default gateway)로 패킷을 포워드(전달)한다.
이후에 올바른 원격 서브넷으로 패킷을 포워딩하는 것은 라우터의 역할이다.

MS가 추천하는 TCP/IP 레퍼런스

  • "TCP/IP Illustrated, Volume 1: The Protocols," Richard Stevens, Addison Wesley, 1994

  • "Internetworking with TCP/IP, Volume 1: Principles, Protocols, and Architecture," Douglas E. Comer, Prentice Hall, 1995

😆느낀 점

검색도 잘 하는 방법이 있다. 검색을 잘 한다는 것은 내가 무엇을 모르는지를 확실하게 알아야 가능하다. 그러면 어떻게 검색해야 할 지를 제대로 알게된다.
여러 번의 삽질을 통해 내가 모르는 것이 특정 주제로 수렴되었을 때 비로소 옳은 검색어로 검색을 할 수 있게 되었다.

조사하여 이해한 바를 내 블로그에 적어보는 과정을 통해서 IP라는 것이 어떻게 구성되고, TCP/IP 통신이 어떻게 이루어지는지 정확하게 알 수 있는 기회가 되었다. 번역하는 과정에서 subnetting에 관한 부분은 뺐는데, 이 부분은 이번 노션 클로닝 개인 프로젝트가 끝나고 추가할 예정이다.

참조

profile
안녕하세요 개발자 윤승록입니다. 내 성장을 가시적으로 기록하기 위해 블로그를 운영중입니다.

0개의 댓글