计算机网络--网络程序设计

本文介绍了计算机网络实验,包括模拟网桥功能的实现,通过两个文件模拟两个网段,根据帧的目的地址决定是否转发,并动态生成转发表。同时讲解了16位效验和计算,通过32位整数处理和进位处理来确保正确性,程序设计中遇到的空间和时间效率问题进行了探讨。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

实验目的

学习网桥的工作原理;
学习校验和算法。

实验环境

Windows环境下运行,程序在单机上运行。
程序设计使用语言为Java
程序设计使用开发工具为intelliJ IDEA

实验内容

1、 写一个程序来模拟网桥功能。
模拟实现网桥的转发功能,以从文件中读取帧模拟网桥从网络中收到一帧,即从两个文件中读入一系列帧,从第一个文件中读入一帧然后从第二个文件中再读入一帧,如此下去。对每一帧,显示网桥是否会转发,及显示转发表内容。
分析:用程序模拟网桥功能,可以假定用两个文件分别代表两个网段上的网络帧数据。而两个文件中的数据应具有帧的特征,即有目的地址,源地址和帧内数据。程序交替读入帧的数据,就相当于网桥从网段中得到帧数据。
对于网桥来说,能否转发帧在于把接收到的帧与网桥中的转发表相比较。判断目的地址后才决定是否转发。由此可见转发的关键在于构造转发表。这里转发表可通过动态生成。

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、 写一个程序来模拟网桥功能。
模拟实现网桥的转发功能,以从文件中读取帧模拟网桥从网络中收到一帧,即从两个文件中读入一系列帧,从第一个文件中读入一帧然后从第二个文件中再读入一帧,如此下去。对每一帧,显示网桥是否会转发,及显示转发表内容。
分析:用程序模拟网桥功能,可以假定用两个文件分别代表两个网段上的网络帧数据。而两个文件中的数据应具有帧的特征,即有目的地址,源地址和帧内数据。程序交替读入帧的数据,就相当于网桥从网段中得到帧数据。
对于网桥来说,能否转发帧在于把接收到的帧与网桥中的转发表相比较。判断目的地址后才决定是否转发。由此可见转发的关键在于构造转发表。这里转发表可通过动态生成。
为了更加深入的了解网桥的功能,本实验设计了一个四个接口的网桥,连在网桥上面的主机数目为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 (str1.</
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值