计算机网络RIP路由选择算法


RIP原理

RPI协议是一种内部网关协议(IGP),是一种动态路由选择协议,用于自治系统(AS)内的路由信息的传递。RIP协议基于距离矢量算法(DistanceVectorAlgorithms),使用“跳数”来衡量到达目标地址的路由距离。这种协议的路由器只关心自己周围的世界,只与自己相邻的路由器交换信息,范围限制在15跳(15度)之内。获取新的路由信息时:

a. 对本路由表中已有的路由项,当发送报文的网关相同时,不论跳数增大还是减少,都更新该路由表项的跳数。

b. 对本路由表中已有的路由项,当发送报文的网关不同时,只有在跳数减少时才更新该路由表项。

c. 对本路由表中不存在的路由项,在度量小于不可达的跳数时,在路由表中增加该路由项目。

class Net:
    def __init__(self, DesNet, Dis, NextHoop):
        self.DesNet = DesNet  # 目的网络
        self.Dis = Dis  # 距离
        self.NextHoop = NextHoop  # 下一跳
        self.next = None


class Link:
    # 构造函数
    def __init__(self):
        self.head = Net(None, None, None)  # 头节点为空
        self.tail = self.head
        self.size = 1

    # 添加节点
    def add(self, DesNet, Dis, NextHoop):
        net = Net(DesNet, Dis, NextHoop)  # 创建新节点
        self.tail.next = net  # 尾节点的下一个节点为新节点
        self.tail = net  # 尾节点为新节点
        self.size = self.size + 1

    # 插入节点(此节点作为第index个节点)
    def insert(self, DesNet, Dis, NextHoop, index):
        if (index > self.size):
            print('链表还没有这么长哟!请输入小一点的整数......')
        else:
            net = self.head
            insert_net = Net(DesNet, Dis, NextHoop)
            for i in range(index - 1):
                net = net.next  # 推进到要插入的位置
            insert_net.next = net.next
            net.next = insert_net
            self.size = self.size + 1

    # 删除节点(索引为index)
    def delete(self, index):
        if (index > self.size):
            print('链表还没有这么长哟!请输入小一点的整数......')
        else:
            net = self.head
            for i in range(index - 1):
                net = net.next
            temp = net.next
            net.next = temp.next
            self.size = self.size - 1

    # 改变指定节点的数据
    def change(self, DesNet, Dis, NextHoop, index):
        if (index > self.size):
            print('链表还没有这么长哟!请输入小一点的整数......')
        else:
            net = self.head
            for i in range(index):  # 推进到要改变节点的位置
                net = net.next
            net.DesNet = DesNet
            net.Dis = Dis
            net.NextHoop = NextHoop

    # 返回节点的数据
    def getData(self, index):
        if (index > self.size):  # 判断是否超过链表的长度
            print('链表还没有这么长哟!请输入小一点的整数......')
        else:
            net = self.head
            for i in range(index):
                net = net.next
            return [net.DesNet, net.Dis, net.NextHoop]

    # 返回节点的长度
    def getSize(self):
        return self.size

    def length(self):
        # 获取这个链表的长度
        count = 0
        cur = self._head
        while cur != None:
            count += 1
            cur = cur.next
        return count


def main():
    table = Link()  # 初始路由表
    NewTable = Link()  # 来自某个路由器的路由表
    FinalTable = Link()  # 最终形成的路由表
    temptable1 = []
    temptable2 = []
    a = int(input('请输入初始路由表行数:'))
    print('请输入整个路由表:')
    for i in range(a):
        DesNet, Dis, NextHoop = input().split()
        table.add(DesNet, Dis, NextHoop)
        FinalTable.add(DesNet, Dis, NextHoop)
    print('路由表初始化完成')
    b = input('新路由表来自的路由器:')
    c = int(input('新路由表的行数:'))
    print('请输入新路由表的信息:')
    for i in range(c):
        DesNet, Dis = input().split()
        Dis = int(Dis) + 1
        NewTable.add(DesNet, Dis, b)
    for i in range(c):
        if i == 0: continue
        count = 0
        for j in range(a):
            if j == 0: continue
            temptable1 = NewTable.getData(i)
            temptable2 = FinalTable.getData(j)
            if temptable1[0] == temptable2[0]:  # 如果目标网络相同
                if temptable1[2] == temptable2[2]:  # 如果目标网络和下一跳均相同
                    FinalTable.change(temptable1[0], temptable1[1], temptable1[2], j)
                if temptable1[2] != temptable2[2]:  # 如果目标网络一致,下一跳不同
                    if int(temptable1[1]) < int(temptable2[1]):
                        FinalTable.change(temptable1[0], temptable1[1], temptable1[2], j)
                    else:
                        continue
            if temptable1[0] != temptable2[0]:
                count = count + 1
        if int(count) == int(a) - 1:
            FinalTable.add(temptable1[0], temptable1[1], temptable1[2])
    print('新的路由表为:')
    print('目的网络    距离    下一跳路由器')
    for i in range(FinalTable.size):
        if i == 0: continue
        data = FinalTable.getData(i)
        print(str(data[0]) + '        ' + str(data[1]) + '         ' + str(data[2]))


if __name__ == '__main__':
    main()

文章作者: 陈细利
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 陈细利 !
评论
 上一篇
计算机网络TCP套接字编程 计算机网络TCP套接字编程
TCP是一个面向连接的协议,意味着客户和服务器开始发送数据之前,它们先要握手和创建一个TCP连接。TCP连接的一端与客户套接字相联系,另一端与服务器套接字相联系。当创建该TCP连接时,我们将其与客户套接字地址(IP地址和端口号)和服务器套接
下一篇 
计算机网络OSPF路由选择算法 计算机网络OSPF路由选择算法
OSFP原理:a.每台路由器学习激活的直接相连的网络。 b.每台路由器和直接相连的路由器互交,发送Hello报文,建立邻居关系。 c.每台路由器构建包含直接相连的链路状态的LSA(Link-State Advertisement,链路状态通
  目录