计算机网络实验(5)--网络程序设计--模拟网桥

📍实验目的

理解网桥的工作原理

📍实验内容

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

📍实验分析

① 交替读入两个文件里面帧的数据
② 通过帧的地址动态生成一个转发表
③ 对源地址是否在动态表内的分析
④ 对目标地址是否在动态表内的分析
⑤ 对源地址和目标地址是否在同一网络接口的分析

📍程序流程图在这里插入图片描述

📍构建网络结构

在这里插入图片描述

📍初始化数据

import random
import pandas as pd

# 地址
addrlist = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I']

# 生成第一个帧文件
frame_data1 = []
n = random.randint(5, 10)  # 随机产生5~10行的数据
for i in range(n):
    addr = random.sample(addrlist, 2)  # 随机取样两个,作为目标地址target和源地址source
    addr.append(random.randint(1, 100))  # 插入1-100的随机数作为帧内数据
    frame_data1.append(addr)
frame_data1 = pd.DataFrame(frame_data1, columns=['target', 'source', 'data'])  # 创建一个帧数据文件
frame_data1.to_csv('frame_data1.csv', index=False)
print(frame_data1)

# 生成第二个帧文件
frame_data2 = []
n = random.randint(5, 10)  # 随机产生5~10行的数据
for i in range(n):
    addr = random.sample(addrlist, 2)  # 随机取样两个,作为目标地址target和源地址source
    addr.append(random.randint(1, 100))  # 插入1-100的随机数作为帧内数据
    frame_data2.append(addr)
frame_data2 = pd.DataFrame(frame_data2, columns=['target', 'source', 'data'])  # 创建一个帧数据文件
frame_data2.to_csv('frame_data2.csv', index=False)
print(frame_data2)

# 读取文件
df1 = pd.read_csv('frame_data1.csv')
df2 = pd.read_csv('frame_data2.csv')

导出数据结果形如(随机生成的):
在这里插入图片描述

📍模拟网桥

import pandas as pd
import numpy as np

# 网桥自学习 更新转发表信息
def updateFIB(key):
    FIB.loc[FIB.shape[0]] = [key, port_dict[key]]

# 通过广播进行查找发送
def broadcastSearch(line):
    for key in port_dict:
        if key == line[0]:
            print('广播发送成功\n')
            return
    print('没有找到目标地址,发送失败')

def func(line):
    print(f'网络接口{port_dict[line[1]]}收到数据帧')
    print(f'PC-{line[1]}向PC-{line[0]}发送数据{line[2]}')

    # 如果 源地址 不在转发表内,则网桥需要自学习更新转发表
    if line[1] not in np.array(FIB.address):
        print(f"转发表登记PC-{line[1]}源地址")
        updateFIB(line[1])

    # 如果 目标地址 不在转发表内,则通过广播进行发送
    if line[0] not in np.array(FIB.address):
        print(f"PC-{line[0]}目标地址不在转发表内,通过广播进行发送")
        broadcastSearch(line)
        return

    # 判断 源地址 和 目标地址 是否在同一网段
    if np.array(FIB[FIB['address'] == line[1]]['port']) == np.array(FIB[FIB['address'] == line[0]]['port']):
        print('源地址和目的地址在同一个网络接口,丢弃帧\n')
    else:
        num = np.array(FIB[FIB['address'] == line[0]]['port'])
        print(f'通过网络接口{num[0]}进行转发\n')

# 初始化: 端口
port_dict = {'A': 1, 'B': 1, 'C': 1, 'D': 2, 'E': 2, 'F': 2, 'G': 2, 'H': 3, 'I': 3}

# 初始化:网桥自己生成的转发表
FIB = pd.DataFrame(columns=['address', 'port'])

# 读取文件
df1 = pd.read_csv('frame_data1.csv')
df2 = pd.read_csv('frame_data2.csv')
print(df1)
print(df2)

# 获取两文件的最大行数
max_rows = max(len(df1), len(df2))

# 从两个文件中 交替读入帧数据
index1 = 0
index2 = 0
for i in range(max_rows):
    if index1 < len(df1):
        # 获取文件1的一行数据,并转为列表:[targetAddr,sourceAddr,data]
        line1 = list(df1.iloc[index1])
        print(line1)
        func(line1)
        index1 += 1

    if index2 < len(df2):
        # 获取文件2的一行数据,并转为列表:[targetAddr,sourceAddr,data]
        line2 = list(df2.iloc[index2])
        print(line2)
        func(line2)
        index2 += 1

# 读完帧,打印转发表
print(FIB)

结果如图:
在这里插入图片描述

📍实验心得

1.编程语言的选择:
初次编写实验程序时,自然容易想到可以用C++实现,不过考虑到如果要写出高效简洁的代码,无非要借助STL标准库中一些容器vector、字典map等,如果用到这些数据结构,java其实也有类似的库,更能方便地实现。于是我开始着手用java写,但是用到读入文件时,所用的读文件语句包括FIle、Scanner等,其实也是能感觉到稍微有点麻烦。由此想到,在前一周进行数模比赛时,用python的panda包读入相当方便,因此最终选用python进行实现。

2.帧数据的创建:
一方面,手动输入比较麻烦,且容易出现格式错误,采用程序来创建帧比较方便;另一方面,采用程序随机创建帧数据,方便测试多组数据,验证程序的正确性。

3.如何交替读入文件的帧数据:
“交替”做某个操作其实很容易实现,但是如果说两个文件中的帧数据个数不一样,即其中一个文件读完后,可以直接读完另一个文件,这让我联想到上学期学数据结构,把两个链表合成一个链表时(当然大多情况是两个链表长短不一),利用双指针就能轻松实现,于是照猫画虎,也就解决了交替读入文件的问题。
在这里插入图片描述
4. 总结:
本次实验也让我加深了对网桥功能和网桥转发算法的理解,体会了校验码实现的过程,更深入地掌握计算机网络的知识。同时对于python更加熟练,这次尝试使用Python来完成这次实验,代码简洁,结构清晰,体验不错,并且实验达到了预期结果,相信以后做相关demo时会更有底气优先选择python实现。
对于网桥、交换机、路由器,我有了更深的认识:
① 网桥:主要用于连接两个局域网(LAN)并传输数据。它通过MAC地址来判断数据包该传输到哪一个网段。
② 交换机:也是连接多个设备的网络设,与网桥不同的是,当交换机接收到数据包时,它会先检查目标MAC地址,并将数据包仅发送到目标设备上,而不是广播给所有设备。
③ 路由器:是连接不同网络的设备,通常被称为“网关”,它通过IP地址来识别网络设备和网络之间的连接,并可以将数据包从一个网络传输到另一个网络
总的来说,网桥用于简单的局域网连接,交换机用于局域网中设备之间的数据传输,而路由器则用于连接不同网络之间的数据传输。
5. 改进方向:
程序实现的“动态”,仅是只能够对静态文件进行扫描读取,之后动态生成转发表。在面对动态增加(PC机、端口号等)时,难以进行处理,解决办法要从根本对文件进行动态处理化,只有这样才能真正模拟网络的动态。比如在程序中增加内容导出等细节,使每次实验都不独立。

附:另一个实验:计算机网络实验(5)–网络程序设计–计算校验和

  • 1
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值