张宇烜++武坚
摘要:随着IPv4地址的枯竭和IPv6技术的逐渐成熟,IPv6协议的商业化已经迫在眉睫。同时,现阶段全球互联网络的流量不断增加,服务器并发连接带宽达到了每秒千兆的级别,服务器性能受到极大约束。单纯依靠硬件升级已经无法从根本上解决超大流量并发的问题。DPDK(Data Plane Development Kit)平台的出现使得传统消息通讯方式出现改变,提高整个系统处理网络并发流量的能力。该文结合现有文献,以IPv6协议栈和DPDK平台为研究对象,实现了高性能,支持并发的简易IPv6协议栈。文中对DPDK平台的消息通讯方式做了初步分析和研究。结合IPv6协议栈的实现和处理流程,对DPDK平台如何让提高网络并发性能做了简要分析。最后,结合实际的拓扑结构,验证了整个网络的可行性,确定了其与标准的Linux网络协议栈的兼容性。
关键词:DPDK; IPv6协议;协议栈实现
中图分类号:TP393 文献标识码:A 文章编号:1009-3044(2017)03-0060-03
The Design and Implementation of IPv6 Address Stack Based on DPDK
ZHANG Yu-xuan,WU Jian
(AVIC Xian Aeronautic Computing Technique Institute , Xi'an 710065, China)
Abstract: With the exhaustion of IPv4 address and the mature development of IPv6 technology, IPv6 commercialization is imminent. At the same time, the server bandwidth of concurrent connections is raised to the level of gigabit per second because the global Internet network traffic is increasing continuously. The performance of the server is limited. It is not available to resolve the high concurrent flow with promotion in hardware. With appearance of DPDK (Data Plane Development Kit) Platform, the traditional communication method has been changed. And it also improves the capacity of handling the concurrent flow in all system. Combined with existing knowledge of IPv6 stack and DPDK platform, this paper implements a high performance IPv6 stack which supports concurrent flow on. Paper analysis the way of communication DPDK uses. With the achievement of IPv6 stack, it gives a brief talk on how to improve the capacity of concurrent flow by using DPDK. At last, we validate the feasibility of whole network with real topology, and make sure the compatibility of standard Linux IPv6 network stack.
Key words: DPDK; IPv6 protocol; stack implementation
1 介紹
随着移动通讯网络的发展,网络容量受限得到持续关注。现有以IPv4为基础的网络协议和传输设施已不能满足现有设备的接入需求,IPv4协议与现有日益增长的网络规模相矛盾[1]。
同时,随着物联网和移动网络的蓬勃发展,互联网已经成为当今社会的基础设施之一。分布全球的服务器系统每时每刻处理数以万计用户请求。现在的服务器系统需要具有高并发性和高可扩展性。服务器要能够快速处理数以千万计的并发请求。随着摩尔定律逐渐失效,单纯的硬件升级对于服务器整体的并发性能提高微乎其微。因此,解决并发性问题需要转变思路。要从单纯堆叠硬件的做法转向改变处理数据的应用程序架构。
经典的数据报文处理方式使用同步阻塞I/O中断处理模型或异步非阻塞I/O模型。在小流量的情况下,此两种模型可以大幅提高服务器的并发性能。但随着请求数目不断上升,服务器需要消耗大量的资源和时间用于非数据处理过程。服务器性能下降。现在,服务器系统面对的是如何处理千万级别的并发请求问题。通过改变应用软件架构,改善系统内核等以往做法已经不能满足服务器的需求,针对上述问题,Intel 提出了 DPDK(Data Plane Development Kit)平台,DPDK平台是Intel公司为旗下Intel网卡在不同平台下开发的一款高性能的网络驱动组件。DPDK平台提供了一系列基础组件。通过使用 DPDK平台,开发人员可以绕过 Linux 内核,编写自己的网络协议栈,在用户空间实现高性能的数据报文转发程序。
由于IPv6协议复杂,协议栈处理所需时间更长,资源更多。因此,将DPDK平台与IPv6技术相结合,使得IPv6协议栈可以更快对数据报文进行处理,以满足未来服务器对数据处理的要求,加快IPv6的部署。
2 基于DPDK的IPv6协议栈设计模型
1)整体设计思想
相比于IPv4协议,IPv6协议更加复杂。IPv6报文分为基础报头和扩展报头两部分。两部分报头逻辑相互关联,功能各自独立。IPv6协议使用邻居发现协议代替原有的ARP协议,在初始时刻使用无状态的地址配置[2]。基于DPDK的IPv6协议栈整体架构如图1所示。
整个协议栈包含数据链路层,IPv6协议层和系统配置三部分。数据链路层负责二层数据报文的转发和处理。IPv6协议层负责IPv6报文解析,处理和转发。系统配置负责全局配置的加载解析。下面主要介绍数据链路层和IPv6协议层的实现方式和功能特点。
2)数据链路层设计与实现
数据链路层主要承担二层数据报文转发任务。其功能较为简单,主要负责MAC地址的识别和链路层的转发任务。但由于其处于整个协议栈最底层,调用频繁,因此对性能的要求较高。链路层模块在编写上使用强耦合关系模型,以减少数据在不同数据结构之间交互,加快整个报文的处理速度。由于DPDK主要针对多核设备,因此数据转发协议栈针对不同CPU內核,将接收队列和发送队列与单个CPU核心绑定。从数据报文进入链路层开始,报文的处理只在一个CPU核心中进行。通过这种数据报文处理和CPU核心的绑定方式,整个数据报文处理过程变得单一化,核心的处理效率提高。
同时,在多核心的处理过程中,必然会涉及不同核心之间的内存共享问题。针对内存共享和使用,协议栈利用DPDK自身的特点,每个核心单独使用一级缓存,共享使用二级缓存。这样的使用方式可以减少数据在内存之间的移动,保证数据报文尽可能少的在不同的内存间进行复制,减少内存操作的开销。
由于一个数据包只被一个CPU核心处理,因此,必然涉及网卡与CPU多核心的对应关系问题。基于DPDK的IPv6协议栈使用数据报文地址作为标识。将地址与特定标志一一对应,使得数据报文从进入网卡开始就对底层的地址进行解析,进行流量负载。同时,为了避免某一核心的负载过大,协议栈还可以通过判断数据队列使用情况,重新对协议栈的接收发送队列进行流量负载。通过以上两种方式,使得每个CPU核心及传输队列可以均衡使用。
最后,对于数据报文的上报,使用轮询机制,减少整个系统的中断次数。通过减少系统中断,减低出入栈的消耗,使得整个协议栈可以将资源倾斜于真正的数据处理过程。
3)IPv6协议栈设计与实现
IPv6协议栈的设计是整个协议栈设计的核心。其主要功能是完成IPv6数据报文的正确解析和转发。
IPv6数据报文分为三部分:基本报头报文,扩展报头和上层报文。IPv6数据报文的解析主要涉及IPv6基本报头的解析和扩展报头的解析。在基本报头中,协议栈对源地址,目的地址等基本信息进行解析。对比本机关键信息后,根据既定策略完成数据报文处理。如果目的地址为本机地址,则当前协议栈将数据报文进行处理,剥离IPv6报头,对扩展字段逐一进行处理。之后数据交与上层程序进行下一步处理。如果解析出的IPv6目的地址不是本机地址,且本机可以作为路由器进行数据转发,则协议栈查找静态路由表。通过路由找出合适的IP地址。最后协议栈修改CRC校验信息和MAC地址,将数据送往发送队列,完成IPv6数据报文的协议转发过程。
同时,协议栈实现了ICMPv6基本协议。协议栈使用ICMPv6协议中的邻居发现协议进行物理地址的查询,代替IPv4中的ARP功能。协议栈还可以利用邻居发现协议向其他节点报告报文错误信息和当前设备的工作状态。IPv6协议栈的处理流程如图2所示[3]。
当IPv6数据报文进入协议栈后,首先检查报文有效性,确认数据报文是否接收正确。然后,协议栈查看数据报文目的地址,确认报文接收方是否正确。同时,协议栈处理IPv6扩展报文,依次对所有类型的扩展报头进行查看和解析。最后,协议栈根据报文的目的地址作出不同的处理。如果目的地址是本机,协议栈将数据报文上报上层应用或其他协议处理平台。如果目的地址是非本机地址,主机进行路由查询,更改报文,使用邻居发现协议进行物理地址查询,最后将报文放入发送队列。
因为使用的DPDK平台绕过系统内核,所以协议栈可以自由使用内存空间,动态分配调整缓存空间和数据库大小,对所有内存空间进行精细管理。为了尽可能降低不同CPU核心之间不必要的交互,协议栈以CPU socket为基础分配内存。由于邻居发现协议和ICMPv6协议的存在,IPv6报文分成了控制数据报文和流量数据报文两种类型。协议栈根据不同类型报文的特点,把内存分为两部分,使得不同类型数据使用不同的内存空间,方便协议栈的内存管理[4]。
3 协议栈测试
1)测试环境与测试结果
搭建测试环境的目的是为了测试和验证基于DPDK的IPv6协议栈的基本特性。其中包括链路的连通性和数据报文解析的正确性。
链路的连通性包含两方面:(1)基于DPDK的IPv6协议栈间的数据报文的传递和解析的正确性;(2)基于DPDK的IPv6协议栈与标准Linux协议栈之间的数据报文的发送接收的正确性。
数据报文解析的正确性主要是指IPv6数据报文和基于ICMPv6的相关控制报文可以正确被基于DPDK的IPv6协议栈和标准协议栈的识别和解析。根据以上要求,验证搭建了如图三所示的测试拓扑环境。测试拓扑由两个单节点计算机和一个路由器组成。
网络测试拓扑中机器A使用标准的Linux操作系统(Ubuntu12.04),IPv6协议栈为Linux标准的IPv6协议栈,机器A的IPv6地址和子网掩码为2001:da8::1234:5678/64。机器B使用与A相同的标准Linux操作系统,但是机器B安装了相关的DPDK驱动,运行基于DPDK的IPv6协议栈和相对应的网络驱动。机器B的IPv6地址和子网掩码为2001:da8::5678:1234/64。路由器同样使用基于DPDK的经过剪裁的IPv6协议栈,完成IPv6数据报文的转发功能。机器A,机器B,路由器均使用静态的IPv6路由表。同时整个网络中的在初始化时刻,所有设备的ARP缓冲区为空。
通过发送ping6命令,可以完成整个测试项目的验证。实验方式从机器A向机器B发送ping6命令。网络实验测试结果如图4所示。
2)结果分析
通过图4的数据可以对整个协议栈的基本特性进行验证。首先,通过ping6命令可以验证和测试网络的链路连通性:由于ICMPv6协议底层的承载协议为IPv6协议和以太网协议,因此,通過ICMPv6数据报文在不同设备之间进行传递检测。因此,可以通过ping6命令验证基于DPDK的IPv6协议栈中MAC层对MAC数据报文和IPv6数据报文的改动是否符合标准协议。是否能正确被标准协议栈所识别。同时,由于ICMPv6数据报文经过交换机转发,中间数据报文需要穿越标准的Linux协议栈。因此,可以验证基于DPDK的IPv6协议栈与标准Linux协议栈之间的数据报文的发送接收的正确性。
由于上面的实验涉及到基于DPDK的IPv6协议栈和标准协议栈之间的数据交互,因此可以同时验证整个IPv6报文和ICMPv6数据报文解析的正确性和在基于DPDK的IPv6协议栈与标准的Linux协议栈的兼容性。
4 总结
本文以DPDK为平台,通过对DPDK平台的初步分析,搭建了一个基于DPDK的IPv6协议栈。概述了在充分利用多核优势下的IPv6协议栈的搭建过程。对协议栈的内存进行了进一步优化。最后验证了IPv6协议栈与标准Linux的IPv6协议栈的兼容性和协议栈对IPv6数据报文正确处理的能力。
参考文献:
[1] 白莹,赵振东,戚银城,李洁.从IPv4到IPv6的改进和过渡.电力系统通信,2004(9):40 -43.
[2] Deering S,Hinden R.Internet Protocol Version 6 (IPv6) Specification [J].RFC2460 Network Working Group, 1998, 17(6):1860-1864.
[3] Silvia Hagen. IPv6 Essentials[M]. O'Reilly Media, Inc, 2006:1-16 .
[4] Lamport L. How to Make a Multiprocessor Computer That Correctly Executes Multiprocess Programs Computers[C]. IEEE Transactions on, 1979.