图解路由器处理报文全过程,值得一看!

news2024/11/17 15:49:26

你们好啊,我的网工朋友

只要有网络的地方,你很难不看到路由器的身影,各种低、中、高端的,种类繁多,所具备的功能和内部实现不完全一样。

要知道,路由器不断的在吞吐通信数据,就像鱼吐泡泡一样,通信数据像是路由器的“食物”。

那么,路由器“吃”进去的数据,上哪去了呢?

“鱼儿”吃进去的“食物”,有的会被吸收了,进入血液,最终转换成能量或变为身体的一部分;没被吸收的经过肠道排泄到体外。

“鱼儿”吞进去的大部分是水,这些水基本都吐出来了,并没有被吸收。

同样的,进入路由器的数据,大部分从一个接口进去,从另一个接口出来,它们只是“过路”的业务报文,也有人称之为“过路”报文。

有一小部分数据被“吸收”了,被上送CPU处理,或者因为各种原因中途被丢弃。

今天,就和你分享一篇关于报文在路由器中的处理全过程,帮助你更好的了解路由器内部的原理。

今日文章阅读福利:《 思科+华为路由器学习指南 》

如果你正好想学习路由器技术,这份资料集合了两家厂商的技术内容,很适合你。

私信我,发送暗号“好东西”,前30名私信的小友可免费获取下载链接。

01 在路由器中,报文度过了怎样的一生?

这张图,是路由器收到的业务报文和协议报文在转发层面的处理流程。

这张图,是路由器CPU发送的协议报文的在转发层面的处理流程。

是不是觉得上图太复杂、概念太多,看不懂?

上述图片只是给一个总的概念,以便下面更好的理解。

下面我们先从“交换”谈起:

数据。是通过接口板接收和发送,通信线缆都要插接到接口板的接口上。

那么,把某一个接口来的数据包送到另一个接口发出去,这两个接口需要连起来。

但实际上,数据包可能从任意接口进来,从任意接口出去,都这么点到点连接的话,则需要N*(N-1)/2根线互联,太多了。

为了解决这种大量连接的问题,接口板和接口板之间需要通过交换网(Switch Fabric)板衔接起来,接口板只要通过若干连线跟交换网板连接,就能完成任意接口的互通。

交换网属于“三无”部件,即与设备配置无关、与协议无关、与数据包类型无关。交换网专注于在入接口和出接口之间建立连接,完成数据的交换。

01 上行和下行

以交换网为中心,可将报文在路由器的行程一分为二,前半程称为“上行”,下半程称为“下行”。

02 寻址转发

可能有人会问,报文从一个接口进来,经过“交换”,从另一个接口出去,这个交换机也会做啊,何必用路由器?

是的,交换机也有交换功能。但是,在互联网中,从一个节点到另一个节点,有许许多多的路径。

路由器可以选择通畅的最短的路径,从而提高通信速度,减轻网络负荷,节约网络资源,这是交换机所不具备的能力。

为数据包选择一条合适的(通常指最短的)传输路径,然后从对应的接口发送,这个过程就称为“寻址转发”。

路由器所在的网络几乎都是遵循TCP/IP体系的,路由器是工作在该体系的第三层,即网络层。

所以,刚才提到的“寻址”的”址“是指根据数据包的网络层地址——IP地址。为了寻址,路由器需要一张“地图”,以目的IP地址为索引的“地图”,也就是路由表。每个路由器中都有一张路由表。

03 路由表长什么样?

这张图是一张实际的地铁出口地图。

实际的路由表跟上图有些相似。

路由表的索引是目的IP地址/掩码,每个表项中都有对应的下一跳IP地址和出接口信息,如下图。

有了这张表,路由器接在收到数据包时就能做到心中有数了。

比如,收到一个目的地址为10.0.0.1的报文,路由器就可以查表得知需要将该报文发送到GE1/0/0这个接口。

04 这个路由表怎么得来的?

一种办法是手工制作,对路由器进行手工设置固定的路由。但是这种路由不能对网络的改变作出反映,如果网络拓扑变化了,需要人工去修改设置。

还有一种办法,就是运行动态路由协议,让路由器之间相互传递路由信息,利用收集到的路由信息进行计算,生成路由表,这样就可以让路由表实时跟进网络拓扑的变化。

在实际应用中,这两个办法都用上了,当动态路由与静态路由发生冲突时,以静态路由为准。

当然,路由表还有一类路由,不是人工配置的,也不是路由协议的学习,而是由链路层协议发现的,称为直连路由。

05 路由表放在哪?

有了路由表,接下来要考虑的是,路由表放哪合适呢?

前面说过,数据包是从某个接口进来,经过交换网,再从另一个接口出去。

那路由表能不能放交换网?答案肯定不行,因为交换网要完成整个设备所有报文的交换,为了让交换网完成高速交换,不成为瓶颈,不能再让交换网去运行路由协议、维护路由表、做寻址转发。

那路由表能不能放下行接口板?

答案也是不行,交换网做交换的时候,就需要知道要送往哪块目的单板,所以寻址转发需要在上行完成。然而,如果把路由表放上行接口板,由于报文可能从任意接口板进来,那么所有的接口板都需要放一个路由表。其实,还有更好的办法,就是将路由表放在一个公共的地方,比如主控板上,由主控板的CPU运行路由协议,计算路由,生成和维护路由表。

06 转发表与路由表

如果路由器采用的是“硬转发”,业务报文不经过主控板CPU处理,不能直接用主控板上的路由表,接口板上也需要有供寻址转发的信息。

所以,主控板CPU生成路由表之后,还要将相关信息下发给各个接口板。

这些相关的信息就是转发信息,存放在各个接口板的转发信息表FIB(Forwarding Information Base)中。

各个接口板上的转发信息都是相同的,因为它们具有相同的来源,都来自主控板。

实际上,现代高性能路由器在架构上都是转发和控制分离:

把转发层面和控制层面分配在不同的组件,控制层面运行路由协议,维护路由表,并下发转发表FIB到转发层面,由转发层面负责数据包转发。

这样做的最基本的好处就是不会相互影响。

如果流量很高导致转发层面高负荷,但是其不会影响控制层面进行正常的路由学习;相反的,如果控制层面对路由信息的处理比较繁忙,也不会影响转发层面进行其高速的数据包转发。

细心的读者会发现,路由表和转发表看起来差不多,都有目的IP地址/掩码、下一跳、出接口这三个信息。

实际上,转发表是根据路由表生成的。路由表中可能包含到达目的地址的多条路由,但是转发表里面只取其中的最优路由。

而且,路由表的下一跳是原始的下一跳,不一定是直接可达的,FIB是用于指导转发的,它的下一跳必须是直接可达。根据“原始下一跳”找到“直接下一跳”的过程就称为“路由迭代”。

路由器上电启动之后,就会运行路由协议学习网络拓扑,生成路由表,如果接口板注册成功,主控板就可以根据路由表生成转发表项并下发给接口板,这样路由器就可以根据转发表转发数据包了。

执行数据包转发的部件是位于接口板上的一个被称为包转发引擎PFE(Packet Forwarding Engine)部件,通常是NP或ASIC芯片。

07 找不到路怎么办?

上述这种在转发报文前,提前准备好转发表,待收到报文时再查表转发的方式称为“预路由”,“先铺路,后通车”。现在路由器都采用这种方式进行IP单播转发。

在这种方式中,查表转发时,如果没有匹配上(如果有默认路由,最终会匹配上默认路由,默认路由不存在“不匹配”的情况),意味着这台路由器没有到这个目的地址的路由(或者还没有学习到这个路由),也就是找不到路,迷路了。

数据包迷路了怎么办,原路返回?

想象下,如果迷路了就被原路返回给源端,那源端重发的还是同样的目的地址,那这个报文还是会在同一个地方迷路,再原路返回,死循环了。

所以,数据包迷路了只能被丢弃。出于可维护方面的考虑,包转发引擎PFE会记录丢弃原因和统计丢弃的报文数。

08 预路由与流触发

刚才说到路由器都采用“先铺路,后通车”的预路由方式。相对的,“先通车,后铺路”的方式,被称为“流触发”。

流触发方式中,设备收到报文,查转发表,如果转发表中不存在对应的表项,就根据这个报文生成一个转发表项。

这样,该用户流的下一个报文就可以命中转发表进行转发了。

目前,路由器和交换机在进行二层转发时所使用的MAC表,就是采用MAC地址学习方式,类似于“流触发”方式。

从安全性角度上,流触发显然容易造成流量攻击,为攻击者提供了一个合理合法的攻击路径。

攻击者可以使用各种未知目的报文对系统进行遍历扫描攻击,形成对路由器的流量攻击。

所以,在高端路由器上,除了有MAC学习方式机制外,为了预防流量攻击,还提供了限制MAC地址学习的功能,即限制最多允许学习多少个MAC地址,并限制每次学习的时间间隔;

而且还允许去使能MAC地址学习,允许人们像配置静态路由一样去手工配置MAC表项。

整理:老杨丨10年资深网络工程师,更多网工提升干货,请关注公众号:网络工程师俱乐部

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【有奖征文 】AI编程:华为云CodeArts Snap入门体验

了不起的开发者们,当你听到“编程”一词时,可能想到的是一行行复杂的代码和漫长的坐姿。但是,随着人工智能的飞速发展,AI编程正在成为一种全新的编程方式,使得编程变得更加简单和直观。现在,是时候跟大家分…

如何在ALPS系统上模拟MODBUS协议

Modbus协议介绍 请想象一下你有一个工厂,里面有许多机器和设备,比如传感器、电机、控制器等,这些设备需要相互通信以便共享数据和执行任务。Modbus协议就像是这些设备之间的一种语言或规则,确保机器和设备能够互相理解和交流。 在…

python数据可视化Mito安装配置

目录 遇见 Mito如何启动 Mito数据透视表Mito 令人印象深刻的功能可视化数据自动代码生成Mito 安装 JupyterLab 是 Jupyter 主打的最新数据科学生产工具,某种意义上,它的出现是为了取代Jupyter Notebook。 它作为一种基于 web 的集成开发环境&#xff…

SpringMvc学习——在idea中新建springWeb项目 浏览器请求 和 服务器响应 SpringMvc文件相关

目录 引出基础知识:三层架构和MVC1. 三层架构2.MVC模型 springWeb项目IDEA搭建1.新建一个普通的maven项目2.导入包,pom.xml文件3.写主启动类Main.java文件SpringBootApplication4.写application.yml文件spring的配置文件5.启动,运行main.java…

【分享】PowerPoint可以设置哪些密码保护?

想要给PPT设置密码保护?那我们来看看PowerPoint自带哪些密码功能。 PowerPoint可以设置两种密码保护,分别是“打开密码”和“限制密码”。 【打开密码】 PowerPoint设置“打开密码”后,就无法随意打开文件,需要输入正确密码才可…

4.地址转换,实现101012分页

实现内存检测,理解Linux内存管理,实现101012分页 参考: 检测内存容量 趣谈 Linux 操作系统 内存管理 《操作系统真相还原》 1.内存检测 BIOS 中断 0x15 的子功能够获取0xE820 能够获取系统的内存布局,由于系统内存各部分的类型属…

什么是版本控制系统?怎么学习? - 易智编译EaseEditing

版本控制系统(Version Control System,简称VCS)是一种用于管理和跟踪文件版本的工具或系统。它可以追踪文件的变更历史,记录每个版本的修改内容,以及支持多人协作开发。 学习版本控制系统可以帮助你更好地管理和控制你…

HTTPS加密:保障网站安全的重要手段

💂 个人网站:【海拥】【游戏大全】【神级源码资源网】🤟 前端学习课程:👉【28个案例趣学前端】【400个JS面试题】💅 寻找学习交流、摸鱼划水的小伙伴,请点击【摸鱼学习交流群】 目录 前言什么是HTTPS加密&a…

由于找不到d3dx9_42.dll,无法继续执行代码怎么修复,这三个修复方法可以解决

是不是遇到过在打开软件或者游戏的时候,电脑提示“由于找不到d3dx9_42.dll,无法继续执行代码”,无法正常启动游戏程序,d3dx9_42.dll是一个DirectX相关的动态链接库文件,它是DirectX 9中的一个组件。DirectX是微软公司开发的一个多…

TC8:SOMEIP_ETS_001-003

SOMEIP_ETS_001: Array_Length_longer_as_message_length_allows_it 目的 当Tester发送的SOME/IP消息中,payload数据是序列化的数组时,数组的Length字段值比SOME/IP Length字段允许的要大时,DUT回复SOME/IP Error消息 如果DUT忽略SOME/IP Request消息,这条测试也是Pass的,…

Sentieon | 每周文献-Genetic Disease-第二期

遗传病系列文章-1 标题(英文):Answer ALS, a large-scale resource for sporadic and familial ALS combining clinical and multi-omics data from induced pluripotent cell lines标题(中文):Answer ALS&…

业务数据又多又杂,该如何高效开展数据治理?

某集团目前有近百套系统,数据分散在各个系统内,且业务范围广泛,数据来源复杂,随着集团业务系统的建设和推广应用,数据质量不高、数据标准不一、数据难以互通共享融合、系统之间存在数据壁垒等问题逐渐显现,…

Selenium教程__单选框和复选框的选中状态判定以及元素是否可用和可见判定(10)

简单写个单选框和复选框界面 <!DOCTYPE html> <html><head><meta charset"utf-8" /><title>test</title></head><body bgcolor"burlywood"><form><input type"radio" name"sex&…

Vulnhub项目:Aragog

1、靶机地址&#xff1a; HarryPotter: Aragog (1.0.2) ~ VulnHub 死亡圣器三部曲之第一部&#xff0c;Aragog是海格养的蜘蛛的名字&#xff0c; 并且又牵扯到了密室 2、渗透过程 确定靶机ip&#xff0c;攻击机ip&#xff0c;扫描靶机开放端口 只有22&#xff0c;80端口&a…

盖雅工场荣膺第二届山东人力资源服务创新大赛信息科技创新赛道一等奖

6月20日&#xff0c;第二届山东人力资源服务创新大赛决赛落下帷幕。经过激烈角逐&#xff0c;盖雅工场脱颖而出&#xff0c;荣膺信息科技创新赛道一等奖。 关于第二届山东人力资源服务创新大赛 第二届山东人力资源服务创新大赛是由山东省人力资源和社会保障厅、威海市人民政府…

SpringCloud Alibaba入门之创建多模块工程

一、创建父项目 创建一个父Maven项目&#xff0c;项目命名为myshop,用于管理子模块。 创建项目后&#xff0c;删除src和增加pom设置 二、创建子module 右键父项目&#xff0c;新建module 此我们的子module就创建完成了。接下来如法炮制&#xff0c;创建另外几个子module&…

快速定位jar冲突插件-maven-dependency-helper

于jar冲突&#xff0c;例如在某一项目A中引入了其他项目B的jar&#xff0c;而2个项目用的mybati版本不一致&#xff0c;则导致jar冲突 例如:B项目用mybatis 3.3.2 this.count() 返回值为integer 而 A项目用版本3.5.1中返回值为Long A项目引入B后&#xff0c;部分代码报错:返回值…

使用哪些频率是不需要取得许可的呢?

无线电频率的使用&#xff0c;你知道哪些不需要许可吗&#xff1f;近日&#xff0c;有关无线电频率的知识又成为了网络热议的话题。你是否也对此感到好奇呢&#xff1f; 首先&#xff0c;我们需要了解一些基础知识。无线电频率是电磁频谱的一部分&#xff0c;大多数人都熟悉AM…

Python学习—装饰器的力量

Python学习—装饰器的力量 作为许多语言都存在的高级语法之一&#xff0c;装饰器是你必须掌握的知识点。 Python的装饰器&#xff08;Decorator&#xff09;允许你扩展和修改可调用对象&#xff08;函数、方法和类&#xff09;的行为&#xff0c;而无需永久修改可调用的对象本身…

买无线耳机什么牌子好?七款好用的无线蓝牙耳机盘点

随着科技的不断进步&#xff0c;蓝牙耳机已经成为了现代生活中不可或缺的伴侣。它们不仅给我们带来了便捷的无线音频体验&#xff0c;还赋予了我们自由移动的能力&#xff0c;让我们可以随时随地沉浸在音乐的海洋中。然而&#xff0c;市场上蓝牙耳机品牌众多、型号繁多&#xf…