Socket API 支持的协议族非常丰富。为了方便理解,我按照应用场景分类整理了一个表格:

Socket API 支持的主要协议族

地址族 协议类型示例 典型应用场景 与 TCP/IP 的区别
AF_INET / AF_INET6 TCP, UDP 互联网通信 (Web服务、游戏联网) 这是主流,跨机器通信,需要 IP 地址和端口。
AF_UNIX / AF_LOCAL 流式套接字 本机进程通信 (Nginx与PHP-FPM通信) 不走网卡,基于文件路径,速度极快,仅限本机。
AF_BLUETOOTH L2CAP, RFCOMM 蓝牙通信 (手机连接蓝牙设备) 使用蓝牙 MAC 地址,替代 IP 地址。
AF_CAN 原始 CAN 帧 汽车电子/工控 (CAN 总线通信) 针对车辆网络,无“连接”概念,基于报文 ID。
AF_PACKET 原始以太网帧 抓包工具/黑客工具 (Wireshark, Tcpdump) 绕过 TCP/IP 协议栈,直接操作网卡收发原始数据帧。
AF_NETLINK Netlink 协议 内核与用户空间通信 (配置路由、防火墙) 用于程序和操作系统内核直接对话,不经过网络传输。
AF_IPX IPX/SPX 老旧局域网协议 (Novell NetWare) 早期局域网协议,现已被 TCP/IP 淘汰,很少使用。

总结

  1. Socket 是“通用插座”
    Socket API 的设计精髓在于抽象。它把“通信”这个动作抽象为 sendrecvbindaccept 等标准接口,而底层的具体实现(是走网线、走蓝牙、还是走内存)则由不同的协议族来驱动。

  2. TCP/IP 只是“默认选项”
    我们平时最常用 AF_INET (IPv4) 和 AF_INET6 (IPv6),所以大家容易产生“Socket 就是 TCP/IP”的误解。实际上,表格里的其他协议在特定领域(如嵌入式开发、高性能计算、系统管理)同样非常重要。

  3. 编程模型一致
    无论你用哪种协议,Socket 编程的核心流程几乎不变:
    socket() -> bind() -> listen() -> accept() -> recv/send()
    唯一的区别在于 socket() 的第一个参数填什么,以及 bind() 时传入的地址结构体(是 IP 地址、文件路径还是蓝牙地址)。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐