基于以太网交换机的Linux协议栈虚拟化技术
2015-09-09陈冰冰程友清
陈冰冰+程友清
摘要:网络协议栈虚拟化的目标是在一台网络设备上虚拟出多个协议栈以实现网络设备的一虚多功能。由于Linux操作系统的网络协议栈本身是不支持这种网络协议栈虚拟化技术的,因此本文通过对Linux操作系统3.11.10版本IPV4网络协议栈进行改造以实现Linux网络协议栈的虚拟化,并在设备平台上验证了经过网络协议栈虚拟化改造后的以太网交换机对业务流的隔离功能。
关键词:协议栈;虚拟化;网络设备
中图分类号:TP316.8 文献标识码:A
The technology of Linux protocol stack virtualization
based on the ethernet switch
CHEN bing-bing*a,b,c, CHENG you-qingb,c
(a.Wuhan Research Institute of Post and Telecommunications, Wuhan 430074, China; b.State Key Laboratory of Optical Communication Technologies and Networks, Wuhan, 430074, China; c.Wuhan FiberHome Networks Co. , Ltd. , Wuhan 430074, China)
Abstract: The goal of network protocol stack virtualization is that virtualize multiple virtual protocol stacks based on one network device in order to implement the function of one network device virtualized into multiple. Since the network protocol stack of the Linux operation system itself dont support this kind of technology, so this paper implement the technology of network protocol stack virtualization by means of modifying the IPV4 network protocol stack based on the 3.11.10 Linux operation system version. And then, it is proved on the device platform that the Ethernet switch, of which the protocol stack virtualization has been realized, has the function of isolating business flow
Key words: protocol stack;virtualization;network device
1 引言
随着网络规模的不断扩大,业务种类的不断丰富,网络对业务的隔离以及安全性、可靠性等属性提出了越来越高的要求[1]。此外,随着硬件能力的迅速提升,多框、集群、分布式路由交换系统的成熟,单台物理网络设备的业务处理能力已经达到了一个新的高度[2]。为了将单台物理设备的强大业务处理能力充分利用,弹性的适应当前的业务需求和未来的发展,网络设备的一虚多(即将一台物理设备虚拟成多个逻辑设备)成为了网络与通信界追求的目标[3]。Linux操作系统因其具有的开源、安全和稳定等优点,受到网络设备制造商的青睐,被广泛应用到网络设备的嵌入式开发中。
目前,国内外对Linux操作系统虚拟化的研究都着力于操作系统级的全局性资源隔离虚拟化,而缺少对网络协议栈虚拟化的深入研究。对于小规模以太网而言,全局性的资源隔离会对网络设备的进程资源造成不必要的浪费,增加了网络设备的负荷,影响网络数据包处理速率。
因此,本文在以太网交换机设备上研究了Linux嵌入式操作系统中虚拟协议栈技术,以实现业务流的隔离,提高单个以太网交换机设备的资源利用率[4]。
2 Linux网络协议栈的层次结构
网络协议栈是指TCP/IP协议栈,实现了一个网络中数据传输的过程:包括上层协议到底层协议,和由底层协议到上层协议。Linux网络协议栈的层次架构模型如图1所示,最上面一层为用户空间中的应用层,中间部分为内核空间中的网络协议栈部分,底层为物理设备[5]。在网络协议栈中用户空间和内核空间之间的数据通过套接字缓存(socket buffer) 来传递,相应的数据结构为sk_buffer。
图1 Linux网络协议栈层次架构
Linux网络协议栈的最上层是系统调用接口,为用户空间中的应用程序提供一种访问内核网络协议栈的接口。通过网络协议栈进行通信都需要对套接字进行操作,网络协议栈提供了两种调用接口给用户进程。一种是在sys_socketcall中会根据网络系统调用号调用具体的功能,另一种是通过普通文件操作来访问网络协议栈,将套接口的输入、输出操作当成典型的文件读写操作来进行。
套接字是一个与协议无关的接口层,它提供了一组通用接口来支持各种协议,它对用户层的应用程序屏蔽了与协议相关的实现细节,将应用程序发送的与协议无关的请求映射到与协议相关的实现。传输层负责数据的传输和数据的控制,提供端到端数据交换机制,传输层协议包括面向连接的TCP协议和面向无连接的UDP协议。网络层负责接收、发送或转发数据包,网络层的协议包括IP协议、ARP协议、RARP协议、ICMP协议和IGMP协议等。邻居子系统为三层协议地址与二层协议地址提供了的映射关系,此外还缓存了二层首部,以加速数据包的发送。在发送数据包的时候,先进行路由查找,如果找到对应的路由,再查看邻居表中是否存在相应的映射关系,如果不存在则新建对应的邻居项;然后再判断邻居项是否为可用状态,如果不可用则把数据报存至发送缓存队列后发送请求;在接收到请求应答后,将对应的邻居项置为可用,并将其缓存队列中的数据包发送出去;如果在指定时间内为收到响应包,则将对应邻居项置为无效状态。对于以太网交换机而言,邻居子系统提供了三层IP地址和二层MAC地址的映射,邻居表就是ARP表。
网络协议栈底部是一个与硬件无关的网络设备接口层,它将网络层的不同协议与各种网络设备连接在一起。设备无关接口层提供了一组通用函数供底层网络设备驱动程序和上层协议栈调用。当输出数据时协议栈不必关心底层的网络设备,而当输入数据时网络设备驱动同样也不必关心上层的协议栈。协议栈向设备发送数据包时都需调用dev_queue_xmit函数。该函数对sk_buffer进行排队,最终由底层设备驱动程序进行传输。而接收报文通常是调用netif_rx函数实现的。当底层设备驱动程序收到一个报文时,就会通过调用netif_rx函数将报文的sk_buffer上传至网络层。
以太网交换机设备上网络接口卡(NIC)的相关信息是由net_device结构来描述的,net_device包括了硬件信息成员变量、接口信息成员变量、设备操作接口变量和一些辅助成员变量。网络接口卡的IPv4地址等相关配置信息存放在in_device结构中,net_device中有一个指针指向in_device。每个网络接口卡都会有一个对应的net_device结构。当设备启动时调用register_netdevice函数注册到系统中,注册过的网络接口卡NIC可通过unregister_netdevice函数注销。net_device结构中包含了一个名为hard_start_xmit的接口,通常在初始化网络接口卡时设置该接口。当协议栈向网络接口卡发送数据包时,会通过设备无关接口调用到此接口[6]。
3 Linux协议栈虚拟化的实现框架
Linux协议栈虚拟化技术是属于控制平面的虚拟化,Linux协议栈虚拟化技术的实现分为以下四个部分:路由表的虚拟化、网络接口的虚拟化、与上层应用接口的虚拟化、套接字层的虚拟化。路由表的虚拟化通过对存储路由表项的数据结构的虚拟化扩展来实现,使每一个虚拟出来的协议栈都对应一份独立的路由转发表实例,虚拟协议栈的路由转发表实例之间互不干扰[7]。网络接口的虚拟化使网络接口卡在收发数据包的时候,可以区分出这个数据包是属于哪个虚拟协议栈,也使数据包在协议栈中传递的时候,可能选择正确的函数处理接口。以上两部分都是通过virtual_id标识来区分不同的虚拟协议栈,每个虚拟协议栈都自己唯一的virtual_id标识,virtual_id和虚拟协议栈是一一对应的。
图2 虚拟化协议栈架构
3.1 路由表的虚拟化
Linux协议栈中使用数据结构fib_table来描述路由表信息,所有的fib_table结构链接在全局散列表fib_table_hash中。fib_table_hash存储在数据结构struct net中的struct netns_ipv4成员中。参数不同的fib_table_hash表示不同类型的路由表,例如fib_table_hash[RT_TABLE_LOCAL]表示设备本地地址的路由表。路由表的虚拟化是将指针数据结构struct hlist_head*fib_table_hash重定义为指向指针的数据结构struct hlist_head** fib_table_hash,使用不同virtual_id标识来区分不同虚拟协议栈的路由表转发实例,例如本地路由表就重定义为fib_table_hash[RT_TABLE_LOCAL][virtual_id]。
Linux协议栈中使用数据结构rtable来描述路由缓存,路由缓存链接在散列表rt_hash_bucket中,为了使路由缓存和虚拟路由表项实例一一对应,散列表rt_hash_bucket需要被重定义为virtual_id 个不同的散列表,即rt_hash_bucket[virtual_id]。
由于不同虚拟协议栈中的目的IP地址可以重用,所以相同的IP地址在邻居子系统的ARP表中对应的目的MAC地址是不同的。而ARP表查找函数的输入参数为net_device和目的IP地址,因此可以通过net_device来区分不同虚拟协议栈中IP地址对应的MAC地址。
3.2 网络接口的虚拟化
协议栈底层网络接口的虚拟化是通过协议栈的net_device结构实现的,需要在net_device数据结构中添加一个virtual_id标识,net_device数据结构中的virtual_id表示该net_device结构对应的网络接口卡属于该virtual_id对应的虚拟协议栈。
3.3 与上层应用接口的虚拟化
协议栈内部不同层次之间接口的虚拟化是通过在协议栈内部接口函数中添加参数virtual_id实现的,virtual_id表示了同一个接口函数中对不同虚拟协议栈进行操作时,选择的表项结构是不同的。比如网络设备状态变化时或者网络设备上IP配置变化时,路由子系统收到通知链的通知,需要对路由表和路由缓存进行添加、删除、修改等操作,接口函数中的virtual_id可以选择对应的路由表项实例进行操作。同样,OSPF、RIP、ISIS等路由协议在网络路由拓扑变化时,需要对路由表进行动态添加、修改、删除的函数,因此修改路由表的接口函数传入的参数struct fib_config结构中也需要增加virtual_id标识,用来标识将要操作的路由表转发实例。
3.4 套接字层的虚拟化
在保证虚拟协议栈业务隔离的前提下,为了兼顾设备内存资源利用率,协议栈接口允许一定的共享,比如多个虚拟协议栈中同种类型的业务流可以共享同一个socket接口。应用层的协议通过socket发送数据包的时候,需要在接收方的网络地址结构中添加相应的virtual_id标识,使应用层的报文通过socket进入协议栈之后可以区分不同的虚拟协议栈,在进行报文转发的时候也可以查找对应虚拟协议栈的路由表转发实例。应用层的协议用socket接收数据包的时候,也可以从接收的地址结构中取出virtual_id标识,区分数据包是由哪个虚拟协议栈送上来的。
4 Linux虚拟协议栈的关键操作
由于网络设备上的每个虚拟协议栈可以对应设备的多个虚拟网络接口卡NIC,所以可以通过网管配置命令将多个虚拟网络接口卡的net_device结构用同一个virtual_id标识,标识为同一个逻辑组,这个逻辑组收发的所有数据包都交给同一个虚拟协议栈处理。当网络设备的网络接口卡NIC收到数据包的时候,根据网络接口卡逻辑组的划分,在数据包的地址结构中添加上对应的virtual_id标识,如图3所示将存放其地址信息的sockaddr_in结构强制转换成sockaddr_in_virtual结构。当数据包在协议栈上下层之间传递的时候,就根据virtual_id标识查找对应的函数接口和路由表项转发实例[8]。当网络设备从出端口发送数据包的时候,数据包不再带有virtual_id标识,virtual_id标识只在设备内部有效,因此设备协议栈的虚拟化对对整个网络是透明的。
图3 sockaddr_in_virtual地址信息结构
5 Linux虚拟协议栈在以太网交换机上的实现
5.1 测试平台的搭建
搭建的测试环境拓扑结构如图4所示,三层交换机设备为烽火网络的S5800系列三层千兆路由交换机。将网络协议栈被改造后的Linux嵌入式操作系统download到三层交换机设备上,该交换机设备与四台电脑相连,PC1和PC2属于vlan1,PC3和PC4属于vlan2,PC1和PC3 的IP 地址相同,PC2和PC4的IP 地址相同。
在网管界面中输入配置命令行,将与PC1和PC2相连的交换机接口划分为同一个逻辑组,它们的net_device数据结构中virtual_id都被赋值为1,与PC3和PC4相连的交换机接口也划分为同一个逻辑组,它们的net_device数据结构中virtual_id都被赋值为2。因此, PC1和PC3发送到交换机的数据包分别被送往不同的虚拟协议栈,实现业务流的隔离。
图4 以太网交换机测试拓扑
5.2 测试结果分析
图5显示了在电脑PC1上ping PC2的实验结果,图6显示了在电脑PC3上ping PC4的实验结果,虽然PC1和PC2的IP地址相同,但是业务流之间互不影响,相互隔离。图7和图8显示了协议栈经过一虚多虚拟化后每个虚拟协议栈都有自己独立的路由转发表。
由上可知,经过网络协议栈虚拟化的虚拟设备可以承载不同的业务,或者服务于不同的用户群,达到业务隔离提升网络可靠性和安全性,降低用户成本,并可以实现多用户群管理隔离,有效简化运维。
图5 PC1 ping PC2实验结果
图6 PC3 ping PC4实验结果
图7 虚拟协议栈1的路由表 图8 虚拟协议栈2的路由表
6 结论
本文描述了Linux协议栈虚拟化技术的实现框架,并通过设备验证了协议栈虚拟化技术对业务流的隔离。运用Linux协议栈的虚拟化技术可以将一台以太网交换机虚拟成多台专用的三层交换机,每个虚拟交换机都有自己独立的路由表转发实例VRF和相应的接口[9]。虚拟协议栈的交换机设备可以帮助用户快速部署网络,实现业务流的隔离,节约网络成本,提高网络的可拓展性和弹性[10]。
参考文献
[1] 王佳隽,吕智慧,吴杰,等.云计算技术发展分析及其应用探讨[J].计算机工程与设计,2010(20):4404-4409.
[2] Smith J.E, Nair Ravi. The Architecture of Virtual Machines[J]. IEEE Computer, 2005 ,
38(5)
[3] N.M.M.K.Chowdhury, R.Boutaba, Network virtalization:state of the Art and research challenges[J].IEEE Communication Magazine, 2009,47(7):20-26
[4] 徐立冰.云计算和大数据时代网络技术揭秘[M].北京:人民邮电出版社,2013:133-154.
[5] 樊东东,莫澜.Linux内核源码剖析-TCP/IP实现[M].北京: 机械工业出版社, 2010: 11-14.
[6] OReilly Media,Inc.深入理解Linux网络技术内幕[M].夏安.闫江毓.黄景昌,译.北京:中国电力出版社,2009:145-167.
[7] E. Rosen, Y. Rekhter, BGP/MPLS IP Virtual Private Networks[J].RFC4364. February 2006.
[8] 王东洋, 基于虚拟设备的虚拟交换机设计[J]. SOFTWARE , 2012,33(1).
[9] 任德玲.韦卫.基于IPSec的MPLS IP VPN 的设计与实现[J].计算机应用研究,2006,23(3):116-118.
[10] 李丹,陈贵海,任丰原,等.数据中心网络的研究进展与趋势[J].计算机学报,2014,37(2):267-268.