前言
上一次写博客竟然还是上一次。。
这个博客发布之前,上面暂时还只有一个 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!
泪目,但是似乎没有必要泪目。
算了。(我要给他完整的一生!!!— 没看过流浪地球的话忽略这句。)
