FDB(过滤数据库)如何填写

网络工程 转变 网络 第 2 层 苹果电脑 硬件
2022-03-06 09:32:05

我想了解 FDB 中用作 VLAN 列的内容。对于 ACCESS 端口,如果帧未标记,则为 PVID;如果帧已标记,则为帧 VID,对于 TRUNK,是否允许 VLAN?

我们可以将 FDB 的 CAM 记录在一个表中表示为如下结构:

type FdbEntry struct {
    Port    uint16
    Address MACAddr
    Type    uint8
    Vlan    []uint16
    TTL     Duration
}

但是如果帧来到trunk端口,trunk端口可以有多个VLAN,我们分别在Vlan字段中设置一个在trunk接口上指定的VLAN数组。如果端口是 ACCESS,我们使用 PVID。由于与 CAM 表一起获取记录的最快选项是通过哈希映射,因此密钥必须是唯一的,并且我们使用发送者的 MAC 地址作为密钥。这就是为什么 Vlan 字段是一个数组。

当帧到来时,我们必须在 FDB 中找到一个条目(因为我们支持 802.1Q)如果找到了一个条目,我们一定要检查入口端口 ID 和入口端口 ID,因为设备可能会重新连接到另一个端口,因此必须相应地更改端口 ID。如果找不到条目,​​我们必须在表 (FDB) 中创建一个条目,并将入口端口的 PVID 作为Vlan字段。或者如果标记了入口帧,我们必须将帧 VID 设置为Vlan字段而不是入口 PVID?

t = FdbEntry{
    Port:    ingressPort.Id,
    Address: ingressFrame.srcAddr,
    Type:    DYNAMIC,
    Vlan:    ingressPort.Vlans(),
    TTL:     60 * Second,
}

检查“MAC 运动时刻”

isMoved = fdbEntry.Port != ingressPort.Id
if isMoved {
    // Be sure to check if a frame came to us, but from under a different port,
    // we must necessarily overwrite the port in the table.
    t = FdbEntry{
        Port:    ingressPort.Id,
        Address: fdbEntry.Address,
        Type:    fdbEntry.Type,
        Vlan:    fdbEntry.Vlan,
        TTL:     fdbEntry.TTL,
    }
    fdbTable.Update(ingressFrame.srcAddr, t) // update hash-map 
}

见下图:

在此处输入图像描述

此外,我们是在帧到达后立即添加条目(仅在入口过滤(如果启用)之后),还是仅在入口、出口过滤、转发过程成功时添加条目?

1个回答

每个 VLAN 都被视为一个单独的 L2 段或转发域。

您不能仅通过目标 MAC 地址转发,因为这会违反这些域。此外,MAC 地址学习需要限制在当前域,因为 MAC 可能位于不同 VLAN 的不同端口上。

关于您的其他问题,同时处理 VLAN 过滤和转发是有效的。将 VLAN ID(或 VLAN 表的索引)视为 MAC 地址的扩展是合理的。在帧入口时,您需要检查入站端口是否允许使用标记的 VLAN 访问。此外,在中继端口上,可能无法定义/允许未标记的帧。非法帧被丢弃。

合法帧与 CAM 表匹配,目标 MAC 可能由 VLAN ID 扩展,具体取决于实现 - 请记住,交换机正在硬件中进行所有转发。

请注意,使用组合的 VLID-MAC 地址,您只能匹配指定 VLAN 上的目标 MAC - 如果 MAC 不存在,则将其视为未知,并且该帧将被泛洪到所有 VLAN 端口。

在出口处,当该 VLAN 未标记(访问端口或中继端口上的本机 VLAN)时,需要删除标记。