본문 바로가기
School/GNPS

[GNPS] 챕터 2 리소스의 위치와 트래픽 라우팅

by 세똔구리 SEDDONGURI 2025. 10. 23.
GNPS (Go Network Programming School)의 내용을 정리한 글입니다.
Go 언어를 활용한 네트워크 프로그래밍 - 책 으로 스터디를 진행합니다. 


IP (Internet Protocol)란 무엇인가?          

IP(Internet Protocol)는 인터넷을 통해 전송되는 데이터의 포맷과 규칙을 정의하는 핵심 통신 규약입니다.

네트워크상에서 각 노드(컴퓨터, 서버 등)를 고유하게 식별할 수 있도록 IP 주소(Address)를 사용하며, 이를 통해 노드 간의 원활한 통신을 가능하게 합니다.

 

IPv4 주소의 구조          

현재 널리 사용되는 IPv4 주소는 8비트로 구성된 네 개의 그룹, 즉 총 32비트로 이루어진 숫자입니다. 모든 비트가 0 또는 1의 조합으로 이루어져, 약 $2^{32}$ (약 42억 개)의 고유한 주소를 표현할 수 있습니다.

  • 10진수 표현: 192.168.156.97
  • 2진수 표현: 11000000.10101000.10011100.01100001

 

네트워크 ID와 호스트 ID          

IP 주소는 크게 두 부분으로 나뉩니다.

  1. 네트워크 ID: 패킷이 이동해야 할 네트워크(혹은 홉)를 가리키는 주소입니다.
  2. 호스트 ID: 해당 목적지 네트워크상에 있는 특정 수신자(장치)를 가리키는 주소입니다.

네트워크 ID는 가장 왼쪽 비트부터 시작하며, 그 크기는 다음에 설명할 CIDR 표기법에 따라 결정됩니다. IP 주소에서 네트워크 ID에 포함되지 않는 나머지 비트는 모두 호스트 ID를 가리키는 데 사용됩니다.

 

CIDR (Classless Inter-Domain Routing)          

과거에는 A, B, C 클래스 등으로 네트워크의 크기가 고정되어 있었습니다. 하지만 IP 주소를 더 효율적으로 사용하기 위해 CIDR(클래스 없는 도메인 간 라우팅) 이 도입되었고, 이를 통해 네트워크를 필요에 따라 유연하게 분할하고 통합할 수 있게 되었습니다.

CIDR은 IP 주소 뒤에 슬래시(/)와 정수를 추가하여 네트워크 ID의 범위를 표현합니다.

  • 예시: 192.168.156.97/16

여기서 /16이 CIDR 표기법이며, '이 IP 주소의 처음 16비트가 네트워크 ID 영역임'을 의미합니다. 나머지 16비트(32 - 16)는 호스트 ID 영역으로 사용됩니다.

 

CIDR과 서브넷 마스크의 관계          

CIDR은 서브넷 마스크(Subnet Mask)를 간결하게 표현하는 방식입니다. 둘 다 네트워크 ID와 호스트 ID를 구분하는 역할을 하지만, 표현 방식에 차이가 있습니다.

  • 서브넷 마스크: 255.255.0.0처럼 10진수로 표현합니다.
  • CIDR: 서브넷 마스크를 2진수로 변환했을 때 1로 표현되는 비트의 개수를 의미합니다.
    • 255.255.0.0 → 11111111.11111111.00000000.00000000 → 1이 16개 → /16

 

네트워크 ID 계산 방법          

IP 주소에서 네트워크 ID를 찾는 공식적인 방법은 IP 주소와 서브넷 마스크를 비트(2진수) 단위로 AND 연산하는 것입니다. 192.168.156.97/16을 기준으로 계산하는 과정은 다음과 같습니다.

1. 서브넷 마스크 확인 (CIDR: /16)
   - 2진수: 11111111.11111111.00000000.00000000
   - 10진수: 255.255.0.0

2. 네트워크 ID 계산 (IP 주소 AND 서브넷 마스크)
     11000000.10101000.10011100.01100001   (IP: 192.168.156.97)
   & 11111111.11111111.00000000.00000000   (Mask: 255.255.0.0)
   --------------------------------------------------
     11000000.10101000.00000000.00000000   (결과: 192.168.0.0)

3. 결과
   - 이 IP가 속한 네트워크 ID: 192.168.0.0
   - 호스트 ID 영역에 해당하는 값: 156.97

 

포트(Port)와 소켓 주소          

TCP와 UDP 프로토콜은 포트(Port)를 사용하여 다중화된 데이터 전송을 가능하게 합니다. 이 덕분에 하나의 컴퓨터(하나의 IP 주소)에서 동시에 여러 애플리케이션이 각기 다른 노드와 통신할 수 있습니다.

운영체제는 이 포트 번호를 사용하여 데이터 전송을 고유하게 식별합니다. IP 주소와 포트 번호의 조합소켓 주소(Socket Address)라고 부르며, 보통 주소:포트 형식으로 표기합니다. (예: 192.168.156.97:8080)

포트는 16비트 양의 정수이므로, 0번부터 65,535번까지의 값을 가질 수 있습니다.

 

NAT (Network Address Translation)          

NAT(네트워크 주소 변환)는 약 40억 개로 한정된 IPv4 주소의 부족 문제를 해결하기 위한 핵심 기술 중 하나입니다.

모든 장치가 인터넷에 연결되기 위해 고유한 공인 IP를 가질 필요는 없습니다. 집이나 회사 같은 내부 네트워크에서는 사설 IP 주소(예: 10.x.x.x, 192.168.x.x)를 사용하고, 이 장치들이 외부 인터넷과 통신해야 할 때만 네트워크의 경계에 있는 NAT 장치(주로 공유기, 라우터)가 사설 IP를 공인 IP로 변환해 줍니다.

이를 통해 하나의 공인 IP 주소로도 여러 대의 내부 장치가 인터넷을 사용할 수 있게 됩니다.

 

NAT 동작 과정          

NAT는 네트워크의 경계에서 트래픽을 중개하며, 다음과 같은 과정을 통해 주소를 변환합니다.

[상황 가정]
- 내부 PC (사설 IP): 10.0.0.3:50926
- NAT 장치 (공인 IP): 1.2.3.4
- 외부 서버 (목적지): 8.8.8.8:443 (예: Google DNS)

---
[1단계: 내부 PC -> NAT (내부망)]
내부 PC(10.0.0.3)가 외부 서버(8.8.8.8)로 패킷을 전송합니다.
이 패킷은 게이트웨이인 NAT 장치로 향합니다.

[ 📦 패킷 #1 | 출발지: 10.0.0.3:50926 | 목적지: 8.8.8.8:443 ]

---
[2단계: NAT -> 외부 서버 (주소 변환)]
NAT 장치가 패킷을 받고, 출발지 주소를 자신의 공인 IP와 새로운 포트로 변환합니다.
이 변환 내역을 'NAT 테이블'에 기록합니다.

[ 📖 NAT 테이블 (기록) ]
|   내부 주소 (Inside) |   외부 주소 (Outside) |
|----------------------|-----------------------|
| 10.0.0.3:50926       |  1.2.3.4:62000        |  <- (새 포트 62000 할당)

[ 📦 패킷 #1 (변환됨) | 출발지: 1.2.3.4:62000 | 목적지: 8.8.8.8:443 ]

---
[3단계: 외부 서버 -> NAT (응답)]
외부 서버는 요청이 온 주소, 즉 NAT 장치의 공인 IP(1.2.3.4:62000)로 응답 패킷을 보냅니다.

[ 📦 패킷 #2 (응답) | 출발지: 8.8.8.8:443 | 목적지: 1.2.3.4:62000 ]

---
[4단계: NAT -> 내부 PC (역변환)]
NAT 장치가 응답 패킷을 받습니다. NAT 테이블을 조회하여
목적지(1.2.3.4:62000)가 원래의 사설 IP(10.0.0.3:50926)와 매핑됨을 확인합니다.
패킷의 목적지 주소를 원래의 사설 IP로 역변환하여 내부 PC로 전달합니다.

[ 📖 NAT 테이블 (조회) ]
"62000번 포트는 10.0.0.3:50926을 위한 것이다."

[ 📦 패킷 #2 (역변환됨) | 출발지: 8.8.8.8:443 | 목적지: 10.0.0.3:50926 ]

 

IPv6: 차세대 인터넷 프로토콜          

IP 주소 고갈 문제에 대한 근본적인 해결책으로 IPv6가 있습니다. IPv6는 128비트 주소 체계를 사용하며, 사실상 무한에 가까운 주소 공간을 제공합니다.

주소는 콜론(:)으로 구분된 8개의 16비트 그룹으로, 16진수로 표현합니다.

  • 예시: fd00:4700:0010:0000:0000:0000:6814:d103

 

IPv6 주소 축약 규칙          

IPv6 주소는 매우 길기 때문에 가독성을 높이기 위해 다음과 같은 축약 규칙을 사용합니다.

  1. 각 그룹에서 왼쪽에 연속되는 0을 제거합니다. (예: 0010 → 10, 0000 → 0)
  2. 0으로만 이루어진 연속된 그룹을 이중 콜론(::)으로 한 번만 축약합니다.
  • 원본: fd00:4700:0010:0000:0000:0000:6814:d103
  • 1단계 (0 제거): fd00:4700:10:0:0:0:6814:d103
  • 2단계 (연속 0 축약): fd00:4700:10::6814:d103

IPv6는 방대한 주소 공간 외에도, 헤더 구조를 단순화하여 라우터의 처리 부담을 줄이고, 주소 자동 구성(Stateless Address Autoconfiguration) 기능을 지원하는 등의 장점을 가집니다.

 

ICMP (Internet Control Message Protocol)          

IP(Internet Protocol)는 패킷을 '최선형(best-effort)'으로 전송할 뿐, 패킷이 목적지에 도달하지 못했을 때 발생하는 문제를 발신지에 알릴 방법이 없습니다.

ICMP는 바로 이 IP의 한계를 보완하는 3 계층 프로토콜로, 데이터 전송이 아닌 네트워크의 상태 제어와 오류 메시지를 전송하는 것이 주목적입니다.

ICMP 메시지는 크게 두 가지 핵심 기능으로 나뉩니다.

  1. 오류 보고 메시지 (Error Reporting) 라우터나 호스트가 패킷을 처리하다 문제가 생기면 발신지로 오류를 알립니다.
    • Type 3 (Destination Unreachable): 목적지 호스트나 포트에 도달할 수 없을 때 사용됩니다.
    • Type 11 (Time Exceeded): 패킷의 TTL(Time To Live)이 0이 되어 패킷이 폐기되었음을 알립니다.
  2. 쿼리 메시지 (Query) 네트워크 상태를 진단하기 위해 사용됩니다.
    • Type 8/0 (Echo Request/Reply): 가장 유명한 ping 유틸리티가 사용하는 메시지입니다. 이를 통해 목적지 호스트의 도달 가능성과 왕복 시간(RTT)을 측정합니다.

traceroute(경로 추적) 유틸리티는 이 ICMP의 Type 11 (Time Exceeded) 메시지를 의도적으로 활용하여 목적지까지의 경로에 있는 라우터들을 순서대로 파악합니다.

ICMP는 이처럼 네트워크 진단에 필수적이지만, 때로는 ping을 이용한 네트워크 스캐닝이나 ICMP Flood (DoS) 공격 등에 악용될 수 있어 방화벽에서 차단되기도 합니다.

 

DNS (Domain Name System)          

DNS(Domain Name System)는 google.com과 같은 사람이 읽기 쉬운 도메인 이름을 172.217.14.228과 같은 기계가 읽을 수 있는 IP 주소로 변환해 주는 시스템입니다.

사용자가 도메인 이름을 요청하면, PC에 설정된 DNS 해석기(Resolver)루트 네임 서버에서부터 시작하여. com (최상위 도메인), google.com (하위 도메인) 순서로 질의를 이어가며 최종적으로 도메인에 연결된 IP 주소를 찾아냅니다.

 

DNS 리소스 레코드 (Resource Records)          

DNS는 도메인에 대한 다양한 정보를 리소스 레코드(Resource Record) 형태로 보관합니다. DNS 쿼리는 이 레코드 정보를 조회하는 과정이며, 주요 레코드 유형은 다음과 같습니다.

  • A 레코드 (Address): 가장 기본적이고 필수적인 레코드로, 도메인 이름을 IPv4 주소에 직접 매핑합니다. (예: google.com → 172.217.14.228)
  • CNAME 레코드 (Canonical Name): 특정 도메인 이름을 다른 도메인 이름(별칭)에 매핑합니다. (예: www.example.com → example.com) 하나의 IP 주소에 여러 개의 도메인 이름을 연결할 때 유용합니다.
  • SOA 레코드 (Start of Authority): 해당 도메인 영역(Zone)에 대한 권한이 있는 주 네임 서버 정보, 관리자 이메일, 데이터 동기화 주기(Refresh, Retry) 등 중요한 관리 정보를 포함합니다.
  • NS 레코드 (Name Server): 해당 도메인의 DNS 정보를 관리하는(권한을 가진) 네임 서버의 도메인 이름을 지정합니다. (예: example.com의 네임서버는 ns1.example.com이다.)
  • TXT 레코드 (Text): 도메인에 대한 임의의 텍스트 정보를 포함합니다. 주로 도메인 소유권을 확인하거나, 이메일 스푸핑을 방지하기 위한 SPF(Sender Policy Framework) 또는 DKIM(DomainKeys Identified Mail) 인증 값을 설정하는 데 사용됩니다.