linux 4.12内核 team简介

team是个啥玩意?

team实现的功能跟bond相似,team本质上也是一个虚拟的网卡驱动(network device driver),只不过并没有真实的物理网卡与之对应,而是由这个虚拟网卡去“管辖”一系列的真实的物理网卡,它的代码结构和一般网卡驱动的代码结构非常类似。

team的四种模式

主备模式:activebackup 只有一个网卡处于活跃状态,当一个宕掉另一个备份网卡马上切换到活跃状态。

此算法的优点是可以提供高网络连接的可用性,但是它的资源利用率较低, 只有一个网卡处于工作状态,在有 N 个网络接口的情况下,资源利用率为1/N。

发包处理:从team口转发的包修改skb->dev字段为活跃dev,然后调用dev_queue_xmit进行发包

收包处理:当netif_receive_skb收到包时,经过一系列处理之后,会调用skb->dev->rx_handler函数指针,team设备创建时注册为team_handle_frame。 从主网卡收到的包修改skb->dev字段为team口dev,然后返回netif_receive后续流程处理,此时返回值为RX_HANDLER_ANOTHER。 从备网卡收到的包修改skb->dev字段为team口dev,然后返回netif_receive后续流程处理,此时返回值为RX_HANDLER_EXACT。

备注:当skb->dev->rx_handler返回值为RX_HANDLER_ANOTHER时,netif_recive_skb会goto至函数入口进行处理。 当返回值为RX_HANDLER_EXACT时,netif_recive_skb不会将skb交给上层协议处理。

广播模式:broadcast 所有网卡设备均处于活跃状态,即在每个接口上传输每个数据包,此模式提供了容错能力,此模式增加了系统开销。

发包处理:从team口转发包时,遍历当前team关联的接口列表,依次修改skb->dev字段为slave dev,并调用dev_queue_xmit发包。

收包处理:在netif_receive_skb调用skb->dev->rx_handler时,会修改skb->dev字段为team口dev,并返回RX_HANDLER_ANOTHER。

loadbalance负载均衡模式:loadbalance 所有网卡设备均处于活跃状态,根据port负载情况分配外出流量,同时如果其中某个port异常,另外的port会接管。此模式主要提升吞吐量,以及容错能力。

发包处理:通过bfp提供的负载均衡算法获取一个hash索引,调用当前指定的hash算法传入hash索引获取相应的port 修改skb->dev字段为port dev,并调用dev_queue_xmit发包。

收包处理:在netif_receive_skb调用skb->dev->rx_handler时,会修改skb->dev字段为team口dev,然后对skb进行判断 如果是LACPDU,则返回RX_HANDLER_EXACT,否则返回RX_HANDLER_ANOTHER。

随机平衡策略:random 所有网卡均处于活跃状态,发包时以生成随机索引的方式选择网卡,同时如果某个port异常,则会停用,此模式一定程度提升了吞吐量,以及容错能力。

发包处理:随机一个索引值,根据索引值检查对应port当前是否能发包,如果不能则遍历port_list,如果找到可用port,则选取当前port为发包接口。 然后修改skb->dev字段为查到到的port dev,并调用dev_queue_xmit发包。

收包处理:在netif_receive_skb调用skb->dev->rx_handler时,会修改skb->dev字段为team口dev,并返回RX_HANDLER_ANOTHER。

轮询平衡策略:roundrobin 所有网卡均处于活跃状态,发包时以依次累加的计数器为索引选择网卡,通过如果某个网卡异常,则会停用,此模式一定程度提升了吞吐量,以及容错能力。

发包处理:以team->sent_packets为索引,查找slave设备并执行sent_packets++操作,检查获取到的port是否能发包,如果不能,则遍历port_list,找到 可用的port之后,修改skb->dev字段为查到到的port dev,并调用dev_queue_xmit发包。

收包处理:在netif_receive_skb调用skb->dev->rx_handler时,会修改skb->dev字段为team口dev,并返回RX_HANDLER_ANOTHER。

team模块初始化

1.注册网络事件处理函数team_notifier_block

2.注册netlink用于与用户态通信

team设备创建

1.用户态通过netlink通知内核创建team。

2.调用rtnl_newlink函数,此函数会进行net_device及team相关私有数据的申请。

3.在上一步中申请net_device时,会调用team_setup对dev->netdev_ops进行赋值。

4.然后在dev->netdev_ops->ndo_init(在上一步中初始化为team_init)函数中对team相关进行初始化。

添加port过程

1.用户态通过netlink通知内核添加port,通过team_port_add函数实现主要功能。

2.一系列参数检查,分配一个用于存放port信息的team_port结构体。

3.对申请的team_port结构指针进行赋值,并修改open网卡设备。

4.维护vlan、组播等相关数据结构。

5.注册收包处理函数team_handle_frame。

6.port添加至team->port_list。

实例示范

1.创建一个team接口,其中接口名为team0,模式为activebackup

nmcli connection add type team con-name team0 ifname team0 config '{"runner":{"name":"loadbalance"}}'

2.给team0设置ip地址

nmcli connection modify team0 ipv4.method manual ipv4.addresses 172.16.254.79/24

3.添加port

nmcli connection add con-name team0-ens224 type team-slave ifname ens224 master team0

nmcli connection add con-name team0-ens256 type team-slave ifname ens256 master team0

4.启用网络

启用team: nmcli connection up team0

启用port: nmcli connection up ens224; nmcli connection up ens256

5.显示team状态

setup:
runner: activebackup
ports:
ens224
link watches:
link summary: up
instance[link_watch_0]:
name: ethtool
link: up
down count: 0
ens256
link watches:
link summary: up
instance[link_watch_0]:
name: ethtool
link: up
down count: 0
runner:
active port: ens224

6.测试

1.在局域网内的另一台机器ping 172.16.254.79 测试结果:能ping通

2.执行ifconfig ens224 down 测试ping结果:能ping通

3.此时查看team0状态 teamdctl team0 stat; 发现active port变成了ens256

4.执行ifconfig ens256 down 测试ping结果:ping不通

5.此时查看team0状态teamdctl team0 stat; 发现active port为空

6.执行ifconfig ens224 up 测试ping结果:又能ping通了,且active port为ens224

7.删除网络组

断开连接:nmcli connection down team0

删除team port: nmcli connection delete team0-ens224; nmcli connection delete team0-ens256

删除team: nmcli connection delete team0

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值