linux网桥中stp分析,linux网桥中stp分析

本文详细介绍了Linux系统中STP(Spanning Tree Protocol)的工作原理和实现,包括STP的状态转换、关键点以及网桥数据处理流程。分析了网桥在数据包接收、转发和发送过程中的处理细节,以及STP数据包如何在LLC层被处理。同时,文章提及了快速STP(RSTP)的概念,强调了其快速切换网络拓扑的能力。

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

STP(Spanning Tree Protocol)是一个二层管理生成树协议。在一个扩展的局域网中参与STP的所有交换机之间通过交换桥协议数据单元bpdu(bridge protocol data unit)来实现;为稳定的生成树拓扑结构选择一个根桥;为每个交换网段选择一台指定交换机;将冗余路径上的交换机置为blocking,来消除网络中的环路.其标准在IEEE 802.1d定义,提供网络的动态冗余切换机制.

rSTP(rapid spanning tree protocol)是STP的扩展,其主要特点是增加了端口状态快速切换的机制,能够实现网络拓扑的快速转换.

STP通过阻塞一个或多个冗余端口,维护一个无回路的网络(IEEE802.1d)

2 代码分析

1) 软中断网桥接收数据

int netif_receive_skb(struct sk_buff *skb)

{

...

skb_reset_network_header(skb);

skb_reset_transport_header(skb);

skb->mac_len = skb->network_header - skb->mac_header;

...

/* 网桥处理 */

skb = handle_bridge(skb, &pt_prev, &ret, orig_dev);

if (!skb)

goto out;

...

type = skb->protocol;

list_for_each_entry_rcu(ptype,

&ptype_base[ntohs(type) & PTYPE_HASH_MASK], list) {

if (ptype->type == type &&

(ptype->dev == null_or_orig || ptype->dev == skb->dev ||

ptype->dev == orig_dev)) {

if (pt_prev)

ret = deliver_skb(skb, pt_prev, orig_dev);

pt_prev = ptype;

}

}

if (pt_prev) {

ret = pt_prev->func(skb, skb->dev, pt_prev, orig_dev);

} else {

kfree_skb(skb);

ret = NET_RX_DROP;

}

out:

rcu_read_unlock();

return ret;

}

static inline struct sk_buff *handle_bridge(struct sk_buff *skb,

struct packet_type **pt_prev, int *ret,

struct net_device *orig_dev)

{

struct net_bridge_port *port;

/* 非网桥数据, 交给后面的网络层来处理 */

if (skb->pkt_type == PACKET_LOOPBACK ||

(port = rcu_dereference(skb->dev->br_port)) == NULL)

return skb;

if (*pt_prev) {

*ret = deliver_skb(skb, *pt_prev, orig_dev);

*pt_prev = NULL;

}

/* 网桥处理 */

return br_handle_frame_hook(port, skb);

}

static int __init br_init(void)

{

...

/* 网桥HOOK点注册 */

err = br_netfilter_init();

if (err)

goto err_out1;

...

/* 网桥处理接口 */

br_handle_frame_hook = br_handle_frame;

...

}

int __init br_netfilter_init(void)

{

int ret;

ret = nf_register_hooks(br_nf_ops, ARRAY_SIZE(br_nf_ops));

...

return 0;

}

static struct nf_hook_ops br_nf_ops[] __read_mostly = {

{ .hook = br_nf_pre_routing,

.owner = THIS_MODULE,

.pf = PF_BRIDGE,

.hooknum = NF_BR_PRE_ROUTING,

.priority = NF_BR_PRI_BRNF, },

{ .hook = br_nf_local_in,

.owner = THIS_MODULE,

.pf = PF_BRIDGE,

.hooknum = NF_BR_LOCAL_IN,

.priority = NF_BR_PRI_BRNF, },

{ .hook = br_nf_forward_ip,

.owner = THIS_MODULE,

.pf = PF_BRIDGE,

.hooknum = NF_BR_FORWARD,

.priority = NF_BR_PRI_BRNF - 1, },

{ .hook = br_nf_forward_arp,

.owner = THIS_MODULE,

.pf = PF_BRIDGE,

.hooknum = NF_BR_FORWARD,

.priority = NF_BR_PRI_BRNF, },

{ .hook = br_nf_local_out,

.owner = THIS_MODULE,

.pf = PF_BRIDGE,

.hooknum = NF_BR_LOCAL_OUT,

.priority = NF_BR_PRI_FIRST, },

{ .hook = br_nf_post_routing,

.owner = THIS_MODULE,

.pf = PF_BRIDGE,

.hooknum = NF_BR_POST_ROUTING,

.priority = NF_BR_PRI_LAST, },

{ .hook = ip_sabotage_in,

.owner = THIS_MODULE,

.pf = PF_INET,

.hooknum = NF_INET_PRE_ROUTING,

.priority = NF_IP_PRI_FIRST, },

{ .hook = i

### Linux网桥的配置与使用 #### 一、Linux 网桥的概念 Linux 网桥是一种虚拟网络设备,它可以在数据链路层(第二层)连接多个网络接口。通过这种方式,可以实现不同物理或逻辑网络之间的通信[^1]。 #### 二、网桥的主要功能 网桥主要用于将多个网络接口聚合在一起形成一个单一的广播域。这使得来自任何一侧的数据包都可以被转发到其他侧,只要目标地址位于该广播域内。这对于创建复杂的网络拓扑非常有用,在云计算环境中尤为常见,用于支持虚拟机间的高效通讯[^2]。 #### 三、CentOS系统的网桥配置命令 对于基于Red Hat的企业级Linux发行版如CentOS来说,可以通过`nmcli`工具来快速设置临时性的网桥: ```bash # 创建一个新的名为bridge0 的网桥连接 $ nmcli con add type bridge ifname bridge0 # 将现有以太网口 eth0 添加至新建立好的网桥上作为端口成员之一 $ nmcli con modify "System eth0" master bridge0 slave-type bridge-port ``` 上述操作完成后即可立即生效而无需重启服务;但是需要注意的是这些更改仅适用于当前会话期间有效,一旦计算机重新启动则需再次执行相同指令恢复配置[^4]。 #### 四、持久化的网桥配置方案 为了使网桥配置能够在系统重引导之后仍然保持不变,应当编辑相应的网络脚本文件来进行永久保存。例如在RHEL/CentOS系列操作系统里,可复制并修改默认网卡配置模板为新的网桥定义文件 `/etc/sysconfig/network-scripts/ifcfg-br0` ,然后调整其中的关键参数比如IP地址分配模式(`BOOTPROTO`)等细节信息以便满足实际需求[^3]。 另外一种更现代化的方法是在Ubuntu及其衍生版本中利用Netplan YAML语法描述整个过程: ```yaml network: version: 2 bridges: br0: interfaces: [eth0] dhcp4: no addresses: ['192.0.2.1/24'] gateway4: '192.0.2.254' nameservers: addresses: ['192.0.2.253'] search: ['example.com'] ``` 此段YAML文档应放置于路径类似于 `/etc/netplan/*.yaml` 下面,并且记得应用变更 `sudo netplan apply` 后才能让设定真正起效[^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值