目录
OSI七层定位
详细对比
1. 普通 Socket(TCP/UDP,你熟悉的网络 socket)
2. SocketCAN(Linux CAN 套接字)
共同点(为什么都叫 Socket)
对你项目的重点影响(力环控制)
容易混淆的点
Socket(TCP/UDP):网络套接字,以太网用;
SocketCAN:CAN 总线的套接字,Linux 专门给 CAN 总线设计的套接字 API
二者都属于 Linux Socket 编程接口(同一个 socket () 系统调用),但是底层协议完全不一样。
OSI七层定位
| OSI 层次 | TCP:传输层;IP:网络层;以太网:数据链路层 | 数据链路层(Layer2)SocketCAN 没有网络层、传输层 |
| 底层介质 | 网线 / WiFi | CAN / CAN-FD 双绞线 |
| 寻址 | IP 地址 + 端口号 | CAN ID |
| 报文 | IP 包 + TCP 分段 | CAN 帧(标准 CAN / CAN FD) |
SocketCAN 本质:把 CAN 总线设备封装成链路层 socket,没有 IP、没有 TCP 握手,直接收发 CAN 二层帧。 普通 TCP Socket:是网络层 + 传输层,建立连接、确认、重传。
详细对比
1. 普通 Socket(TCP/UDP,你熟悉的网络 socket)
- 模型:应用层 → 传输层 (TCP/UDP) → 网络层 (IP) → 数据链路层 (以太网 MAC) → 物理层
- 特点:
- 面向连接 (TCP) / 无连接 (UDP)
- 寻址:IP + port
- 跨网段路由,可跨设备远距离通信
- 自带校验、重传、拥塞控制(TCP)
2. SocketCAN(Linux CAN 套接字)
- 模型:应用层 → SocketCAN API → 内核 CAN 协议栈(CAN 驱动) → 数据链路层 CAN → CAN 物理总线
- ✅ 没有 IP,没有 TCP,没有端口
- 寻址:CAN ID,总线广播机制(一发多收,一主多从)
- 报文就是原始 CAN 帧(8 字节普通 CAN / 64 字节 CAN-FD)
- CAN 硬件自带 CRC 校验;内核不做重传,CAN 总线本身出错会自动重发(CAN 硬件控制器实现)
- 只能在同一条 CAN 总线内通信,不能路由
共同点(为什么都叫 Socket)
Linux 设计上统一 API: 都用:socket() → bind() → send() → recv() → close() 这套系统调用。
只是 socket 创建时传入的协议族不一样:
- 以太网 TCP:AF_INET
- SocketCAN:AF_CAN
// 以太网socket
int fd = socket(AF_INET, SOCK_STREAM, 0);
// SocketCAN socket(C代码)
int fd = socket(AF_CAN, SOCK_RAW, CAN_RAW);
python-can 在 Linux 底层就是封装这套AF_CAN的 socket。
对你项目的重点影响(力环控制)
容易混淆的点
❌ SocketCAN ≠ TCP Socket SocketCAN 只是借用了 socket 这套 API 接口,协议栈是 CAN 链路层,不是 IP 网络。




