路由分组转发算法

 路由分组转发算法就不多介绍了。这里主要讲一下自己的简单实现过程。

 

本程序只写到了一般路由器,

没有加特定主机路由和默认路由。

没有实现IP与MAC的转换

 

接收IP数据包,用输入IP的方式代替。

用打印字符串形式说明路由将把消息发向哪里。

功能比较简单。

 

 

 

 

 

流程图:

 

 

 

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		IPAdress h1=new IPAdress();		//接收到一个IP数据包
		h1.input();									//用输入来模拟得到目的IP地址
		RoutingTable routing=new RoutingTable();	//	打开路由表
		routing.match(h1);										//进行路由表匹配
	}
}


 

 

 

/**
 * 地址
*/
class Adress{
	int part1,part2,part3,part4;
	String IP;	//地址的字符串格式
	/**
	 * 将IP字符串转换为数字格式存储
	 * */
	public void setIP(){	
		IP=String.valueOf(part1)+"."+String.valueOf(part2)+"."+String.valueOf(part3)+"."+String.valueOf(part4);
	}
	/**
	 * 将IP数字转换为字符串格式存储
	 * */
	public void resetIP(){
		String[] strings=IP.split("\\.");
		part1=Integer.parseInt(strings[0]);
		part2=Integer.parseInt(strings[1]);
		part3=Integer.parseInt(strings[2]);
		part4=Integer.parseInt(strings[3]);
	}
	public void set(String IP){
		this.IP=IP;
	}
	/**
	 * 检查两个地址是否相同
	 * */
	public boolean equals(Adress b) {
		return IP.equals(b.IP);
	}
	public String toString(){
		return IP;
	}
}


 

 

 

class IPAdress extends Adress{
	/**
	 * 输入目的IP地址
	 * */
	public void input(){
		System.out.println("请输入IP地址");
		Scanner scanner=new Scanner(System.in);
		IP=scanner.next();
		//IP="128.30.33.138";
		String[] strings=IP.split("\\.");
		part1=Integer.parseInt(strings[0]);
		part2=Integer.parseInt(strings[1]);
		part3=Integer.parseInt(strings[2]);
		part4=Integer.parseInt(strings[3]);
	}
}


 

 

 

/**
 * 路由表
 * */
class RoutingTable{
	Tuple[] tuples=new Tuple[3];
	public RoutingTable() {
		tuples[0]=new Tuple();
		tuples[1]=new Tuple();
		tuples[2]=new Tuple();
		tuples[0].DEST.set("128.30.33.0");
		tuples[0].SUBNET.set("255.255.255.128");
		tuples[0].NEXT="直接交付";
		tuples[1].DEST.set("128.30.33.128");
		tuples[1].SUBNET.set("255.255.255.128");
		tuples[1].NEXT="接口1";
		tuples[2].DEST.set("128.30.36.0");
		tuples[2].SUBNET.set("255.255.255.0");
		tuples[2].NEXT="R2";
	}
	/**
	 * 对路由表中的各元组子网掩码与目标地址相与
	 * 然后和目的网络地址比较
	 * */
	public int AND(IPAdress IP){
		Adress result = new Adress();	//按位与后的结果
		for(int i=0;i<3;i++){
			Adress SUB=tuples[i].SUBNET;
			SUB.resetIP();
			//按位与操作
			result.part1=IP.part1&SUB.part1;
			result.part2=IP.part2&SUB.part2;
			result.part3=IP.part3&SUB.part3;
			result.part4=IP.part4&SUB.part4;
			result.setIP();	//设置字符串IP
System.out.println("检查匹配中:"+result+"--"+tuples[i].DEST);
			if(result.equals(tuples[i].DEST)){
				return i;
			}
		}
		return -1;
	}
	/**
	 * 将IP与子网掩码按位相与后 和目的网络地址比较
	 * */
	public void match(IPAdress h1) {
		int temp=AND(h1);
		switch (temp) {
		case 0:
			System.out.println(tuples[temp].NEXT);
			break;
		case 1:
			System.out.println(tuples[temp].NEXT);
			break;
		case 2:
			System.out.println(tuples[temp].NEXT);
			break;
		default:
			System.out.println("转发分组错误");
			break;
		}
	}
	class Tuple{	//一条记录 一个元组
		Adress DEST;			//目的网络地址
		Adress SUBNET;	//子网掩码
		String NEXT;			//下一跳
		public Tuple() {
			DEST=new Adress();
			SUBNET=new Adress();
		}
	}
}

 

运行结果截图:

 

 

 

 


 

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值