针对这种情况,我对 RIP 协议的实现作了进一步的改进和扩展,经过扩展和改进后,本文档中描述的 RIP 协议已不是传统意义上的 RIP 协议所能概括的了。
1、对拨号网路由的处理
针对拨号网上路由的特点,我们不可能象在局域网和专线网一样在拨号网上对路由进行 30 秒的定时广播,从而也就决定了我们对拨号网上的路由不能象对局域网上的路由一样进行超时处理。
正是基于这种考虑,为了保证路由的及时性和可行性的考虑,我们规定拨号网上的路由修改报文的发送在如下几种情况下进行:
· 当收到路由修改的特定的请求时;
· 当路由数据库被从别的接口收到新路由报文改变时;
· 当得知某信宿从不可达变成可达时;
· 当某接口从电路 DOWN 到电路 UP 时。
这就存在这样一个问题, RIP 报文是通过 UDP 的 520 号端口发送的,而 UDP 是不可靠的传送方式,这显然必须考虑报文传输失败的可能性。为此,我们在传送时采取了报文传送的重发和确认机制。在发送报文时,当发送完请求报文或修改报文后,如果在 5 秒钟仍未收到信宿回发过来的确认报文,重发请求报文或确认报文。如果在重发后 5 秒后仍未收到确认报文,则继续重发直到收到信宿的确认报文为止。如果在重发 10 次后,认为收到信宿的确认报文,则认为传输失败,将对应路由的 Metric 值设为 16 。在接收报文时,当收到信源发来的请求或修改报文后,要对收到的报文进行确认,并向原信源发送相应的确认报文。
如果从拨号网上下一驿站路由器收到路由修改报文,则修改报文中的路由项将一直认为是可达的直到某次发送路由报文失败。
拨号网与 局域网和专线网 对超时处理的不同也体现在路由数据库中。在路由数据库中,路由分为两种,一种是“临时性路由” ,一种是“永久性路由”。“临时性路由”针对于局域网路由和广域网专线上的路由。这种路由每 30 秒广播一次,在一定时间内没有收到路由刷新报文后,进行超时处理。“永久性路由”指的是包括拨号网上的路由,在没有收到刷新报文仍不不进行超时处理,但当对某信宿发送报文失败时则将该路由改为“临时性路由”。另外还有一种情况需要将“永久性路由”改为“临时性路由”,这将在后面说到。
2、报文格式的扩展为了更好地处理拨号网上的路由刷新,参照 RFC/1581/15822091/2092 标准,对报文格式进行了的改进和扩充修改。对报文的修改主要是支持三种新的报文分组类型,在报文命令域数值标识:
9---------Update Request 修改请求
10------- Update Response 修改响应
11--------Update Acknowledge 修改确认
同时对各类型报文添加一个报文头:
Update Request (9)
+------------------------------------------------+
| Version (1) | must be zero(3) |
+------------------------------------------------+
Update Response (10) 和 Update Acknowledge (11)
+------------------------------------------------+
| Version(1) | Flush (1) | Sequencenumber(2) |
+------------------------------------------------+
其中 Version 域指的是各报文的版本号,而不是 RIP 的版本号,主要是基于向后兼容性考虑,这里必须为 1 。
增添 Flush 域是对路由的及时性的一种考虑。如果对外发送响应报文是在收到请求后发送的,说明信宿有一个从不可达到可达的变化。如果该信宿中还保留有到其它路由器的路由信息,则这些路由信息很可能是过时的,从而需要进行更新。为了更快地更新路由器中的路由信息。在报文中增添一个 Flush 域,当路由器收到设置了 Flush 值的修改报文后,要将路由数据库中的原有路由设为“临时性路由”,进行超时处理。 Flash 域在设置时为 1 ,在不设置时为 0 ,取其他值则认为报文非法。
Sequence number 是对报文的标记,用于识别各报文的确认报文,但只对发送方有用。对发送方来说, Sequence number 不能有相同值,修改报文的 Sequence number 一般采取以 65535 为一个轮回的递增方式。而确认报文的 Sequence number 值取对应修改报文中的响应值。当路由器收到确认报文后,可根据 Sequence number 值来确认对应的修改报文已被收到。