路由分组转发算法

一.路由分组转发原理

1.转发:转发是指将分组从一个输入链路转移到适当输出链路接口的路由器本地动作

2.路由分组转发:路由器某个输入端口收到的分组,按照分组要去的目的地,把该分组从路由器的某个合适的输出端口转发给下一跳的路由器。

二.流程图展示

三.代码成果

import re
def address(ip2):
    N=re.sub("\.[0-9]+",".0",ip2)
    return N
def diret(a,b,ip2,R1,R2,R3,E):
    N=address(ip2)
    if a=="10":
        if b=="10" or b=="20":
            print(R1[N])
            return 1
        else:
            print("否!")
            print("(2)看路由表中是否有特定主机路由?")
            if ip2 in E.keys():
                  print(E[ip2])
                  return 2
            else:
                   return 3
    if a=="20":
        if b=="10" :
            print(R1[N])
            return 1
        elif b=="20" or b=="30":
            print(R2[N])
            return 1
        else:
            print("否!")
            print("(2)看路由表中是否有特定主机路由?")
            if ip2 in E.keys():
                print(E[ip2])
                return 2
            else:
                return 3
    if a=="30" or a=="40":
        if b=="30" or b=="40":
            print(R3[N])
            return 1
        else:
            print("否!")
            print("(2)看路由表中是否有特定主机路由?")
            if ip2 in E.keys():
                print(E[ip2])
                return 2
            else:
                return 3
def transit(ip1,ip2,R1,R2,R3,E):
    N=address(ip2)#根据目的主机地址,获得网络地址

    result1=re.split('\.',ip1)
    a=result1[0]#获得源主机所在的网络
    result2 = re.split('\.', ip2)
    b= result2[0]#获得目的主机所在的网络
    d1=R1.keys()
    d2=R2.keys()
    d3=R3.keys()
    if a=="10":
          print("(1)看网络N是否与路由器直接相连?")
          v=diret(a,b,ip2,R1,R2,R3,E)
          if v==1:
              return
          elif v==2:
              return
          else :
              print("否!")
              print("(3)看能否间接转发?")
              if N in d1:
                  print("R1-", end="")
                  print(R1.get(N))
                  if "直接交付" in R1.get(N):
                      return
                  if N in d2:
                      print("R2-", end="")
                      print(R2.get(N))
                      if "直接交付" in R2.get(N):
                          return
                      if N in d3:
                          print("R3-", end="")
                          print(R3.get(N))
                          if "直接交付" in R3.get(N):
                              return
              else:
                  print("否!")
                  print("(4)查询是否有默认路由?")
                  if "0.0.0.0" in d1:
                      print(R1["0.0.0.0"])
                  else:
                      print("否!")
                      print("转发失败!")
    if  a=="20" :
        print("(1)看网络N是否与路由器直接相连?")
        v = diret(a, b, ip2, R1, R2, R3, E)
        if v == 1:
            return
        elif v == 2:
            return
        else:
            print("否!")
            print("(3)看能否间接转发?")
            if N in d2:
                print("R2-", end="")
                print(R2.get(N))
                if "直接交付" in R2.get(N):
                    return
                if N in d3:
                    print("R3-", end="")
                    print(R3.get(N))
                    if "直接交付" in R3.get(N):
                        return
            else:
                print("否!")
                print("(4)查询是否有默认路由?")
                if "0.0.0.0" in d1:
                    print(R1["0.0.0.0"])
                else:
                    print("否!")
                    print("转发失败!")
    if a>="30":
        print("(1)看网络N是否与路由器直接相连?")
        v = diret(a, b, ip2, R1, R2, R3, E)
        if v == 1:
            return
        elif v == 2:
            return
        else:
            print("否!")
            print("(3)看能否间接转发?")
            if N in d3:
                print("R3-", end="")
                print(R3.get(N))
                if "直接交付" in R3.get(N):
                    return
                if N in d2:
                    print("R2-", end="")
                    print(R2.get(N))
                    if "直接交付" in R2.get(N):
                        return
                    if N in d1:
                        print("R1-", end="")
                        print(R1.get(N))
                        if "直接交付" in R1.get(N):
                            return
            else:
                print("否!")
                print("(4)查询是否有默认路由?")
                if "0.0.0.0" in d3:
                    print(R3["0.0.0.0"])
                else:
                    print("否!")
                    print("转发失败!")
if __name__ == "__main__":
        R1 = {"10.0.0.0":"直接交付,10.0.0.4","20.0.0.0":"直接交付,20.0.0.7","30.0.0.0":"20.0.0.9","40.0.0.0":"20.0.0.9"}
        R2 = {"10.0.0.0":"20.0.0.7","20.0.0.0":"直接交付,20.0.0.9","30.0.0.0":"直接交付,30.0.0.2","40.0.0.0":"30.0.0.1"}
        R3 = {"10.0.0.0":"30.0.0.2","20.0.0.0":"30.0.0.2","30.0.0.0":"直接交付,30.0.0.1","40.0.0.0":"直接交付,40.0.0.4","0.0.0.0":"默认路由转发"}
        E={"50.10.6.6":"R5-50.0.0.9"}
        ip1=input("请输入源主机地址:")
        ip2=input("请输入目的主机地址:")
        print("转发过程如下:")
        transit(ip1, ip2, R1, R2, R3,E)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值