实验目的
学习网桥的工作原理;
学习校验和算法。
实验环境
Windows环境下运行,程序在单机上运行。
程序设计使用语言为Java
程序设计使用开发工具为intelliJ IDEA
实验内容
1、 写一个程序来模拟网桥功能。
模拟实现网桥的转发功能,以从文件中读取帧模拟网桥从网络中收到一帧,即从两个文件中读入一系列帧,从第一个文件中读入一帧然后从第二个文件中再读入一帧,如此下去。对每一帧,显示网桥是否会转发,及显示转发表内容。
分析:用程序模拟网桥功能,可以假定用两个文件分别代表两个网段上的网络帧数据。而两个文件中的数据应具有帧的特征,即有目的地址,源地址和帧内数据。程序交替读入帧的数据,就相当于网桥从网段中得到帧数据。
对于网桥来说,能否转发帧在于把接收到的帧与网桥中的转发表相比较。判断目的地址后才决定是否转发。由此可见转发的关键在于构造转发表。这里转发表可通过动态生成。
2、 编写一个计算机程序用来计算一个文件的16位效验和。最快速的方法是用一个32位的整数来存放这个和。记住要处理进位(例如,超过16位的那些位),把它们加到效验和中。
要求:
- 以命令行形式运行:check_sum infile。其中check_sum为程序名,infile为输入数据文件名。
- 输出:数据文件的效验和
附:效验和(checksum)
参见RFC1071 - Computing the Internet checksum
原理:
把要发送的数据看成16比特的二进制整数序列,并计算他们的和。若数据字节长度为奇数,则在数据尾部补一个字节的0以凑成偶数。
例子:16位效验和计算,下图表明一个小的字符串的16位效验和的计算。
为了计算效验和,发送计算机把每对字符当成16位整数处理并计算效验和。如果效验和大于16位,那么把进位一起加到最后的效验和中。
实验步骤、记录和结果
1、 写一个程序来模拟网桥功能。
模拟实现网桥的转发功能,以从文件中读取帧模拟网桥从网络中收到一帧,即从两个文件中读入一系列帧,从第一个文件中读入一帧然后从第二个文件中再读入一帧,如此下去。对每一帧,显示网桥是否会转发,及显示转发表内容。
分析:用程序模拟网桥功能,可以假定用两个文件分别代表两个网段上的网络帧数据。而两个文件中的数据应具有帧的特征,即有目的地址,源地址和帧内数据。程序交替读入帧的数据,就相当于网桥从网段中得到帧数据。
对于网桥来说,能否转发帧在于把接收到的帧与网桥中的转发表相比较。判断目的地址后才决定是否转发。由此可见转发的关键在于构造转发表。这里转发表可通过动态生成。
为了更加深入的了解网桥的功能,本实验设计了一个四个接口的网桥,连在网桥上面的主机数目为12。其拓扑结构如下如图:
程序分析:
模拟网桥实验首先设置一个List存放在每个接口发出的帧的组合,再设计一个Interface类表示每个接口的接口号和链接在这个接口的主机号(为了方便表示,接口号用阿拉伯数字表示,主机号用大写英文字母表示)。然后又设置一个List存放这网桥的接口。然后遍历要发送的帧,读进来的帧进行分析, 先判别源地址是否存在于网桥转发表中, 若果在则进入第一个循环模块, 再判别目标地址是否在转发表中,最后输出数据由哪个接口转发。如果源地址不在转发表中, 要把这个源地址和所对应接口写入网桥的转发表中, 在进行其他判别。由此可见转发的关键在于构造转发表,这里转发表是动态生成的。
程序流程图如下图:
import java.io.*;
import java.util.ArrayList;
import java.util.List;
public class Bridge {
public static void main(String[] args) {
List<String> str = new ArrayList<String>(); //存放所有传输的帧
List<Interface> str1 = new ArrayList<Interface>(); //记录转发表的内容
creatTxtFile(); //创建txt文件,并且写入数据
readTxtFile(str); //读取txt文件
System.out.println("开始监听:");
for (int i = 0; i < str.size(); i++) {
String[] str2 = str.get(i).split(" ");
str1.add(new Interface(i));
for (int j = 0; j < str2.length; j++) {
//检查网桥是否记录源地址
if (!str1.get(i).host.contains(String.valueOf(str2[j].charAt(0)))) {
//检查接口是否记录这个主机
str1.get(i).host.add(str2[j].charAt(0) + "");
}
//检查网桥是否记录目的地址
boolean isExist = false;
int k;
for (k = 0; k < str1.size(); k++) {
if