- IP数据报的发送和转发过程
★4.4 IP数据报的发送和转发过程
为了将重点放在 TCP/IP 协议栈的网际层发送和转发 IP 数据报的过程上,在之后的举例中,我们忽略使用 ARP 协议来获取目的主机或路由器接口的 MAC 地址的过程以及以太网交换机自学习和转发帧的过程。
如下图所示,路由器连接有两个网络,其中各网络地址与网络中各主机和路由器端口的 IP 地址如下所示。

同一网络中的主机之间可以直接通信,这属于直接交付;不同网络的主机之间的通信需要通过路由器来中转,这属于间接交付。
主机发送IP数据报
假设主机 C 要给主机 F 发送 IP 数据报,主机 C 将自己的 IP 地址与自己的子网掩码作逻辑与运算,得到自己所在网络的网络地址 192.168.0.0(源网络地址),同理,由于主机 C 给主机 F 发送 IP 数据报,说明主机 C 已经知道了主机 F 的 IP 地址,主机 C 将主机 F 的 IP 地址与自己的子网掩码作逻辑与运算,得到主机 F 的网络地址 192.168.0.128(目的网络地址),发现该目的网络地址与自己的源网络地址不同,说明主机 F 与主机 C 不在同一个网络中,所以需要通过路由器进行间接交付。
于是主机 C 先将 IP 数据报传输给路由器,由路由器将 IP 数据报转发给主机 F。

先看源主机和目的主机是否在同一个网络中,若是就通过以太网交换机直接通信,若不是就要通过路由器间接通信。
主机 C 为了通过路由器转发其发送的 IP 数据报,还需要知道路由器 R 的存在。
实际上,用户为了让本网络中的主机能和其他网络中的主机进行通信,就必须给其指定本网络中的一个路由器,由该路由器帮忙进行转发,所指定的路由器也被称为默认网关。
当本网络中的主机(主机 C)要和其他网络中的主机(主机 F)进行通信时,会将 IP 数据报传输给默认网关(192.168.0.126),由默认网关帮主机将 IP 数据报转发出去。

路由器转发IP数据报
路由器接收到要转发的 IP 数据报以后,会进行以下操作:
- 检查 IP 数据报的首部是否出错,若出错,则丢弃该 IP 数据报并通告源主机,若没有出错,则进行转发;
- 根据 IP 数据报首部中的目的地址在路由表中查找匹配的路由条目,若找到匹配的条目,则转发给条目中指示的下一跳,若找不到,则丢弃该 IP 数据报并通告源主机;
(下例又假设是主机 A 给 主机 D 发送 IP 数据报,与上例有所不同。)


路由器会将 IP 数据报首部的目的地址逐条和路由条目中的子网掩码进行逻辑与运算,若得到的网络地址和该路由条目中的目的网络地址相同,就找到了匹配的条目,然后就转发给匹配条目中的下一跳。


注意:路由器并不转发广播 IP 数据报。
★总结

4.5 静态路由配置及其可能产生的路由环路问题
静态路由配置:用户或网络管理员使用路由器的相关命令给路由器人工配置路由表。

★静态路由配置
静态路由配置:用户或网络管理员使用路由器的相关命令给路由器人工配置路由表。
如下图所示,路由器 R1 通过自己的接口所配置的 IP 地址和地址掩码,可以自动得出接口 0 所在的网络,且为直连路由;同理 R1 可得到接口 1 所在的网络,且为直连路由;路由器 R2 同理。

假设 R1 要转发一个 IP 数据报给 192.168.2.0/24 网络中的某台主机,但在 R1 的路由表中并没有该网络的路由条目,而且由图可知 R1 应该通过 R2 来将该 IP 数据报转发给目的主机,因此,就需要使用路由器配置的相关命令,给 R1 添加一条到达 192.168.2.0/24 目的网络的路由条目,如下图所示,是静态路由。

同理也可给 R2 进行静态路由配置。

★默认路由
如下图所示,在上述例子的基础之上,假设 R2 的接口 2 连接到了因特网上,且 R1 要转发一个 IP 数据报给因特网中某个网络中的某个主机,则 R1 应先将 IP 数据报转发给路由器 R2 的接口 0,再由 R2 将该 IP 数据报转发到因特网中。

但在因特网中包含有众多的网络,如果给 R1 添加针对这些网络的每一条路由条目,就会给人工配置带来巨大的工作量,且 R1 的路由表会变得很大,降低了查表转发的速度。
实际上,对于具有相同下一跳的不同目的网络的路由条目,可以用一条默认路由条目来代替,默认路由为 0.0.0.0/0,对于上例,默认路由条目中的下一跳为路由器 R2 的端口 0 的地址 10.0.0.2,默认路由由人工静态配置。

特定主机路由
有时,可以给路由器添加针对某个主机的特定主机路由条目,一般用于网络管理人员对网络的管理和测试;另外,在需要考虑某种安全问题时也可以采用特定主路由。

特定主机路由的网络前缀最长(目的网络地址即为目的主机的 IP 地址),路由最具体;
默认路由的网络前缀最短(网络前缀为 0 ),路由最模糊。
当路由器转发 IP 数据报时,若有多条路由可选,则采用 “最长前缀匹配” 的原则,选用目的网络前缀最长的那个路由条目进行转发。
路由环路问题
配置错误
如下图所示,假设 R2 要将 IP 数据报转发给 192.168.1.0/24,则 R2 根据路由表,会将 IP 数据报转发给 R1 的端口 1 的 IP 地址 10.0.0.1。

**假设人工静态配置时配置错误,R2 的路由表中的路由条目配置为
192.168.1.0/24 10.0.1.2
**,则在 R2 根据路由表转发 IP 数据报时,下一跳会错误地转发给路由器 R3 的接口 0;R3 接收到该 IP 数据报后,进行查表转发,将该 IP 数据报转发给 R2 的端口 1;同理,R2 又将接收到的 IP 数据报转发给 R3 的接口 0。因此,由于静态路由配置错误,导致 R2 和 R3 之间产生了路由环路。为了防止 IP 数据报在路由环路中永久兜圈,在 IP 数据报首部设有生存时间 TTL 字段(Time To Live),IP 数据报进入路由器后,TTL 字段的值减 1,若 TTL 的值不等于 0 ,则被路由器转发,否则被丢弃。

聚合了不存在的网络
如下图所示,假设 R2 要转发 IP 数据报给 192.168.2.0/24,R2 进行查表转发,找到了匹配的路由条目
192.168.0.0/22 10.0.0.1
,然后 R2 将 IP 数据报发送给 R1 的端口 1,然后 R1 进行查表转发,将 IP 数据报转发给 192.168.2.0/24。

但若是 R2 要将 IP 数据报转发给不存在的网络 192.168.3.0,则首先 R2 进行查表转发,会将该 IP 数据报转发给 R1 的端口 1;然后 R1 进行查表转发,根据默认路由,会将该 IP 数据报转发给 R2 的端口 0;同理,R2 又会将该 IP 数据报转发给 R1 的端口 1。
因此,由于聚合了不存在的网络,导致 R1 和 R2 之间产生了路由环路。

针对这种情况,可以在 R2 的路由表中,添加针对所聚合的、不存在的网络的黑洞路由。

网络故障
如下图所示,假设路由器 R1 检测到其接口 0 所直连的网络出现了故障而不可达,就会自动在其路由表中删除该直连网络的路由条目。此时,若 R2 要转发 IP 数据报到 R1 的接口 0 所直连的网络 192.168.1.0/24,则进行查表转发,下一跳应转发给 10.0.0.1(即 R1 的接口 1 的 IP 地址);R1 接收到该 IP 数据报后,由于 R1 的路由表中的 192.168.1.0/24 路由条目已经被自动删除,所以 R1 进行查表转发,根据默认路由,下一跳会转发给 R2 的接口 0;然后 R2 又进行查表转发,将该 IP 数据报转发给 R1 的接口 1。
因此,由于网络故障的问题,导致 R1 和 R2 之间产生了路由环路。

针对这种情况,可以在 R1 的路由表中,添加针对直连的故障网络的黑洞路由。

当网络故障恢复后,路由器 R1 又自动地得到其接口 0 的直连网络的路由条目,并将之前人工配置的针对该网络的黑洞路由条目设置为失效状态。