欢迎光临
我们一直在努力

Socket与SocketCAN有什么区别?

目录

OSI七层定位

详细对比

1. 普通 Socket(TCP/UDP,你熟悉的网络 socket)

2. SocketCAN(Linux CAN 套接字)

共同点(为什么都叫 Socket)

对你项目的重点影响(力环控制)

容易混淆的点


Socket(TCP/UDP):网络套接字,以太网用;

SocketCAN:CAN 总线的套接字,Linux 专门给 CAN 总线设计的套接字 API

二者都属于 Linux Socket 编程接口(同一个 socket () 系统调用),但是底层协议完全不一样。

OSI七层定位

项目Socket (TCP/UDP 以太网)SocketCAN
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 延迟、握手开销,低延迟,适合 1kHz 力环;
  • CAN 总线是广播,发一帧,总线上所有节点都收到,靠 CAN ID 过滤;
  • CAN-FD 可以支持最长 64 字节载荷,正好传输 Fx,Fy,Fz,Mx,My,Mz;
  • 只有Linux(树莓派)原生支持 SocketCAN;Windows 没有 AF_CAN,Windows 只能用虚拟 CAN/PCAN 第三方驱动。
  • 容易混淆的点

    ❌ SocketCAN ≠ TCP Socket SocketCAN 只是借用了 socket 这套 API 接口,协议栈是 CAN 链路层,不是 IP 网络。

    赞(0)
    未经允许不得转载:171主机测评 » Socket与SocketCAN有什么区别?
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址