网络基础扫盲-多路转发

多路径路由算法简单总结:LFI、MDVA、MPA、MPDA、MPATH 最近看了一些论文,多路径路由算法的。比较晦涩,还是勉强总结了一点内容: problem formulation: 主要是保证无环,多路径才能有效。两种表达无环的方法(用于指导算法设计、证明算法正确性): 1) 2) 几个多路径路由算法: 1)MPA: 2)MDVA: 3)MPDA: 先看PDA: 阅读详情

博客内容:多路转发的常见方式select,poll,epoll



前言
Linux下一切皆文件,是文件就会存在IO的情况,IO的方式决定了效率的高低。

一、五种IO模型

  • 阻塞IO
    内核将数据准备好之前,系统调用会一直等待。 比较常见的IO方式,在我们使用scanf、cin等函数需要从键盘等外设中获取数据,如果我们一直不输入数据,程序会运行到对应的地方卡住,进行阻塞等待。
  • 非阻塞IO
    非阻塞IO,如果内核数据没有准备好,系统调用任然会返回。系统中的父进程在对于子进程的回收时,参数可以设置非阻塞的。比较形象的说法就是排队时可以听着音乐,时不时的看看是否轮到自己。在阻塞的基础上多了一个对于文件描述符的轮询,对于cpu来说就是比较大的浪费。特定场合下才会被使用。
  • 信号驱动IO
    信号的IO方式,内核将数据准备好后,使用SIGIO信号通知引用程序进行IO操作。常见的就是生产消费模型。
  • 多路转发IO
    多路转接,也叫多路复用。表面看来就是阻塞IO,但是比较不同的是阻塞IO是一对一,而多路转接是多对一。就是广撒网的方式。
  • 异步IO
    在内核数据拷贝完成时,通知程序。值得注意的是信号IO是告知程序什么时候可以进行数据的拷贝。

可以说IO就是等待+读写。IO效率取决于等待的时间。

二、多路转发的常见接口

1.select

函数原型:

int select(int nfds, fd_set *readfds, fd_set *writefds,
fd_set *exceptfds, struct timeval *timeout)
  1. 参数一就是对于所需要监视的最大文件描述符+1。
  2. 第二、三、四个参数分别是对可读文件描述符集合,可写文件描述符集合,异常文件描述符的集合。参数的类型是位图,位图的位置代表的数文件描述符,对应的位置表示对应的文件描述符是否是被监视,不需要的直接置null。在这里插入图片描述
    为了使用方便可以这组fd_set的接口
void FD_CLR(int fd, fd_set *set); // 用来清除描述词组set中相关fd 的位
int FD_ISSET(int fd, fd_set *set); // 用来测试描述词组set中相关fd 的位是否为真
void FD_SET(int fd, fd_set *set); // 用来设置描述词组set中相关fd的位
void FD_ZERO(fd_set *set); // 用来清除描述词组set的全部位
  1. 参数五就是对于这些文件描述符的一种方式。参数直接取值为null表示是阻塞时读取。为0是非阻塞,{n,0} 表示在规定时间内没有事件发生 ,超时就会返回,少于规定时间返回剩余的时间。select是进行IO等待了。
    中间的位图参数是一个输入输出型的参数,如果select返回后会把以前加入但是无事件发生的fd清空,就需要使用一个数组进行数据的保存。
    在使用中每一次都需要手动设置fd集合。需要从用户态拷贝到内核态,在用户态、内核态都需要进行遍历所有的fd。开销比较大。最重要的是select使用的位图结构会存在文件描述符数量受限的情况。

最重要的一点,在使用select函数时,用户需要传递一个数组作为参数,用于存储可读、可写和错误事件的文件描述符集合。这是因为操作系统内核不知道用户需要监视哪些文件描述符,因此用户需要自己维护一个数组来告诉内核要监视哪些文件描述符。而且这个数组需要在每次调用select函数时重新初始化,告诉内核新的监视对象。因此,select需要用户自己维护数组。

2、poll

poll函数原型:

int poll(struct pollfd *fds, nfds_t nfds, int timeout);
// pollfd结构
struct pollfd {
int fd; /* file descriptor */
short events; /* requested events */
short revents; /* returned events */
};

参数说明

  1. fds是一个poll函数监听的结构列表. 每一个元素中, 包含了三部分内容: 文件描述符, 监听的事件集合, 返 回的事件集合。
  2. nfds表示fds数组的长度. 。
  3. timeout表示poll函数的超时时间, 单位是毫秒(ms)
    返回值小于0表示失败,等于0表示poll等待超时。dyu0,表示监听的文件描述符就绪二返回。
    poll在使用上比select简单而且解决了select表示文件描述符表数量受限的问题。但是poll在返回后还是需要轮询pollfd来获取就绪的文件描述符。同时在每次的调用时都需把大量的pollfd结构从用户态拷贝到内核态。连接的大量客户端在同一时刻可能只有很少的处于一个就绪状态。随着监视的描述符数量的增长,效率也会出现线性的下降。

3、epoll

epoll是为了处理大批量的句柄而改进的poll。
使用epoll的三部曲

  1. 调用epoll_create创建一个epoll句柄;
  2. 调用epoll_ctl 将要监控的文件描述符进行注册;
  3. 调用epoll_wait 等待文件描述符就绪
int epoll_create(int size);

参数:自从linux2.6.8之后, size参数是被忽略的.用完之后, 必须调用close()关闭。

int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);

参数:第一个就是epoll模型,epoll_create()的返回值。参数二是表示的动作,通常使用宏来表示

  • EPOLL_CTL_ADD :注册新的fd到epfd中;
  • EPOLL_CTL_MOD :修改已经注册的fd的监听事件;
  • EPOLL_CTL_DEL :从epfd中删除一个fd

参数三是需要监听的文件描述符,参数四是监听文件描述符的什么事件。

int epoll_wait(int epfd, struct epoll_event * events, int maxevents, int timeout);

  • 参数events是分配好的epoll_event结构体数组
  • .epoll将会把发生的事件赋值到events数组中 (events不可以是空指针,内核只负责把数据复制到这个events数组中,不会去帮助我们在用户态中分配内存).
  • maxevents告之内核这个events有多大,这个maxevents的值不能大于创建epoll_create()时的size.
  • 参数timeout是超时时间 (毫秒, 0会立即返回,-1是永久阻塞).如果函数调用成功,返回对应I/O上已准备好的文件描述符数目,如返回0表示已超时, 返回小于0表示函数失败。

为啥epoll好?
通过与select的缺点对应比较。

  • 接口方便:虽然拆分了三个函数,但是更加高效,使用select时需要每次都访问自己维护的数组。输入输出的参数进行了分离。
  • 数据拷贝更加的轻量化:在对于文件描述符的添加时不是一直都都需要调用EPOLL_CTL_ADD进行拷贝到内核中的,不会像select一样操作频繁。
  • 事件回调机制:避免使用了遍历,使用的是回调函数机制,就绪的文件描述符结构加入就绪队列中,epoll_wait返回直接访问就绪队列的就是知道哪些文件描述符已经就绪。事件复杂度是O(1)的。
  • 没有数量上的限制。

以上的优点何以见得,epoll的底层原理就是
每一个epoll对象都有一个独立的eventpoll的结构体,用来存放epoll_ctl方法向epoll对象中添加进来的事件。事件挂载到红黑树上,重复添加就是对于红黑树的节点的增,查,改操作。添加的事件都会与外界的设备程序建立回调关系,事件一旦发生就会触发对应的回调函数。回调的方法在内核中ep_poll_callback,它再将发生的事件添加到rdilist双向链表中,双向链表作为epoll_wait的消息队列。对于同一个事件节点是被红黑树和消息队列的俩个数据结构共用的。
在这里插入图片描述
三者之间的对比

特性selectpollepoll
可监视的fd数最大为FD_SETSIZE没有限制没有限制
事件触发方式轮询轮询事件通知
I/O效率低一般高
内存占用高适中低
时间复杂度O(n)O(n)O(1)
可移植性跨平台跨平台仅在Linux、BSD等少数平台支持
文件描述符生命周期控制子进程不继承fd子进程不继承fd子进程自动继承fd

总结

select适用于连接数较少的情况,可移植性好,但效率较低;poll效率高于select,但仍然存在遍历fd集合的缺点;epoll适用于连接数较多的场景,且能够避免无用的遍历,效率最高,但只能运行在Linux系统上。

时分多路复用(转发) 多路复用 一、什么是多路复用技术? 多路复用技术是把若干个低速信道组成一个高速信道的技术,可以提高数据链路利用率,从而使一条高速的主干链路同时为多条低速的接入链路提供服务,即使网络主干链路可同时运载大量的语音和数据传输。 多路复用技术是人们为了充分利用传输介质,而研究的在一条物理线路上建立多个通信信道的技术。 多路复用技术的实质:将一个区域的多个用户数据通过发送多路复用器进行汇集,然后将汇... 阅读详情

相关推荐

使用IO多路复用实现转发服务器

IO多路复用:允许同时对多个输入输出进行控制。 原理:构建一张文件描述符表,使用函数select,不断地监听表中的文件描述符是否可读(是否有数据),如果有则返回对应的文件描述符,并擦除其余文件描述符。 使用步骤: (1)定义一个文件描述符集合 fd_set set; (2)将集合清空:FD_ZERO(&set); (3)将想关注的文件描述符添加到集合中 FD_SET(fd, &set); (4)监测集合中的文件描述符是否有动作(是否有数据)

dml128的博客 1414

多路径传输(MPTCP & MPQUIC)数据包调度研究总结

MPTCP与MPQUIC多路径传输数据包调度研究梳理总结。

Green Lv的博客 8352

从零到一:手把手部署用友T3标准版11.2及SQL Server 2008R2环境

本文详细介绍了从零开始部署用友T3标准版11.2及SQL Server 2008R2环境的完整流程,包括环境准备、SQL Server安装、环境检测与修复、T3标准版安装实战以及初始化配置与测试。通过手把手的步骤指导和常见问题解决方案,帮助用户顺利完成部署,确保系统稳定运行。

weixin_28339967的博客 452

TRILL技术及其组网模型

TRILL(Transparent Interconnection of lots of links,多链路透明互联)是IETF为实现数据中心大二层扩展制定的一个标准,目前已经有一些协议文稿标准化,如RFC6325,6326,6327等等。该协议的核心思想是将成熟的三层路由的控制算法引入到二层交换中,将原先的L2报文加一个新的封装(隧道封装),转换到新的地址空间上进行转发。而新的地址有与IP类似的

achejq的专栏 4911

Multisim的探针(Probe)及数字电路的一些调试技巧的应用

Multisim的探针(Probe)及数字电路的一些调试技巧的应用 --EE Bang   By  WRS 上图为555方波发生器,根据R1,R2,C2参数的配置可产生频率为46.3KHZ,占空比50%的方波信号,如果用示波器查看波形参数的话需要用两个坐标轴做差,操作不便,另外如果要修改电路将上述电阻换成滑动变阻器的话,使其产生可变频率

Agent Christmas的博客 3万+

【27】软考软件设计师——数据流图(DFD)补全题满分精讲|下午15分大题深度拆解

本文是《软件设计师·50讲通关|从零基础到工程师职称》专栏第27篇,深度精讲**下午案例题第1道必考大题:数据流图(DFD)补全**,该题单题分值高达**12 ~ 15分**,是整张试卷最稳的保底得分大题。我结合多年备考复盘与真题阅卷规则,超详细拆解DFD四大核心元素标准定义、机考绘图规范、三层分层逻辑、**父图子图平衡刚性扣分规则**,升级强化版「DFD满分补全三步法」;复刻历年高频真题完整流程,拆解缺失数据流定位、实体/存储辨析、平衡改错、文字需求对照全流程,配套**阅卷满分答题话术、机考避坑细则

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 589

多网卡Bonding

Bonding(绑定)是一种将多个网络接口(通常是以太网接口)聚合为一个逻辑接口的技术。这种聚合可以实现负载均衡、冗余和故障转移等功能。bonding 模式定义了网络接口如何在 bond 中工作。

邢宇宇的博客 2198

PLC的模糊PID控制

模糊PID控制包括模糊化,确定模糊规则,解模糊等组成部分,小车通过传感器采集赛道信息,PLC通过温度传感器获取炉内温度,确定当前实际温度和设定目标值的偏差e(error), e=setpoint-input以及偏差的变化ec(当前偏差-上次偏差),根据给定的模糊规则进行模糊推理,最后对模糊参数进行解模糊,输出PID控制参数 其次我们需要对这2个参数进行模糊化,e 、 ec 这里我对e进行举例,两个输入的标准化范围都在 [-1,1] 范围内。模糊逻辑控制器还产生范围 [-1,1] 内的归一化输出。 博

RXXW_Dor的博客 1万+

Linux多路径的使用及介绍

作者:kent 出自:[url]http://kentfang.blog.sohu.com/[/url]多路径(multi-path)软件的介绍 普通的电脑主机都是一个硬盘挂接到一个总线上,这里是一对一的关系。而到了有光纤组成的SAN环境,由于主机和存储通过了光纤交换机连接,这样的话,就构成了多对多的关系。也就是说,主机到存储可以有多条路径可以选择。主机到存储之间的IO由多...

weixin_34417814的博客 704

PyTorch生成式人工智能(7)——生成对抗网络(Generative Adversarial Network, GAN)实践详解

生成对抗网络 (Generative Adversarial Network, GAN) 最早由 Ian Goodfellow 于 2014 年提出,其中生成器试图创建与真实样本无法区分的数据样本,而判别器则试图区分生成器生成的样本与真实样本。在本节中,我们将介绍 GAN 的理论基础。然后,介绍如何使用 PyTorch 从零开始构建 GAN,以便了解所有细节,深入理解 GAN 的内部工作原理,为后续讨论 GAN 的其他更高级内容奠定基础,比如生成高分辨率图像或逼真的音乐。

盼小辉丶的博客 1万+

【报错解决】OpenClaw 报错 `openclaw: command not found`:全局命令未加入系统 PATH 的深度排查与修复指南

在国产AI工具链开发中,OpenClaw作为关键命令行工具常出现command not found报错。本文深度分析该问题的根源——Linux环境变量PATH未包含用户级安装目录(~/.local/bin)。通过四种解决方案(临时PATH修改、永久配置、软链接、虚拟环境处理)和排错Checklist,揭示"命令存在却找不到"的本质是路径配置问题,特别适用于Docker/国产Linux/非root环境。文中强调理解Linux工具链机制对国产AI开发的重要性,并指出这是开发者掌握环境

博客 5381

多路径路由算法选择(3)——路由器的简单介绍

下面内容摘自《计算机网络,谢希仁》: 路由器的构成P160图4-42 路由器是一种具有多个输入输出端口的专用计算机,其任务是转发分组。 (注意这段的内容丰富,仔细阅读)路由器有两部分组成:路由选择部分和分组转发部分。路由选择部分的核心构件是路由选择处理机,它根据所选定的路由选择协议(RIP/OSPF),构造、更新、维护路由表。分组转发部分由交换结构、输入端口、输出端口组成,输

mmc2015的专栏 2985

YOLOv11【第二章:核心模块进阶篇·第3节】LDConv线性可变形卷积改进YOLOv11!

🏆 本文收录于专栏 《YOLOv11实战:从入门到深度优化》。本专栏围绕 YOLOv11 的改进、训练、部署与工程优化 展开,系统梳理并复现当前主流的 YOLOv11 实战案例与优化方案,内容目前已覆盖 分类、检测、分割、追踪、关键点、OBB 检测 等多个方向。

**My Coding Family** 7438

计算机网络世界(知识扫盲一)

网络世界(扫盲一) 众所周知,我们现在越来越离不开网络,首先我们也要了解他们。 我们先来区分三个关键词:互联网,英特网,以太网,万维网。 以太网 Ethernet 先来下个定义:以太网是一种多台计算机能够彼此自由和廉价的互相通信而设计的通信技术。以太网是局域网的一种类型,和我们生活中的WLAN技术是一类。以太网是最常用的局域网组网方式。所以以太网是一种技术!不是网络!我们所接触的到网口(笔...

Mr.Wing的博客 1928

Linux故障排查和性能优化面试题及参考答案

在 Linux 系统中,负载(Load Average)是衡量系统繁忙程度的一个重要指标,它表示系统在特定时间间隔内运行队列中的平均进程数。负载值反映了系统当前的工作压力,主要包括 CPU 等待运行的进程数量和处于不可中断睡眠状态(通常是等待 I/O 操作完成)的进程数量。负载平均值通常有三个数值,分别代表过去 1 分钟、5 分钟和 15 分钟内的系统平均负载。例如,在使用uptime命令或查看文件时,会看到类似这样的输出,这三个数值依次表示过去 1 分钟、5 分钟和 15 分钟的负载平均值。

大模型大数据攻城狮的专栏 1081

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

来一场轰轰烈烈的HTTP协议扫盲革命

最近一段时间在空闲之余拜读了一下《图解HTTP协议》,收货颇丰。以前不懂的地方在读完这本书之后,豁然开朗。于是花了一些时间总结一下,其中我也查阅了一些其他资料来补充进去,希望这篇文章可以给大家带来帮助。

m0_61869253的博客 829

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

HCIA总结

MAC表中记录各个MAC对应的接口),之后再关注数据帧中的目标MAC地址表中是否有其记录,若存在记录,仅基于记录的接口唯一转发(单播);链路状态协议的更新量随着网络范围的扩展指数性的上升,因此ospf协议为了在中大型网络中工作,需要结构化的部署-区域划分、合理ip地址规划;适当的修改计时器,可以加快协议的收敛速度;修改时,全网所有运行rip的设备建议一致?大---无线距离、无冲突、单播--->交换机--->MAC地址--->洪泛--->洪泛的范围--路由器-->ARP-->广播-->广播域(洪泛域)...

gx1469131213的博客 568

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

HTTP的前世今生(HTTP1.1,HTTPS,SPDY,HTTP2.0,QUIC,HTTP3.0)

本文将从HTTP不断发展的时间线来讲解与其相关的知识点,其中包括HTTP1.1,HTTPS,SPDY,HTTP2.0,QUIC,HTTP3.0等,文章中内容涉及面较广,属于扫盲级别,不会特别深入某个知识点来延伸,希望各位读者都能有所收获。 1. WEB始祖HTTP HTTP的全称是:超文本传输协议(HyperText Transfer Protocol) 。 伴随着计算机网络和浏览器的诞生,HTTP1.0也随之而来,处于计算机网络中的应用层,HTTP是建立在TCP协议之上,所以HTTP协议的瓶颈及其优化技巧

qq_35448165的博客 406

系统软件开发笔试核心考点:C++基础、操作系统与算法刷题策略

系统软件开发岗位的笔试考察,与常规算法岗有本质不同。它不单看重刷题数量,更关注候选人的基础扎实程度、系统理解深度与工程实现能力。C++语言机制、操作系统内存管理、并发同步模型、Linux网络编程,以及边界条件处理严格的数据结构与算法题,共同构成了这类笔试的分值重心。从空类大小到虚表布局,从虚拟内存缺页机制到多线程竞态条件,这些底层原理既是笔试的关键得分点,也是实际系统开发中排查问题的基础。理解命题背后的能力模型与备考逻辑,能帮助求职者高效规划复习路径,更快找到系统软件开发的备考方向,也有助于准备小米、华为等

weixin_33849215的博客 378

如何实现多路海康大华等RTSP数据转RTMP推送

一个好的转发模块,首先要低延迟!其次足够稳定、灵活、有状态反馈机制、资源占用低,跨平台,最好以接口形式提供,便于第三方系统集成。 以Windows平台为例,我们的考虑的点如下 1. 拉流:通过RTSP直播播放SDK的数据回调接口,拿到音视频数据; 2. 转推:通过RTMP直播推送SDK的编码后数据输入接口,把回调上来的数据,传给RTMP直播推送模块,实现RTSP数据流到RTMP服务器的转发;...

大牛直播SDK 5595

java实现多路分发

多路分发就是指在调用a.plus(b),a和b都不知道确切类型,也能让他们正常交互。 如果想使用两路分发,那么必须有两个方法调用,第一个方法调用决定第一个未知类型,第二个方法调用决定第二个未知类型。要利用多路分发,程序员必须为每一个类型提供给一个实际的方法调用。一般而言,程序员需要设定好某种配置,以便一个方法调用能够引出更多的方法调用,从而能在这个过程中处理多个类型。 下面是个“石头 ...

管子(zero)的杂乱空间 381

apache 多路转发配置 (反向代理方法)

打开apache安装目录的conf文件夹下的httpd.conf1、将以下两行前的注释字符 # 去掉:#LoadModule proxy_module modules/mod_proxy.so#LoadModule proxy_http_module modules/mod_proxy_http.so2、在httpd.conf 文件的最后加上转发规则例如:ProxyPass /cas htt...

922

计算机网络-多路复用

什么是多路复用技术呢? 多路复用(multiplexing),简称复用,是通信技术中的基本概念 。  事实上,多路复用技术的原理就是,把通信资源或者说是链路、信道资源进行的划分,分成一系列的资源片。把这些资源片分配给每一路通信。每一路通信在通信过程中就独占它分配到的分配资源。当然在整个通信过程中,可能或出现闲置。 那典型的多路复用技术有: 频分多路复用( frequency divis...

suxiaorui的博客 1万+

多路icmp/tcp转发实验

之前在cloudlab上做的都是单switch转发实验,这次试了多switch转发实验,并且在ping通(icmp转发)的基础上,增加了tcp转发,实验拓扑如上图 controller代码如下: from ryu.base import app_manager from ryu.controller import ofp_event from ryu.controller.handler import CONFIG_DISPATCHER, MAIN_DISPATCHER from ryu.co...

aaaa1997的博客 2222
上一篇: 指针与引用详解
下一篇: 网络基础扫盲-初识网络
小鱼君
博客等级 码龄4年 530粉丝 33原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小鱼君

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值