Unix Domain Socket(UDS)是Linux中专用于同一主机进程间通信的高效机制,复用socket API但绕过网络协议栈,通过文件系统路径寻址,具备高性能、高可靠、强安全和易迁移四大优势。

Unix Domain Socket(UDS)是 Linux 中一种高效、可靠且安全的本地进程间通信机制,它复用网络 socket 的编程模型,但完全绕过网络协议栈,在内核中直接完成数据拷贝,性能接近内存操作。
核心特点与优势
UDS 不依赖 IP 和端口,而是通过文件系统中的路径标识通信端点。它的关键优势包括:
- 高性能:无需封装/解包、校验和计算、序号管理等网络开销,同一主机上吞吐量通常是 TCP loopback 的两倍;
- 高可靠性:不经过网络链路,不存在丢包、乱序或连接中断问题,SOCK_STREAM 和 SOCK_DGRAM 均保证消息有序送达(后者虽标“不可靠”,但在 UDS 中实际不丢包);
- 强安全性:绑定路径生成的 socket 文件受标准 Unix 权限控制(如 chmod、chown),可精确限制哪些用户或进程能连接;
- 易迁移性:API 与网络 socket 几乎一致(socket/bind/connect/accept/send/recv),熟悉网络编程者几乎零学习成本。
两种常用通信模式
UDS 支持两种 socket 类型,对应不同使用场景:
- SOCK_STREAM(流式):面向连接、全双工、字节流传输,适用于需要稳定会话的场景(如数据库客户端与服务端、Nginx 与 PHP-FPM);
- SOCK_DGRAM(数据报):无连接、消息边界保留、无需 accept/listen,适合轻量、请求-响应类通信(如日志采集、状态上报);
注意:SOCK_SEQPACKET 也存在,提供有序、可靠、带边界的消息流,但使用较少。
典型使用流程(以 SOCK_STREAM 为例)
服务端和客户端均需创建 AF_UNIX socket,并通过 sockaddr_un 结构体指定路径地址:
- 服务端:socket() → bind()(路径需提前清理已存在文件)→ listen() → accept() → recv()/send() → close();
- 客户端:socket() → bind()(可选,常用于标识自身)→ connect() → send()/recv() → close();
关键细节:
- bind() 前建议用 access() 或 unlink() 清理残留 socket 文件,否则会失败;
- sockaddr_un.sun_path 长度上限为 108 字节(含终止符),路径不宜过长;
- 客户端通常无需 bind,但若需被服务端反向识别(如带 PID 的临时路径),则应显式绑定。
实际应用注意事项
UDS 在生产环境中广泛用于关键系统组件通信:
- Docker daemon 与容器运行时通过 UDS 指令交互;
- systemd 使用 /run/systemd/private 等 UDS 路径管理服务状态;
- X11 图形服务、Wayland 合成器均依赖 UDS 实现客户端-服务端通信;
- Web 服务器(如 Nginx)常通过 UDS 代理请求到本地应用(如 Gunicorn、uWSGI),比 TCP 更快更安全。
部署时务必确保 socket 文件所在目录可写、权限合理(如 0700),并配合 systemd socket activation 或守护进程自动重建机制,避免因异常退出导致路径残留阻塞重启。


















