协议简介及报文封装格式
RIP是Routing Information Protocol(路由信息协议)的简称。它是一种较为简单的内部网关协议IGP(Interior Gateway Protocol),主要用于规模较小的网络中,比如校园网以及结构较简单的地区性网络。对于更为复杂的环境和大型网络,一般不使用RIP。
RIP是一种基于距离矢量(Distance-Vector)算法的协议,它通过UDP报文进行路由信息的交换,使用的端口号为520。
RIP有两个版本:RIP-1和RIP-2。
- RIP-1是有类别路由协议(Classful Routing Protocol),它只支持以广播方式发布协议报文。RIP-1的协议报文中没有携带掩码信息,它只能识别A、B、C类这样的自然网段的路由,因此RIP-1无法支持路由聚合,也不支持不连续子网(Discontiguous Subnet)。
- RIP-2是一种无分类路由协议(Classless Routing Protocol),有两种报文传送方式:广播方式和组播方式,缺省将采用组播方式发送报文,使用的组播地址为224.0.0.9。当接口运行RIP-2广播方式时,也可接收RIP-1的报文。
RIP-1的报文格式
0 7 15 23 31 +---------------------------------------------------------------+ | Command | Version | Must be zero | +---------------------------------------------------------------+ | Address family identifier | Route Tag | +---------------------------------------------------------------+ | Must be zero | +---------------------------------------------------------------+ | Must be zero | +---------------------------------------------------------------+ | Metric | +---------------------------------------------------------------+
RIP-2的报文格式
0 7 15 23 31 +---------------------------------------------------------------+ | Command | Version | Must be zero | +---------------------------------------------------------------+ | Address family identifier | Route Tag | +---------------------------------------------------------------+ | IP Address | +---------------------------------------------------------------+ | Subnet Mask | +---------------------------------------------------------------+ | Next Hop | +---------------------------------------------------------------+ | Metric | +---------------------------------------------------------------+
实验
RIPv2并没有拓展其他报文字段,而是对v1保留字段进行填充,而v2中下一跳(Next Hop)字段的作用我用一个实验来说明一下自己的理解。
拓扑如下:
场景:为了实现R1与R3 3.3.3.3/32网络互通,需要全网运行路由协议。R1、R2、R3同属一个广播多路访问网络(192.168.1.0/24),R1与R2运行RIPv2,R2与R3运行OSPF,R3同时连接一个3.3.3.3/32的网络,并宣告到OSPF进程。R2上将OSPF路由信息引入RIP。R1\R2\R3的IP分别为192.168.1.1/.2/.3 。
分析:从R1访问R3的3.3.3.3/32网络,是通过哪台路由器访问的?为什么?从路由传递层面思考。
- 首先R1要想访问R3的3.3.3.3/32网络,必须获取目标地址路由信息。R3将3.3.3.3/32宣告到OSPF进程后,R3发给R2。
- 此时R2到达3.3.3.3/32下跳为R3的出接口地址,R2同时做了OSPF引入RIP的动作,会将OSPF路由表注入到RIP路由表,再由R2将此路由发给R1。
- R1收到3.3.3.3.3/32路由信息后,将上层协议数据封装上源、目的IP,进行下一步数据交换转发。
- 在R1上查看路由表如下,到达3.3.3.3/32的路由下一跳是192.168.1.3。
[R1]display ip routing-table Route Flags: R - relay, D - download to fib ------------------------------------------------------------------------------ Routing Tables: Public Destinations : 8 Routes : 8 Destination/Mask Proto Pre Cost Flags NextHop Interface 3.3.3.3/32 RIP 100 1 D 192.168.1.3 GigabitEthernet0/0/0 127.0.0.0/8 Direct 0 0 D 127.0.0.1 InLoopBack0 127.0.0.1/32 Direct 0 0 D 127.0.0.1 InLoopBack0 127.255.255.255/32 Direct 0 0 D 127.0.0.1 InLoopBack0 192.168.1.0/24 Direct 0 0 D 192.168.1.1 GigabitEthernet0/0/0 192.168.1.1/32 Direct 0 0 D 127.0.0.1 GigabitEthernet0/0/0 192.168.1.255/32 Direct 0 0 D 127.0.0.1 GigabitEthernet0/0/0 255.255.255.255/32 Direct 0 0 D 127.0.0.1 InLoopBack0
那么,根据路由传递方向,到达3.3.3.3/32路由是R2传递给R1的,下一跳应该是192.168.1.2才对,而此处下一跳却为R3,为什么呢?
继续在R2上抓包分析,得到如下数据包
Frame 823: 86 bytes on wire (688 bits), 86 bytes captured (688 bits) on interface 0 Ethernet II, Src: HuaweiTe_0d:2d:9b (00:e0:fc:0d:2d:9b), Dst: IPv4mcast_09 (01:00:5e:00:00:09) Internet Protocol Version 4, Src: 192.168.1.2, Dst: 224.0.0.9 User Datagram Protocol, Src Port: 520, Dst Port: 520 Routing Information Protocol Command: Response (2) Version: RIPv2 (2) IP Address: 3.3.3.3, Metric: 1 Address Family: IP (2) Route Tag: 0 IP Address: 3.3.3.3 Netmask: 255.255.255.255 Next Hop: 192.168.1.3 Metric: 1 IP Address: 192.168.1.0, Metric: 1 Address Family: IP (2) Route Tag: 0 IP Address: 192.168.1.0 Netmask: 255.255.255.0 Next Hop: 0.0.0.0 Metric: 1
可以看到,这条路由源IP为192.168.1.2,目的IP为组播地址224.0.0.9,这条路由是由R2发出的,其中携带了两条路由信息,且3.3.3.3的路由Next Hop为192.168.1.3,此处非零,填充了下一跳字段。为什么会填充Next Hop字段?
结论:
- R2给R1传递3.3.3.3/32路由信息时下一跳填充时自动填充的,并没有做人为策略。当R2收到一条路由检测到入方向路由同出方向处于同一网段,同时底层链路为MA(广播多路访问)网络,则会在路由发送方向自动填充下跳为收到路由中的下一跳地址,这样可以解决MA网络环境中次优路径问题。
- Next Hop字段只会在MA网络中携带,NBMA、P2P等网络环境并不会填充,原因正是由网络环境所决定,这里不在赘述。