
C++ 게임 서버를 개발하기 위해서는 소켓 프로그래밍(Socket Programming)에 대한 이해가 필수적입니다. 그리고 소켓 프로그래밍을 제대로 다루기 위해서는, 그 기반이 되는 네트워크(Network)와 운영체제(OS)에 대한 기본적인 지식이 선행되어야 합니다.
첫 번째 목표는 Socket Open & Close의 정확한 이해입니다. 단순히 코드만 나열하는 것이 아니라, 그 안에 내포된 OS와 네트워크 개념을 함께 이해해야 각 코드가 왜 필요한지, 어떤 의미를 가지는지를 명확히 알 수 있습니다.
이 글은 소켓 프로그래밍으로 들어가기 전 반드시 짚고 넘어가야 할 네트워크 기본 개념들을 정리한 글입니다. IPv4와 IPv6의 등장 배경, 주소 체계의 차이, 포트 번호의 역할, 그리고 통신 방식의 차이까지 하나씩 살펴봅니다.
이 글을 끝까지 정독하신다면, 네트워크 관점에서 바라본 Socket대한 이해가 되실겁니다.
[학습목표]
1. Network 관점에서 바라본 Socket이란?
2. Socket Address Struct
(이 글은 여러 기술 문서와 교재 등 다양한 자료를 참고하였습니다)
먼저 TCP/IP, UDP/IP와 같이 표기되는 구조에서 IP는 Internet Protocol의 약자로, OSI Model의 Layer 3(Network Layer)에 위치한 프로토콜입니다.
IP는 네트워크 상에서 패킷을 전달하기 위한 규칙(Protocol)을 정의하며, 패킷의 전달을 위해 필요한 주소 체계와 라우팅 방식을 함께 규정합니다. IP가 담당하는 주요 역할은 다음과 같습니다.
그렇다면 IP 주소(IP Address)란 무엇일까요? IP 주소는 IP(Internet Protocol)에서 사용하는 논리적 주소 값으로, 네트워크 상에서 각각의 기기(또는 네트워크 인터페이스)를 식별하기 위해 사용됩니다.
IP 주소의 형식은 IP의 버전에 따라 달라지며, IPv4 주소는 32비트로 구성되어 있으며 일반적으로 8비트 숫자 4개로 표현됩니다. IPv6 주소는 128비트 주소 체계를 사용합니다.
즉, IP는 규칙을 정의하는 프로토콜이고, IP 주소는 그 규칙 안에서 사용되는 식별자라고 할 수 있습니다.
이때 포켓몬IP, Game IP등의 IP는 Intrellectual Property라는 '지적 재산'의 약자입니다.
예를 들어 네이버이나, 구글 등 IP주소를 얻기 위해서는 cmd에서 ping naver.com, ping google.com 입력시 여러 개의 IP주소 중 첫 번째 또는 가장 적합한 IP 하나를 선택하여 보여줍니다.

위의 사진은 네이버의 여러 IP주소입니다.

위의 사진은 여러 IP주소 중 첫 번째에 해당하는 IP주소입니다.
IPv4와 IPv6의 본격적으로 이해하기 위해서는, 먼저 각 프로토콜이 등장하게 된 배경과 한계를 살펴볼 필요가 있습니다.
IPv4는 1982년 SATNET에서 처음 사용되었고, 1983년 1월 ARPANET에 공식적으로 배포되며 인터넷의 핵심 프로토콜로 자리 잡았습니다. IPv4는 32비트 주소 공간을 사용하며, 이론적으로는 약 43억 개(2³²)의 IP 주소를 할당할 수 있습니다.
네이버의 여러 IP주소 중 [223.130.192.248]이 IPV4의 형식입니다.
그러나 IPv4 주소 체계는 수십 년간 전 세계적으로 사용되면서 현재는 주소 고갈(Address Exhaustion)이라는 구조적인 한계에 도달했습니다. 이는 단순히 주소 개수가 부족해서만은 아닙니다. IPv4 주소는 특정 범위를 기준으로 국가·기관·조직에 계층적으로 분배되며, 이 과정에서 사설 주소, 멀티캐스트 주소, 루프백 주소 등 실제로 호스트에 할당할 수 없는 예약 주소 영역이 존재합니다. 그 결과, 실질적으로 사용 가능한 주소 수는 이론적인 최대치보다 훨씬 적습니다.
이러한 문제를 완화하기 위해 등장한 기술이 NAT(Network Address Translation)입니다. NAT는 하나의 공인 IP 주소를 여러 내부 장치가 공유하도록 함으로써 주소 부족 문제를 일정 부분 지연시켰습니다. 하지만 이는 근본적인 해결책이라기보다는 임시적인 우회 방법에 가깝습니다. NAT 환경에서는 종단 간(end-to-end) 연결성이 저하되고, 네트워크 구조가 복잡해지는 등의 부작용도 발생합니다.
특히 사물 인터넷(IoT) 환경에서는 수많은 기기와 사물이 각각 고유한 인터넷 주소를 가져야 한다는 전제를 기반으로 합니다. 이러한 환경에서 IPv4 주소 체계는 구조적으로 확장에 한계가 있을 수밖에 없습니다.
아래 사진은 IPV4에 대한 역사적 배경입니다.
이러한 문제를 근본적으로 해결하기 위해 팰로앨토 연구소에서 개발하고, 1994년 IETF(국제 인터넷 표준화 기구)가 채택한 IPv6입니다. IPv6는 128비트(16바이트) 크기의 주소 체계를 사용하며, 이는 16비트(2바이트) 값 8개를 콜론(:)으로 구분하여 표현합니다. IPv6의 주소 공간은 약 2¹²⁸개에 달하며, 이는 사실상 주소 고갈을 걱정할 필요가 없는 수준입니다.
IPv4와 IPv6의 가장 큰 차이점은 위에 언급한 주소 공간의 크기입니다. IPv4는 32비트 주소 체계를 사용하여 약 43억 개의 주소만을 제공하는 반면, IPv6는 128비트 주소 체계를 사용하여 사실상 무한에 가까운 주소 공간을 제공합니다. 이는 단순히 더 많은 주소를 확보하는 것을 넘어, 모든 장치가 고유한 공인 IP 주소를 가질 수 있도록 설계되었음을 의미합니다.
주소 공간 확장과 함께 네트워크 구조의 변화도 중요한 차이점입니다. IPv4에서는 주소 부족 문제를 해결하기 위해 NAT(Network Address Translation)가 널리 사용되었습니다. 반면 IPv6는 충분한 주소 공간을 전제로 설계되었기 때문에 NAT가 필요 없으며, 이를 통해 종단 간 연결성을 회복할 수 있습니다.
주소 표현 방식 역시 다릅니다. IPv4는 점(.)으로 구분된 10진수 형식으로 주소를 표현하는 반면, IPv6는 콜론(:)으로 구분된 16진수 형식을 사용합니다. 또한 IPv6는 연속된 0을 축약하여 표현할 수 있어 주소 표기가 보다 유연합니다.
프로토콜 구조 측면에서도 차이가 존재합니다. IPv4 헤더는 옵션 필드로 인해 구조가 가변적이며 비교적 복잡한 반면, IPv6 헤더는 크기를 고정(40바이트)하고 구조를 단순화했습니다. 불필요한 헤더 체크섬을 제거하고, 확장 헤더(Extension Header)를 통해 필요한 기능만 선택적으로 추가할 수 있도록 설계되어 라우터의 처리 효율이 향상되었습니다.
또한 IPv4는 Broadcast 방식을 지원하지만, IPv6에서는 Broadcast를 제거하고 Multicast와 Unicast를 기본 통신 방식으로 사용합니다. 이는 불필요한 네트워크 트래픽을 줄이고 보다 효율적인 데이터 전달을 가능하게 합니다.
이러한 특성 덕분에 IPv6는 대규모 네트워크 환경과 사물 인터넷(IoT)과 같이 수많은 장치가 동시에 연결되는 환경에 더욱 적합한 프로토콜이라 할 수 있습니다. 즉, IPv6는 IPv4의 단순한 확장이 아니라, 미래 인터넷 환경을 고려하여 재설계된 차세대 인터넷 프로토콜입니다.
더 자세한 내용은 아래 링크에 첨부해두었습니다.
https://www.ibm.com/docs/ko/i/7.6.0?topic=6-comparison-ipv4-ipv6
해당 개념들은 세 가지 통신 방식 외에도 다양한 네트워크 개념과 밀접하게 연결되어 있으므로, 추후 글에서 보다 자세히 다루도록 하겠습니다.
Unicast는 하나의 송신자(Sender) 가 하나의 수신자(Receiver) 에게 데이터를 전송하는 방식입니다. 가장 기본적이고 일반적인 통신 형태로, 대부분의 인터넷 통신은 Unicast방식으로 이루어집니다.

Broadcast는 하나의 송신자가 동일한 네트워크에 속한 모든 단말기에게 데이터를 전송하는 방식입니다. 수신 대상을 특정하지 않으며, 같은 브로드캐스트 도메인에 있는 모든 장치가 패킷을 수신하게 됩니다.
이 방식은 네트워크 초기 설정이나 장치 탐색과 같이 “누가 있는지 모르는 상태”에서 유용하지만, 모든 단말기가 패킷을 처리해야 하므로 불필요한 트래픽을 발생시킬 수 있습니다. 이러한 이유로 IPv6에서는 Broadcast 개념이 제거되었습니다.

Multicast는 하나의 송신자가 특정 그룹에 속한 다수의 수신자에게만 데이터를 전송하는 방식입니다. 수신자는 사전에 특정 멀티캐스트 그룹에 가입(Join)한 상태여야 하며, 그룹에 속한 호스트만 데이터를 수신합니다.

Game Server에서 Unicast는 1대1 통신 방식으로 특정 플레이어 한 명에게만 데이터를 보내는 데 사용됩니다. 주로 플레이어 간의 개인적인 상호작용, 서버와 클라이언트 간의 지속적인 정보 교환, 로그인, 아이템 획득 등 고유한 데이터를 주고받을 때 핵심적인 역할을 합니다.
단말기마다 IP 주소가 존재한다는 점은 네트워크 통신의 기본이 됩니다. 그러나 IP 주소만으로는 네트워크 프로그램을 구현하기에 충분하지 않습니다. 하나의 단말기 안에서는 여러 개의 프로세스가 동시에 실행되며, 단순히 IP 주소만으로는 어떤 프로세스가 데이터를 보냈는지, 그리고 어떤 프로세스가 해당 데이터를 받아야 하는지를 식별할 수 없기 때문입니다.
이러한 문제를 해결하기 위해 IP 주소 내부에서 통신의 대상을 구분하는 개념이 필요하며, 이 역할을 수행하는 것이 바로 포트(Port)입니다. 포트는 하나의 단말기 내에서 실행 중인 특정 프로세스 또는 네트워크 서비스를 식별하는 0~65535 범위의 포트 번호로 논리적인 식별자 역할을 합니다.
포트는 하드웨어 인터페이스를 의미하는 포트와 혼용되기도 하지만, 소켓 프로그래밍에서의 포트는 네트워크 서비스나 프로세스를 식별하기 위한 논리 단위를 의미합니다.
포트는 주로 전송 계층(Transport Layer)에서 사용되며, 대표적인 전송 계층 프로토콜로는 TCP(Transmission Control Protocol)와 UDP(User Datagram Protocol)가 있습니다.
일반적으로 네트워크 통신에서 IP 주소, 전송 계층 프로토콜(TCP/UDP), 포트 번호의 조합을 통해 통신의 한 종단점을 식별하며, 이를 흔히 소켓(Socket)이라 부른다.
이는 IANA(Internet Assigned Numbers Authority)가 정의한 포트 번호 범위 분류 체계입니다 이는 UDP/TCP Socket이나 특정 소켓 옵션 설정과 직접적으로 연결됩니다.
포트 번호는 용도와 관리 목적에 따라 크게 Well-known Port, Registered Port, Dynamic(또는 Ephemeral) Port의 세 가지 범위로 구분됩니다. 이 구분은 포트 충돌을 방지하고, 네트워크 서비스의 역할을 명확히 하기 위해 정의되었습니다.
0번부터 1023번까지의 포트 번호로, 인터넷의 핵심 서비스들을 위해 예약된 범위입니다. HTTP(80), HTTPS(443), FTP(21), SSH(22)와 같은 표준 서비스들이 이 범위를 사용합니다. 운영 체제에서는 보안상의 이유로 일반 사용자 프로세스가 해당 포트를 임의로 사용하는 것을 제한하며, 주로 시스템 권한을 가진 서비스 데몬이 사용합니다.
1024번부터 49151번까지의 범위로, 특정 애플리케이션이나 서비스가 사용하도록 등록된 포트 번호입니다. 이 포트들은 IANA에 의해 관리되며, 표준은 아니지만 특정 서비스가 관례적으로 사용하는 포트가 여기에 해당합니다.
예를 들어 MySQL(3306), PostgreSQL(5432), Redis(6379) 등이 있습니다. 다만 이 범위의 포트는 운영 체제에 의해 엄격히 보호되지는 않으므로, 사용자 애플리케이션에서도 자유롭게 사용할 수 있습니다.
49152번부터 65535번까지의 범위로, 주로 클라이언트 측에서 임시적으로 사용됩니다. 클라이언트가 서버와 통신을 시작할 때, 운영 체제는 이 범위 내에서 사용 가능한 포트 번호를 자동으로 할당합니다. 통신이 종료되면 해당 포트는 다시 반환되며, 지속적으로 재사용됩니다. 이 포트들은 서버가 고정적으로 대기(Listen)하는 용도가 아니라, 일시적인 연결을 위한 목적으로 사용됩니다.
이러한 포트 번호 구분 덕분에 서버는 고정된 포트에서 안정적으로 서비스를 제공할 수 있고, 클라이언트는 충돌 없이 여러 네트워크 연결을 동시에 생성할 수 있습니다.
바이트 정렬(Byte Order) 개념은, 곧 살펴볼 소켓 주소 구조체에서 포트 번호와 IP 주소를 설정할 때 반드시 필요합니다.
바이트 정렬(Byte Order)은 메모리에 데이터를 저장할 때 Byte의 배치 순서를 나타내는 용어입니다. 빅 엔디언(Big-endian) 과 리틀 엔디언(Little-endian) 방식이 있습니다.
빅 엔디언 : 최상위 바이트(MSB : Most Significant Byte) 부터 차례대로 저장하는 방식입니다
리틀 엔디언 : 최하위 바이트(Least Significant Byte) 부터 차례로 저장하는 방식입니다.
시스템에서 사용하는 Byte Order은 CPU와 OS에 따라 다르므로 서로 다른 시스템 간의 Data를 교환할 때는 이를 고려 해야합니다.

File에 Data를 저장하고 읽어오는 경우나 Network을 통해 Data를 송수신하는 경우는 Byte Order을 유의해야 합니다. 예를 들어 한쪽에서 Data를 Little-endian 방식으로 File에 저장하거나 Network로 전송하고, 다른 쪽에서 Big-endian 방식으로 해당 Data를 읽어서 해석하면 전혀 다른 의미의 Data로 인식되는 문제가 생깁니다.
IP 주소와 포트 번호를 먼저 설명한 이유는, 이 두 값이 단순한 네트워크 개념을 넘어 소켓 주소 구조체(Socket Address Structure)를 구성하는 핵심 요소이기 때문입니다. OS는 네트워크 통신의 대상을 추상적인 개념으로 관리하지 않고, 이를 명확한 자료 구조 형태로 표현합니다.
소켓 주소 구조체는 통신의 상대를 식별하기 위한 정보를 담고 있으며, 그 내부에는 주소 체계(Address Family)와 함께 IP 주소와 포트 번호가 포함됩니다. 즉, 프로그램이 특정 서버나 클라이언트와 통신하기 위해서는, 결국 이 구조체를 통해 “어디로 데이터를 보낼 것인지”를 운영 체제에 전달하게 됩니다.
따라서 IP 주소와 포트 번호에 대한 이해는 단순한 배경 지식이 아니라, 이후 다루게 될 소켓 주소 구조체의 필드들이 어떤 의미를 가지는지 이해하기 위한 전제 조건이라 할 수 있습니다.
소켓 주소 구조체(Soket Address Struct)는 네트워크 프로그램에 필요한 주소 정보를 담는 구조체로, 다양한 소켓 함수의 인수로 사용합니다. 프로토콜 체계에 따라 주소 지정 방식이 다르므로 다양한 소켓 주소 구조체가 존재합니다. 기본이 되는 것은 sockaddr 구조체로 아래와 같이 정의되어 있습니다.
#include<windsock2.h> //Window
#include<sys/socket.h> //리눅스
struct sockaddr
{
unsinged short sa_family;
char sa_data[14];
}
sa_family는 주소 체계를 나타내는 16bit 정숫값입니다. 예를 들어 TCP/IP 프로토콜을 사용한다면 IP 버전에 따라 AF_INET(IPV4) 혹은 AF_INET6(IPV6) 값을 가집니다.
주소체계에 대한 개념은 아래 링크를 참고하면됩니다.
https://velog.io/@whdrnr545/Network-Soket-Programming-Concopt-Open-Close
sa_data는 해당 주소 체계에서 사용할 주소 정보를 담습니다. 주소 체계에 따라 필요한 정보가 다르므로 가장 일반적인 형태인 Byte 배열로 선언되어 있습니다. 예를 들어 TCP/IP 프로토콜을 사용한다면 IP주소와 Prot Number을 저장합니다.
sockaddr 구조체는 대표 타입이며, 실제 응용 프로그램이 사용할 프로토콜은 그 종류에 따라 별도의 소켓 주소 구조체가 정의되어 있습니다. 예를 들어 TCP/IP에서는 sockaddr_in, sockaddr_in6 구조체가 있습니다.
사용하는 프로토콜과 주소 체계에 따라 서로 다른 형태의 구조체가 정의되어 있으며, 그 중심에 sockaddr, sockaddr_in, sockaddr_in6가 존재합니다.

이번 글에서는 네트워크 프로그래밍을 이해하기 위한 가장 기초적인 요소로서 IP 주소, 포트 번호, 그리고 소켓 주소 구조체를 중심으로 살펴보았습니다.
글을 제대로 읽으셨다면 아래의 질문들을 제대로 답하실 수 있을겁니다.
Q1. IP, IP Address는 개념과 차이점은 무엇인가요?
Q2. IPv4,IPv6는 무엇이고 어떻게 발전했나요?
Q3. Port Number은 무엇인가요?
Q4. Unicast, Broadcast, Multicast 무엇인가요?
Q5. Byte Order(빅, 리틀 엔디언)은 무엇인가요?
Q6. 소켓 주소 구조체는 무엇인가요?
정리하자면, 이번 글에서 다룬 내용은 단순한 네트워크 배경 지식이 아니라, TCP/IP 기반 네트워크 프로그래밍을 직접 구현하기 위한 필수적인 전제 조건입니다. 앞으로 다루게 될 TCP 프로토콜의 연결 과정(3-way Handshake), socket(), bind(), listen(), accept(), connect()와 같은 실제 소켓 API들은 모두 이 글에서 설명한 IP, 포트, 소켓 주소 구조체 개념 위에서 동작합니다.
다음 글에서는 이러한 기반 지식을 바탕으로 프로그래밍 관점에서 바라본 Socket의 개념과 첫 번째 목표인 Socket Open & Close Programming입니다.
[AWS Service Web]
[위키백과 IPV4, IPV6, Port]
[한국인터넷정보센터(KRNIC)]
[교보문구]
[IBM]