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通信原理对比 的相关文章

  • 使用curl复制本地文件[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 有没有办法用curl复制本地文件 我需要它作为cp命令的替代品 这有点奇怪 但我正在一个 cp 不可用的环境中工作 你可以说 curl o
  • 放弃root权限

    我有一个以 root 身份启动的守护进程 因此它可以绑定到低端口 出于安全原因 初始化后我非常希望它放弃 root 权限 谁能指点我已知正确C 中的一段代码可以做到这一点 我阅读了手册页 研究了不同应用程序中的各种实现 它们都是不同的 其中
  • 为什么 nginx 接受 Host 标头与 server_name 不匹配的请求?

    我有一个这样设置的站点 nginx 作为代理服务器 通过 UNIX 套接字代理为 Django 站点提供服务的 Gunicorn 实例的请求 这是我的 nginx 配置 server listen 80 server name api my
  • 使用 sed 反转输入顺序

    我有一个文件 我们将其命名为 a txt 该文件包含以下文本行 do to what 我想知道 SED 命令是什么来反转此文本的顺序 使其看起来像 what to do 我必须做某种追加吗 就像将 do 附加到 to 所以它看起来像 to
  • 使用 sh shell 比较字符串

    我正在使用 SH shell 我试图将字符串与变量的值进行比较 但是if条件始终执行为真 为什么 这是一些代码 Sourcesystem ABC if Sourcesystem eq XYZ then echo Sourcesystem M
  • 如何使用 diff 排除多行模式?

    我想对两个 xml 文件进行比较 但忽略 2 3 行模式 例如 假设我想在比较下面的 xml 格式时忽略可用性和价格 这是我到目前为止所拥有的 diff I
  • 使用 Shell 脚本提供密码

    我已将客户端和服务器设置为无密码登录 就像无密码登录一样 通过将服务器的 RSA 密钥复制到所有客户端的 root ssh id rsa pub 来实现 但这是我手动完成的 我喜欢使用 shell 脚本自动执行此过程 并通过脚本向计算机提供
  • 模拟用户输入以使用不同参数多次调用脚本

    我必须使用提供的脚本 该脚本在脚本运行时接受用户输入而不是参数 我无法解决这个问题 脚本的一个例子是 bin bash echo param one read one doSomething echo param two read two
  • 命令行参数中的“-”(破折号)有什么魔力?

    例子 创建 ISO 映像并将其直接刻录到 CD mkisofs V Photos r home vivek photos cdrecord v dev dev dvdrw 更改到上一个目录 cd 侦听端口 12345 并解压发送到该端口的数
  • 什么是 POSIX 合规性以及它对我有何影响?

    我不断看到这个问题出现 每次我查找它时 我都无法很好地解释它是什么或它对我意味着什么 什么是 POSIX 合规性 假设我的程序仅在兼容 POSIX 的机器上运行 这对我作为程序员来说有何简化 甚至吗 POSIX http pubs open
  • 如何用 C 语言练习 Unix 编程?

    经过五年的专业 Java 以及较小程度上的 Python 编程并慢慢感觉到我的计算机科学教育逐渐消失 我决定要拓宽我的视野 对世界的一般用处 并做一些 对我来说 感觉更重要的事情就像我真的对机器有影响一样 我选择学习 C 和 Unix 编程
  • shell脚本“x$VARIABLE”中x的用途[重复]

    这个问题在这里已经有答案了 我正在查看一些 shell 脚本 comarison shcu 中 x 的用途是什么 if x USER x RUN AS USER then su RUN AS USER c CATALINA HOME bin
  • 如何在不登录主机的情况下从IP查找主机名

    我需要找到一个 UNIX 主机的主机名 该主机的 IP 是已知的 而无需登录到该 UNIX 主机 Use nslookup http en wikipedia org wiki Nslookup nslookup 208 77 188 16
  • 类unix系统中的python和python3命令有什么区别?

    我通读了每个命令的描述 但每个命令的描述都是完全相同的 所以我不明白这两个命令在类 Unix 系统中的工作方式有何不同 谁能解释其中的区别吗 Python3命令的引入是因为python命令指向了python2 从那时起 Python3 已成
  • 怎样才能使 Windows 成为一个开箱即用的 POSIX 兼容操作系统?

    这个问题的动机是我的一个牵强的梦想 即 nix 平台上可用的许多优秀软件可以轻松移植到 Windows 微软最近对开源和开放性采取了不同的方法 所以我真的很想知道如果微软有这样的倾向 这样的事情会有多可行 我很好奇的一些更具体的事情是 是否
  • 在以下程序中将产生多少个进程

    int main fork fork fork fork fork printf forked n return 0 当我们调用 fork 函数时 父进程会得到一个非零 pid而孩子得0分作为回报 基于这个逻辑 在第二个陈述中 我们必须应用
  • 在C语言中如何清屏? [复制]

    这个问题在这里已经有答案了 我想清除屏幕上的所有文字 我尝试过使用 include
  • 在 Unix 中添加用户和组

    有谁知道在unix中添加用户和组以及删除它们的api吗 我想以编程方式执行此操作 谢谢 坦率 我开始查看一些系统调用并发现以下内容 请注意 它们具有不同的标准 因此并非所有标准都可以在您的 Unix 版本上运行 getpwent setpw
  • 为什么 Linux 对目录使用 getdents() 而不是 read()?

    我浏览 K R C 时注意到 为了读取目录中的条目 他们使用了 while read dp gt fd char dirbuf sizeof dirbuf sizeof dirbuf code Where dirbuf是系统特定的目录结构
  • UNIX/MacOS 上静态文件的“临时 Web 服务器”?

    是否有一个像小型网络服务器这样的东西 我可以从命令行调用它 只从本地文件系统获取文件并通过特定端口上的 HTTP 为它们提供服务 我希望能够做这样的事情 cd Sites mysite serve 10 0 1 1 8080 这应该会启动一

随机推荐

  • 专业的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