一、实验目的
复习网桥的工作原理;复习校验和算法。
二、实验原理
Window10,visual studio 2019
三、实验内容
1、写一个程序来模拟网桥功能。
模拟实现网桥的转发功能,以从文件中读取帧模拟网桥从网络中收到一帧,即从两个文件中读入一系列帧,从第一个文件中读入一帧然后从第二个文件中再读入一帧,如此下去。对每一帧,显示网桥是否会转发。
要求:Windows或Linux环境下运行,程序应在单机上运行。
分析:用程序模拟网桥功能,可以假定用两个文件分别代表两个网段上的网络帧数据。而两个文件中的数据应具有帧的特征,即有目的地址,源地址和帧内数据。程序交替读入帧的数据,就相当于网桥从网段中得到帧数据,当然如果模拟的数据量比较少,也可以用两个数组代替两个文件存放帧数据,同样达到代表两个网段上的帧数据的效果。
对于网桥来说,能否转发帧在于把接收到的帧与网桥中的转发表相比较。判断目的地址后才决定是否转发。由此可见转发的关键在于构造转发表。这里转发表可通过动态生成。
2、编写一个计算机程序用来计算一个文件的16位效验和。最快速的方法是用一个32位的整数来存放这个和。记住要处理进位(例如,超过16位的那些位),把它们加到效验和中。
要求:1)以命令行形式运行:check_sum infile
其中check_sum为程序名,infile为输入数据文件名。
2)输出:数据文件的效验和
附:效验和(checksum)
参见RFC1071 - Computing the Internet checksum
原理:把要发送的数据看成16比特的二进制整数序列,并计算他们的和。若数据字节长度为奇数,则在数据尾部补一个字节的0以凑成偶数。
例子:16位效验和计算,下图表明一个小的字符串的16位效验和的计算。
为了计算效验和,发送计算机把每对字符当成16位整数处理并计算效验和。如果效验和大于16位,那么把进位一起加到最后的效验和中。
四、源代码
1、
#include <iostream>
#include <fstream>
using namespace std;
#define TABLEMAX 255 //转发表最大行数
int Count = 0;//转发表的行数
struct dataframe //定义帧
{
char source; //源地址
char destination; //目的地址
int data; //数据
};
struct Forwardingtable //定义转发表
{
int interface; //接口
char destination;//目的地址
}table[TABLEMAX] = {
0 };
int searchtable(dataframe dataframe) //查找转发表,返回flag的值
{
int temp1 = 0, temp2 = 0;//设置两个临时变量存储接口值
int low = 0, high = Count - 1, mid;
if (Count < 8)
{
for (int i = 0; i < Count; i++)
{
if (dataframe.source == table[i].destination) //地址是否在转发表中
{
temp1 = table[i].interface; //temp1等于源地址对应接口
}
if (dataframe.destination == table[i].destination) //地址是否在转发表中
{
temp2 = table[i].interface; //temp2等于源地址对应接口
}
}
}
while (Count >= 8 && low <= high)
{
mid = (low + high) / 2;
if (dataframe.source == table[mid].destination)
{
temp1 = table[mid]