Skip to content

Unix Domain Socket

A Unix domain socket or IPC socket (inter-process communication socket) is a data communications endpoint for exchanging data between processes executing within the same host operating system. Like named pipes, Unix domain sockets support transmission of a reliable stream of bytes (SOCK_STREAM, compare to TCP). They additionally support ordered and reliable transmission of datagrams (SOCK_SEQPACKET), or unordered and unreliable transmission of the same (SOCK_DGRAM, compare to UDP). The Unix domain socket facility is a standard component of POSIX operating systems.

Preview

Unix Domain Socket(이하 UDS) 는 socket API를 수정없이 이용며, port 기반의 Inernet Domain Socket에 비해서 로컬 시스템의 파일시스템을 이용해서 내부프로세스간의 통신을 위해 사용한다는 점이 다르다고 할수 있다.

ls 를 이용해서 통신을 위해서 만들어진 파일을 보면 다음과 같은 모습을 보인다.

[yundream@localhost tmp]$ ls -al
srwx------    1 root     nobody          0 12월 14 21:16 .fam_socket

보면 파일타입에 "s" 가 붙어 있는걸 알수 있으며, 파일사이즈가 0으로 되어 있는 걸 알수 있다. 왜냐하면 FIFO와 마찬가지로 메시지가 파일로 쌓이지 않고 커널로 전달되어서 커널에서 처리하기 때문이다.

파일을 통해서 통신을 하며, 커널내부에서 메시지를 관리한다는 점에서 FIFO와 매우 유사한면을 보여주지만, FIFO와는 달리 양방향 통신이 가능하다는 특징을 가지고 있다. 그러므로 다중의 클라이언트를 받아들이는 서버/클라이언트 모델을 만들기가 매우 쉽다. 또한 Inet 소켓을 통한 외부통신에 비해서 2배 이상의 효율을 보여준다라는 장점을 가지고 있다.

많은 경우 약간 복잡한 내부프로세스간 통신을 해야된다고 했을때 UDS을 많이 사용한다. INET 계층에서의 통신이 TCP/IP 4계층을 모두 거치는것과는 다르게, UDS 은 어플리케이션 계층에서 TCP 계층까지만 메시지가 전달되고, 다시 곧바로 어플리케이션 계층으로 메시지가 올라가게 된다. TCP/IP 계층에 대한 자세한 내용은 TCP/IP 개요(2)를 참고 하기 바란다.

위에서 INET 소켓보다 2배이상의 효율을 가진다고 했는데, 4계층의 레이어를 모두 거쳐야하는 INET 소켓에 비해서 단지 2개의 레이어만 사용한다는 점도 그 이유중 하나로 작용한다.

Abstract Domain Socket

해당 항목 참조.

TCP/IP vs Unix Domain Sockets vs Named PIPE

UDS는 TCP/IP보다 상당히 개선되었습니다. 구체적으로, 응답이 비교적 작을 때 초당 쿼리 수(QPS)가 약 15% 상승했고, 100KB만큼 큰 응답의 경우 인상적인 50% 증가를 관찰했습니다. 즉, UDS는 대용량 데이터를 전송해야 할 때 훨씬 더 나은 성능을 발휘합니다. 명명된 파이프는 작은 응답 본문의 경우 UDS만큼 효율적이지만 대용량 응답 본문의 경우 훨씬 더 나빠집니다.

한마디로, 로컬 호출에는 가능한 한 많은 UDS를 사용해야 합니다.

참고로 Unix Domain SocketsNamed PIPE 의 성능 차이는 PC/OS 마다 차이 있는듯.

See also

Favorite site

References


  1. Benchmark_TCP_IP_and_Unix_domain_socket_and_Named_pipe.pdf 

  2. Codeclip_-UDS(Unix_Domain_Socket).pdf