路由器的工作原理详解

fd160b88f8f742f09b99c49a11bea795.jpg


 

什么叫路由?

 

路由器的英文是 Router,也就是「找路的工具」。找什么路?寻找各个网络节点之间的路。

换句话说,路由器就像是快递中转站,包裹会经过一个个的中转站,从遥远的地方寄到你家附近,数据包也是一样。

d1f31370e5454d859bd960182fd0abc6.png

 路由器是连接两个网络的硬件设备,承担寻路功能,是网络的大门,因此,路由器又叫做网关设备(Gateway)。

 

路由表

 

路由器和交换机一样,也有自己的小本本,这个路由表上记载了到各个网络节点之间的路,会记录数据来源、相应的路由条目以及下一跳。

8410e7f680474abd87b444cc4fcf756a.png

 路由表就相当于路由器的导航,路由器只需要按照路由表的指示走就可以了。当然前提是,路由表中存在匹配该数据包目的 IP 地址的路由条目。路由表会周期性更新,当网络拓扑发生变化时也会更新,不用担心走错路。

9d6a086a6c3d45e8b2086126728be040.png路由器收发数据包的流程

路由器在收发数据包的时候会先查看路由表,如果路由表里有匹配项,就会把数据包交给下一跳。如果没有匹配项,就会直接丢弃数据包,然后告诉主机,这个目的地不可达。

 

直连、静态路由、动态路由

 

路由条目的获取来源有很多种,比如说直连、静态路由和动态路由。

直连,也就是路由器的直接邻居。路由器会自己去认识邻居,然后记录下来。

当然,也可以通过手动添加的方式告诉路由器目的网段的路径,也就是静态路由,适合网络规模比较小的场景。但是当网络拓扑发生变化,或是规模扩大的时候,配置和维护的成本就会很高。

这时候就需要结合动态路由,让路由器通过动态的方式来学习。在大型网络中,往往采用这种动、静路由相结合的方式进行部署。

 

三层寻址

 

上期讲解的「二层寻址」,大家还记得吗?二层寻址就是交换机根据 MAC 地址,在物理层进行寻址。

三层寻址就是指路由器根据 IP 地址,在网络层进行寻址。

cab245c27695425cb2e8dc299517c6b0.jpg  路由器三层寻址流程

当主机想要发送数据的时候,首先会查看目的地是否和自己在同一个网段,如果在同一个网段就会让交换机进行二层转发。

如下图所示,PC1 要给 PC2 发送数据,就会通过交换机来完成。

5a514594a5454d5696a596def8ba94ea.png

 如果不在同一个网段,主机会把数据包交给自己的路由器,路由器再根据目的 IP 查询自己的路由表,如果有匹配的条目,则交给下一跳,没有就丢弃。

如下图所示,PC1 要给 PC3 发送数据,发现 PC3 和自己不在同一个网段,就会把数据包交给路由器 A,再根据路由表的条目转发给路由器 B -> C,最后通过交换机 C 送达 PC3。

81edac4dd3324802b552a3abdbd1bb79.png

 

寻路原则

 

既然路由器是负责找路的,那条条大路通罗马,哪条大路最近呢?

默认情况下,路由的查询遵循最长匹配原则,也就是掩码越长、越精确,路由器就会优先选择那条路。

然后考虑路径开销,比如说带宽、管理距离、度量值等。也就是如果从这条路走,要花上多少时间和金钱。绝大部分数据通信行为是双向的,考虑流量的时候,还要关注流量的往返,从这条路去,也得从这条路回来,回来的时候没路了,这也不行。

路由查询的行为是逐跳的,到目标网络沿途的每个路由器都必须有关于该目标网段的路由信息。简单来说,数据包每经过一个路由器,路由器就会告诉它下一跳是谁,该往哪个方向走。

 

如何选择路由器?

 

路由器选型可以考虑这几个因素:带宽需求/转发性能、端口数量、带机量。

比如说家里拉了千兆宽带,那么路由器一定得是千兆路由器,还要满足千兆 NAT 转发的性能。顺带一提,运营商配的光猫是自带路由功能的,如果没有特殊需求,普通家庭一般够用了。

一般家用场景,路由端口用的不太多,可以通过交换机补充。大部分商用场景,4-12 口也就够了,再多的话,相信大部分企业会选择三层交换机。

带机量是一个很重要的指标,我们一般会考虑并发用户,还有用户的业务类型。

以 UniFi 的网关设备为例:USG 可以到 100 并发,普通家庭或小微企业,都足够用了;USG-Pro-4 带机量可以到 1000 并发,中小企业需求基本可以满足;如果还有更高需求,可以使用 UDM-Pro。

 

欢迎点赞收藏转发

           

                     —— End ——

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/337.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于深度学习的高精度袋鼠检测识别系统(PyTorch+Pyside6+YOLOv5模型)

摘要:基于深度学习的高精度袋鼠检测识别系统可用于日常生活中或野外来检测与定位袋鼠目标,利用深度学习算法可实现图片、视频、摄像头等方式的袋鼠目标检测识别,另外支持结果可视化与图片或视频检测结果的导出。本系统采用YOLOv5目标检测模型…

【软件开发】MyBatis 理论篇

MyBatis 理论篇 1.MyBatis 是什么? MyBatis 是一个半 ORM(对象关系映射)框架,它内部封装了 JDBC,开发时只需要关注 SQL 语句本身,不需要花费精力去处理加载驱动、创建连接、创建 statement 等繁杂的过程。…

【机器学习】sklearn数据集的使用,数据集的获取和划分

「作者主页」:士别三日wyx 「作者简介」:CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「推荐专栏」:对网络安全感兴趣的小伙伴可以关注专栏《网络安全入门到精通》 sklearn数据集 二、安装sklearn二、获取数据集三、…

用Docker部署Nginx

部署步骤: 1.拉取镜像 docker pull nginx 2.创建并进入容器 docker run -d --name nginx01 -p 3344:80 nginx #注意nginx01是起的名字,3344是公网访问的端口,80是Nginx的默认端口 3.启动Nginx curl localhost:3344 4.在我的windows系统访…

(贪心) 1221. 分割平衡字符串 ——【Leetcode每日一题】

❓ 1221. 分割平衡字符串 难度:简单 平衡字符串 中,L 和 R 字符的数量是相同的。 给你一个平衡字符串 s,请你将它分割成尽可能多的子字符串,并满足: 每个子字符串都是平衡字符串。 返回可以通过分割得到的平衡字符…

【杨宗宝】Cocos Creator 3.x : 你们要的Label3D来了(升级版)

前沿 宗宝我又回来了,本次给大家带来的分享是基于之前Label3d的升级版;在上次发布了Lable3d的功能后,大家在使用的过程中多多少少的会发现各种问题:微信小游戏真机不显示,字体如何实现描边,引擎版本升级后…

本地部署开源大模型的完整教程:LangChain + Streamlit+ Llama

在过去的几个月里,大型语言模型(llm)获得了极大的关注,这些模型创造了令人兴奋的前景,特别是对于从事聊天机器人、个人助理和内容创作的开发人员。 大型语言模型(llm)是指能够生成与人类语言非常相似的文本并以自然方式理解提示的机器学习模型…

【Java】JVM学习(四)

对象的分配 JVM中对象的创建过程 对象的内存分配 虚拟机遇到一条new指令时,首先检查是否被类加载器加载,如果没有,那必须先执行相应的类加载过程。 类加载就是把class加载到JVM的运行时数据区的过程。 1)检查加载 首先检查这…

低功耗蓝牙OM6621EM 兼容Nordic 51系列2.4G私有协议

OM6621EM是一个功率优化的系统(SOC).解决蓝牙低功耗和专有的2.4 ghz应用。它集成了一个高具有蓝牙基带和丰富外设的低功耗射频收发器I0扩展。OM6621EM还集成了电源管理单元(PMU)来提供高效的电源管理。它的目标是2.4GHz低功耗蓝牙系统,专有的2.4 ghz系统&#xff0c…

LLM大模型应用开发的本地环境搭建

尽管 ChatGPT 仍然很受欢迎,但泄露的 Google 内部文件表明开源社区正在迎头赶上并取得重大突破。 我们现在能够在消费级 GPU 上运行大型 LLM 模型。 因此,如果你是一名开发人员,想要在本地环境中尝试这些 LLM 并用它构建一些应用程序&#x…

与chagpt对话记录

每日chagpt对话记录 关注我一下 vscode 浏览器版本 c 函数 无法跳转 C/C IntelliSense, debugging, and code browsing. C/C IntelliSense、调试和代码浏览是指在使用VS Code进行C/C开发时的一些核心功能。下面是对这些功能的简要说明: IntelliSense(智能…

android的PopupWindow透明弹窗

1.要实现这种效果 2.可以使用这种方式 View v LayoutInflater.from(mContext).inflate(R.layout.ceshi_01, null);PopupWindow popupWindow new PopupWindow(v, ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT, true);popupWindow.showAsDropDo…