网站首页  词典首页

请输入您要查询的论文:

 

标题 基于Netmap的动态地址分配服务的设计与实现
范文

    周云滔++赵钦

    

    

    

    摘要:随着IP技术由IPv4发展到IPv6,动态地址分配技术也由DHCP升级到DHCPv6和无状态自动配置,目前动态分配IP地址主要是通过路由器实现,而市场上支持IPv6的路由器价格比较昂贵,一些软件形式的地址分配服务也没有达到足够高的性能。本文旨在研究与实现一个在FreeBSD平台下,基于netmap框架的高性能的地址分配服务器。本文研究的场景是在局域网内,一台FreeBSD通过多网卡与多个客户机进行连接以及通信。本文主要从以下几个方面展开,netmap框架的优势,IPv4地址分配的实现,IPv6地址分配的实现。

    关键词:DHCP;DHCPv6;无状态自动配置;netmap;局域网

    中图分类号:TP302.2

    文献标识码:A

    DOI: 10.3969/j.issn.1003-6970.2015.11.018

    0 引言

    IP地址作为TCP/IP网络的唯一标识,每台主机都必须获取一个IP地址才能与网络中其他主机进行通信。根据局域网络的结构、规模及管理模式,IP地土止的分配方式有两种:按照网络管理员的地址规划进行手工设置的静态分配方案和基于DHCP的动态分配方案。动态地址分配不仅能够极大地减轻大型网络管理员的工作量,也能避免网络管理员在手动配置过程中带来的错误。

    同时,随着网络中主机数目的不断飞速增长,IPv4地址已经接近枯竭,下一代互联网技术IPv6将是大势所趋。IPv6动态地址配置方式有两种:主机IPv6协议栈根据路由器发出的RA和网卡MAC地址计算得到完整IPv6地址的无状态地址自动配置方式和由DHCP服务器从地址池分配一个完整IPv6地址的有状态地址自动配置方式。

    目前实现地址分配的路由器大部分只支持IPv4,支持IPv6的路由器价格昂贵,且灵活性差,而一些以软件形式实现的地址分配服务大部分是以单线程运作,串行处理客户端请求,在大型网络管理中,速度及效率都不是很高。netmap作为一款高性能的收发原始数据包的框架,使用内存映射、环形队列、批量处理等多种技术,减少了动态申请/释放内存、系统调用、内存拷贝等多种开销,大幅度提高了数据包转发速率,非常适合用于构建高性能的地址分配服务器。

    为了更有效地对局域网中的IPv4和IPv6地址进行管理,对主机实现动态地址分配,本文讨论并实现了一个在多核处理器的FreeBSD系统环境下,基于netmap框架的高性能的地址分配服务系统。内容包括了系统使用到的关键技术和部分技术实现分析,系统总体架构与功能模块划分,最后是总结与展望。

    1 相关技术

    1.1 netmap框架介绍

    netmap是一款由意大利比萨大学信息工程系副教授Luigi Rizzo编写的高性能网络I/O框架,它已经被实现为一个单独的内核模块,在FreeBSD系统中可以直接使用。而普通linux上需要自行下载netmap源码,目前支持大于linux 2.6.32的版本。相较一般网络I/O框架而言,把netmap框架应用到软件交换模块中,可以大大缩减与硬件交换模块在转发速率上的差距。netmap在lOGbps速率的网卡环境下可以达到14.88Mpps的包转发速率,在40Gbps速率的网卡环境下可以达到30Mpps的包转发速率。

    netmap作为一个高速的网络I/O框架,使用了多种技术手段来提升自身的性能。1)利用内存映射,实现零拷贝技术。在netmap模式下,系统会维护一对ne tmap环位于共享空间,网卡会将数据包直接存入这些netmap环中,同时,将网卡里的netmap环内存空间映射到用户空间,用户就可以通过调用netmap API直接访问netmap环里的数据包,即用户态可以直接访问到原始的数据包,无需内核空间和用户空间进行两次拷贝。2)利用预先分配的固定大小的buf存储空间来保存数据包。这样可以减少内核原有的给每个数据包动态分配内存所导致的一些系统开销。3)利用一个轻量级的元数据表示,实现批量处理网络数据包。这样就减少了系统调用次数,提升了性能。

    netmap拥有高性能的同时,还具有其它优点。在稳定性上,用户不会直接操作寄存器,只是在内核模块下进行,所以在用户空间下操作时,不会导致操作系统的崩溃。在亲和性上,netmap实现CPU和网卡绑定。在易用性上,netmap有着相对简单的API操作函数,同时,netmap不依赖硬件,支持大多数网卡,只需对网卡驱动程序稍微修改就可以使用。

    1.2 动态IP地址分配协议

    实现IPv4地址动态分配的主要协议是DHCP协议,它全称是动态主机配置协议(Dynamic HostConfiguration Protocol,DHCP)它是一个使用在局域网下的网络协议,也是一个基于UDP的应用层协议,它的前身是BOOTP。DHCP协议的主要用途有两个:一是给局域网内部主机自动分配IPv4地址,二是给用户或者内部网络管理员提供对局域网内部所有主机进行集中管理的手段,在局域网中使用极其普遍。通过DHCP,我们就不必再像在传统网络中那样手动为网络中的每台主机分配静态IPv4地址、子网掩码、默认网关、DNS服务器等TCP/IP协议的相关配置,同时也能保证同一网络中每台主机分配到的IPv4地址不会产生冲突。

    而IPv6地址动态分配的实现中,分为两种技术:一种是传统的有状态(stateful)自动配置,典型代表就是与自动分配IPv4地址的DHCP相对应的DHCPv6,一种是IPv6的无状态(stateless)自动配置,典型代表是Radvd,这也是IPv6协议相较IPv4协议的一个突出特点:支持网络节点的地址自动配置。在有状态地址自动配置的方式下,采用动态主机配置协议DHCPv6,需要配备专门的DHCPv6服务器,内网主机通过网络接口向DHCPv6服务器发出IPv6地址请求,并从DHCPv6服务器的响应中得到地址配置信息。在无状态地址自动配置方式下,内网主机通过网络接口接收路由器宣告的全局地址前缀,再结合接口自身ID使用EUI64算法生成全球唯一的IPv6地址,完成自我配置。

    2 系统设计

    本文所设计的基于netmap的动态地址分配服务器将在FreeBSD系统上运行,并为系统设置多块虚拟网卡作为服务器的端口,系统整体框架图如下,

    系统流程主要分为四部分:

    (1)设置服务器端口个数,并让每个网卡端口进入netmap模式。

    (2)利用poll()函数监听多端口,判断端口是否有地址请求。

    (3)利用netmap机制高效读取并处理端口收到的地址请求数据包。

    (4)根据DHCP、DHCPv6、无状态自动配置等相关协议进行相应的服务器响应。

    系统总体工作流程如下:

    3 系统实现

    3.1 网卡进入netmap模式

    当一个网卡进入了netmap模式后,所有经过该网卡的数据包都将交由netmap来处理,数据包将进入到netmap的特殊数据存储结构netmap_ring中,而操作系统认为该网卡仍然是在正常模式下运行,当网卡解除了netmap模式之后,数据包就会回归正常渠道,传递给传统的系统协议栈。

    网卡在进入netmap模式之前,程序会定义多个my_rmg数据结构,里面包含了端口名称,文件描述符,起始内存地址,以及n对发送netmap_ring和接收netmap_ring等重要信息,数据结构初始化之后,将端口名称对应起相应的虚拟网卡,同时所有的my_ring数据结构都指向相同的起始内存地址,再调用netmap_open,完成网卡的netmap模式化。

    值得注意的是,网卡可以有多种方式进入netmap模式,有把收到的所有数据包都发往系统协议栈的NETMAP_HW_RING方式,也有把数据包只存到netmap内部指定的netmap_ring环对的NETMAP_SW_RING方式,或者把数据包保存到netmap内部所有netmap_ring环对的方式,根据本系统的需要,我们将选择可以把数据包保存到netmap内部所有netmap_ring环对的方式来打开网卡。

    3.2 poll()函数监听多网卡端口

    作为一个地址分配服务器,需要满足多台主机的需求,设置多个端口。poll()函数是与select()函数具有同等功能的函数,可以检测多个文件描述符的状态。而且每当调用poll()函数之后,系统不会清空里面的struct pollfd结构类型的数组,操作起来比较方便,这对于文件描述连接比较多的情况下,可以提高一定的处理效率。与之不同的select()函数,在被调用之后,select()函数会清空它所检测的文件描述符集合,从而导致每次调用select()之前都必须把socket描述符重新加入到待检测的集合中。因此,对于多端口需要检测的情况,poll()函数比select()函数更适合选用。

    3.3 netmap机制接收数据包

    每个端口需要监测的是,端口是否收到地址请求的数据包,或者是否有数据包需要从端口发往网络。程序将调用pkt_queued()函数对端口进行检测,根据netmap机制,数据包一旦到达网卡,将保存到netmap_ring即netmap环中,一个网卡将与n对发送netmap_ring和接收netmap_ring对应,而netmap_ring又由n个netmap_slot即netmap槽组成,每次对网卡检测都会检测该网卡对应的发送和接收的netmap环下的所有netmap槽是否有数据包存在,若数据包存在,则将该网卡对应的truct pollfd结构类型变量的revents设置为POLLOUT.否则将它的events设置为POLLIN。

    对于revents被设置为POLLOUT的truct pollfd结构类型变量所对应的网卡端口,可以判断出该端口已收到待处理的数据包,程序将提取出该数据包进行解析,与地址请求协议进行对比。对于提取数据包的过程,首先定位出数据包所在的接收netmap_ring环的位置,再定位出数据包在netmap_ring环中netmap_slot槽的位置,最后再定位出数据包在槽中的起始位置,从而得出数据包的具体信息。

    数据包在转发处理时同样高效,转发可以分为将数据包返回给源端口,或者将数据包转发到另一个端口,完成端口之间的桥接。而转发的本质就是将一个端口里的接收netmap_ring的数据交换到本端口的或另一个端口的发送netmap_ring中,只需定位出数据包在环中的位置,然后交换指针,并无空间申请和数据拷贝,效率非常高。

    3.4 处理客户机地址请求

    地址请求分为IPv4地址的请求和IPv6地址的请求,IPv4地址请求对应的地址分配协议是DHCP,IPv6地址请求对应的处理方式分为DHCPv6和无状态自动配置。

    3.4.1处理DHCP请求

    服务器接收到数据包后,会读取数据包关键位,判断其是否为DHCP相关消息,通过确定一些关键位信息比如网络层协议类型为IP,版本为4,传输层协议类型为UDP,源端口为68,目的端口为67等信息即可确定其为DHCP相关数据包,再判断数据包的DHCP消息类型位,若为1则其为DHCP Discover.若为2则其为DHCP Request。服务器读取完数据包后,再构造相应的DHCP Offer和DHCP ACK数据包进行返回,里面包含了服务器对其分配的IPv4地址的相关信息。DHCP T作过程如下图所示,

    3.4.2 处理DHCPv6请求

    服务器收到数据包后,读取数据包关键位,如果网络层协议类型为IPv6,版本为6,传输层协议类型为UDP,源端口为546,目的端口为547等即可确定其为DHCPv6相关数据包,再判断数据包的DHCPv6消息类型位,若为1则其为Solicit,若为3则其为Request。服务器读取完数据包后,再构造相应的Advertise和Reply数据包进行返回,里面包含了服务器对其分配的IPv6地址的相关信息。DHCPv6工作过程如下图所示,

    3.4.3 处理路由请求Router Solicitation

    服务器收到的数据包,若其网络层协议类型为ICMPv6,协议类型位为133等则可确定其为RouterSolicitation.服务器再构造Router Advertisement数据包进行返回,里面包含了地址前缀等相关信息。无状态自动配置工作过程如下图所示,

    4 部署与测试

    系统整体拓扑如下图所示,设置多台主机,同时每台主机与服务器的一个虚拟网卡处于同一网络。

    测试步骤如下:

    (1)先在服务器端输入命令./bridge -n 4 -i em0-i em1 -i em2 -i em3启动服务器模块。

    (2)进入每台主机,输入命令vim /etc/network/interfaces打开网络配置文件,分别输入命令iface eth0inet dhcp,命令iface eth0 inet6 dhcp和命令iface eth0 inet6 auto将主机分别设置成DHCP方式获取IPv4地址,DHCPv6方式获取IPv6地址和无状态自动配置IPv6地址。

    (3)再输入命令sudo /etc/init.d/networking restart重启各主机的网卡。

    (4)最后输入命令ifconfig查看各主机的的地址分配情况。

    服务器收到数据包后进行判断,

    判断其为DHCPv6的Solicit请求后,构造数据包返回给主机

    地址分配过程结束后,主机地址信息如下:

    5 结束语

    动态地址分配对Internet的重要性不言而喻,现今动态分配IP地址主要靠路由器实现,特别是支持IPv6地址分配的路由器需要昂贵的价格,而普通的软件路由器在性能上比较低下。本文采用FreeBSD系统,设计并实现了基于高速网络I/O框架netmap框架的动态地址分配服务器,在性能上有一定的提升,同时易于网络管理员管理IP地址的分配。

随便看

 

科学优质学术资源、百科知识分享平台,免费提供知识科普、生活经验分享、中外学术论文、各类范文、学术文献、教学资料、学术期刊、会议、报纸、杂志、工具书等各类资源检索、在线阅读和软件app下载服务。

 

Copyright © 2004-2023 puapp.net All Rights Reserved
更新时间:2025/2/5 23:47:44