LVS源码分析(1)
由于要做个类似LVS的包转发模块,研究LVS的架构和代码,下这
个系会做个总结。先推荐下这个blog http://yfydz.cublog.cn 对
LVS, IPSec的讲解常错
个重要的数据结构如下:
ip_vs_conn:个连接由N元组构成,包括 caddr (客户端地址cip), vaddr
(服务虚拟地址vip), daddr (的realserver地址dip), cport (客户端连接端
), vport (服务虚拟端), dport (的realserver端), protocol (协议)
ip_vs_service:代表个虚拟服务。LVS中虚拟服务代表个虚拟IP和端
,作为服务的,后跟着些realserver,在这些realserver之间做
负载平衡。ip_vs_service中包括protocol, addr, port。struct list_head
destinations, __u32 num_dests则代表后realserver的链表和个数
ip_vs_dest:代表个realserver。addr, port, weight分别代表realserver
的ip, port, 权重。struct dst_entry *dst_cache代表从LVS到realserver的
由缓存项,在我看来这个应该只对NAT, tunnel模式有效。vport, vaddr,
protocol代表虚拟服务地址,端和协议
ip_vs_scheduler:所有调度的基类,对ip_vs_service进调度,其最重
要的法是 struct ip_vs_dest* (*schedule)(struct ip_vs_service *svc,
const struct sk_buff* skb),从ip_vs_service下的ip_vs_dest数组中选取
个出来返回
static int __init ip_vs_init(void)来初始化ipvs.ko,也就是LVS的核模
块:
ip_vs_control_init调nf_register_sockopt注册struct nf_sockopt_ops结
构,ip_vs_genl_register注册struct genl_ops ip_vs_genl_ops[]数组,这是通
过netlink进控制的命令结构。
ip_vs_protocol_init依次注册ip_vs_protocol_tcp, ip_vs_protocol_udp,
ip_vs_protocol_ah, ip_vs_protocol_esp四个协议