首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

[linux][network]bond技术分析

前言: 云计算场景下,经常会使用到bond技术的主备模式。这里分析一下bond技术的原理。

原理: 简单回忆一下IPV4协议栈,以用户发送一个HTTP请求为例:

HTTP数据包经过TCP协议栈,然后到达IP栈;IP栈运算完,那么会把数据给netdevice,最终把数据送达网卡。(代码参考linux-4.0.4/net/ipv4/目录和linux-4.0.4/net/core目录) netdevice是Linux维护的一个数据结构,一个netdevice对应着一个网络设备。网卡在初始化的时候,会先申请一个netdevice,再把网卡和netdevice关联到一起,最后向协议栈注册netdevice。(参考代码linux-4.0.4/drivers/net/ethernet/intel/e1000/e1000_main.c)

如图,至于bond,即创建出来新的netdevice。当然,这个netdevice并不真正的关联物理网卡,是一个virtual device。数据包从IP到bond device,bond device再根据算法选择网卡的netdevice。例如,以主备为例,那么在NETCARD0(假设NETCARD0是主,NETCARD1是备)正常工作的情况下,那么bond会选择NETCARD0的netdevice;如果NETCARD0发生了故障,那么bond会选择NETCARD1发送数据包。同理,RoundRobin模式下,bond会轮询/随机选择一个NETCARD发送数据。 分析: 代码:linux-4.0.4/drivers/net/bonding目录下。 1,bonding_masters 在bond_sysfs.c中:

创建/sys/class/net/bonding_masters,例如用户通过echo “+bond666” > /sys/class/net/bonding_masters创建新的bond device---bond666(by bond_create);或echo “-bond666” > /sys/class/net/bonding_masters来删除bond device(by unregister_netdevice)。 2,bond slave 例如创建了bond666后,那么kernel会生成目录/sys/class/net/bond666/bonding,其中slave变量,用来控制bond device的slave(slave的handler函数是bond_option_slaves_set)。

例如,希望把eth0加入到bond666中,则可以通过:echo “+eth0” > /sys/class/net/bond666/bonding/slave。逻辑很明显,通过ifname,找到netdevice(by __dev_get_by_name),找到后,把这个netdevice设置为bond的slave(by bond_enslave);或者通过 echo “-eth0” > /sys/class/net/bond666/bonding/slave,来把eth0从bond666中移除(by bond_release)。 3,bond xmit IP数据包发送到bond device,bond device会根据mode来决定下一步发送目标。 以主备为例:

找到curr_active_slave,发送数据包。 4,curr_active_slave bond初始化的时候,会注册相关的notify(by register_netdevice_notifier),最终会调用到bond_change_active_slave函数,从而修改curr_active_slave。 后记: 其他模式更加复杂些,这里没有做分析。这里只是提供了一个思路,可以简单作为分析其他模式的入口。另外,还有一些细节没有写出来,例如在加入bond的时候,slave需要先shutdown。

举报
领券