前面我们学习了运输层如何为客户端和服务器输送数据的,提供进程端到端的通信。那么下面我们将学习网络层实际上是怎样实现主机到主机的通信服务的。几乎每个端系统都有网络层这一部分。所以,网络层必然是很复杂的。下面我将花费大量篇幅来介绍一下计算机网络层的知识。
网络层概述
网络层是 OSI 参考模型的第三层,它位于传输层和链路层之间,网络层的主要目的是实现两个端系统之间透明的数据传输。
网络层的作用从表面看上去非常简单,即将分组
从一台主机移动到另外一台主机。为了实现这个功能,网络层需要两种功能
转发
:因为在互联网中有很多路由器
的存在,而路由器是构成互联网的根本,路由器最重要的一个功能就是分组转发
,当一个分组到达某路由器的一条输入链路时,该路由器会将分组移动到适当的输出链路。转发是在数据平面中实现的唯一功能。
在网络中存在两种平面的选择
- 数据平面(data plane):负责转发网络流量,如路由器交换机中的转发表(我们后面会说)。
- 控制平面(control plane):控制网络的行为,比如网络路径的选择。
路由选择
:当分组由发送方流向接收方时,网络层必须选择这些分组的路径。计算这些路径选择的算法被称为路由选择算法(routing algorithm)
。
也就是说,转发是指将分组从一个输入链路转移到适当输出链路接口的路由器本地动作。而路由选择是指确定分组从源到目的地所定位的路径的选择。我们后面会经常提到转发和路由选择这两个名词。
那么此处就有一个问题,路由器怎么知道有哪些路径可以选择呢?
每台路由器都有一个关键的概念就是 转发表(forwarding table)
。路由器通过检查数据包标头中字段的值,来定位转发表中的项来实现转发。标头中的值即对应着转发表中的值,这个值指出了分组将被转发的路由器输出链路。如下图所示
上图中有一个 1001 分组到达路由器后,首先会在转发表中进行索引,然后由路由选择算法决定分组要走的路径。每台路由器都有两种功能:转发和路由选择。下面我们就来聊一聊路由器的工作原理。
路由器工作原理
下面是一个路由器体系结构图,路由器主要是由 4 个组件构成的
- 输入端口:
输入端口(input port)
有很多功能。线路终端功能
和数据链路处理
功能,这两个功能实现了路由器的单个输入链路相关联的物理层和数据链路层。输入端口查找/转发功能
对路由器的交换功能来说至关重要,由路由器的交换结构来决定输出端口,具体来讲应该是查询转发表来确定的。 - 交换结构:
交换结构(Switching fabric)
就是将路由器的输入端口连接到它的输出端口。这种交换结构相当于是路由器内部的网络。 - 输出端口:
输出端口(Output ports)
通过交换结构转发分组,并通过物理层和数据链路层的功能传输分组,因此,输出端口作为输入端口执行反向数据链接和物理层功能。 - 路由选择处理器:
路由选择处理器(Routing processor)
在路由器内执行路由协议,维护路由表并执行网络管理功能。
上面只是这几个组件的简单介绍,其实这几个组件的组成并不像描述的那样简单,下面我们就来深入聊一聊这几个组件。
输入端口
上面介绍了输入端口有很多功能,包括线路终端、数据处理、查找转发,其实这些功能在输入端口的内部有相应的模块,输入端口的内部实现如下图所示
每个输入端口中都有一个路由处理器维护的路由表的副本,根据路由处理器进行更新。这个路由表的副本能 够使每个输入端口进行切换,而无需经过路由处理器统一处理。这是一种分散式
的切换,这种方式避免了路 由选择器统一处理造成转发瓶颈。
在输入端口处理能力有限的路由器中,输入端口不会进行交换功能,而是由路由处理器统一处理,然后根据 路由表查找并将数据包转发到相应的输出端口。
一般这种路由器不是单独的路由器,而是工作站或者服务器充当的路由,这种路由器内部中,路由处理器其实就是
CPU
,而输入端口其实只是网卡
。
输入端口会根据转发表定位输出端口,然后再会进行分组转发,那么现在就有一个问题,是不是每一个分组都有自己的一条链路呢?如果分组数量非常大,到达亿级的话,也会有亿个输出端口路径吗?
v我们的潜意识中显然不是的,来看下面一个例子。
下面是三个输入端口对应了转发表中的三个输出链路的示例
可以看到,对于这个例子来说,路由器转发表中不需要那么多条链路,只需要四条就够,即对应输出链路 0 1 2 3 。也就是说,能够使用 4 个转发表就可以实现亿级链路。
如何实现呢?
使用这种风格的转发表,路由器分组的地址 前缀(prefix)
会与该表中的表项进行匹配。
如果存在一个匹配项,那么就会转发到对应的链路上,可能不好理解,我举个例子来说吧。
比如这时有一个分组是 11000011 10010101 00010000 0001100 到达,因为这个分组与 11000011 10010101 00010000 相匹配,所以路由器会转发到 0 链路接口上。如果一个前缀不匹配上面三个输出链路中的一种,那么路由器将向链路接口 3 进行转发。
路由匹配遵循 最长前缀原则(longest prefix matching rule)
,最长匹配原则故名思义就是如果有两个匹配项一个长一个短的话,就匹配最长的。
一旦通过查找功能确定了分组的输出端口后,那么该分组就会进入交换结构。在进入交换结构时,如果交换结构正在被使用,就会阻塞新到的分组,等到交换结构调度新的分组。