路由分组转发算法就不多介绍了。这里主要讲一下自己的简单实现过程。
本程序只写到了一般路由器,
没有加特定主机路由和默认路由。
没有实现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();
}
}
}
运行结果截图: