📜  网桥(本地联网设备)(1)

📅  最后修改于: 2023-12-03 14:57:00.965000             🧑  作者: Mango

网桥(本地联网设备)

网桥是一种本地联网设备,能够在网络中连接多个局域网,并将数据包转发到对应的目标地址,从而实现不同局域网之间的通信。

网桥的工作原理

网桥的主要工作原理是学习和转发。

学习

网桥能够学习到连接它的每个局域网上的MAC地址,以及这些地址所对应的端口。当一个数据包到达网桥时,网桥会检查数据包的源MAC地址,并记录该地址所对应的端口。

这样,网桥就能够知道每个MAC地址所在的局域网,以及怎样将数据包转发到目标地址所在的局域网。

转发

网桥能够通过将数据包从一端口转发到另一个端口,实现不同局域网之间的通信。当一个数据包到达网桥时,网桥会查找目标MAC地址所对应的端口,并将数据包转发到这个端口。

如果目标MAC地址所对应的端口不在同一个局域网上,网桥会将数据包转发到与目标MAC地址所在局域网相连的端口。

网桥的优点

相比于集线器和交换机,网桥有以下优点:

  • 改善网络性能:当一个数据包被发送到网络中时,网桥只会将数据包发送到目标MAC地址所在的端口,而不是向所有端口广播,这样比集线器更加高效。

  • 具备更强大的策略:网桥能够基于MAC地址等属性,实施更加灵活的策略,比如隔离具有特定属性的数据流,为这些数据流分配更多的带宽等。

  • 对网络可靠性的提升:当在网络中出现环路时,网桥能够将数据包阻止在某个端口进入网络中,从而防止冲突和丢包。

代码示例

以下是Python中使用scapy库构建一个简单的网桥程序的示例:

from scapy.all import *

class Bridge:
    def __init__(self, iface_1, iface_2):
        self.iface_1 = iface_1
        self.iface_2 = iface_2
        self.mac_table = {}

    def forward_packet(self, pkt):
        if (pkt.src not in self.mac_table):
            self.mac_table[pkt.src] = pkt.recv_iface
        if (pkt.dst in self.mac_table):
            dest_iface = self.mac_table[pkt.dst]
            if (dest_iface == pkt.recv_iface):
                return
            pkt.recv_iface = pkt.sent_iface
            pkt.sent_iface = dest_iface
            sendp(pkt, iface=dest_iface)
        else:
            self.mac_table[pkt.dst] = pkt.recv_iface
            sendp(pkt, iface=self.iface_1)
            sendp(pkt, iface=self.iface_2)

    def run(self):
        sniff(iface=[self.iface_1, self.iface_2], prn=self.forward_packet)

bridge = Bridge('eth0', 'eth1')
bridge.run()

以上代码中,我们创建了一个Bridge类,其中包含了两个接口,以及用于存储MAC地址的mac_table字典。当数据包到达Bridge时,我们会查找源MAC地址和目标MAC地址所对应的端口,并将其存储在mac_table中。然后,我们根据mac_table中的记录,将数据包转发到对应的端口。

我们通过使用scapy库中的sendp函数,实现了将数据包发送到指定接口的功能。同时,我们在接收到数据包时,从中提取出recv_iface和sent_iface,用于标记数据包是从哪个接口接收的,以及将要发送到哪个接口。

在程序中使用了sniff函数,可以在不停止程序的情况下,持续接收数据包,并将其转发到相应的接口上。