[转帖]AF_UNIX和AF_INET

af,unix,inet · 浏览次数 : 0

小编点评

**AF_INET** * 用于IPV4协议的TCP和UDP协议。 * 对于单台机器上的进程间通信。 * 协议层与应用程序层之间进行通信。 * 使用场景:跨进程通信。 **AF_UNIX** * 用于本地IPC。 * 依赖路径名标识发送方和接收方。 * 效率更高,传输速率更高。 * 仅适用于本机内进程之间的通信。 * 使用场景:单台机器之间的通信。

正文

https://www.cnblogs.com/shangerzhong/p/9153737.html

 

family参数代表地址家族,比较常用的为AF_INET或AF_UNIX。AF_UNIX用于同一台机器上的进程间通信,AF_INET对于IPV4协议的TCP和UDP 。

type参数代表套接字类型,SOCK_STREAM(流套接字)或者SOCK_DGRAM(数据报文套接字)。

其中AF_INET类型有关的例子非常多,但AF_UNIX的少见,所以给出一个AF_UNIX简单的例子,并通过select实现非阻塞socket。

Server端:

 

1.  AF_INET域socket通信过程

AF_INET域通信过程

典型的TCP/IP四层模型的通信过程。

 

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

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

2.  AF_UNIX域socket通信过程 

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

 AF_UNIX域通信过程

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

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

5.  使用场景

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

与[转帖]AF_UNIX和AF_INET相似的内容:

[转帖]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参数代表套接字类型

[转帖]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. 不同点

[转帖]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数据库,对