네트워크 소켓


정의

네트워크 소켓(network socket)은 컴퓨터 네트워크 상에서 프로세스 간에 데이터를 송수신하기 위한 소프트웨어 인터페이스이자 논리적인 통신 종착점(endpoint)이다. 운영 체제는 소켓을 통해 애플리케이션이 IP 주소와 포트 번호 등 네트워크 주소 체계를 추상화하여 사용할 수 있게 해 주며, 이를 통해 TCP/IP, UDP, SCTP 등 다양한 전송 프로토콜 위에서 통신을 구현한다.

주요 구성 요소

요소 설명
프로토콜 스택 소켓은 특정 전송 계층 프로토콜(TCP, UDP 등) 위에 존재한다. 프로토콜에 따라 연결지향(stream) 혹은 비연결형(datagram) 동작을 제공한다.
주소 체계 IPv4/IPv6 주소와 포트 번호가 결합된 4‑tuple(또는 5‑tuple) : {프로토콜, 로컬 IP, 로컬 포트, 원격 IP, 원격 포트} 로 소켓을 고유하게 식별한다.
파일 디스크립터 유닉스·리눅스 계열에서는 소켓이 파일 디스크립터(fd) 형태로 반환되며, read(), write(), select() 등 기존 파일 I/O 함수와 동일하게 다룰 수 있다.
버퍼 송신 버퍼와 수신 버퍼가 OS 커널에 할당돼 비동기식 전송·수신을 지원한다. 버퍼 크기는 setsockopt() 로 조정 가능하다.

종류

  1. 스트림 소켓 (Stream Socket, SOCK_STREAM)

    • TCP 기반, 연결‑지향, 신뢰성 보장, 흐름 제어·혼잡 제어 제공.
    • 데이터는 바이트 스트림 형태로 전송되며, 순서가 유지된다.
  2. 데이터그램 소켓 (Datagram Socket, SOCK_DGRAM)

    • UDP 기반, 비연결형, 신뢰성 보장 없음, 순서 보장 안 함.
    • 메시지 단위(패킷)로 전송되며, 최대 전송 단위는 MTU에 제한된다.
  3. 시퀀스 패킷 소켓 (SOCK_SEQPACKET)

    • SCTP 등 일부 프로토콜이 지원하는 형태로, 메시지 경계 보존 및 신뢰성을 제공한다.

기본 동작 흐름 (TCP 서버 예시)

  1. 소켓 생성socket(AF_INET, SOCK_STREAM, 0)
  2. 주소 할당bind() 로 로컬 IP·포트 바인딩
  3. 수신 대기listen() 로 연결 요청 큐 설정
  4. 연결 수락accept() 로 클라이언트와의 연결 소켓 반환
  5. 데이터 교환recv(), send() (또는 read(), write())
  6. 연결 종료close() 로 소켓 닫기

주요 API (POSIX)

함수 용도
socket() 새 소켓 디스크립터 생성
bind() 로컬 주소와 포트에 바인딩
listen() 수신 대기 상태 전환(서버 전용)
accept() 클라이언트 연결 요청 수락
connect() 원격 소켓에 연결(클라이언트 전용)
send(), recv() 데이터 송수신(바이트 스트림)
sendto(), recvfrom() 데이터그램 전송·수신(주소 지정 포함)
setsockopt(), getsockopt() 소켓 옵션 설정·조회(예: 타임아웃, 버퍼 크기)
select(), poll(), epoll() 소켓 다중 입출력 multiplexing

플랫폼별 특징

OS 특징
Linux epoll 로 대규모 동시 연결 효율 향상, SO_REUSEPORT 지원, TCP_QUICKACK 등 고급 옵션 제공
Windows Winsock API (WSAStartup, WSASocket 등) 사용, IOCP(입출력 완료 포트) 로 높은 동시성 지원
macOS / BSD kqueue 로 이벤트 기반 입출력, SO_NOSIGPIPE 옵션 등 BSD 계열 고유 옵션 존재
임베디드/RTOS 경량 TCP/IP 스택(LwIP 등) 에서 제한된 소켓 API 제공, 메모리·CPU 제약 고려 필요

보안 고려 사항

  • TLS/SSL : socket() 위에 TLS 레이어(예: OpenSSL, mbedTLS)를 적용해 전송 데이터 암호화 및 인증 수행.
  • 방화벽·패킷 필터링 : IP·포트 기반 접근 제어를 위해 OS 방화벽(iptables, Windows Defender Firewall 등)과 연동.
  • 소켓 옵션 : SO_REUSEADDR, SO_REUSEPORT 남용 시 포트 스키핑 위험, SO_LINGER 로 연결 종료 시 데이터 폐기 정책 제어.
  • 시스템 콜 검증 : 권한 상승 공격을 방지하기 위해 입력 값(주소·포트 등)을 철저히 검증하고, 비정상적인 소켓 생성·바인딩을 제한.

활용 사례

  • 웹 서버·클라이언트 : HTTP/HTTPS 프로토콜 구현에 TCP 스트림 소켓 사용.
  • 실시간 스트리밍 : RTP/RTSP 등 UDP 데이터그램 소켓을 활용해 저지연 전송.
  • P2P·분산 시스템 : NAT 통과를 위해 STUN/TURN 서버와 결합한 UDP 소켓 활용.
  • IoT 디바이스 : 경량 TCP/IP 스택 위에서 UDP 소켓으로 센서 데이터 전송.

참고 표준

  • RFC 793 – TCP (Transmission Control Protocol)
  • RFC 768 – UDP (User Datagram Protocol)
  • RFC 4960 – SCTP (Stream Control Transmission Protocol)
  • POSIX.1-2008 – Sockets API 표준
  • IEEE 802.3 – 이더넷 물리 계층 (소켓이 작동하는 네트워크 매체)

요약
네트워크 소켓은 운영 체제가 제공하는 추상화된 통신 인터페이스로, IP 주소·포트 번호를 이용해 프로세스 간 데이터를 교환한다. TCP 기반 스트림 소켓은 신뢰성·연결지향성을 제공하고, UDP 기반 데이터그램 소켓은 저지연·비연결성을 특징으로 한다. POSIX·Winsock 등 표준 API를 통해 생성·제어되며, 다양한 운영 체제와 프로토콜 스택에 적용 가능하다. 보안·성능 최적화를 위해 TLS, 소켓 옵션, 이벤트 기반 입출력 메커니즘 등을 적절히 활용한다.

둘러보기

더 찾아볼 만한 주제