计算机网络(第十九题)

113 阅读4分钟

3.4扩展的以太网

在许多情况下,我们希望对以太网的覆盖范围进行扩展。本节先讨论在物理层对以太网扩 展,然后讨论在数据链路层对以太网扩展。 这种扩展的以太网在网络层看来仍然是一个网络。 3.4.1 在物理层扩展以太网 以太网上的主机之间的距离不能太远(例如,10BASE-T 以太网的两台主机之间的距离 不超过200米),否则主机发送的信号经过铜线的传输就会衰减到使 CSMA/CD 协议无法正 常工作。在过去广泛使用粗缆或细缆以太网时,常使用工作在物理层的转发器来扩展以太网 ·97 ·

的地理覆盖范围。那时,两个网段可用一个转发器连接起来。 IEEE 802.3 标准还规定,任意 两个站之间最多可以经过三个电缆网段。但随着双绞线以太网成为以太网的主流类型,扩展 以太网的覆盖范围已很少使用转发器了。 现在,扩展主机和集线器之间的距离的一种简单方法就是使用光纤(通常是一对光 纤)和一对光纤调制解调器,如图3-23所示。

光纤调制解调器的作用就是进行电信号和光信号的转换。由于光纤带来的时延很小, 并且带宽很宽,因此使用这种方法可以很容易地使主机和几公里以外的集线器相连接。 如果使用多个集线器,就可以连接成覆盖更大范围的多级星形结构的以太网。例如, 一个学院的三个系各有一个10BASE-T 以太网(图3-24(a)), 可通过一个主干集线器把各系 的以太网连接起来,成为一个更大的以太网(图3-24(b))。

这样做可以有以下两个好处。第一,使这个学院不同系的以太网上的计算机能够进行 跨系的通信。第二,扩大了以太网覆盖的地理范围。例如,在一个系的10BASE-T 以太网 中,主机与集线器的最大距离是100 m, 因而两台主机之间的最大距离是200 m。 但在通过 主干集线器相连接后,不同系的主机之间的距离就可扩展了,因为集线器之间的距离可以是 100m (使用双绞线)或甚至更远(如使用光纤)。

请你举一个简单的代码示例。

以下是一个使用Python编写的简单示例代码,演示了如何在以太网中模拟主干集线器和连接的多个子网。代码使用了面向对象的编程方法,创建了一个EthernetNetwork类,其中包含主干集线器和多个子网的信息和功能。

class EthernetNetwork:
    def __init__(self):
        self.backbone_hub = Hub()  # 创建主干集线器对象
        self.subnets = []  # 创建子网列表

    def add_subnet(self, subnet):
        self.subnets.append(subnet)  # 添加子网到子网列表

    def connect_subnets(self):
        for subnet in self.subnets:
            self.backbone_hub.connect(subnet)  # 将主干集线器连接到每个子网的集线器

    def transmit_message(self, source_subnet, destination_subnet, message):
        source_subnet.send_message(message)  # 在源子网发送消息
        self.backbone_hub.broadcast_message(source_subnet, destination_subnet, message)  # 主干集线器广播消息
        destination_subnet.receive_message(message)  # 在目标子网接收消息


class Hub:
    def __init__(self):
        self.connected_subnets = []

    def connect(self, subnet):
        self.connected_subnets.append(subnet)  # 将子网连接到集线器

    def broadcast_message(self, source_subnet, destination_subnet, message):
        for subnet in self.connected_subnets:
            if subnet != source_subnet and subnet != destination_subnet:
                subnet.receive_message(message)  # 广播消息到所有连接的子网


class Subnet:
    def __init__(self, name):
        self.name = name

    def send_message(self, message):
        print(f"{self.name}: Sending message - {message}")

    def receive_message(self, message):
        print(f"{self.name}: Received message - {message}")


# 创建以太网网络对象
ethernet_network = EthernetNetwork()

# 创建子网对象
subnet1 = Subnet("Subnet 1")
subnet2 = Subnet("Subnet 2")
subnet3 = Subnet("Subnet 3")

# 将子网添加到以太网网络中
ethernet_network.add_subnet(subnet1)
ethernet_network.add_subnet(subnet2)
ethernet_network.add_subnet(subnet3)

# 连接子网
ethernet_network.connect_subnets()

# 在子网之间传输消息
ethernet_network.transmit_message(subnet1, subnet2, "Hello, Subnet 2!")

这个简单的代码示例展示了一个以太网网络,其中包含一个主干集线器和三个子网。主干集线器通过连接子网的集线器来扩展以太网的地理范围。代码中的send_message方法表示在子网中发送消息,receive_message方法表示接收消息。transmit_message方法用于在两个子网之间传输消息,演示了跨子网通信的实现。

Subnet 1: Sending message - Hello, Subnet 2!
Subnet 3: Received message - Hello, Subnet 2!
Subnet 2: Received message - Hello, Subnet 2!

根据之前提供的代码示例,在模拟的以太网网络中,当在 Subnet 1 中发送消息 "Hello, Subnet 2!" 时,消息将通过主干集线器广播到其他所有连接的子网。

因此,输出的结果应为:

Subnet 1: Sending message - Hello, Subnet 2!
Subnet 3: Received message - Hello, Subnet 2!
Subnet 2: Received message - Hello, Subnet 2!

其中,"Subnet 1: Sending message - Hello, Subnet 2!" 表示在 Subnet 1 中发送消息,"Subnet 3: Received message - Hello, Subnet 2!" 表示在 Subnet 3 中收到了该消息,"Subnet 2: Received message - Hello, Subnet 2!" 表示在 Subnet 2 中也收到了该消息。这表明消息成功地从 Subnet 1 广播到了 Subnet 2 和 Subnet 3。