路由器你竟然是这样的...(一)

简介: 前面我们学习了运输层如何为客户端和服务器输送数据的,提供进程端到端的通信。那么下面我们将学习网络层实际上是怎样实现主机到主机的通信服务的。几乎每个端系统都有网络层这一部分。所以,网络层必然是很复杂的。下面我将花费大量篇幅来介绍一下计算机网络层的知识。

前面我们学习了运输层如何为客户端和服务器输送数据的,提供进程端到端的通信。那么下面我们将学习网络层实际上是怎样实现主机到主机的通信服务的。几乎每个端系统都有网络层这一部分。所以,网络层必然是很复杂的。下面我将花费大量篇幅来介绍一下计算机网络层的知识。

网络层概述

网络层是 OSI 参考模型的第三层,它位于传输层和链路层之间,网络层的主要目的是实现两个端系统之间透明的数据传输。

微信图片_20220416142418.png

网络层的作用从表面看上去非常简单,即将分组从一台主机移动到另外一台主机。为了实现这个功能,网络层需要两种功能

  • 转发:因为在互联网中有很多路由器的存在,而路由器是构成互联网的根本,路由器最重要的一个功能就是分组转发,当一个分组到达某路由器的一条输入链路时,该路由器会将分组移动到适当的输出链路。转发是在数据平面中实现的唯一功能。

在网络中存在两种平面的选择

  • 数据平面(data plane):负责转发网络流量,如路由器交换机中的转发表(我们后面会说)。
  • 控制平面(control plane):控制网络的行为,比如网络路径的选择。
  • 路由选择:当分组由发送方流向接收方时,网络层必须选择这些分组的路径。计算这些路径选择的算法被称为 路由选择算法(routing algorithm)。

也就是说,转发是指将分组从一个输入链路转移到适当输出链路接口的路由器本地动作。而路由选择是指确定分组从源到目的地所定位的路径的选择。我们后面会经常提到转发和路由选择这两个名词。

那么此处就有一个问题,路由器怎么知道有哪些路径可以选择呢?

每台路由器都有一个关键的概念就是 转发表(forwarding table)。路由器通过检查数据包标头中字段的值,来定位转发表中的项来实现转发。标头中的值即对应着转发表中的值,这个值指出了分组将被转发的路由器输出链路。如下图所示

微信图片_20220416142422.png

上图中有一个 1001 分组到达路由器后,首先会在转发表中进行索引,然后由路由选择算法决定分组要走的路径。每台路由器都有两种功能:转发和路由选择。下面我们就来聊一聊路由器的工作原理。

路由器工作原理

下面是一个路由器体系结构图,路由器主要是由 4 个组件构成的

微信图片_20220416142426.png

  • 输入端口:输入端口(input port)有很多功能。线路终端功能和数据链路处理功能,这两个功能实现了路由器的单个输入链路相关联的物理层和数据链路层。输入端口查找/转发功能对路由器的交换功能来说至关重要,由路由器的交换结构来决定输出端口,具体来讲应该是查询转发表来确定的。
  • 交换结构:交换结构(Switching fabric)就是将路由器的输入端口连接到它的输出端口。这种交换结构相当于是路由器内部的网络。
  • 输出端口:输出端口(Output ports) 通过交换结构转发分组,并通过物理层和数据链路层的功能传输分组,因此,输出端口作为输入端口执行反向数据链接和物理层功能。
  • 路由选择处理器:路由选择处理器(Routing processor) 在路由器内执行路由协议,维护路由表并执行网络管理功能。

上面只是这几个组件的简单介绍,其实这几个组件的组成并不像描述的那样简单,下面我们就来深入聊一聊这几个组件。

输入端口

上面介绍了输入端口有很多功能,包括线路终端、数据处理、查找转发,其实这些功能在输入端口的内部有相应的模块,输入端口的内部实现如下图所示

微信图片_20220416142429.png

每个输入端口中都有一个路由处理器维护的路由表的副本,根据路由处理器进行更新。这个路由表的副本能 够使每个输入端口进行切换,而无需经过路由处理器统一处理。这是一种分散式的切换,这种方式避免了路 由选择器统一处理造成转发瓶颈。

在输入端口处理能力有限的路由器中,输入端口不会进行交换功能,而是由路由处理器统一处理,然后根据 路由表查找并将数据包转发到相应的输出端口。

一般这种路由器不是单独的路由器,而是工作站或者服务器充当的路由,这种路由器内部中,路由处理器其实就是 CPU,而输入端口其实只是网卡。

输入端口会根据转发表定位输出端口,然后再会进行分组转发,那么现在就有一个问题,是不是每一个分组都有自己的一条链路呢?如果分组数量非常大,到达亿级的话,也会有亿个输出端口路径吗?

v我们的潜意识中显然不是的,来看下面一个例子。

下面是三个输入端口对应了转发表中的三个输出链路的示例

微信图片_20220416142433.png

可以看到,对于这个例子来说,路由器转发表中不需要那么多条链路,只需要四条就够,即对应输出链路 0 1 2 3 。也就是说,能够使用 4 个转发表就可以实现亿级链路。

如何实现呢?

使用这种风格的转发表,路由器分组的地址 前缀(prefix) 会与该表中的表项进行匹配。

微信图片_20220416142437.png

如果存在一个匹配项,那么就会转发到对应的链路上,可能不好理解,我举个例子来说吧。

比如这时有一个分组是 11000011 10010101 00010000 0001100 到达,因为这个分组与 11000011 10010101 00010000 相匹配,所以路由器会转发到 0 链路接口上。如果一个前缀不匹配上面三个输出链路中的一种,那么路由器将向链路接口 3 进行转发。

路由匹配遵循 最长前缀原则(longest prefix matching rule),最长匹配原则故名思义就是如果有两个匹配项一个长一个短的话,就匹配最长的。

一旦通过查找功能确定了分组的输出端口后,那么该分组就会进入交换结构。在进入交换结构时,如果交换结构正在被使用,就会阻塞新到的分组,等到交换结构调度新的分组。

相关文章
|
11月前
|
Java Spring
Spring Boot配置的优先级
SpringBoot项目支持多种配置方式,主要包括配置文件(application.properties、yml、yaml)和外部配置(系统属性、命令行参数)。优先级从高到低为:命令行参数 > Java系统属性 > application.properties > application.yml > application.yaml。
|
10月前
|
存储 安全 数据可视化
档案宝自动化档案管理,从采集、整理到归档、利用,一步到位
当档案管理成为“效率瓶颈”,我们需要怎样的解决方案? 在数字化转型浪潮下,档案管理早已不再是简单的“文件存放”——企业需要快速调取合同凭证应对审计,教育机构则要长期保存学生成长记录……档案既是历史凭证,也是决策依据,更是核心资产。
|
Linux 数据安全/隐私保护
如何在 Fedora 38 中为用户添加、删除和授予 Sudo 权限?
如何在 Fedora 38 中为用户添加、删除和授予 Sudo 权限?
1145 0
如何在 Fedora 38 中为用户添加、删除和授予 Sudo 权限?
|
分布式数据库 流计算 Docker
实时计算 Flink版操作报错合集之在Docker上启动JobManager(JM)时遇到报错,,该怎么处理
在使用实时计算Flink版过程中,可能会遇到各种错误,了解这些错误的原因及解决方法对于高效排错至关重要。针对具体问题,查看Flink的日志是关键,它们通常会提供更详细的错误信息和堆栈跟踪,有助于定位问题。此外,Flink社区文档和官方论坛也是寻求帮助的好去处。以下是一些常见的操作报错及其可能的原因与解决策略。
|
存储 缓存 网络协议
第五问:一个程序从点击到启动发生了什么?
一个可执行程序从用户点击启动到运行,经历了8个主要阶段:用户触发启动、操作系统查找文件、进程创建、可执行文件加载到内存、初始化程序上下文、执行程序入口点、程序运行和程序退出。涉及硬盘、内存、缓存等硬件交互。
|
容灾 应用服务中间件 调度
八年磨一剑,四大技术视角总结云上应用管理实践
这篇文章是阿里云 EDAS 团队在近八年服务客户的过程中,在应用管理两大领域(容量管理和流量管理)方向往云时代迈进时所呈现出来的不同进行深入剖析与总结,以帮助大家在更好的理解云上环境的特点,在生产实践中有效避坑。
|
安全 测试技术
深入理解白盒测试:方法、工具与实践
【4月更文挑战第7天】 在软件开发的质量控制过程中,白盒测试是确保代码逻辑正确性的关键步骤。不同于黑盒测试关注于功能和系统的外部行为,白盒测试深入到程序内部,检验程序结构和内部逻辑的正确性。本文将探讨白盒测试的核心技术,包括控制流测试、数据流测试以及静态分析等方法,同时介绍当前流行的白盒测试工具,并讨论如何在实际项目中有效实施白盒测试。文章的目标是为软件测试工程师提供一份综合性指南,帮助他们更好地理解和应用白盒测试技术。
|
运维 应用服务中间件 调度
|
缓存 算法 Linux
深入理解Linux动态库加载:路径、问题与解决方案
深入理解Linux动态库加载:路径、问题与解决方案
4700 0
|
存储 Linux 程序员
x86的内存寻址方式
在16位的8086时代,CPU为了能寻址超过16位地址能表示的最大空间(因为 8086 的地址线 20 位而数据线 16 位),引入了段寄存器。通过将内存空间划分为若干个段(段寄存器像 ds、cs、ss 这些寄存器用于存放段基址),然后采用段基地址+段内偏移的方式访问内存,这样能访问1MB的内存空间了。

热门文章

最新文章