3.3 路由器的包转发操作
3.3.1 路由器的基本知识
路由器通过查表判断转发目标
网络包经过集线器和交换机之后到达了路由器,并在此被转发到下一个路由器。
这一步转发的工作原理和交换机类似,不过在具体的操作过程上,路由器和交换机是有区别的,因为路由器是基于 IP 设计的,而交换机是基于以太网设计的。
路由器概概况
路由器的内部结构如下图所示。只要看明白路由器包括转发模块和端口模块两部分就可以了。
其中转发模块负责判断包的转发目的地,端口模块负责包的收发操作。
二者关系,就相当于协议栈的 IP 模块和网卡之间的关系,将路由器的转发模块想象成 IP 模块,将端口模块想象成网卡。
通过更换网卡,计算机不仅可以支持以太网,也可以支持无线局域网。如果路由器的端口模块安装了支持无线局域网的硬件,就可以支持无线局域网了。
计算机的网卡除了以太网和无线局域网之外很少见到支持其他通信技术的品种,而路由器的端口模块则支持除局域网之外的多种通信技术,如 ADSL、FTTH,以及各种宽带专线等,只要端口模块安装了支持这些技术的硬件即可。
路由器工作原理
根据端口对应通信技术将包接收
路由器转发包时通过端口将发过来的包接收进来,具体取决于端口对应的通信技术。
对于以太网端口来说,就是按照以太网规范进行工作,而无线局域网端口则按照无线局域网的规范工作,总之就是委托端口的硬件将包接收进来。
根据包中IP头部中IP地址进行查询后转发包到对应端口
接下来,转发模块会根据接收到的包的 IP 头部中记录的接收方 IP 地址,在路由表中进行查询,以此判断转发目标。
然后,转发模块将包转移到转发目标对应的端口,端口再按照硬件的规则将包发送出去,也就是转发模块委托端口模块将包发送出去的意思。
端口具有MAC地址和IP地址
端口模块是以实际的发送方或者接收方的身份来收发网络包的。
以以太网端口为例,路由器的端口具有 MAC 地址,因此它就能够成为以太网的发送方和接收方。
和网卡一样,MAC 地址也是在生产时写入端口的 ROM 中的。但端口并不会成为 IP 的发送方和接收方。
端口还具有 IP 地址,从这个意义上来说,它和计算机的网卡是一样的。
当转发包时,首先路由器端口会接收发给自己的以太网包,然后查询转发目标,再由相应的端口作为发送方将以太网包发送出去。
这一点和交换机是不同的,交换机只是将进来的包转发出去而已,它自己并不会成为发送方或者接收方。
端口是按照以太网规范接收包的,即当端口的 MAC 地址和包的接收方MAC 地址一致时,端口才接受这个包,否则就丢弃包。
3.3.2 路由表中的信息
使用路由表判断转发目标
交换机是通过 MAC 头部中的接收方 MAC 地址来判断转发目标的,而路由器则是根据 IP 头部中的 IP 地址来判断的。
由于使用的地址不同,记录转发目标的表的内容也会不同。路由器中的表叫作路由表,其中包含的信息如下图所示
路由表的结构
目标地址中的IP地址是子网的地址
目标地址列记录的是接收方的信息。实际上这里的 IP 地址只包含表示子网的网络号部分的比特值,而表示主机号部分的比特值全部为0B。
路由器会将接收到的网络包的接收方 IP地址与路由表中的目标地址进行比较,并找到相应的记录。
交换机在地址表中只匹配完全一致的记录,而路由器则会忽略主机号部分,只匹配网络号部分。
打个比方,路由器在转发包的时候只看接收方地址属于哪个区,×× 区发往这一边,×× 区发往那一边。
路由聚合
刚才我们说过,目标地址列中的 IP 地址表示的是子网,但也有一些例外,有时地址本身的子网掩码和路由表中的子网掩码是不一致的,这是路由聚合的结果。
路由聚合会将几个子网合并成一个子网,并在路由表中只产生一条记录。
如图 3.14 所示,我们现在有 3 个子网,分别为10.10.1.0/24、10.10.2.0/24、10.10.3.0/24,路由器 B 需要将包发往这 3 个子网。
路由器 B 的路由表中原本应该有对应这 3 个子网的 3条记录,但在这个例子中,无论发往任何一个子网,都是通过路由器 A 来进行转发。
因此我们可以在路由表中将这 3 个子网合并成 10.10.0.0/16,这样也可以正确地进行转发,但我们减少了路由表中的记录数量,这就是路由聚合。
经过路由聚合,多个子网会被合并成一个子网,子网掩码会发生变化,同时,目标地址列也会改成聚合后的地址。
路由表的子网掩码列只表示在匹配网络包目标地址时需要对比的比特数量
还有另外一些情况,如将一个子网进行细分并注册在路由表中,然后拆分成多条记录。
从结果上看,路由表的子网掩码列只是用来在匹配目标地址时告诉路由器应该匹配多少个比特。
而且,目标地址中的地址和实际子网的网络号可能并不完全相同,但即便如此路由器依然可以正常工作。
通过上述方法,我们也可以将某台具体计算机的地址写入路由表中,这时的子网掩码为 255.255.255.255,也就是说地址中的全部 32 个比特都为 1。
这样一来,主机号部分比特全部为 0 可以表示一个子网,主机号部分比特不全部为 0 可以表示某一台计算机,两种情况可以用相同的规则来处理。
网关、接口和跃点计数
网关和接口它们表示网络包的转发目标。根据目标地址和子网掩码匹配到某条记录后,路由器就会将网络包交给接口列中指定的网络接口(即端口),并转发到网关列中指定的 IP 地址。
跃点计数表示距离目标 IP 地址的距离是远还是近。这个数字越小,表示距离目的地越近;数字越大,表示距离目的地越远。
路由表的维护
路由器中对路由表的维护是与包转发操作相互独立的,在转发包的过程中不需要对路由表的内容进行维护。
对路由表进行维护的方法有几种,大体上可分为以下两类:
①由人手动维护路由记录
②根据路由协议机制,通过路由器之间的信息交换由路由器自行维护路由表的记录
其中提到的路由协议有很多种,例如 RIP、OSPC、BGP 等都属于路由协议。
3.3.3 路由器的包接收操作
路由器接收网络包后的操作
路由器接收包后存入缓存区
路由器的端口有各种不同的类型,这里我们只介绍以太网端口是如何接收包的。
以太网端口的结构和计算机的网卡基本相同,接收包并存放到缓冲区中的过程也和网卡几乎没有区别。
PHY模块和MAC模块处理信号为数字信息
首先,信号到达网线接口部分,其中的 PHY(MAU)模块和 MAC 模块将信号转换为数字信息,然后通过包末尾的 FCS 进行错误校验。
如果没问题则检查 MAC 头部中的接收方 MAC 地址,看看是不是发给自己的包,如果是就放到接收缓冲区中,否则就丢弃这个包。
如果包的接收方 MAC地址不是自己,说明这个包是发给其他设备的,如果接收这个包就违反了以太网的规则。
路由器的端口都具有 MAC 地址,只接收与自身地址匹配的包,遇到不匹配的包则直接丢弃
3.3.4 查询路由表确定输出端口
完成接收包后的操作
丢弃MAC头
完成包接收操作之后,路由器就会丢弃包开头的 MAC 头部。
MAC 头部的作用就是将包送达路由器,其中的接收方 MAC 地址就是路由器端口的 MAC 地址。
因此,当包到达路由器之后,MAC 头部的任务就完成了,于是 MAC 头部就会被丢弃。
通过路由器转发的网络包,其接收方 MAC 地址为路由器端口的MAC 地址。
根据IP头部查询路由表
根据最长原则匹配目标地址
如下图所示,假设地址为 10.10.1.101 的计算机要向地址为 192.168.1.10 的服务器发送一个包,这个包先到达图中的路由器。
然后根据包的接收方 IP 地址查询路由表中的目标地址栏,以找到相匹配的记录。
这个匹配并不是匹配全部 32 个比特,而是根据子网掩码列中的值判断网络号的比特数,并匹配相应数量的比特。
按照这样的规则,第3、4、5行都可以匹配。其中,路由器首先寻找网络号比特数最长的一条记录。
网络号比特数越长,说明主机号比特数越短,子网中可能存在的主机数量越少,这一规则的目的是尽量缩小范围,所以根据这条记录判断的转发目标就会更加准确。
这一规则称为“最长匹配”原则。
相比服务器所属的子网来说,直接指定服务器本身的地址时范围更小,因此这里应该选择第 4 行作为转发目标。
按照最长匹配原则筛选后,如果只剩一条候选记录,则按照这条记录的内容进行转发。
根据跃点值筛选网络号相同的记录
有时候路由表中会存在网络号长度相同的多条记录,例如考虑到路由器或网线的故障而设置的备用路由就属于这种情况。
这时需要根据跃点计数的值来进行判断。跃点计数越小说明该路由越近,因此应选择跃点计数较小的记录。
无法匹配记录的包直接丢弃
如果在路由表中无法找到匹配的记录,路由器会丢弃这个包,并通过ICMP消息告知发送方。
因为交换机根据以太网协议可以将包发送到所有的端口上,而路由器工作的网络环境就是互联网,连接设备远大于交换机。
如果产生大量的网络包会造成网络拥塞,所以路由器遇到不知道该转发到哪里的包,就会直接丢弃。
ICMP
Internet Control Message Protocol,Internet 控制报文协议。
当包传输过程中发生错误时,用来发送控制消息。2.5.11 节介绍过 ICMP。