[转帖]AF_UNIX 本地通信

af,unix,本地,通信 · 浏览次数 : 0

小编点评

**一、AF_UNIX 本地通信** **1. Linux进程通信机制** - socket 本地域套接字是本地进程间通信的一种方式。 - 它利用socket结构上的AF_UNIX标志,实现进程间通信。 - socket 本地域套接字可以用于本地进程间通信,也可以用于与网络连接的本地进程间通信。 **2. socket本地域套接字AF_UNIX** - socket 本地域套接字是一种用于本地进程间通信的特殊套接字。 - 它仅适用于本地网络,并且只能用于与本机内的进程通信。 **3. demo 示例** ```c #include #include #include #include int main() { int sockfd; struct sockaddr_in client_addr; client_addr.sin_family = AF_UNIX; client_addr.sin_port = htons(6000); client_addr.sin_addr.s_addr = htonl(127.0.0.1); // 创建套接字 sockfd = socket(AF_UNIX, SOCK_STREAM, 0); // 连接到远程服务器 if (connect(sockfd, (struct sockaddr *)&client_addr, sizeof(client_addr)) == -1) { perror("connect error"); return 1; } // 发送数据 char message[] = "Hello from client!"; send(sockfd, message, sizeof(message), 0); // 关闭套接字 close(sockfd); return 0; } ``` **二、AF_INET域与AF_UNIX域socket通信原理对比** | 特性 | AF_INET域socket | AF_UNIX域socket | |---|---|---| | 本地网络 | 可以 | 本机内 | | 协议 | TCP/IP | 本地协议 | | 传输速度 | 较高 | 中等 | | 系统cpu消耗 | 高 | 低 | | 适用场景 | 跨机器通信 | 本机通信 | **三、PF_INET和AF_INET、PF_UNIX和AF_UNIX之间的区别** | 特性 | PF_INET | AF_INET | PF_UNIX | AF_UNIX | |---|---|---|---|---| | 本地网络 | 可以 | 本机内 | 本机内 | | 协议 | TCP/IP | 本地协议 | 本地协议 | | 传输速度 | 高 | 中等 | 低 | | 系统cpu消耗 | 高 | 低 | 低 | | 适用场景 | 跨机器通信 | 本机通信 | 本机通信 |

正文

一、AF_UNIX 本地通信

1. Linux进程通信机制

linux本地进程间通讯,大概有如下几种方式,socket本地域套接字是其中的一种。
在这里插入图片描述
项目中,主应用和协议栈两个进程间通讯,就是用的socket本地域套接字。(需要自定义数据协议格式,一般定义好协议格式头+数据+尾即可)

2. socket本地域套接字AF_UNIX

用于本地进程间的通信。

基于socket的框架上发展出一种IPC机制,就是UNIX Domain Socket。虽然网络socket也可用于同一台主机的进程间通讯(通过loopback地址127.0.0.1),但是UNIX Domain Socket用于IPC 更有效率 :

  • 不需要经过网络协议栈
  • 不需要打包拆包、计算校验和、维护序号和应答等,可靠性更强

只是将应用层数据从一个进程拷贝到另一个进程。这是因为,IPC机制本质上是可靠的通讯,而网络协议是为不可靠的通讯设计的。UNIX Domain Socket也提供面向流和面向数据包两种API接口,类似于TCP和UDP,但是面向消息的UNIX Domain Socket也是可靠的,消息既不会丢失也不会顺序错乱。

3. demo示例

https://blog.csdn.net/m0_37542524/article/details/84668406

二、AF_INET域与AF_UNIX域socket通信原理对比

转自:https://blog.csdn.net/sandware/article/details/40923491

1. AF_INET域socket通信过程

在这里插入图片描述
典型的TCP/IP四层模型的通信过程。

发送方、接收方依赖IP:Port来标识,即将本地的socket绑定到对应的IP端口上,发送数据时,指定对方的IP端口,经过Internet,可以根据此IP端口最终找到接收方;接收数据时,可以从数据包中获取到发送方的IP端口。

发送方通过系统调用send()将原始数据发送到操作系统内核缓冲区中。内核缓冲区从上到下依次经过TCP层、IP层、链路层的编码,分别添加对应的头部信息,经过网卡将一个数据包发送到网络中。经过网络路由到接收方的网卡。网卡通过系统中断将数据包通知到接收方的操作系统,再沿着发送方编码的反方向进行解码,即依次经过链路层、IP层、TCP层去除头部、检查校验等,最终将原始数据上报到接收方进程。

2. AF_UNIX域socket通信过程

典型的本地IPC,类似于管道,依赖路径名标识发送方和接收方。即发送数据时,指定接收方绑定的路径名,操作系统根据该路径名可以直接找到对应的接收方,并将原始数据直接拷贝到接收方的内核缓冲区中,并上报给接收方进程进行处理。同样的接收方可以从收到的数据包中获取到发送方的路径名,并通过此路径名向其发送数据。
在这里插入图片描述

3. 相同点

操作系统提供的接口socket(),bind(),connect(),accept(),send(),recv(),以及用来对其进行多路复用事件检测的select(),poll(),epoll()都是完全相同的。收发数据的过程中,上层应用感知不到底层的差别。

4. 不同点

1 建立socket传递的地址域,及bind()的地址结构稍有区别:

socket() 分别传递不同的域AF_INET和AF_UNIX

bind()的地址结构分别为sockaddr_in(制定IP端口)和sockaddr_un(指定路径名)

2 AF_INET需经过多个协议层的编解码,消耗系统cpu,并且数据传输需要经过网卡,受到网卡带宽的限制。AF_UNIX数据到达内核缓冲区后,由内核根据指定路径名找到接收方socket对应的内核缓冲区,直接将数据拷贝过去,不经过协议层编解码,节省系统cpu,并且不经过网卡,因此不受网卡带宽的限制。

3 AF_UNIX的传输速率远远大于AF_INET

4 AF_INET不仅可以用作本机的跨进程通信,同样的可以用于不同机器之间的通信,其就是为了在不同机器之间进行网络互联传递数据而生。而AF_UNIX则只能用于本机内进程之间的通信。

5. 使用场景

AF_UNIX由于其对系统cpu的较少消耗,不受限于网卡带宽,及高效的传递速率,本机通信则首选AF_UNIX域。

不用多说,AF_INET则用于跨机器之间的通信。

三、PF_INET和AF_INET、PF_UNIX和AF_UNIX之间的区别

https://blog.csdn.net/xiongmaojiayou/article/details/7584211

四、参考资料

socket的学习(二)AF_UNIX实现本地通信
https://blog.csdn.net/weixin_39258979/article/details/80931464

嵌入式linux网络编程,UNIX域套接字,AF_LOCAL,PF_LOCAL,PF_UNIX,,AF_UNIX,进程间通信机制
https://blog.csdn.net/m0_37542524/article/details/84668406

</article>

与[转帖]AF_UNIX 本地通信相似的内容:

[转帖]AF_UNIX 本地通信

文章目录 一、AF_UNIX 本地通信1. Linux进程通信机制2. socket本地域套接字AF_UNIX3. demo示例 二、AF_INET域与AF_UNIX域socket通信原理对比1. AF_INET域socket通信过程2. AF_UNIX域socket通信过程3. 相同点4. 不同点

[转帖]AF_UNIX和AF_INET

https://www.cnblogs.com/shangerzhong/p/9153737.html family参数代表地址家族,比较常用的为AF_INET或AF_UNIX。AF_UNIX用于同一台机器上的进程间通信,AF_INET对于IPV4协议的TCP和UDP 。 type参数代表套接字类型

[转帖]acme 中文说明

https://github.com/acmesh-official/acme.sh/wiki/%E8%AF%B4%E6%98%8E acme.sh 实现了 acme 协议, 可以从 letsencrypt 生成免费的证书. 主要步骤: 安装 acme.sh 生成证书 copy 证书到 nginx/

[转帖]一文看懂 .dockerignore

https://dhcp.cn/k8s/docker/dockerignore.html#dockerignore-%E8%AF%A6%E7%BB%86%E4%BB%8B%E7%BB%8D 一文看懂 .dockerignore 在 dockerfile 同级目录中创建名为 .dockerignore

[转帖]比较不同CPU下的分支预测

https://plantegg.github.io/2023/04/16/%E6%AF%94%E8%BE%83%E4%B8%8D%E5%90%8CCPU%E4%B8%8B%E7%9A%84%E5%88%86%E6%94%AF%E9%A2%84%E6%B5%8B/ 目的 本文通过一段对分支预测是否友

[转帖]比较不同CPU下的分支预测

https://plantegg.github.io/2023/04/16/%E6%AF%94%E8%BE%83%E4%B8%8D%E5%90%8CCPU%E4%B8%8B%E7%9A%84%E5%88%86%E6%94%AF%E9%A2%84%E6%B5%8B/ 所有 CPU 都期望对分支预测友好

[转帖]LVS 20倍的负载不均衡,原来是内核的这个Bug

https://plantegg.github.io/2019/07/19/%E5%B0%B1%E6%98%AF%E8%A6%81%E4%BD%A0%E6%87%82%E8%B4%9F%E8%BD%BD%E5%9D%87%E8%A1%A1--%E8%B4%9F%E8%BD%BD%E5%9D%87%E

[转帖]就是要你懂网络--一个网络包的旅程

https://plantegg.github.io/2019/05/15/%E5%B0%B1%E6%98%AF%E8%A6%81%E4%BD%A0%E6%87%82%E7%BD%91%E7%BB%9C--%E4%B8%80%E4%B8%AA%E7%BD%91%E7%BB%9C%E5%8C%85%E

[转帖]clickhouse存储机制以及底层数据目录分布

https://www.cnblogs.com/MrYang-11-GetKnow/p/15818141.html#:~:text=%E6%AF%8F%E4%B8%80%E4%B8%AA%E6%95%B0%E6%8D%AE%E5%BA%93%E9%83%BD%E4%BC%9A%E5%9C%A8cli

[转帖]Redis命令详解:Keys

https://jackeyzhe.github.io/2018/09/22/Redis%E5%91%BD%E4%BB%A4%E8%AF%A6%E8%A7%A3%EF%BC%9AKeys/ 介绍完Redis连接相关命令后,再来介绍一下与Key相关的命令,Redis作为一个key-value数据库,对