边界网关协议学习指引( 二 )


2.1 需求之一—路由传播
现在我们提出一个需求:两个ISP通过一条高速POS链路连接起来 , 这两个ISP想把各自的路由通知给对方 。如下图所示:
图中ISP1的路由器RT1知道ISP1的所有路由 , 而ISP2的边界路由器RT2知道ISP2的所有路由 , 当然 , 这两个路由器是通过IGP路由协议 , 比如OSPF完成这一点的 。
假设没有BGP , 我们怎样解决这个问题呢?
实际上 , 解决这个问题的方案很多 , 这里我们使用这样一种解决方式:让RT1和RT2运行RIP2协议 , 而且仅仅在RT1和RT2互连的POS接口上运行 , 在RT1和RT2上分别把ISP1的路由和ISP2的路由引入RIP 。这样RIP进程就每隔三秒种 , 把自己的路由表通告给对方一次 , 互相学习之后 , 两个ISP的边界路由器RT1和RT2就知道了对方的路由 , 这样在RT1和RT2上再把RIP路由引入到两个ISP运行的IGP协议即可 。
可见 , 在这里我们使用RIP解决了两个ISP的路由传播问题 , 但有一个严重的缺陷:默认情况下 , RIP每隔三秒钟把自己的路由表通告一遍 , 这样假如两个ISP的路由表非常大(达到100000条) , 完成这个通告的过程也需要不止三秒的时间 , 这样整个POS链路就完全为RIP通告服务 , 而不能转发其他数据了 。
为了解决这个问题 , 我们对RIP协议做如下改造:
1、去掉RIP的每三秒通告一次路由表的规则;
2、引入增量通告规则 , 即假如路由没有变化 , 则不发任何通告 , 一旦路由有变化 , 则按照下列规则进行:假如是路由增加 , 则通告给对方增加的路由 , 假如是路由删除 , 则通告给对方删除的路由 , 假如是路由修改(比如修改了下一跳等) , 则首先通告一个路由删除 , 再通告一个路由增加 。
这样改进之后 , 只要路由表不进行大的改变 , 整个POS链路上就会很平静 。
细心的读者可能会发现另外一个问题:开始的时候 , ISP1和ISP2的两个边界路由器必须有一个同步的过程 , 也就是说 , 两个边界路由器RT1和RT2刚开始建立邻居关系的时候 , 需要把自己的整个路由表传输给对方 。而传统的RIP协议是使用UDP作为自己的传输协议的 , 这个协议的最大缺点就是不可靠 , 不适合传输大量的数据 。所以我们为了传输庞大的路由表 , 可以考虑使用其他的传输协议 , 当然 , 最轻易想到的就是TCP协议 。
于是 , 我们再对RIP进行改进:把用于传输的协议由UDP改为TCP 。这样改进之后 , RIP使用的发现和维护邻居的机制也应该改变(RIP使用HELLO报文来发现和维护邻居) , 我们可以这样考虑:
1、因为要建立TCP连接 , 所以ISP两端的路由器必须知道对方的IP地址 , 我们通过静态配置的方式告知路由器;
2、ISP边界路由器知道对方的IP地址后 , 就可以尝试跟对方建立连接了 , 假如连接不能建立 , 说明对方还未激活 , 于是会等待一段时间再进行连接的建立 , 这个过程一直重复 , 直到连接建立;
3、假如TCP连接建立起来 , 两端的设备必须交换某些数据以确认对方的能力或确定自己下一步的行动 , 即所谓的能力交互 。这个过程是必须的 , 因为任何支持IP 协议栈的设备都支持TCP连接的建立 , 而不是每个支持IP协议栈的设备都支持我们扩展的RIP协议 , 所以我们必须在该TCP连接上进行确认;
4、确认了对方支持我们扩展的RIP协议后 , 我们就可以进行路由表的同步了 。因为TCP是基于数据流传输服务的 , 所以设备一次可以传输大量的数据给对方 , 而不用担心数据的丢失(因为有TCP机制保证);
5、两端路由表同步完成之后 , 并不是立即拆除这个连接 , 因为以后假如有路由表改变了 , 需要重新进行同步(注重 , 这里是增量同步) , 假如把这个TCP连接给拆除了 , 以后同步的时候必须重新建立 , 这样需要消耗很多资源 , 假如利用保持的TCP连接 , 就可以不用重新建立连接而马上进行数据的传输;

推荐阅读