一.路由分组转发原理
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)