AF_INET域与AF_UNIX域socket通信原理对比【转】

news/2024/7/9 18:20:27 标签: 操作系统, epoll, 网络

转自:https://www.cnblogs.com/lfxiao/p/9672797.html

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

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

 

5.  使用场景

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

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


http://www.niftyadmin.cn/n/990160.html

相关文章

PAT --- 1045.快速排序 (25 分)

1045 快速排序 (25 分) 著名的快速排序算法里有一个经典的划分过程:我们通常采用某种方法取一个元素作为主元,通过交换,把比主元小的元素放到它的左边,比主元大的元素放到它的右边。 给定划分后的 NNN 个互…

subversion的安装、配置、使用示例

Subversion是一个自由,开源的版本控制系统。在Subversion管理下,文件和目录可以超越时空。Subversion将文件存放在中心版本Subversion是一个自由,开源的版本控制系统。在Subversion管理下,文件和目录可以超越时空。Subversion将文…

java调用IPFS去中心化体系

Maven pom.xml引入 <repositories><repository><id>jitpack.io</id><url>https://jitpack.io</url></repository></repositories><dependencies><dependency><groupId>com.github.ipfs</groupId><…

laravel 数据库迁移转 sql 语句

可以使用下面的命令 php artisan migrate --pretend --no-ansi   当然&#xff0c;你需要有可以 migrate 的东西。 数据库迁移导出到文件&#xff08;使用命令&#xff09; <?phpnamespace App\Console\Commands;use Illuminate\Contracts\Bus\SelfHandling;class Migrat…

MySQL Cluster搭建MySQL高可用性方案讨论

2019独角兽企业重金招聘Python工程师标准>>> MySQLCluster介绍以及搭建可以参考传送门 MySQL Cluster主要包括三种节点&#xff1a; 数据节点&#xff1a;存储集群的数据&#xff0c;同时集群软件会自动对数据进行分片并冗余。图中NDBSQL节点&#xff1a;查询入口。…

微服务的架构里应该使用 J2Cache 两级缓存框架

2019独角兽企业重金招聘Python工程师标准>>> 微服务真的很火&#xff0c;看看码云上那些基于各种 Spring Xxxx 的项目&#xff0c;不需要怎么推广就有很多人关注。其实我还是蛮好奇的&#xff0c;到底是什么样的应用在使用微服务&#xff0c;微服务适合什么规模的系…

centos linux 快捷键,Linux Centos 创建快捷方式的方法

在/usr/share/applications和~/.local/share/applications/xxxx.desktop这两个目录下有很多系统中的快捷方式图标&#xff0c;如果你的某个图标被误删了&#xff0c;可以在这里创建一个.图标都是.desktop格式的. application/x-desktop文件.[Desktop Entry] //每个desktop文件都…

RabbitMQ的应用场景以及基本名词解释

目录 一、背景 二、 应用场景 三、 系统架构 四、基本名词解释 一.背景 RabbitMQ是一个由erlang开发的AMQP(Advanved Message Queue)的开源实现。 二.应用场景 2.1异步处理 场景说明&#xff1a;用户注册后&#xff0c;需要发注册邮件和注册短信,传统的做法有两种1.串行的方式;…