유닉스 도메인 소켓(Unix Domain Socket)은 프로세스간의 데이터 교환을 위한 기술 중 하나로, 파일 시스템을 통해 소켓통신 방식으로 내부 프로세스간의 통신을 하는 구조로 이뤄져있다. 약칭으로 UDS라고 표기하며, 간단하게 ‘유닉스 소켓(Unix socket)‘이라고 부르기도 한다. IPC(Inter Process Communication)의 일부로서 분류할 때는 ‘IPC소켓’이라고 부르기도 한다. POSIX의 표준 운영체제 구성요소 중 하나로 포함되어있다.

UDS의 가장 큰 특징은 소켓통신 방식을 써서 만든 프로세스에 사용이 가능하기 때문에 소켓프로그래밍 구조를 유지한 채로 로컬 프로세스와의 효율적 통신을 가능케 한다는 점이다. TCP, 혹은 UDP형식 데이터를 파일 시스템을 이용해서 통신하는 구조로, 파일 시스템을 통해 파일 주소 및 inode로 각 프로세스에서 참조되며, 통신은 운영체제의 커널상에서 이뤄지기 때문에 inet소켓을 이용해서 네트워크단을 이용해 전달하는 것보다 빠르며 부하가 적게 걸린다.

기본적으로 소켓통신 방식이 TCP/IP의 4계층을 거쳐 전달되기 때문에 지연이 발생하는데 반해서 유닉스 소켓은 어플리케이션 계층에서 TCP계층으로 내려가 바로 데이터를 전달하고, 수신측도 TCP계층에서 수신해 어플리케이션 계층으로 올라간다. 기술적으로 더 정확히 서술하자면, 유닉스 도메인 소켓은 TCP 계층조차 거치지 않고 전체 TCP/IP 프로토콜 스택과 루프백 네트워크 카드 인터페이스를 통째로 우회한다. 패킷 분할, 체크섬 계산, 헤더 조립, 내부 라우팅 테이블 참조, TCP의 3-Way Handshake 등의 복잡한 오버헤드가 전혀 발생하지 않는다. 오직 운영체제 커널의 가상 메모리 버퍼를 통해 두 프로세스 간에 데이터를 메모리 대 메모리로 직접 복사·교환하기 때문에 네트워크 소켓 통신보다 지연 시간이 극단적으로 짧고 CPU 점유율도 낮다.

이러한 특성 때문에 네트워크 관련 프로그램에서 널리 사용되며, X윈도우 등의 프로젝트에서도 활용되고 있다. 또한 현대 백엔드 아키텍처 환경에서는 도커 데몬과 CLI 간의 통신이나, 동일 서버 내에서 구동되는 웹 서버와 WAS, 또는 데이터베이스 간의 고속 프로세스 간 통신에 사실상 업계 표준으로 중용된다.

C언어를 비롯해 php, 자바, 펄 등 다양한 언어에서 지원을 위한 라이브러리를 기본 제공하고 있다.

과거에는 마이크로소프트의 윈도우 시리즈에서 사용이 불가능하여 윈도우로 포팅될 땐 보통 localhost(127.0.0.1)의 임의 포트를 이용하도록 변경된다. NGINX 등의 서버 어플리케이션이 윈도우 상에서 효율이 나쁜 이유 중 하나이기도 하다. 그러나 윈도우 10(17063)과 윈도우 서버 2019부터 Winsock API 상에서 유닉스 도메인 소켓을 네이티브로 공식 지원하기 시작하여, 크로스 플랫폼 애플리케이션의 개발 난이도가 크게 완화되었다. 하지만 오랜 기간 누적된 개발 레거시와 윈도우만의 전통적인 로컬 IPC 기법인 명명된 파이프(Named Pipe) 선호 경향 때문에, 여전히 윈도우 환경에서는 완벽한 UDS 이식이 지연되거나 루프백 TCP 통신을 우회 수단으로 삼는 프로그램이 상당히 많이 잔존해 있다.

추가로 프로세스는 sendmsg()와 recvmsg() 시스템콜을 이용해서 유닉스 도메인 소켓에 접속해 파일 기술자(file descriptors)를 주고받을 수도 있다. 이걸 이용하면 지능적인 IPC 로직 구현이 가능해진다.

목차

1. 외부

1. 외부


이 문서의 내용 중 전체 또는 일부는 넥스32 위키에서 가져왔으며 GNU Free Documentation License 1.3에 따라 이용할 수 있습니다.
본 문서의 원본은 링크에서 확인할 수 있습니다.

 
추천 0

(돌아가기)
(임시 저장) (임시 저장 불러오기)

↪️💎🛠️ (추가)

비로그인 상태입니다. 편집한 내용을 저장하면 지금 접속한 IP가 기록됩니다.