1. IP数据报转发简介

对于一个主机而言IP数据报转发分为两类,第一种是如果目的地主机是直接相连的(例如点到点连接)或者共享网络(例如以太网),IP数据报直接发送到目的地主机,不需要使用路由器。第二种是如果目的地主机不直接相连,那么主机将数据报发送到路由器,由路由器将数据报交付到目的地主机。本文主要介绍第二种情况,即路由器如何转发IP数据报。

2. 路由器和转发表简介

路由器工作在OSI七层协议中的第三层,也就是网络层。其主要任务是接收来源于一个网络接口的数据包,根据这个数据包中所含的目的地址,决定转发的下一个目的地址,即路由的作用。 路由器中时刻维持着一张转发表,所有数据包的发送和转发都通过查找转发表来实现的。

2.1 转发表

路由表与iptables_IP


IP协议标准没有规定转发表所需的精确数据,IP转发表通常包含一下几个关键信息:

  • 目的地:IPv4或者IPv6地址
  • 掩码:目的地地址对应的掩码
  • 下一跳:下一跳转发的IPv4或者IPv6地址
  • 接口:数据报发送到下一跳设备的网络接口

3. 路由器转发的过程和最长前缀匹配算法

3.1 路由器的转发过程

路由表与iptables_IP_02


路由器物理层从路由器的一个端口收到一个报文,上送到链路层。链路层去掉链路层封装,根据报文的协议域上送到网络层。网络层首先看报文是否是送给本机的(即是否为本机IP地址)。若是,去掉网络层封装,送给上层(传输层)。若不是,则根据报文的目的地址查找转发表,执行最长匹配算法寻找下一跳的IP地址。若找到路由,将报文发送到相应端口的数据链路层,数据链路层封装后,发送报文。若找不到路由,报文丢弃。

路由表与iptables_目的地址_03

3.2 最长匹配算法

路由表与iptables_路由表与iptables_04


首先将IP报文中的目的地址和路由表项中的子网掩码进行 “逻辑与” 操作,得到一个网络地址,然后拿此网络地址与转发表中的网络地址做比较,如果一致就认为匹配,否则认为不匹配。

当路由表中存在多个路由项可以同时匹配目的IP地址时,路由查找进程会选择其中掩码最长的路由项进行转发掩码越长表明其代表的网络范围越小,匹配的程度就越精确。 这就是所谓的最长匹配原则。

如图所示,路由器接收到目的地址为30.0.0.1的IP报文后,经查找整个路由表,发现与路由项30.0.0.0/24和30.0.0.0/8都能匹配。但根据最长匹配的原则,路由器会选择路由项30.0.0.0/24,并根据该路由项转发数据包。

确定了下一跳地址后,路由器将此报文送往对应的接口,接口进行相应的地址解析,解析出对应的链路层地址后,对IP报文进行数据封装并转发。