本帖最后由 weidhuan 于 2015-6-30 10:02 编辑 在路由器收到数据包之后,会发生什么?

在收到数据包之后,路由器必须在路由该数据包之前,执行下面的三个常见的步骤:
---> 路由
---> 转发(交换)
---> 封装
接下来,让我们分别对每个步骤进行详细地讨论:
路由进程: 路由进程说白了就是路由器的控制层面。路由器通过记录路由表来列出哪些路由条目会被使用,以及通过哪个物理接口来连接。路由器会通过静态配置、动态路由协议如 IGP (OSPF,EIGRP,RIP,IS-IS)、或者外部路由协议如 BGP 来学习网络中的路由信息。
路由器收到任何数据包时,都必须移除二层的报头信息。举个例子来讲,在以太网中,源和目的 MAC 地址都存在于二层报头中。一旦路由器移除掉二层信息,便开始查找数据包中可用的三层信息,即源和目的 IP 地址。
为了在接口之间转发三层数据包,路由器会检查目的地址,并在 IP 路由表中查找最长前缀匹配来找到出向接口。 IPv4 路由器使用最长掩码来确定转发数据包所对应的最佳路由条目。
示例:假设我们配置了三个不同长度子网掩码的静态路由。
Sh ip route 1.1.1.1
ip route 1.1.1.0 255.255.255.0 fa0/2
ip route 1.1.0.0 255.255.0.0 fa0/1
ip route 1.0.0.0 255.0.0.0 fa0/0
在上例中,当路由器对目的地址 1.1.1.1 进行目的查找时,路由器会选择满足最长前缀匹配的条目,即 1.1.1.0/24,并从 fa 0/2 转发出去,这是因为目的地址与被选择的路由之间有最多的相同比特位。
同理而言,对于其他的目的地址,像 1.1.2.0 ,最长匹配的路由是 1.1.0.0/16, 而对于 1.2.0.0,最长匹配的则是 1.0.0.0/8。
在 IPv4 路由中,最长的可能匹配是 /32 (255.255.255.255),最短的可能匹配则是默认路由,即 0.0.0.0。
---> 如果路由器通过同一个协议,学习到了多个相同子网掩码的路由,路由器将会选择度量值最小的一条。例如: Eigrp使用复合的 “metric”,Ospf 使用 “Cost” 来进行比对。
---> 如果从不同的协议,学到了多个相同子网掩码的路由,路由器则会选择管理距离(AD)最低的一条。
---> 最后一点,也是最重要的一点,就是递归查找: 每当需要进行不止一次的路由查找时,我们便把它称为递归查找。路由器会不断地进行递归查找,直到目的地址指向了一个物理或者逻辑接口。
示例: 我们现在通过接口 fa0/0 以及下一跳 IP 地址 2.2.2.2,来到达 1.1.1.1 所在网络。那我们可以通过两种不同的方法来配置静态路由,即通过定义下一跳地址 2.2.2.2,或者指定出向接口 fa0/0 来定位网关。如下所示:
ip route 1.1.1.1 255.255.255.255 2.2.2.2
ip route 1.1.1.1 255.255.255.255 FastEthernet0/0
尽管两条语句有着不同的含义,但看上去两者似乎是一模一样的。然而,当你使用出向接口来指定目的地址的下一跳时,路由器会假设目的地址是直连在这个接口下的,所以就不需要在进行进一步的路由的查找。而当你把目的地址指向了一个下一跳 IP 地址时,我们仍然需要对下一跳地址进行一次路由查找,这也就发生了递归查找。
如果我们想要了解更多的信息,关于在我们使用下一跳 IP 地址或者下一跳接口时,路由器是如何工作,可以参考这个文档。
转发进程:也被称为交换进程。一旦路由器找到了出向接口,转发进程便开始在接口之间移动数据包。这个动作将由进程交换,快速交换或者 cef 交换来完成。转发时将使用存储在路由处理器或者支持交换的接口卡上的邻接表来完成。
---> 进程转发需要设备的 CPU 来参与每一个转发决定。
---> 快速转发仍然会使用 CPU 来处理最开始的数据包,并填写路由器缓存表。一旦最开始的数据包被转发完成,关于如果到达目的网络的相关信息会被存储到一个快速交换的缓存里。当另一个数据包也要去往相同的目的地址时,缓存中关于下一跳的信息会被再次使用,这样就避免了使用路由处理器来进行查找。但是如果相应的信息并没有被缓存,我们仍然需要 CPU 来处理整个数据包。
---> 在开启了 CEF 模式时,它会在路由处理器上面建立 CEF 转发信息表和邻接表,并且由路由处理器来执行高速转发。
在转发进程里,设备会根据我们使用的算法,来进行实际的链路负载均衡。
封装进程:除了NAT,VPN以外,三层的报头将会一直保持不变,而二层的报头则会根据传输介质,逐跳进行改变。为了传输三层数据包,路由器需要根据传输时使用的介质类型,来找出数据包中的二层信息。
为了更加详细地阐述封装过程,我搭建了下图中的一个小拓扑:

如上所述,二层报头中的 MAC 地址会基于传输介质逐跳发生改变。本例中,传输介质是以太网。
首先让我们从 R3 ping R2 的接口来产生一些流量。当 R1 从 R3 收到了数据包,便会立即移除 R3 发送的二层信息,并检查数据包里可用的三层信息,即源(20.1.1.2)和目的地址(10.1.1.1)。之后,路由器会查询自身的路由表来找到出向接口,上例中即为 fa0/0。当路由器确定出口,便会在把数据包放到线路上之前,添加上二层信息。所以此时 R1 会把自身接口 MAC 填为 源 MAC,把 R2 填为目的 MAC。
R1 的 ARP 表:

为了进行数据包层面的查看,我在此处附上一些在 R1 接口下抓取的报文。
R1 的 Fa0/1 抓包:

R1 的 Fa0/0 抓包:

希望这些对大家能有所帮助。

原文出处:
https://supportforums.cisco.com/blog/153276/what-happens-when-router-receives-packet原文作者:
ashirkar