소켓 통신 모듈
소켓 통신 모듈을 구현하기 위한 지식
소켓 통신
네트워크 상에서 프로세스끼리 데이터를 주고받기 위한 통신 엔드포인트
서로 다른 프로그램끼리 연결을 맺고 데이터 송수신을 하게 해주는 프로그래밍 인터페이스(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.