基于Linux的交换机功能实现

本文详细介绍了如何通过Mininet和Wireshark进行交换机转发实验,包括交换机的数据结构学习、操作流程、问题解决和实验结果验证。重点探讨了端口信息、mac地址映射与转发表的维护,以及广播和数据包转发的实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.实验题目

交换机转发实验

2.实验目的

  • 学习交换机的工作原理;
  • 学习交换机转发和广播数据包的流程;
  • 学习转发表的数据结构;
  • 学习转发表的维护操作。

3.实验环境

  • 虚拟平台:Vmware Workstation Pro
  • 操作系统:Ubuntu 16.04 LTS
  • gcc:5.4.0
  • python:2.7.12
  • Mininet:2.3.0
  • Wireshark:2.6.10

4.实验内容

  • 在主机 h2 和 h3 上分别打开 wireshark 程序,监听各自主机的 eth0 端口(h2-eth0 和 h3-eth0)。
  • 在 h1 主机上分别 ping h2 和 h3 两个主机,在 h2 和 h3 两个主机上的 wireshark 捕获的应该只包含自己节点和 h1 产生的数据包。

5.实验流程

  1. 首先分析交换机中所包含的数据结构:
    ①端口信息结构体:iface_info_t

该结构体存放了交换机上的端口信息,包括文件描述符、端口ID、mac地址、端口名称,并通过内核链表进行连接。

②mac 地址与端口映射表:mac_port_entry

该结构体存放了交换机记录的转发mac地址,与mac地址对应的转发端口信息,以及老化时间visited,也是通过内核链表进行连接。

③mac 地址与 hash 映射表:mac_port_map_t

该结构体通过内存放了256个hash key,每个hash key 通过内核链表串联起映射到自己的mac地址表(即上述第②个结构体),结构体内还包含互斥锁供多线程操作。
  1. 实现对数据结构 mac_port_map 的所有操作,以及数据包的转发和广播操作。

①首先实现 iface_info_t *lookup_port(u8 mac[ETH_ALEN])函数,该函数的难点在于遍历 hash 表来找到对应的端口号,但内核链表给我们提供了宏函数 list_for_each_entry 来进行遍历操作。

我的实现过程是首先根据 mac 地址计算对应的 hash 值,然后通过 list_for_each_entry 宏函数对对应 hash 值下的链表进行遍历,遍历时加互斥锁,退出时解锁,通过 findFlag 作为找到对应 mac 地址的标志。若找到,则在退出时更新老化时间 visit,并返回转发端口;若未找到,则在退出时返回 null。

②接下来实现 void insert_mac_port(u8 mac[ETH_ALEN], iface_info_t *iface)函数。

该函数主要是对结构体 mac_port_entry_t 的操作,首先构建要插入的端口信息结构体,然后计算该收到包的 mac 地址对应的 hash 值,将该结构体插入到对应 hash 值下的链表,该插入操作是通过内核链表提供的宏函数 list_add_head 所完成的,执行插入操作时,对映射表加互斥锁。

③接下来是 int sweep_aged_mac_port_entry()函数的实现。

该函数的难点在于遍历并删除超过 30 秒未访问的转发条目,通过内核链表提供的 list_for_each_entry_safe 宏函数对链表进行遍历,找到与当前时间差超过 30 的条目并执行删除操作,删除操作使用的也是系统提供的宏函数。在调试过程中发现,执行 free 操作必须要使用 safe 的遍历方法,否则会产生指针错误。

④接下来是 void broadcast_packet(iface_info_t *iface, char *packet, int len)函数的实现。

该函数要实现的是广播操作,通过 list_for_each_entry 函数进行遍历,找到非发送端口并将数据包发送出去,实现广播操作。

⑤最后是实现 void handle_packet(iface_info_t *iface, char *packet, int len)函数。

该函数要实现的是包处理功能,收到数据包后首先获取包内的目的地址,通过 lookup_port 函数查找转发表中是否存在对应的转发端口,若存在,则通过对应端口转发,否则广播该数据包。之后获取数据包的源地址,在转发表中若未找到该地址的条目,则将其 mac 地址以及对应端口插入至转发表。

  1. 基于 Ubuntu 系统,在 mininet 平台验证交换机程序的正确性
  • 首先通过 make 命令,对所有代码进行联合编译。

  • 打开终端,运行 sudo python2 three_nodes_bw.py 命令,启动老师给定的拓扑结构。

  • 在 mininet 平台上,通过 xterm s1 h2 h3 命令,启动 s1,h2,h3 的虚拟终端。

  • 在 s1 上运行./switch 命令,启动交换机程序。

  • 在 h2 和 h3 上运行 sudo wireshark 命令,启动 wireshark 软件,并监听各自的 eth0 端口的网络数据。至此的运行界面如图 1 所示。

  • 在 mininet 中运行 h1 ping h2 和 h1 ping h3 命令。

h1 ping h2 的结果如图 2 所示,在 h2-eth0 端口捕获到了源地址为 h1 目的地址为 h2 的数据包,同时,在 h3-eth0 端口没有捕捉到来自 h1 的数据包,只有 ARP 的广播地址包。
h1 ping h3 的结果如图 3 所示,在 h3-eth0 端口捕获到了源地址为 h1 目的地址为 h3 的数据包,同时,在 h2-eth0 端口没有捕捉到来自 h1 的数据包,只有 ARP 的广播地址包。
老化操作如图 4 所示,s1 主机展示了删除表项的信息(最后一行)。
实验结果表明,基本符合实验要求,实现了交换机对数据包的转发功能以及转发表的维护。

图 1 实验初始化环境展示

图 2 h1 ping h2 实验结果

图 3 h1 ping h3 实验结果

图 4 s1 交换机删除表项信息

6.实验问题分析

  1. 实验过程中遇到的第一个问题是内核链表的使用,通过资料的查找和学习,理解了其工作原理,通过计算结构体中链表的地址以及结构体的地址来找到结构体指针应该指向的首位置,以此来实现对结构体的访问以及修改等操作。
  2. 代码编写过程中,在遍历链表时卡了一段时间,主要原因是因为先使用了系统提供的宏函数 list_for_each_entry(),并在遍历过程中 free()了传入的指针,之后查找了更多的资料后,发现了系统也提供了一种 safe 的遍历方法,即多借用一个中转指针来保存遍历指针位置,可以安全的调用 free()方法且不会引起错误。
    for_each_entry(),并在遍历过程中 free()了传入的指针,之后查找了更多的资料后,发现了系统也提供了一种 safe 的遍历方法,即多借用一个中转指针来保存遍历指针位置,可以安全的调用 free()方法且不会引起错误。
<think>好的,我现在需要帮助用户了解Linux环境下的交换机基础知识及配置方法。首先,用户提到的“Linux交换机”可能有点混淆,因为通常交换机是硬件设备,而Linux本身是操作系统。但可能用户指的是在Linux系统中配置软件交换机,比如使用bridge-utils或者Open vSwitch(OVS)等工具。也有可能用户想了解如何通过Linux系统来管理物理交换机的配置,比如通过SSH或SNMP。 接下来,我需要参考用户提供的引用内容。引用[1]、[4]、[5]主要讲的是硬件交换机的基本原理,比如MAC地址学习、VLAN、双工模式等。引用[2]、[3]涉及Linux下的多网卡绑定(bonding)模式及其与交换机的配合配置。用户的问题可能更偏向于如何在Linux系统中进行类似交换机网络配置,比如创建虚拟交换机或配置网络桥接。 首先,我需要明确Linux环境下常见的交换机相关技术: 1. **网络桥接(Bridge)**:使用bridge-utils创建软件桥接,模拟交换机功能实现二层数据帧转发。 2. **Open vSwitch(OVS)**:更高级的虚拟交换机,支持VLAN、STP、流量控制等。 3. **网卡绑定(Bonding)**:将多个物理网卡聚合为一个逻辑接口,提高带宽或冗余,需要与交换机的端口聚合(如LACP)配合。 4. **VLAN配置**:在Linux中通过vconfig或ip命令配置虚拟局域网。 用户可能需要了解这些内容的基础配置和原理。需要结合引用中的信息,比如bonding模式与交换机端口的聚合配置(引用[2]、[3])、交换机的MAC学习(引用[4])、双工模式(引用[5])等。 接下来,我应该分步骤解释这些技术,并给出配置示例。例如,配置网络桥接的步骤、使用OVS创建虚拟交换机、设置bonding的不同模式及其对应的交换机配置要求。同时,需要强调与硬件交换机的交互,比如在mode 0 bonding时交换机需要配置端口聚合,而mode 6则不需要(引用[3])。 还需要注意用户可能的误区,比如Linux本身不充当传统交换机,而是通过软件实现类似功能。因此,要明确说明这些技术的适用场景和限制。 最后,生成相关问题,帮助用户进一步学习,比如询问不同bonding模式的区别、VLAN配置方法或故障排除技巧。</think>### Linux环境下的交换机基础配置及原理 在Linux系统中,"交换机"通常指**软件实现网络交换功能**,主要通过虚拟网络设备实现二层数据转发。以下是关键技术与配置方法: --- #### 一、基础原理 1. **数据链路层操作** Linux软件交换机基于MAC地址表进行帧转发,与物理交换机原理相同[^4]。通过`bridge`命令可查看MAC地址表: ```bash bridge fdb show ``` 2. **虚拟网络设备类型** - **桥接设备 (Bridge)**:模拟物理交换机,连接多个虚拟或物理接口 - **VLAN子接口**:实现虚拟局域网划分,如`eth0.10`表示VLAN ID 10 - **Bonding接口**:聚合多网卡提升带宽或冗余(需配合交换机配置)[^3] --- #### 二、核心配置方法 ##### 1. 配置网络桥接(软件交换机) ```bash # 安装工具 sudo apt install bridge-utils # 创建桥接设备 brctl addbr br0 # 添加物理/虚拟接口到桥接 brctl addif br0 eth0 brctl addif br0 eth1 # 启用设备 ip link set br0 up ``` ##### 2. Open vSwitch高级配置 ```bash # 创建OVS桥接 ovs-vsctl add-br ovs-br0 # 添加端口并设置VLAN ovs-vsctl add-port ovs-br0 eth0 tag=100 ovs-vsctl add-port ovs-br0 eth1 trunk=100,200 ``` ##### 3. 网卡绑定(Bonding)与交换机协作 | Bond模式 | 特点 | 交换机要求 | |---------|------|-----------| | mode=0 | 负载均衡 | 需启用LACP/静态聚合[^2] | | mode=1 | 主备冗余 | 无需特殊配置 | | mode=6 | 自适应负载均衡 | 独立端口即可[^3] | **配置示例(mode 0):** ```bash # 加载bonding模块 modprobe bonding mode=0 miimon=100 # 创建bond接口 ip link add bond0 type bond ip link set eth0 master bond0 ip link set eth1 master bond0 ``` --- #### 三、关键注意事项 1. **双工模式匹配** 通过`ethtool`确保Linux网卡与交换机端口双工模式一致(全双工/半双工)[^5] ```bash ethtool -s eth0 speed 1000 duplex full ``` 2. **VLAN穿透配置** 在桥接设备中启用VLAN过滤: ```bash bridge vlan add vid 100 dev eth0 bridge vlan add vid 100 dev tap0 ``` 3. **STP协议支持** 防止网络环路(需Linux内核≥3.5): ```bash brctl stp br0 on ``` ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值