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

2023-05-16

1. AF_INET域socket通信过程

在这里插入图片描述

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

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

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

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则用于跨机器之间的通信。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

AF_INET域与AF_UNIX域socket通信原理对比 的相关文章

  • 检查 Unix 消息队列是否为空

    谁能告诉我如何检查消息队列中是否有消息 消息队列是在基于Linux的操作系统中用C语言实现的 我只是想检查在特定时间消息队列中是否有消息 只需使用以下命令即可检查消息数量 如果有 msgctl 函数 并在返回时检查 msqid ds 结构
  • 带有存储在文件中的通配符的 grep

    我希望 grep 通过读取需要从文本文件中过滤掉的内容来过滤掉行 这是我给 grep 的内容 它存储在foo txt Users 1337 X Users 1337 R Users 1337 W 这是它应该过滤的内容 它存储在bar txt
  • XAMPP Windows 上的 Php Cron 作业

    嗯 我是这个词的新手CRON 据我所知 这是一个Unix安排特定操作在定义的时间间隔后执行的概念 我需要运行一个php文件 每小时更新一次数据库 但我的困惑在于安排执行 我在用XAMPP用于 Windows 7 上的本地开发测试 我发现了什
  • mongodb 正在运行吗?

    我已经在我的 Unix 服务器上安装了 Mongodb 和 PHP 驱动程序 我的问题是如何判断 Mongodb 是否正在运行 是否有一个简单的命令行查询来检查状态 如果我从外壳程序启动一次 如果我退出外壳程序 它会继续运行 情况似乎并非如
  • 用 C 实现 Unix shell:检查文件是否可执行

    我正在努力用 C 语言实现 Unix shell 目前正在处理相对路径的问题 特别是在输入命令时 现在 我每次都必须输入可执行文件的完整路径 而我宁愿简单地输入 ls 或 cat 我已经设法获取 PATH 环境变量 我的想法是在 字符处拆分
  • 如果目录不存在,有没有办法让 mv 创建要移动到的目录?

    因此 如果我在主目录中并且想将 foo c 移动到 bar baz foo c 但这些目录不存在 是否有某种方法可以自动创建这些目录 以便你只需要输入 mv foo c bar baz 一切都会顺利吗 似乎您可以将 mv 别名为一个简单的
  • 在 bash 中快速引用 stdout(即上一个命令的输出)?

    有没有办法快速 例如通过键盘快捷键等 引用写入到 stdout 的上一个命令的输出 例如 如果我这样做 which rails 它回来了 usr local bin rails然后我想在 textmate 中打开该文件 我可以像这样重新输入
  • 在 Bash 中拆分 csv 文件中的列

    我想从 csv 文件的第二列中提取值并将提取的值存储在新列中 我的数据集示例 page name post id page id A 86680728811 272953252761568 86680728811 A 86680728811
  • 如何创建路径别名?

    那么 cs 将映射到 College 以便我可以运行命令 cd cs 我相信您在问如何创建符号链接 或符号链接 例如 ln s College cs 不过 还有其他方法可以加快工作流程 例如设置 CDPATH export CDPATH C
  • 如何将文本数据从 ruby​​ 控制台传递到剪贴板而不保存到文件?

    我试图将我创建的全局变量中包含的数组传递到我的 mac 上的剪贴板中 它很长 所以我不想在控制台上突出显示 复制和粘贴 我想使用嵌入式unix代码 特别是pbcopyMac 笔记本电脑控制台的功能 允许我将文本传递到我的计算机剪贴板中 准备
  • 如何在Linux中获取带有图标的活动应用程序

    我想找到一种方法获取活动应用程序的列表及其名称和图标 实际上 我正在使用此命令来获取所有活动进程 wmctrl lp 示例输出 0x03800002 0 3293 user notebook XdndCollectionWindowImp
  • 使用 SED 将单词的第一个字母大写

    如何将单词的第一个字母替换为大写字母 例如 Trouble me Gold rush brides into Trouble Me Gold Rush Brides 这一行应该做到这一点 sed e s b u 1 g
  • 使用 awk 处理多个文件

    我必须使用 awk 处理大量 txt 文件 每个文件 1600 万行 我必须阅读例如十个文件 File 1 en sample 1 200 en n sample 2 10 en sample 3 10 File 2 en sample 1
  • 为什么 **sort** 不在每台机器上进行相同的排序?

    使用相同的sort具有相同输入的命令在不同的机器上产生不同的结果 我该如何解决这个问题 The man page http developer apple com documentation Darwin Reference ManPage
  • 如何在 ruby​​ Kernel.exec 之后运行代码

    我有以下红宝石外壳 usr bin env ruby stdin each line do line pid fork exec line puts after exec gt Process pid Process wait pid en
  • Crontab 每 5 分钟一次 [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我如何告诉 crontab 每 5 分钟运行一次 但从每小时的第二分钟开始 换句话说 我想在以下时间执行我的脚本minute 5 2 例如 我的脚本应
  • unix 下日期字段排序

    我有包含数十万条记录的文本文件 其中一个字段是日期字段 有没有办法根据日期字段对文件进行排序 09 APR 12 04 08 43 632279000 AM 19 MAR 12 03 53 38 189606000 PM 19 MAR 12
  • 类似 jq 中的 sql join

    我有以下 json id 1 type folder title folder 1 id 2 type folder title folder 2 id 3 type item title item 1 folder 1 id 4 type
  • unix下如何根据时间戳对文件进行排序? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 unix下如何根据时间戳对文件进行排序 我需要对文件进行排序 并根据它们创建的时间进行排序 文件修改 ls t 索引节点变化 ls tc 文件访问 l
  • 执行命令而不将其保留在历史记录中[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 在进行软件开发时 经常需要在命令行命令中包含机密信息 典型示例是将项目部署到服务器的凭据设置为环境变量 当我不想将某些命令存储在命令历史记

随机推荐

  • 专业的JS混淆加密:JShaman轻量版,功能体验

    来自国内专业的JS混淆加密平台 xff1a JShaman xff0c 体验其全新的轻量版功能 从官网首页 xff0c 点击 本地部署 34 xff1a 再进入页面下方的 本地部署 轻量版 xff1a 轻量版的界面风格 xff0c 与官网保
  • 调用JShaman的Web API接口,实现JS代码加密。

    在NodeJS中 xff0c 调用JShaman的Web API接口 xff0c 实现JS代码加密 同样的方法 xff0c 也可把该功能集成到自己的产品或项目中 xff0c 让自己也具备JS加密功能 调用JShaman接口的源码非常简单 x
  • npm警告:npm WARN nest-app@0.0.1 No repository field.

    npm警告 npm WARN No repository field 使用npm安装第三方扩展包出现警告提示 npm WARN nest app 64 0 0 1 No repository field 查看本机版本 node versio
  • JShaman JS代码混淆加密效果

    JShaman JS代码混淆加密效果 关键字 xff1a js加密 js混淆 js代码混淆加密 JShaman是专业的JS代码混淆加密平台 xff0c 拥有数十种自研JS代码保护技术 以下展示部分功能效果 注1 xff1a 代码中红色 绿色
  • Node.JS中调用JShaman,加密JS代码

    在Node JS环境中 xff0c 调用JShaman的WebAPI接口 xff0c 对JS代码进行混淆加密 效果如下 xff1a 代码 xff1a js代码 var js code 61 96 function NewObject pre
  • 在Node.JS中调用JShaman接口,实现JS代码加密

    在Node JS中调用JShaman接口 xff0c 实现JS代码加密 使用axios库实现https的post请求 xff0c 代码如下 xff1a const axios 61 require 34 axios 34 const jsh
  • js加密混淆,jshaman和jscrambler哪个好用?

    在前端开发中 xff0c JavaScript混淆加密是一种十分重要的技术 xff0c 其可以防止代码被反编译以及保护代码的安全性 在市场上有很多的JavaScript混淆工具 xff0c 其中jshaman和jscrambler是两个非常
  • CMake Error at CMakeLists.txt:11

    背景 xff1a 编译opencv源码 问题 xff1a 用clion或者CMake命令时报错 xff0c 报错类型为 xff1a CMake Error at CMakeLists txt 11 message FATAL In sour
  • PHP出现Warning: A non-numeric value encountered问题的原因及解决方法

    PHP出现Warning A non numeric value encountered问题的原因及解决方法 参考文章 xff1a xff08 1 xff09 PHP出现Warning A non numeric value encount
  • openstack总结2_环境搭建+keystone模块安装

    上篇说到我的openstack的部署环境是ubuntu16 04 xff0c 安装的版本是ocata 其实我最开始安装的版本是mitaka 因为mitaka有中文的安装部署文档 官方的Demo配置是ubuntu14 04 43 mitaka
  • WSL(ubuntu2204)xfce4语言支持报错及配置WSL服务自启

    语言支持报错 在图形桌面或命令行打开语言支持报错 xff1a dbus exceptions DBusException org freedesktop DBus Error FileNotFound Failed to connect t
  • 设置未识别的网络默认为专用网络

    在WIN7 WIN2008R2中 xff0c 没有配置网关的网络连接默认是公用网络 比如双网卡做软路由的时候 xff0c 连接内网的网卡是不配置网关的 xff0c 如果开启防火墙而又被识别为公用网络有时候很不方便 修改默认为专用网络的操作如
  • 多模块,Maven无法下载依赖,仓库查看有这个版本但是无法下载,点reload也没用

    Maven无法下载依赖 xff0c 点reload也没用 配置文件正确 也不是maven版本问题 最后发现是pom文件里面的依赖是写在 这个标签内的 这个的作用是子模块当引入同个依赖的时候 xff0c 不需要去写版本号 但是父模块的pom文
  • 在TypeORM中使用实体@Entity与字段@Column注解

    在TypeORM中使用实体 64 Entity与字段 64 Column注解 客观存在并相互区别的事物称为实体 Entity 实体是一个抽象名词 xff0c 是指一个独立的事物个体 xff0c 自然界的一切具体存在的事物都可以看做一个实体
  • ubuntu 16.04升级到ubuntu 18.04

    昨天升级了一下ubuntu xff0c 发现升级过程不是很顺利 xff0c 我这里分享一下我的经验 xff0c 在升级前 xff0c 需要把所有的ppa软件源和相应的软件删除 然后执行下面的操作 xff1a sudo apt get upd
  • Ubuntu系统下载及安装教程

    ubuntu下载及系统安装步骤 说明 xff1a 本教程介绍的是安装DeskTop版的系统 1 官网下载镜像 官方网址 https ubuntu com download 进入官网后会有最新版本的镜像下载地址 xff0c 如果需要下载最新版
  • Xrdp编译报错configure failed for librfxcodec解决方案

    vnc对异地网络远程控制不是很友好 这段时间中午休息的时候总是会远程连回寝室电脑 于是将目标锁定了Xrdp 但是使用apt install xrdp安装的xrdp不支持声音 xff0c RDP版本也很低 那就干脆自己编译一个 遇到问题先百度
  • python解析.pyd文件

    有的时候 xff0c 为了对python文件进行加密 xff0c 会把python模块编译成 pyd文件 xff0c 供其他人调用 拿到一个 pyd文件 xff0c 在没有文档说明的情况下 xff0c 可以试试查看模块内的一些函数和类的用法
  • 字节与KB的关系

    1个二进制位 61 1位 8位 xff08 bit xff09 61 1字节bai xff08 Byte xff09 xff0c 1024字节 61 1KB 字节 xff1a 英文单词 xff1a xff08 byte xff09 xff0
  • AF_INET域与AF_UNIX域socket通信原理对比

    1 AF INET域socket通信过程 典型的TCP IP四层模型的通信过程 发送方 接收方依赖IP Port来标识 xff0c 即将本地的socket绑定到对应的IP端口上 xff0c 发送数据时 xff0c 指定对方的IP端口 xff