Post

소켓 통신 모듈

소켓 통신 모듈을 구현하기 위한 지식

소켓 통신

네트워크 상에서 프로세스끼리 데이터를 주고받기 위한 통신 엔드포인트

서로 다른 프로그램끼리 연결을 맺고 데이터 송수신을 하게 해주는 프로그래밍 인터페이스(API)라고 볼 수 있음

기본 개념

용어의미
IP 주소네트워크 상의 장비를 구별하는 주소
포트 번호하나의 장비 안에서 여러 프로그램을 구별하기 위한 번호
TCP 소켓신뢰성 있는 연결(순서 보장, 데이터 손실 없음)
UDP 소켓빠르지만 신뢰성 없는 연결(순서 보장 X, 데이터 손실 가능)

소켓 통신 라이브러리(Python)

socket

  • 표준 라이브러리 저수준 서버 프레임워크
  • 저수준 소켓 API를 제공하여 TCP/UDP 소켓을 생성 및 핸들링 가능
  • 표준 모듈인 만큼 추가 의존성 없이 사용 가능하고 저수준 제어가 가능

asyncio

  • Python 3에 내장된 비동기 프레임워크로, 이벤트 루프를 통해 단일 스레드에서 다중 작업을 동시에 수행
  • 메인 스레드에서 이벤트 루프와 selector를 사용하여 I/O를 처리
    • 접속 수가 많아도 각 연결마다 스레드를 만드는 방식보다 효율적
    • 레이스 컨디션 위험을 줄이고, 스레드를 다수 생성하는 오버헤드를 피할 수 있음
  • await 문법으로 코드의 비동기 흐름을 기술할 수 있어 코드 유지보수가 용이
    • 전통적인 동기/스레드 코드에 익숙한 개발자에게는 초기 학습이 필요
  • ROS2 Python 노드(rclpy)와 함께 사용할 때는 별도의 실행 스레드나 전용 Executor를 사용하여 이벤트 루프를 통합하는 방식도 고려필요

socketserver

  • 표준 라이브러리의 고수준 서버 프레임워크
  • 간단한 TCP/UDP 서버를 구현할 때 유용
  • 핸들러 클래스를 상속 구현하고 ThreadingMixIn과 함께 사용하면 각 연결을 별도 스레드로 처리하는 간단한 동시성 구현이 가능
  • 스레드 기반 동작이므로 접속 수가 매우 많아지면 스레드 수 증가에 따른 성능 한계가 있음

소켓 통신 라이브러리(C++)

Boost.Asio

  • 비동기 소켓 통신 라이브러리
  • TCP, UDP 소켓 모두에 대해 일관된 인터페이스를 제공하며, 동기식과 비동기식 작업을 동일한 스타일로 지원하는 통일된 디자인을 갖추고 있음
  • 크로스플랫폼으로 동작하므로 윈도우/리눅스 등에서 코드 변경 없이 사용할 수 있음
  • ROS 2에서도 내부 구현에 Asio를 사용하고 있으며, 사용자 코드에서도 Boost.Asio 사용을 권장

POSIX API

  • 운영체제에서 제공하는 저수준 소켓 함수들을 직접 호출하는 방식
  • 추가 라이브러리 없이 기본 툴체인만으로 동작하고, 소켓 옵션 등 세부 설정을 직접 제어할 수 있음
  • C 언어나 C 스타일로 작성된 기존 코드 자산을 활용가능
  • 플랫폼마다 차이를 직접 다뤄야 하고 (예: Windows의 경우 Winsock 초기화 등이 필요), 비동기 처리나 다중 접속 처리를 위해 select(), poll() 같은 함수를 이용한 추가 작업이 필요

ZeroMQ

  • 소켓 통신 패턴을 캡슐화한 고성능 메시징 라이브러리
  • 간단한 API로 TCP/UDP 기반의 publish-subscribe나 request-reply 패턴을 구현가능
  • ZeroMQ는 성능이 뛰어나고 멀티스레드 지원이 좋지만, 소켓의 세부 제어보다는 메시지 전달 추상화에 초점을 두므로 범용 소켓 인터페이스와 다름
This post is licensed under CC BY 4.0 by the author.