本篇继续介绍路由器及其转发过程。
1 路由器内部结构
路由器内部结构图如图所示。
即主要包含左侧的包转发模块和右侧的端口模块。转发模块负责查找包的发送目的地,端口模块完成包的发送。通过安装不同的硬件,转发模块不仅可以支持以太网,也可以支持无线局域网等不同的网络技术。
首先,端口模块根据使用的网络技术,将发过来的包接收进来。接下来转发模块根据包的IP头部中记录的接收方IP地址,在路由表中查询转发目标。然后转发模块将包转移到端口模块,由端口模块根据使用的硬件规则再将包发送出去。
与交换机的不同之处在于,路由器的端口具有MAC地址,会根据包中的接收方MAC地址判断是否需要接收;同时端口还具有IP地址,将需要转发的包发送出去。从这个意义上来讲,路由器的端口与计算机网卡是一致的。路由器的工作有个接收-发送的过程,而对于交换机来说其实没有进行任何处理,只是将所有进来的包再转发出去。
2 路由表
路由器根据路由表查询发送目的地,路由表的内容如下表所示。
将接收方IP地址与表中的目标地址进行匹配,其中子网掩码一列表示匹配的字节数。网关列为转发的目的地址,而接口表示转发的端口。假设当前收到一个包,其接收方目标地址为10.10.1.10。在表中查找,发现第一条记录目标地址为10.10.1.0,子网掩码为255.255.255.0,表示只匹配前24个比特,则这个包可以与第一条记录匹配上。10.10.1.0这样的记录,主机号的8个比特全部为0,表示的是一个子网;而10.10.1.101这样的记录,主机号的8个比特不全为0,则表示的是一台主机。
此外路由表的更新与交换机地址表的更新也有所不同。交换机在转发过程中可以自动更新地址表,而路由表则无法进行这样的更新。路由表的更新有以下两种方式:
(1) 由人手动维护路由记录;
(2) 根据路由协议机制,通过路由器之间的信息交换,由路由器自行维护路由记录;
3 路由器基本工作过程
了解了路由表的基本内容,再来看路由器的工作过程。
首先路由器会接收发送过来的网络包。网络包经网线到达路由器接口时,PHY与MAC模块将信号转换为数字信息,检查包结尾的FCS,FCS无误后再检查MAC头部中的接收方MAC地址。如果接收方MAC地址与端口的MAC地址一致,则存入缓冲区,否则就丢弃这个包。
路由器收到包之后会将MAC头部去掉。因为MAC头部就是用来将包转发到路由器的,到达路由器之后,这个MAC头部就会被丢弃,在转发到下一个路由器前,再添加上新的MAC头部。
接下来转发模块会根据路由表查询转发的目标。以上表中的内容为例,假设当前有IP地址为10.10.1.101的计算机向IP地址为192.168.1.10的服务器发送一个包,这个包会先到达路由器。首先会根据包的接收方地址,在目标地址栏中进行匹配。如前所述,这里会根据子网掩码确定匹配的比特数。
根据实际情况,可能匹配到多条满足要求的记录,这时要选择网络号比特数最长的一条记录。网络号的比特数越长,则主机号的比特数越短,说明子网中可能存在的主机数越少,这样就可以尽量缩小范围。
如果根据这一规则,仍然匹配到了多条网络号比特数相同的记录,则需要根据跃点数来进行判断。跃点数越小,说明该路由器越近,因此要选择跃点数最小的记录。
如果未匹配到符合要求的记录,则路由器会丢弃这个包,并通过ICMP消息告知发送方。另外,最后一行的目标地址0.0.0.0,是在其他记录都无法匹配时选择的默认地址。因为目标地址和子网掩码都为0.0.0.0,任何地址都可以匹配到这条记录。在这一条记录的网关列中填入接入互联网的路由器地址,当匹配不到其他记录时,网络包机会转发到互联网接入路由。因此这一条记录也被称为默认路由,配置的网关被称为默认网关。
查找到转发目标之后,还需要完成一些工作,才能将包交给端口模块进行发送。
首先是更新IP头部中的TTL(Time To Live,生存时间)参数,该参数表示包的有效期,每经过一个路由器,TTL的值就-1,当TTL的值变为0时,该包就会被丢弃。如果路由表的转发目标配置有问题,包就可能出现死循环的情况,这一机制是为了防止这一情况。TTL通常被设置为64或128,在正常情况下访问任何一台服务器所需要经过的路由器也不过几十个,只要路由表配置正确,包就能够在过期之前被转发到目的地。
由于路由器的端口可以支持不同的硬件协议,可能出现端口的输出包的最大长度小于端口的输入包的最大长度,这种情况下就需要通过IP协议中定义的分片功能对大的包进行拆分。分片功能与TCP协议的拆分的不同之处在于TCP协议是将数据部分拆分之后再添加头部,而IP协议的分片是将包含头部的完整包重新进行拆分,如下图所示。
在分片的过程中,首先查询输出端口的MTU,看包能否不经拆分就进行转发。如果输出端口的MTU小于输入端口,则需要对包进行拆分。接下来查询拆分的标志字段,如果标志字段设置为不允许拆分,则路由器将这个包丢弃并通过ICMP告知。否则就可以根据输出端口的MTU大小对包进行拆分了。原包从TCP头部开始的部分都可以作为拆分的数据,每个拆分的部分也都会被添加MAC头部和IP头部,除了标志分片的信息之外,这些头部信息内容基本是一致的。
以上工作完成之后,可以准备发送了。在路由器中,如果路由表中网关一列为空,表示下一个转发的目标就是包中的接收方地址。根据IP地址,通过ARP协议获取对应的MAC地址,并加入到MAC头部中。
如果接收端口类型为以太网,网络包就会被发往下一个路由器。这样经过多次转发,最终到达目的地。
4 路由器的地址转换
设备在网络中通信时,每个设备都应该具有唯一的地址,这样才能保证包转发到正确的目的地。早期网络确实是这样做的,每个接入网络的设备都会分配唯一的固定地址。但随着接入互联网的设备越来越多,网络地址逐渐面临不够用的情况。
有一种方法是,对于两个互相独立的子网,只要子网内部的IP地址不重复即可,两个子网之间的地址可以重复。这样子网内部的设备就不必分配固定的地址了。子网内部的地址也需要根据一定的规则进行设置,称为私有地址;而原来的固定地址则称为公有地址。私有地址仅限于以下范围:
- 10.0.0.0 - 10.255.255.255
- 172.16.0.0 - 172.31.255.255
- 192.168.0.0 - 192.168.255.255
私有地址本身的结构并无特殊之处,只是将公有地址中没分配的一部分拿出来,规定只能在内网中使用。
这样做可以节省一部分IP地址,但还是无法完全解决问题。如果内网之间不是完全独立的,需要通过互联网传送信息,具有相同内网地址的计算机通信仍然会出现问题。针对这个问题,采用的方法是将子网分成两个部分,一部分是对互联网开放的服务器,另一部分是子网内部的设备。对互联网开放的服务器分配公有地址,可以直接与互联网通信;内部设备分配内部地址,不能和互联网直接收发网络包,需要通过地址转换的机制。
通过私有地址与互联网通信,在建立TCP连接时,首先要将发送方IP地址从私有地址改写为公有地址。这里的公有地址即地址转换设备(路由器)的互联网接入地址。同时端口号也要进行改写,地址转换设备会随机选择一个空闲的端口进行改写。接下来改写前的私有地址和端口号与改写后的公有地址和端口号会作为一组对应的记录,保存在地址转换设备内部的一张表中,如下表所示
这个包经过改写之后发送出去,会收到来自服务器的响应。响应包中的接收方地址和端口号即是发送前改写的公有地址和端口号。根据公有低值和端口号,在表中查询,即可以找到对应的私有地址和端口号,包就可以到达原始的发送方了。
由于可用端口号有几万个,通过将私有地址转换为公有地址与端口号的组合,相当于一个公有地址可以对应几万个私有地址,很大程度上提高了公有地址的利用率。