Unix Domain Socket(UDS)和 TCP/IP(使用 127.0.0.1
或 localhost
)都是進程間通信(IPC)的方式,但它們在實現、性能和適用場景上有顯著區別。以下是兩者的對比:
1. 通信機制
-
Unix Domain Socket (UDS)
- 基于文件系統:通過一個特殊的 socket 文件(如
/tmp/socket.sock
)進行通信,本質是內核級的進程間通信。 - 僅限本地:只能用于同一臺主機上的進程間通信。
- 基于文件系統:通過一個特殊的 socket 文件(如
-
TCP/IP (127.0.0.1)
- 基于網絡協議棧:即使使用
127.0.0.1
(本地回環),數據仍然要走完整的 TCP/IP 協議棧(包括協議頭、校驗和等)。 - 可擴展性:雖然這里用于本地通信,但理論上可以改為遠程通信(只需更改 IP)。
- 基于網絡協議棧:即使使用
2. 性能對比
指標 | Unix Domain Socket | TCP/IP (127.0.0.1) |
---|---|---|
速度 | 更快(無需網絡協議處理) | 較慢(有協議頭、TCP 握手等開銷) |
吞吐量 | 更高(數據拷貝次數少) | 較低(協議棧額外處理) |
延遲 | 更低(直接內核通信) | 較高(經過網絡棧) |
系統調用開銷 | 較少(sendmsg /recvmsg 優化) | 較多(send /recv 需經過協議棧) |
3. 安全性
- Unix Domain Socket
- 可以通過文件系統權限(
chmod
/chown
)控制訪問。 - 支持 SCM_RIGHTS(傳遞文件描述符)。
- 可以通過文件系統權限(
- TCP/IP (127.0.0.1)
- 依賴 IP/端口權限,但
127.0.0.1
默認僅允許本地訪問。 - 可能受防火墻(如
iptables
)影響。
- 依賴 IP/端口權限,但
4. 適用場景
場景 | 推薦方式 | 原因 |
---|---|---|
高性能本地 IPC | Unix Domain Socket | 低延遲、高吞吐,如數據庫、容器通信 |
需要跨主機擴展 | TCP/IP | 未來可能改為遠程通信 |
傳遞文件描述符 | Unix Domain Socket | TCP/IP 不支持 |
兼容現有網絡應用 | TCP/IP | 如 HTTP、gRPC 等標準協議 |
容器間通信(同主機) | Unix Domain Socket | Docker/Podman 支持 UDS,性能更好 |
5. 代碼示例
Unix Domain Socket (Server)
#include <sys/un.h>
#include <sys/socket.h>int main() {int sock = socket(AF_UNIX, SOCK_STREAM, 0);struct sockaddr_un addr = { .sun_family = AF_UNIX, .sun_path = "/tmp/demo.sock" };bind(sock, (struct sockaddr*)&addr, sizeof(addr));listen(sock, 5);// ... accept() 和 read()/write()
}
TCP/IP (Server, 127.0.0.1)
#include <netinet/in.h>int main() {int sock = socket(AF_INET, SOCK_STREAM, 0);struct sockaddr_in addr = { .sin_family = AF_INET, .sin_port = htons(8080), .sin_addr.s_addr = inet_addr("127.0.0.1") };bind(sock, (struct sockaddr*)&addr, sizeof(addr));listen(sock, 5);// ... accept() 和 send()/recv()
}
6. 總結
特性 | Unix Domain Socket | TCP/IP (127.0.0.1) |
---|---|---|
速度 | ? 更快 | 🐢 較慢 |
可擴展性 | 僅本地 | 可擴展至遠程 |
權限控制 | 文件系統權限 | 依賴 IP/端口 |
適用場景 | 高性能本地 IPC | 兼容網絡協議或未來擴展 |
推薦選擇:
- 如果僅需本地通信且追求性能,優先用 Unix Domain Socket。
- 如果需要兼容網絡協議或未來擴展,用 TCP/IP(即使
127.0.0.1
稍慢)。