unix domain socket
参考文章:https://lists.freebsd.org/pipermail/freebsd-performance/2005-February/001143.html
参考:https://zh.wikipedia.org/wiki/Unix域套接字
Unix domain socket 或者 IPC socket是一种终端,可以使同一台操作系统上的两个或多个进程进行数据通信。与管道)相比,Unix domain sockets 既可以使用字节流,又可以使用数据队列,而管道通信则只能使用字节流。Unix domain sockets的接口和Internet socket很像,但它不使用网络底层协议来通信。Unix domain socket 的功能是POSIX操作系统里的一种组件。
Unix domain sockets 使用系统文件的地址来作为自己的身份。它可以被系统进程引用。所以两个进程可以同时打开一个Unix domain sockets来进行通信。不过这种通信方式是发生在系统内核里而不会在网络里传播。
UNIX Domain Socket用于IPC更有效率:不需要经过网络协议栈,不需要打包拆包、计算校验和、维护序号和应答等,只是将应用层数据从一个进程拷贝到另一个进程。UNIX域套接字与TCP套接字相比较,在同一台主机的传输速度前者是后者的两倍。这是因为,IPC机制本质上是可靠的通讯,而网络协议是为不可靠的通讯设计的。UNIX Domain Socket也提供面向流和面向数据包两种API接口,类似于TCP和UDP,但是面向消息的UNIX Domain Socket也是可靠的,消息既不会丢失也不会顺序错乱。
Unix domain socket 是同一个主机下,不同进程之间通信时使用的。一个主机不同进程之间通信默认是可靠的,所以比起需要加密、验证的 http 协议,省略很多步骤,所以更高效。
应用举例
supervisorctl 和 supervisord 之间通信就是用的 unix domain socket, 这点可以在配置文件中确认:
[unix_http_server]
file=/tmp/supervisor.sock ; the path to the socket file
;chmod=0700 ; socket file mode (default 0700)
;chown=nobody:nogroup ; socket file uid:gid owner
;username=user ; default is no username (open server)
;password=123 ; default is no password (open server)
[supervisorctl]
serverurl=unix:///tmp/supervisor.sock ; use a unix:// URL for a unix socket
;serverurl=http://127.0.0.1:9001 ; use an http:// url to specify an inet socket
;username=chris ; should be same as in [*_http_server] if set
;password=123 ; should be same as in [*_http_server] if set
;prompt=mysupervisor ; cmd line prompt (default "supervisor")
;history_file=~/.sc_history ; use readline history if available
此外 docker 、 mysql等都用到了 unix domain socket
rpc
rpc, remote Procedure call. 远程调用服务器上的程序,比如 java 的 dobbo 和 go 的 grpc。rpc 是不同服务器之间的程序调用,不是一种网络协议,可以使用http、tcp 等来实现,甚至不怕效率低的话,还可以以 java 格式来传递数据。