当前位置: 首页 > news >正文

集线器、交换机、路由器是如何转发包的

集线器、交换机、路由器是如何转发包的

  • 集线器
  • 交换机
    • MAC地址表的维护
  • 路由器
    • 路由表中的信息
    • 路由器的包接收操作
    • 查询路由表确定输出端口
    • 找不到匹配路由时选择默认路由
    • 包的有效期
    • 通过分片功能拆分大网络包
    • 路由器发送操作中的一些特点
  • 参考文档

集线器

集线器是一层(物理层)设备
集线器将信号发送给所有连接在它上边的线路

集线器是什么呢?
文字描述就是:集线器(Hub)是计算机网络中的一种网络设备,主要用于连接多台计算机,实现数据包的广播传输。 集线器工作在OSI模型的物理层,负责物理信号的传输。它将多个计算机的物理连接集中在一起,形成一个共享的网络。 集线器接收到的数据包会被广播到所有连接在它上面的计算机。这意味着,无论是哪台计算机发送的数据包,所有计算机都会接收到这个数据包。

然而,随着技术的发展,集线器逐渐被交换机(Switch)所取代。交换机不同于集线器,它在数据链路层(OSI模型的第二层)工作,能够根据MAC地址将数据包仅发送到目标设备,而不是广播到所有设备。这样,交换机能够提供更高效的数据传输,减少了网络中的冗余流量。

集线器内部结构如下图:
集线器内部结构图
在每个接口的后面装有和网卡中的PHY(MAU)功能相同的模块。
网卡不仅可以连接集线器,因为网卡的PHY(MAU)模块和集线器都是一样的,所以两台计算机的网卡也可以相互连接,只要将一侧的发送信号线和另一侧的接收信号线连起来就可以收发数据了。

信号到达集线器的PHY(MAU)模块后,会进入中继电路。中继电路的基本功能就是将输入的信号广播到集线器的所有端口上。当然,也有一些产品具有信号整形、错误抑制等功能,但基本上就是将输入的信号原封不动输出到网线接口。

接下来,信号从所有接口流出,到达连接在集线器上的所有设备。然后,这些设备在收到信号之后会通过MAC头部中的接收方MAC地址判断是不是发送给自己的,如果是就接收,如果不是则忽略。这样网络包就到达指定的MAC地址的接收方了。

交换机

来一张交换机的图片。图片取自某宝某品牌:
在交换机

交换机端口不具有MAC地址
交换机根据MAC地址表查找MAC地址,然后将信号发送到相应的端口

信号到达网线接口,并有PHY(MAU)模块进行接收,这一部分和集线器是相同的。也就是说,当信号从双绞线传入时,就会进入PHY(MAU)模块的接收部分。

接下来,PHY(MAU)模块会将网线中的信号转换为通用格式,然后传递给MAC模块。MAC模块将信号转换为数字信息,然后通过包末尾的FCS校验错误,如果没有问题则存放到缓冲区中,如果有错误就丢弃这个包。这部分操作和网卡基本相同,可以认为交换机的每个网线接口后边都是一块网卡。网线接口和后边的电路部分一起称为一个端口,也就是说交换机的一个端口就相当于交换机上的一块网卡。但交换机的工作方式和网卡有一点不同。网卡本身具有MAC地址,并通过该对收到的包的接收方MAC地址判定是不是发给自己的,如果不是发给自己的则丢弃;相对的,交换机的端口不核对接收方MAC地址,而是直接接收所有的包并存放到缓冲区。因此,和网卡不同,交换机的端口不具有MAC地址

将包放入缓冲区后,接下来需要查询一下这个包的接收方MAC地址是否已经在MAC地址表中有记录。MAC地址表主要包含两个信息,一个是设备的MAC地址,另一个是该设备连接在交换机的哪个端口上。MAC地址和端口是一一对应的,通过这张表就能够判断出收到的包应该转发到哪个端口。

MAC地址表的维护

交换机在转发包的过程中,需要对MAC地址表的内容进行维护,维护操作分两种。

第一种是收到包时,将发送方MAC地址以及其输入端口的号码写入MAC地址表中。由于收到包的哪个端口就连着发送这个包的设备,所以只要将这个包的发送方MAC地址写入地址表,以后当收到发往这个地址的包时,交换机就可以将它发送到正确的端口了。交换机每次收到包时都会执行这个操作,因此只要某个设备发送过网络包,它的MAC地址就会被记录到地址表中。

另一种是删除地址表中某条记录的操作,这是为了防止设备移动时产生问题。比如,我们开会时会把笔记本从工位拿到会议室,这时设备就发生了移动。从交换机的角度来看,就是本来连接在某个端口上的笔记本消失了。这时如果交换机收到了发往这台已经消失的笔记本的包,那么它依然会把包发送到原来的端口,通信就会出错,因此必须想办法删除哪些已经过时的记录仪。然而交换机没办法知道这台笔记本已经从原来的端口移走了。因此地址表中的记录不能永久有效,而是要在一段时间不使用后自动删除。

那么当笔记本被拿到会议室之后,会议室里的交换机又会如何工作呢?只要笔记本电脑连接到会议室的交换机,交换机就会根据笔记本电脑发出来的包更新它的地址表。因此对于目的交换机来说不用做什么特别的措施就可以正常工作了。

如果接入到新的交换机,当前笔记本又没有发送过包,当需要接收包的时候,怎么知道MAC地址呢?
广播ARP请求,获取目标设备的MAC地址,一旦目标设备回应了ARP请求,交换机会将其MAC地址添加到MAC表中,以便将来的通信可以直接定位到目标端口。

一旦交换机知道了目标设备的MAC地址,它就会将数据包定向到正确的端口,而不再是广播到所有端口。这种机制使得交换机能够动态地学习和更新网络中各设备的MAC地址,从而提高了网络的效率。

路由器

路由器各个端口都具有MAC地址和IP地址

网络包在到达路由器时会被转发到下一个路由器,这一转发操作的工作原理和交换机类似,也是通过查表判断包的转发目标。

路由器的内部结构如下图所示。其中包转发模块负责判断包的转发目的地,端口模块负责包的收发操作。
路由器内部结构
路由器在转发包时,首先通过端口将发过来的包接收进来,这一步的工作过程取决于端口对应的通信技术。接下来,转发模块会根据收到的包的IP头部中记录的接收方IP地址,在路由表中进行查询,以此判断转发目标。然后,转发模块将包转移到转发目标对应的端口,端口再按照硬件的规则将包发送出去,也就是转发模块委托端口模块将包发送出去的意思。

端口模块会根据相应通信技术的规范执行包收发的操作,这意味着端口模块时以实际的发送方或者接收方的身份来收发网络包得。以以太网为例,路由器的端口具有MAC地址,因此它能够成为以太网的发送方和接收方。端口还具有IP地址,从这个意义上讲,它和计算机的网卡是一样的。

路由表中的信息

路由器根据IP地址判断转发目标
路由器会忽略主机号,只匹配网络号
路由器表的子网掩码列指标是在匹配网络包目标地址时需要对比的数量

在“查表判断转发目标”这一点上,路由器和交换机的大体思路是类似的,不过具体的工作过程有所不同。交换机是通过MAC头部中的接收方MAC地址来判断转发目标的,而路由器则是根据IP头部中的IP地址来判断的。由于使用的地址不同,记录转发的内容也会不同

路由表
路由表示例如上图,最左侧的目的地址列记录的实接收方的信息。实际上这里的IP地址只包含表示子网的网络号部分的比特值,而表示主机号部分的比特值全部为0。路由器会将接受到的网络包的接收方IP地址与路由表中的目标地址进行比较,找到相应的记录。交换机在地址表中只匹配完全一致的记录,而路由器则会忽略主机号部分,只匹配网络号部分。

在匹配地址的过程中,路由表需要知道网络号的比特数,因此路由表中还有一列子网掩码。通过这个值就可以判断出网络号的比特数。


路由器还会把几个子网合并成一个子网,并在路由表中只产生一条记录,称之为路由聚合。 路由聚合会将几个子网合并成一个子网,并在路由表中只产生一条记录。

路由聚合

假设现在有三个子网,分别是 10.10.1.0/24,10.10.2.0/24、10.10.3.0/24,路由器 A 需要将包发往这 3 个子网。在这种情况下,路由器 A 中原本有对应这 3 个子网的 3 条记录,但是我们把这三个子网聚合成一个子网为 10.10.0.0/16,这样也能够正确地进行转发,但我们减少了路由表中的记录数量,这就是路由聚合。经过路由聚合,多个子网会被合并成一个子网,子网掩码会发生变化,同时,目标地址列也会改成聚合后的地址。

相对地,还有另外一些情况,如将一个子网进行细分并注册在路由表中,然后拆分成多条记录。

此外,通过上述方法,我们也可以将某台计算机的地址写入路由表中,这时的子网掩码为 255.255.255.255,也就是说地址中的全部 32 个比特都为 1。这样一来,主机号部分比特全部为 0 可以表示一个子网,主机号部分比特不全部为 0 可以表示某一台计算机,两种情况可以用相同的规则来处理。


路由表最后一列是跃计数,它表示距离目标IP地址的距离是远还是近。这个数字越小,表示距离目的地越近,数字越大,表示距离目的地越远。

路由器的包接收操作

路由器的端口都具有MAC地址,直接受与自身地址匹配的包,遇到不匹配的包则直接丢弃

信号到达网线接口部分,其中的PHY(MAU)模块和MAC模块将信号转换为数字信息,然后通过包末尾的FCS进行错误校验,如果没问题则检查MAC头部中的接收方MAC地址,看看是不是发送给自己的包,如果是就放到就收缓冲区,否则就丢弃这个包。如果包的接收方MAC地址不是自己,说明这个包时发送给其他设备的,如果接受这个包就违反了以太网的规则。

查询路由表确定输出端口

通过路由器转发的网络包,其接收方MAC地址为路由器端口的MAC地址

完成包接收操作之后,路由器就会丢弃包开头的MAC头部。MAC头部的作用就是将包送达路由器,其中的接收方MAC地址就是路由器端口的MAC地址。因此,当包到达路由器之后,MAC头部的任务就完成了,于是MAC头部 就会被丢弃。

接下来路由器会根据MAC头部后方的IP头部中的内容进行包的转发操作。

根据包的接收方IP地址查询路由表中的目标地址栏,以找到相匹配的记录。这个匹配不是匹配全部的32个比特,而是根据子网掩码列中的值判断网络号的比特数,并匹配相应数量的比特。按照这样的规则可能会匹配到多条候选记录,路由器会首先寻找网络号比特数最长的一条记录。网络号的比特数越长,说明主机号比特数越短,也就意味着该子网内可分配的主机数越少,即子网中存在的主机数量越少,这一规则的目的是尽量缩小范围,所以根据这条规则判断转发目标就会更加准确。

然而,有时候路由表中会存在网络号长度相同的多条记录,例如考虑到路由器或网线的故障而设置的备用路由就属于这种情况。这时需要根据跃点计数值来进行判断。跃点计数越小说明路由越近,因此应选择越点数较小的记录。

如果在路由表中找不到匹配的记录,路由器会丢弃这个包,并通过ICMP消息告知发送方。

找不到匹配路由时选择默认路由

路由表中子网掩码为 0.0.0.0的记录表示“默认路由”

如果找不到目标记录,路由器就直接丢弃该包,那么是不是要把所有的转发目标都配置到路由器中表中呢?如果转发目标就成千上万,是不是都要写到路由表呢?

不是,路由表最后一行的作用就解决了如上问题。这一行的子网掩码为 0.0.0.0,关键就在这里,子网掩码 0.0.0.0的意思就是网络包接收方IP地址和路由表目标地址的匹配的比特数为0,换句话说,就是根本不需要匹配

包的有效期

从路由表中查找到转发目标之后,网络包就会被转发给输出端口,并最终发送出去,但在此之前,路由器还有一些工作要完成。

第一个工作就是更新IP头部中的TTL(time to live,生存时间)字段。TTL字段表示包的有效期,包每经过一个路由器的转发,这个值就会减1,当这个值变成0时,就表示超过了有效期,这个包就会被丢弃。

这个机制是为了防止包在一个地方陷入死循环。

通过分片功能拆分大网络包

路由器的端口并不只有以太网一种,也可以支持其他局域网或专线通信计数。不同的线路和局域网类型各自能传输的最大包长度也不同。一旦转发的包的长度超过了输出端口能传输的最大长度,就无法直接发送这个包了。

遇到这种情况,可以使用IP协议中定义分片功能对包进行拆分,缩短每个包的长度。首先需要知道输出端口的MTU,看看这个包能不能不分片直接发送。最大包长度是由端口类型决定的,用这个最大长度减掉头部的长度就是MTU,将MTU与要转发的包长度进行比较。如果MTU太小就需要将这个包按照MTU进行分片,再次之前还要看一下IP头部中的标志字段,确认是否可以分片。
对包进行拆分的分片功能
如果查询标志字段发现不能分片,那么就只能丢弃这个包,并通过ICMP消息通知发送方。否则,就可以按照输出端口MTU对数据进行一次拆分了。

路由器发送操作中的一些特点

路由器判断下一个转发目标的方法如下:

  • 如果路由表的网关列内容为IP地址,则该地址就是下一个转发目标。
  • 如果路由器的网关列内容为空,则IP头部中的接收方IP地址就是下一个转发目标

路由器也会使用ARP来查询下一个转发目标的MAC地址

参考文档

《网络是怎样连接的》 ——户根勤

相关文章:

集线器、交换机、路由器是如何转发包的

集线器、交换机、路由器是如何转发包的 集线器交换机MAC地址表的维护 路由器路由表中的信息路由器的包接收操作查询路由表确定输出端口找不到匹配路由时选择默认路由包的有效期通过分片功能拆分大网络包路由器发送操作中的一些特点 参考文档 集线器 集线器是一层(物…...

交通物流模型 | MDRGCN:用于多模式交通客流预测的深度学习模型

城市交通拥堵是造成交通事故的重要原因,也是城市发展的主要障碍。通过学习历史交通流数据,我们可以预测未来一些区域的交通流,这对城市道路规划、交通管理、交通控制等都有重要意义。然而,由于交通网络拓扑结构的复杂性和影响交通流的因素的多样性,交通模式往往是复杂多变…...

保研经历分享(一)

这个系列的文章主要是想记录一下自己大学期间最重要的一件事(保研!!)的经历、过程,外加一些保研流程介绍、面试经验、院校投递、踩坑经历,主要给学弟学妹们避雷,也做一些借鉴吧~ 这一篇主要是对保研过程的一些介绍&…...

【手写数字识别】数据挖掘实验二

文章目录 Ⅰ、项目任务要求任务描述:主要任务要求(必须完成以下内容但不限于这些内容): II、实现过程数据集描述实验运行环境描述KNN模型决策树模型朴素贝叶斯模型SVM模型不同方法对MNIST数据集分类识别结果分析(不同方法识别对比率表及结果分析) 完整代…...

什么是云计算?云计算简介

其实“云计算”作为一个名词而言,那是相当成功滴。很多人都有听过。但提及云计算”具体是什么?很多人,知其然,却不知其所以然! 利用软件将这些成千上万不可靠的硬件组织成一个稳定可靠的IT系统,以此支撑其公司的IT基础服务。这家…...

Vue路由进阶--VueRouter声明式导航

Vue路由进阶–VueRouter声明式导航 文章目录 Vue路由进阶--VueRouter声明式导航1、声明式导航1.1、导航链接1.2、高亮类名1.3、跳转传参1.4、动态路由参数可选符 1、声明式导航 1.1、导航链接 需求:实现导航高亮效果 vue-router提供了一个全局组件router-link(取…...

Oracle 云服务即将支持 PostgreSQL!

2023 年 9 月 19 日,Oracle 产品团队发布了一篇文章,宣布 Oracle 云基础架构(OCI)开始提供 PostgreSQL 服务。目前支持的版本为 PostgreSQL 14.9,提供有限支持,12 月份将会提供正式版本。 众所周知&#x…...

数字孪生项目:突破技术难关,引领未来发展

项目背景 数字孪生技术一直在不断发展,为企业提供了无限的潜力和机会。在这个数字时代,公司需要不断进化,以适应市场的需求和客户的期望。北京智汇云舟一直以“视频孪生”为标签,是数字孪生领域的头部企业,拥有强大的…...

MySQL 如何使用离线模式维护服务器

离线模式 作为 DBA,最常见的任务之一就是批量处理 MySQL 服务的启停或其他一些活动。在停止 MySQL 服务前,我们可能需要检查是否有活动连接;如果有,我们可能需要把它们全部杀死。通常,我们使用 pt-kill 杀死应用连接或…...

期权开户流程合集——期权开户的操作步骤

最详细的期权开户流程介绍是怎样的,下文为大家介绍期权开户流程合集——期权开户的操作步骤的知识点,希望对读者有所帮助,期权开户流程和方式分两种,一种券商,一种期权分仓平台,有啥区别下文揭秘。本文来自…...

mysql改造oracle,以及项目改造

mysql改造oracle,以及springboot项目改造 oracle改造说明 这次的任务是springboot mysql版本改造为oracle版本,mysql5.7,oracle11.2,springboot2.0.2(springboot版本无所谓,都差不多,自己记录…...

利用互斥锁实现多个线程写一个文件

代码 #include <stdio.h> #include <pthread.h> #include <string.h> #include <unistd.h>FILE *fp;//线程函数1 void *wrfunc1(void *arg); //线程函数2 void *wrfunc2(void *arg); //线程函数3 void *wrfunc3(void *arg);//静态创建互斥锁 pthread_…...

【m98】视频缓存PacketBuffer 1 : SeqNumUnwrapper int64映射、ForwardDiff

视频缓存PacketBuffer 对rtp包进行接收处理。 rtp序号 相关 【mediasoup】RtpStreamRecv 对rtp 序号的验证 与这里的处理有不同。...

day58:ARMday5,GPIO流水灯实验

汇编指令&#xff1a; .text .global _start _start: 1.设置GPIOE GPIOF寄存器的时钟使能 RCC_MP_AHB4ENSETR[5:4]->1 0x50000a28 LDR R0,0x50000a28 LDR R1,[R0] ORR R1,R1,#(0x3<<4) STR R1,[R0]2.设置PE10、PF10、PE8管脚为输出模式&#xff0c;GPIOE_MODER[21…...

Linux shell编程学习笔记9:字符串运算 和 if语句

Linux Shell 脚本编程和其他编程语言一样&#xff0c;支持算数、关系、布尔、字符串、文件测试等多种运算&#xff0c;同样也需要进行根据条件进行流程控制&#xff0c;提供了if、for、while、until等语句。 上期学习笔记中我们研究了字符串数据的使用&#xff0c;今天我们研…...

【分享】xpath的属性表达式

在XPath中&#xff0c;要选择HTML文档中具有特定类的元素&#xff0c;您通常需要使用属性选择器 [attribute-nameattribute-value] 来选择元素&#xff0c;其中 attribute-name 是属性名称&#xff0c;attribute-value 是要匹配的属性值。对于HTML元素的类选择器&#xff0c;您…...

Oracle Dataguard跨版本数据迁移(11.2.0.4~19.13.0.0)

一、前期准备 按照DG部署步骤修改DG参数、添加standby redo log、配置静态监听、配置tnsnames文件、备端修改参数文件、创建所需目录等配置好部署环境&#xff0c;这里不再赘述&#xff0c;跟正常部署DG无区别。 环境配置好后&#xff0c;进行后面的操作。 二、使用RMAN备份复…...

零基础Linux_14(基础IO_文件)缓冲区+文件系统inode等

目录 1. 缓冲区 1.1 缓冲区的存在 1.2 缓冲区的刷新策略 1.3 模拟C标准库中的文件操作 完整代码及验证&#xff1a; 1.4 重看缓冲区 1.5 stdout和stderr的区别 2. 文件系统 2.1 磁盘的物理结构CHS等 2.2 磁盘的抽象结构LBA等 2.3 文件管理inode等 2.4 对文件的操作…...

Vue中的router路由的介绍(快速入门)

路由的介绍 文章目录 路由的介绍1、VueRouter的介绍2、VueRouter的使用&#xff08;52&#xff09;2.1、5个基础步骤(固定)2.2、两个核心步骤 3、组件存放的目录&#xff08;组件分类&#xff09; 生活中的路由&#xff1a;设备和ip的映射关系&#xff08;路由器&#xff09; V…...

ESP-07S进行TCP 通信测试

一&#xff0c;TCP Server 为 AP 模式&#xff0c;TCP Client 为 Station 模式。 这里电脑pc作为TCP Server&#xff0c;ESP-07S作为TCP Client 。 二&#xff0c;电脑端配置。 1&#xff0c;开启热点。 2&#xff0c;转到“设置”&#xff0c;编辑热点信息。 3&#xff0c;关闭…...

如何找到新媒体矩阵中存在的问题?

随着数字媒体的发展&#xff0c;企业的新媒体矩阵已成为品牌推广和营销的重要手段之一。 然而&#xff0c;很多企业在搭建新媒体矩阵的过程中&#xff0c;往往会忽略一些问题&#xff0c;导致矩阵发展存在潜在风险&#xff0c;影响整个矩阵运营效果。 因此&#xff0c;找到目前…...

MongoDB-基本常用命令

基本常用命令 MongoDB常用命令a) 案例需求b) 数据库操作b.1) 选择和创建数据库b.2) 删除数据库 c) 集合操作c.1) 集合的显示创建c.2) 集合的隐式创建c.3) 集合的删除 d) 文档基本CRUDd.1) 文档的插入(1) 单个文档的插入(2) 批量插入 d.2) 文档的基本查询(1) 查询所有(2) 投影查…...

Linux 常用systemctl service 脚本

文章目录 1. jar 包部署 service 脚本2. nginx 服务安装 脚本3.artemis 服务安装脚本 1. jar 包部署 service 脚本 默认jdk 执行&#xff1a; [Service] Typesimple Userroot WorkingDirectory/opt/app/webserver ExecStart/usr/bin/java -Xms512m -Xss256k -jar /opt/app/we…...

flask-sqlalchemy实现读写分离完整版

1. 依赖版本: alembic==1.6.5 click==8.0.1 colorama==0.4.4 Flask==1.1.2 Flask-Migrate==2.7.0 Flask-Script==2.0.6 Flask-SQLAlchemy==2.4.4 greenlet==1.1.0 itsdangerous==2.0.1 Jinja2==3.0.1 Mako==1.1.4 MarkupSafe==2.0.1 protobuf==3.17.3 PyMySQL==1.0.2 python-…...

windows下在cmd和git bash中执行bash download.sh失败

cmd报错信息&#xff1a; 解决办法&#xff1a; win64-wget-1.21.4 安装软件wget&#xff0c;如下这是64位的包&#xff0c;解压后&#xff0c;下面有个wget.exe&#xff0c;拷贝到C:\Windows\System32、 然后打开cmd&#xff0c;执行wget -V 如上&#xff0c;有版本信息就O…...

rust流程控制

一、分支 &#xff08;一&#xff09;if 1.if 语法格式 if boolean_expression { }例子 fn main(){let num:i32 5;if num > 0 {println!("正数");} }条件表达式不需要用小括号。 条件表达式必须是bool类型。 2.if else 语法格式 if boolean_expression { } …...

虚拟机软件Parallels Desktop 19 mac功能介绍

Parallels Desktop 19 mac是一款虚拟机软件&#xff0c;它允许用户在Mac电脑上同时运行Windows、Linux和其他操作系统。Parallels Desktop提供了直观易用的界面&#xff0c;使用户可以轻松创建、配置和管理虚拟机。 PD19虚拟机软件具有快速启动和关闭虚拟机的能力&#xff0c;让…...

在工业机器视觉领域中应用钡铼技术有限公司的EtherCAT网关

钡铼技术有限公司作为一家专注于业物联网关、工业智能网关、边缘计算网关、ARM嵌入式工业计算机、PLC远程采集网关、Modbus转MQTT网关、OPC UA网关、BACnet网关路由器、Lora网关、工业4G边缘路由器、4G无线远程数据采集模块、4G DTU RTU、以太网远程IO模块、工业总线分布式I/O模…...

ssh指定的密钥协商方式以及Ansible的hosts文件修改密钥协商方式

一、首先你要知道用什么加密协商。 [WARNING]: Invalid characters were found in group names but not replaced, use -vvvv to see details 10.10.2.190 | UNREACHABLE! > {"changed": false,"msg": "Failed to connect to the host via ssh: U…...

NLP 项目:维基百科文章爬虫和分类【01】 - 语料库阅读器

自然语言处理是机器学习和人工智能的一个迷人领域。这篇博客文章启动了一个具体的 NLP 项目&#xff0c;涉及使用维基百科文章进行聚类、分类和知识提取。灵感和一般方法源自《Applied Text Analysis with Python》一书。 一、说明 该文是系列文章&#xff0c;揭示如何对爬取文…...