网络及其计算 - Lab3

记录一下 Lab3 的一些思路

前言

上一次写博客竟然还是上一次。。

这个博客发布之前,上面暂时还只有一个 Hello World。。

3个多月了,我又回来写这个了。

感觉事情也挺多的,没时间写这些东西,

我改变下思路,写的随意一点什么的,不需要花太长时间写。

要不然是真的没时间。

当个回忆录也行啊。

试试看吧。不知道能坚持几天。

也许又要断更几个月。。。

Whatever。

正文要开始了。

等等,忘了吐槽一下AI了,

之前就说过,AI好厉害什么的,没想到进步的也太快了吧。

全员大逆向时代开始了,软件行业要完蛋了吗?

不知道。

还是继续看正文吧。

网络及其计算 - 实验三

网桥

第一步

收到一个帧先看源 MAC 地址,如果没有就记录,格式: [源地址,接收接口, 时间戳]。

这样就能知道某一个 MAC 地址的设备是在哪个接口。

已有就更新时间戳。

第二步

看该帧的目的 MAC 地址,查转发表。

MAC 地址 接口
… …
  • 目的地址在表里,而且对应的接口(该目的 MAC 地址在转发表对应的接口) ≠ 该帧进来的接

    口,向该接口单独转发。

  • 目的地址在表里,但对应的接口 = 该帧进来的接口,直接丢弃。(因为目的地和发送方在同一个

    网段,不需要这个网桥管)

  • 目的地址不在表里,向除了进入接口以外的所有其他接口广播。

第三步

定时器,用来定时发送测试帧。

编码思路

Bridge 类

  • name: 存网桥名字

  • Map<String, Integer> physicalPorts = new HashMap<>(); - 存每个网桥物理连接着哪些设备,

    用来判断发来的帧归哪个网桥管。String 是 MAC 地址(设备名),Int 是接口号

  • Map<String, TableEntry> forwardingTable = new HashMap<>(); - 存每个网桥的转发表,String 是 MAC 地

    址(设备名), TableEntry 里面有具体接口号和时间

TableEntry 类

这个类存在网桥类里面的 forwardingTable 里的值,有具体的接口号和时间

initializeBridge

初始化两个网桥里面连接的设备与端口,后面用来找某个设备具体属于哪个网桥管,比如 src 是 A,那么需要找哪

个网桥直接连接了 A,连接到 A 的网桥会处理这个帧。

handleFrame

接收 main 函数里的一次帧并处理,Cilent 发送的信息是 A->B。

main 函数解析出 src 和 dest,交给 handleFrame 处理。

首先判断 src 这个主机连接在了哪个网桥(通过网桥里面的 physicalPort 判断)。

连接到的网桥就要处理这个帧(即 physicalPort 里有这个主机的)

通过 physicalPort 能用键(主机名/ MAC ),找到对应的值(接口)。

这样网桥就知道是从哪个接口来的帧了。

通过某个网桥的 receiveFrame 判断需不需要调用另一个网桥的 receiveFrame。

receiveFrame

针对某一个网桥对象实例的方法,

handleFrame 传入 src,dest,inPort,

首先判断源地址在不在表里,在表里就更新时间戳(转发表里的),不在表里就记录这个源地址和它对应的接口

号。

之后判断目的地址,如果在表(转发表)里,并且这个帧进来的接口号和目的接口号(从转发表查出来的)不同,

就单独转发到从转发表里查出来的那个接口号。如果接口号相同就丢弃。(因为目的地址就在这个接口的网络里,

不需要这个网桥转发,这个网络里面就处理好了。)

如果目的地址不在表里,就向除了这个帧进来的接口的其他接口都转发这个帧,因为不知道在哪,所以都发一遍。

返回一个 List,里面是该网桥要向哪些端口转发,给上一级的 handleFrame 来判断需不需要转发给另一个网桥。

printStatus

打印某一个网桥的转发表,用 Enrty 取出每一个键值对打印。

random

Random random = new Random();

random.nextInt();

范围左闭右开。


2026 年 10 月 29 日更新

后记

Phew~(呼~) (对 David Malan 老师拙劣的模仿罢了,纪念一下 CS50)

有兴趣可以搜一下,很好的老师。

我可能会 记 一 辈 子

也没那么夸张……吧

不知道现在学 CS50 还有没有很大用了。

当时做 lab 做的很 “爽”。

你懂的,痛并快乐着。

终于也是考完了,考的也是还行。

软件需求分析和 .NET,

说实话,这周真的忙炸了,又要做网络和数据库实验,又要准备两个考试。

终于过去了。

.NET 考的我觉得偏难了,不知道薅了多少头发才做出来。

不详细说了吧,我以为他会出很简单的题来着。

结果来了个大的,真的是没想到。他。竟然。还有这一面。(是他出的题吗。。不太清楚啊。)

你玩梗玩的很开心嘛。

开个玩笑,私密马赛私密马赛。(真心

注: 私密马赛是对不起的意思。

我感觉可能比我之前的所有语言类的考试难度都难,不知道是不是我的错觉。

也可能是我准备的不够。

对了,我今天来是复习这个 lab 3 的。

也是来刷个 commit。

这个真的是我手敲的代码,看起来确实没那么费劲了。

就是明天能不能讲明白呢?

See You Tomorrow!

我不知道怎么应对 AI 对我的冲击,

但是还是要 感谢 Gemini!

泪目,但是似乎没有必要泪目。

算了。(我要给他完整的一生!!!— 没看过流浪地球的话忽略这句。)

The End