【小菜学网络】观察集线器与交换机 (2)

sendether 是一个自制命令,用于发送以太网帧。其中,-i 指定发送网卡,-t 指定目的地址,-T 指定数据类型,-d 指定要发送的数据。后续的编程环节,我们会讲解 sendether 是如何封装、发送以太网帧的。

我们立马看到主机 bee 上的 tcpdump 抓到一个以太网帧,它就是 ant 发出来的 hello, world! :

root@bee [ ~ ] ➜ tcpdump -ni eth0 tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes 16:37:27.254658 32:90:b9:9f:35:56 > a2:17:41:bb:cd:98, ethertype Unknown (0x0900), length 27: 0x0000: 6865 6c6c 6f2c 2077 6f72 6c64 21 hello,.world!

注意到,主机 cicada 也收到这个帧,这符合集线器的行为:

root@cicada [ ~ ] ➜ tcpdump -ni eth0 tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes 16:37:27.254624 32:90:b9:9f:35:56 > a2:17:41:bb:cd:98, ethertype Unknown (0x0900), length 27: 0x0000: 6865 6c6c 6f2c 2077 6f72 6c64 21 hello,.world!

由于这个帧的目的主机并不是 cicada ,cicada 协议栈将丢弃它。

实验二:观察以太网交换机

本实验将 3 台 Linux 主机连到一个交换机上,以此观察交换机的工作行为,网络拓扑图如下:

实验环境同样通过 docker 容器提供,执行以下命令即可一键打开:

docker run --name switch-lab --rm -it --privileged --cap-add=NET_ADMIN --cap-add=SYS_ADMIN -v /data -h switch fasionchan/netbox:0.5 bash /script/switch-lab.sh

实验环境启动后,可以看到 4 个由 tmux 命令划分的窗口,分别代表 3 台主机以及交换机。

为了方便观察交换机 MAC 地址学习的过程,我们为每台主机设置了一个很好分辨的 MAC 地址:

主机 网卡 MAC地址 交换机端口
ant   eth0   40:aa:aa:aa:aa:aa   1  
bee   eth0   40:bb:bb:bb:bb:bb   2  
cicada   eth0   40:cc:cc:cc:cc:cc   3  

实验环境中的交换机由 bridge 虚拟设备模拟,设备名为 switch0 :

root@switch [ ~ ] ➜ ip link show switch0 4: switch0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default qlen 1000 link/ether 4a:9e:f8:3c:75:40 brd ff:ff:ff:ff:ff:ff

执行 brctl 命令,可以查看交换机当前的 MAC 地址表:

root@switch [ ~ ] ➜ brctl showmacs switch0 port no mac addr is local? ageing timer 3 4a:9e:f8:3c:75:40 yes 0.00 3 4a:9e:f8:3c:75:40 yes 0.00 2 6a:64:44:0d:d1:55 yes 0.00 2 6a:64:44:0d:d1:55 yes 0.00 1 be:24:47:bd:f2:52 yes 0.00 1 be:24:47:bd:f2:52 yes 0.00

噫?怎么 MAC 地址表已经有一些条目了?我们明明还没有在任何主机上发数据,地址表按理说应该是空的呀!

其实,这些 MAC 地址是交换机自己的, is local 列值都是 yes 。如果将该列值为 yes 的记录过滤掉,就可以确认 MAC 地址表确实为空(暂未学习到任何地址):

root@switch [ ~ ] ➜ brctl showmacs switch0 | grep -v yes port no mac addr is local? ageing timer

现在,我们在主机 ant 上往主机 bee 发送一个以太网帧,来观察交换机行为。开始之前,我们先在主机 bee 和 cicada 上运行 tcpdump 命令来嗅探网络流量。

root@bee [ ~ ] ➜ tcpdump -ni eth0 root@cicada [ ~ ] ➜ tcpdump -ni eth0 root@ant [ ~ ] ➜ sendether -i eth0 -t 40:bb:bb:bb:bb:bb -d 'hello, bee!'

这个帧成功发出去后,我们同时在主机 bee 和 cicada 上观察它。原因在于,交换机还没学到主机 bee 的 MAC 地址,只能将这个帧转发到其他所有端口,因此 cicada 也会收到它。

root@bee [ ~ ] ➜ tcpdump -ni eth0 tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes 16:40:34.437330 40:aa:aa:aa:aa:aa > 40:bb:bb:bb:bb:bb, ethertype Unknown (0x0900), length 25: 0x0000: 6865 6c6c 6f2c 2062 6565 21 hello,.bee! root@cicada [ ~ ] ➜ tcpdump -ni eth0 tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes 16:40:34.437152 40:aa:aa:aa:aa:aa > 40:bb:bb:bb:bb:bb, ethertype Unknown (0x0900), length 25: 0x0000: 6865 6c6c 6f2c 2062 6565 21 hello,.bee!

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wsxjdz.html