基于以太网的CCN路由节点实现
2017-08-12韩毅刚傅秋宇武淑艳
冯 飞 韩毅刚 傅秋宇 武淑艳
(天津市光电传感器与传感网络技术重点实验室南开大学电子信息与光学工程学院 天津 300350)
基于以太网的CCN路由节点实现
冯 飞 韩毅刚 傅秋宇 武淑艳
(天津市光电传感器与传感网络技术重点实验室南开大学电子信息与光学工程学院 天津 300350)
针对目前内容中心网络CCN(Content-Centric Networking)仅有基于覆盖网实现的现状,提出一种CCN网络基于以太网实现的方案。该方案将CCN在协议栈中的位置下移至以太网MAC层之上,直接将CCN数据包封装在以太网帧中传输,从而摆脱IP网络体系结构的限制,充分发挥CCN网络在设计上的优势。基于这一方案,在Linux平台上设计和实现CCN路由节点的基本功能,并利用该路由软件进行CCN网络的实际部署,成功地实现了CCN网络环境下的文件传输。
内容中心网络 底层实现 路由节点 以太网
0 引 言
随着互联网应用的不断增长及应用方式的转变,传统的IP网络在内容分发、安全性、可扩展性等方面面临严峻挑战[1]。尽管P2P、CDN等改良技术已逐渐被运用到实际的网络部署中,也取得了一定的效果。但是由于TCP/IP协议本质上的缺陷,无法从根本上解决互联网的资源利用问题[2]。因此,国内外很多研究机构致力于探索设计全新的未来网络来取代IP网络,以解决当前互联网的主要问题。其中,内容中心网络CCN[3]是目前国际上研究较多的一种体系结构,其核心思路是采用名字路由,用对数据命名代替对物理主机的命名,从而使网络上数据的传输不再依赖终端位置,在时间和空间上解耦信息的发布者和接收者。
目前,CCN已经有了原型实现的支持,就是PARC(Palo Alto Research Center)公司研发的CCNx项目[4]。该项目为CCN设计出了一个原型系统,很多网络研究者的工作都是基于这个开源项目设计和研究的。然而,CCNx是基于TCP/IP协议上的覆盖网,基于覆盖网实现的CCN网络无法摆脱IP网络本质上的缺陷,不能充分发挥CCN网络设计在内容传输、安全性和移动性上的优势。因此,有必要对内容中心网络进行底层实现,摆脱TCP/IP协议的限制,充分发挥CCN网络在体系架构上的优势。
本文提出一种CCN网络基于以太网实现的方案,该方案将CCN在协议栈中的位置下移到以太网MAC层之上,利用巨型帧技术直接把完整的CCN数据包封装在以太网帧中传输。在路由节点中,网卡捕获数据帧后,数据链路层根据以太网帧的类型字段过滤出CCN数据包交由上层CCN部分处理。上层协议依然遵循CCN的工作机制,但路由转发表FIB和前向转发表PIT所记录的转发接口改由物理网口和MAC地址组成,以解决由内容名到物理地址的转换问题。基于这一方案,本文通过在Linux平台上编写应用层的网络程序,实现了基于以太网的CCN路由节点的基本功能,并利用该路由软件在实验室环境下实际搭建了底层实现的CCN网络进行实验验证。
1 CCN工作机制
传统IP网络采用Host-to-Host的通信模式,在获取内容时,总要先映射到内容所在的设备。而CCN采用全新的网络体系架构,以内容的名字代替IP地址作为标识,解除了内容与其具体的存储位置的绑定关系,使网络专注于内容的发布和获取。在CCN网络中,终端设备或者路由节点可以通过发布名字前缀来声明自己可以提供的内容,成为内容源。覆盖网环境下,内容源发布的名字前缀可以借助域内、域间路由机制(域内采用OSPF协议的扩展,域间采用BGP协议的扩展)在全网进行传播[5],网络节点根据收到的名字前缀(路由信息),整合、计算出路由表,为用户的请求提供转发服务。另外,CCN为路由器增加了存储的功能,可以缓存经过的数据。对于访问热度较高的内容,这样设计既节省了用户访问的响应时间,减轻了内容源的负载,还从整体上减少了网络的流量。
CCN的数据包类型分为两类:Interest包和Data包。二者功能不同,Interest包是请求包,Data包是响应包。内容请求方通过向网络发送带有内容名的Interest包来获取内容(数据),内容源或缓存有该内容的路由节点收到Interest包后,将被请求的内容、内容名以及内容发布者的签名等信息封装成Data包,经Interest包到达的路径逆向发送给内容请求方。当出现请求内容相同且转发路径重叠的情况时,内容请求者可共享该请求。
CCN路由节点上有三个关键的数据结构完成转发:路由转发表FIB(Forwarding Information Base)、内容缓存CS(Content Store)和前向转发表PIT(Pending Interest Table)。FIB相当于IP网络中的路由表,由路由协议自动生成,决定了Interest包的转发出口。区别是CCN中的FIB可以提供一组出口,这样请求可以到达不同内容源。CS负责缓存已经转发的Data包,以响应相同的内容请求。缓存的内容依缓存策略决定。PIT表记录了已经转发但是尚未获得响应的Interest包及其到达的接口,这样响应的Data包可以准确地到达其请求者。
路由节点对于Interest包和Data包的处理过程如图1、图2所示。当一个Interest包到达时,路由器先提取Interest包中的内容名,然后在CS中进行内容名的精确匹配查找,若找到请求的内容,则响应该请求,并丢弃该Interest包;如果未在CS中找到被请求内容,则继续在PIT中进行内容名的精确匹配查找,如果PIT中存在该内容名条目,则在条目中增加该Interest包的到达接口,并丢弃该Interest包;如果PIT中没有该内容名条目,则在FIB中进行内容名最长前缀匹配查找,如果匹配到该内容名的前缀,则按照FIB提供的所有接口转发该Interest包,并在PIT中记录;如果匹配失败,则丢弃该Interest包。当一个Data包到达时,路由器根据Data包的内容名在CS中进行精确匹配查找,如果存在,则丢弃该Data包;如果不存在,则继续在PIT中进行精确匹配查找,如果匹配成功,则按照PIT中记录的接口转发,并缓存在CS中;如果匹配失败,则丢弃该Data包。
图1 Interest包处理过程
图2 Data包处理过程
2 底层实现方案分析
CCN的底层实现是指将CCN在协议栈中的位置下移至以太网MAC层之上,取代IP协议“瘦腰”位置,使整个网络真正依靠内容名字进行通信。CCN底层实现的协议栈结构如图3所示。CCN原本就是为取代传统的IP网络而设计的,理论上来说,其依靠内容名字进行路由的机制,完全可以抛开IP协议独立运行。但是,这需要数据链路层协议在相邻节点之间建立起适合CCN数据包传输的通道。
应用层CCN部分以太网MAC层物理层
图3 CCN底层实现协议栈结构
清华大学的陈震等[6]提出了一种CCN底层实现的方法,该方法中CCN网络节点通过网卡和网线直接相连,上层运行CCNx,下层使用原始套接字与物理网卡绑定作为CCNx的转发接口。以太网MAC层只保留成帧和校验功能,将地址字段和类型字段都用来承载CCN数据包。这种实现方法相当于把协议栈压缩为物理传输层、网络层和应用层。但是,由于没有MAC地址,该方法实现的路由节点无法与现有的网络拓扑和网络设备兼容,比如交换机、集线器等设备。而且,网络节点运行期间数据链路上只允许传输CCN数据包,系统必须禁用TCP/IP协议栈,保证网络纯净。CCN的部署不可能一蹴而就,这种实现方法不利于CCN的实际部署。因此,本文提出的底层实现方法完整地保留了以太网层的功能,这样搭建的CCN网络不仅适用于现有的网络拓扑和网络设备,还可以与TCP/IP协议栈兼容。
以太网帧中的源、目的MAC地址是通信双方物理设备的标识。现在的以太网大多采用星型结构,一个物理网口可以连接到多台设备。所以,无论是在交换式以太网中还是共享式以太网中,通信双方都需要通过MAC地址找到与自己连接的对端设备。在传统的IP网络中,网卡收到网络层送来的IP包后,通过地址解析协议(ARP)将目的IP地址装换为目的MAC地址,再封装成以太网帧发送出去。而CCN包中只有内容名一个标识,ARP的解析方式不再适用。因此,CCN层不仅要向以太网层提交CCN数据包,还要提供下一跳节点的标识。
根据CCN的工作机制,Interest包根据FIB表的一组出口转发。在CCN基于覆盖网的实现CCNx中,需要事先手动配置邻近路由节点的IP地址,所有的网络传输通过TCP连接或UDP连接进行。对于CCNx来说,FIB表中的一组出口就是指与邻近节点所建立的socket套接字。而在CCN的底层实现中,这组出口可以是物理网口和MAC地址的组合。由物理网口和MAC地址的组合可以唯一地确定一台邻接设备。所以在转发Interest包时,路由节点可以依据FIB中对应的物理网口和MAC地址表项,将Interest包封装成以太网帧发送出去。FIB表应由路由协议生成,由路由协议完成邻接节点的探测。实验阶段也可以像CCNx一样事先手动配置。同理,Data包的转发依据PIT表所记录的Interest包的到达接口,路由节点在转发Interest包之前,要在PIT表中记录其到达的物理网口以及源MAC地址,为响应的Data包提供转发依据。
网卡收到以太网帧后,会根据帧首部的类型字段判断荷载中的协议类型,并转交给相应的协议栈进行处理。以太网标准中没有为CCN分配类型值,在实验阶段只能临时使用未被分配的类型值作为CCN的类型值。取Interest包的类型值为0x0601,Data包的类型值为0x0602。
另外,标准的以太网帧的MTU(最大传输单元)为1 500 B。而CCN的Data包中所传输的内容块的大小为固定的4 KB,再加上内容名、签名等信息,远大于标准的以太网帧的MTU。覆盖网中通过TCP连接或者UDP连接传输CCN数据包时,数据包的分段对于路由节点来说是透明的。但是要将CCN数据包直接放入以太网帧中传输,则必须考虑数据包被分段传输的情况。将CCN数据包按照标准以太网帧的MTU进行分段传输,必然会带来额外的字节开销,降低传输效率。而且CCN属于未来网络的范畴,在未来高速的数据传输中,如果还是延续这一最大帧长的限制,只会增加网络设备单位时间内处理数据包的数目,由此带来的开销会随着网络速度的提高而愈加明显。因此,为避免分段传输,可以采用巨型帧技术[7]。巨型帧就是指MTU超过1 500 B的以太网帧。目前很多商家的千兆网卡都支持巨型帧,可以通过将网卡的MTU修改到4 KB以上来承载CCN数据包。
图4展示了以太网帧承载CCN数据包时的帧结构。除了荷载增大到了4 KB以上,其余字段类型均与以太网标准保持一致。这样构造的以太网帧,可以在由千兆交换机组成的以太网中完整传输,实现相邻节点间的数据交换。
字节7166246~4K+412前导码帧定界符目的MAC地址源的MAC地址类型CCN数据包校验序列结束位
图4 承载CCN数据包的以太网帧
3 路由软件的实现
目前IP网络中的路由器多采用硬件实现,但是硬件路由器成本高,不容易升级扩展。对于尚处于实验阶段的CCN来说并不适合。因此,本文选择软件路由器的实现方法,通过编写应用程序在单台计算机上实现CCN路由节点的功能。路由软件基于Linux系统运行,采用C语言编写。底层部分利用SOCK_PACKET类型套接字实现对网卡数据的操作,从而绕开Linux内核的TCP/IP协议栈,直接收发封装有CCN数据包的以太网帧。路由转发部分主要实现了FIB、PIT和CS三个关键的数据结构,其中,路由表通过配置文件读入,缓存策略采用最近最少使用算法LFU(Least Frequently Used)。
3.1 总体架构及功能描述
路由软件的架构如图5所示,程序的功能模块全部在用户空间完成,主要包括存储器管理模块、网络接口层模块、Interest包处理模块、Data包处理模块、FIB管理模块、PIT管理模块、CS管理模块。
图5 路由软件架构
存储器管理模块主要负责管理网络数据的存储空间,记录网络数据的相关信息,为网络数据在各模块间的传递提供便利。软件参照Linux内核网络协议栈的存储区缓存管理器skbuff设计了自己的缓存管理器结构,主要包括网卡设备信息、以太网首部结构指针和网络数据的指针等。
网络接口层通过对Linux内核协议栈的网卡数据的直接操作实现以太网帧的接收和发送。对于从网卡收到的CCN数据包,调用存储器管理模块的处理函数为其申请skbuff结构存储,并按其类型分别放入Interest包队列和Data包队列等待处理。处理完毕的CCN数据包经网络接口层封装成以太网帧从网卡发送出去。
Interest包处理模块和Data包处理模块按照CCN工作机制,调用FIB管理模块、PIT管理模块和CS管理模块提供的接口,对于Interest包队列和Data包队列中的待处理CCN数据包进行转发处理。
FIB管理模块维护路由节点的FIB表项。由于路由表是通过配置文件手动配置的,在路由软件启动阶段读入路由表后,FIB表项在运行期间不会发生改变。因此,FIB管理模块主要为Interest包处理模块提供查找服务。
PIT管理模块维护路由节点的PIT表项。PIT是CCN路由节点特有的结构,是其工作机制正常运转的核心部件。当有Interest包到达时,要在PIT表中查询是否转发过相同请求,若Interest包成功转发则要在PIT表中记录请求的内容名及到达接口。当有Data包到达时,要查询PIT表中匹配的内容名,并在转发后将该表项删除。因此,PIT表需支持查找、插入和删除功能。
CS管理模块维护路由节点的缓存功能。CS缓存的内容是已经转发Data包,无论是Interest包还是Data包到来,都要先在CS中进行匹配查找。当缓存即将溢出时,则需要根据缓存策略删除已存储的内容,以存储新的内容。因此,CS需要支持查找、读取、插入、替换和删除等操作。另外,根据缓存策略的需要,还要为已缓存的内容维护被访问的一些状态,例如内容被访问的频率、上次被访问的时间、上次被修改的时间等。
3.2 网络接口层
网络接口层的核心功能是实现封装有CCN数据包的以太网帧的直接发送和接收,需要绕过Linux内核空间的TCP/IP协议栈,直接访问数据链路层。Linux系统将基于数据链路层开发应用程序的接口集成在套接字中[8]。通过创建packet类型的套接字,应用程序可直接在数据链路层接收或发送未被系统处理的原始的数据报文。在Linux系统中,以下两种方式创建的packet套接字可直接用于访问数据链路层:
(1) PF_INET协议族中的SOCK_PACKET类型的套接字。
(2) PF_PACKET协议族中的SOCK_RAW类型的套接字。
两种套接字的作用相同,本文选用了第一种方式。默认情况下所有网络接口收到的数据报文都会被送到packet套接字,通过bind系统调用可以将建立的套接字与一个固定的网卡绑定在一起。由于路由器一般有多个网卡,所以要为每个网卡都绑定一个套接字。
在初始化阶段,除了绑定网卡,还需要修改网卡的MTU适应CCN数据包的大小。Linux系统中可以通过ioctl()函数配置网络接口的参数。目前默认的CCN内容块的大小为4 KB,另外还有内容名、签名等信息。所以,将MTU修改为5 KB以收发完整的CCN数据包。
路由节点运行期间,网卡上捕获的数据帧都会送到绑定的套接字,网络接口层需要根据以太网帧的类型字段过滤出CCN数据包送入响应队列等待处理。
3.3 PIT管理模块
PIT管理模块为Interest包处理模块和Data包处理模块提供PIT表项的查找、插入和删除功能。参考CCNx[9]的实现,PIT表采用了基于哈希表的实现,如图6所示。PIT表的表项由内容名、指向下一表项的指针和接口集合组成。该接口集合记录的是已转发的Interest包的到达接口,由时间戳、到达网卡和源MAC地址组成。当需要转发Data包时,先在PIT表中进行内容名匹配,然后按照匹配表项中的接口集合,调用网络接口层的函数封装成以太网帧从相应的网卡发送出去。
图6 PIT表基于哈希表的实现
另外,PIT表还需要实现超时机制,否则Interest包的丢失将导致后续到达的相同的Interest包一直被阻塞。PIT表项中每一个接口都包含一个时间戳,记录该Interest包被转发的时间。当再有相同的Interest包从该接口到达时,先检查时间戳,如果超时就重新转发该Interest包并更新时间戳。如果未超时则作丢弃处理。超时时间的选择应根据网络状况作出动态的调整。
3.4 FIB管理模块
FIB管理模块采用字典树存储FIB表[10],如图7所示。CCN的内容名由“/”隔开的任意字符串构成,例如“/CCNrouter/experiment/test.txt”。前缀匹配时,以“/”之间的字符串为单位进行匹配。在路由节点启动阶段,从配置文件中读入路由表,路由表项包括内容名前缀和转发接口集合,转发接口由转发网卡和目的MAC地址组成。内容名按“/”拆分存入字典树中,在内容名存入的最后一个节点处存入转发接口集合。
图7 FIB表基于字典树的实现
FIB表的内容名匹配是最长前缀匹配,当有Interest包需要转发时,从根节点开始搜索,匹配到第一级内容名。若该节点的接口集合不为空则记录,再在相应的子树继续搜索,匹配到第二级内容名,若该节点的接口集合不为空则更新刚刚记录的接口集合。如此迭代下去,直到FIB表中没有匹配的下一级内容名或内容名完全匹配。将Interest包按记录下来的接口集合转发出去。
3.5 CS管理模块
CS管理模块由哈希表和基于访问频率的优先队列组成。哈希表负责缓存中内容名的匹配查找。基于访问频率的优先队列负责在缓存区即将溢出时选出被替换的缓存数据。当Interest包到达时,先通过哈希表进行内容名匹配,匹配成功则复制内容块直接响应请求并在优先队列中增加相应条目的访问频率。当Data包到达时,同样先通过哈希表进行内容名匹配,匹配失败时从优先队列中选取访问频率低的内容块进行替换。
4 实验验证
为了验证CCN底层实现方案的可行性,利用编写的路由软件进行了CCN网络的实际部署,并成功地实现了在CCN网络环境下的文件传输。
4.1 实验环境搭建
实验中利用四台个人计算机和一台千兆交换机搭建了一个星型网络,网络拓扑如图8所示。其中节点B为路由节点,运行路由软件,操作系统版本为Ubuntu Linux 14.10。路由节点配置两块千兆以太网卡,一块为主机自带的PCI网卡,型号为Realtek RTL 8168e,另一块为扩展的USB网卡,型号为Realtek RTL 8153。节点A为内容源,运行响应程序,响应程序采用C语言实现,运行时从网卡侦听封装有Interest包的以太网帧,根据Interest包的内容名读取内容文件作出响应。节点C和节点D同为内容请求终端,运行请求程序,请求程序同样采用D语言实现,运行时向路由节点发送封装有Interest包的以太网帧,同时从网卡侦听到的Data包中读取内容块存储到本地。
图8 网络拓扑
实验开始阶段,根据网络拓扑,手动为路由节点配置FIB表,即将内容名和对应的转发接口集合记录在配置文件中,配置文件的格式如图9所示。配置好路由表后,启动路由节点的路由软件和内容源节点的响应程序,等待内容请求终端发送请求即可。
#entry
name=CCNrouter/experiment/test.txt
#face
dev=etho
mac=6c3be53fb4d8
#endentry
图9 配置文件格式
4.2 文件传输实验
实验一由节点C执行一次文件下载操作。节点C将Interest包封装在以太网帧中,经路由节点转发到达节点A,节点A根据Interest包中内容名及数据块编号作出响应。最终,节点C成功从节点A获取到大小为26.1 MB的视频文件,传输速度为3.2 MB/s。图10展示了传输过程的捕包结果。可以观察到CCN数据包成功封装在以太网帧中,类型值为0x0601的是Interest包,类型值为0x0602的是Data包。Data包的大小达到4 059 B,虽然超过了标准以太网帧的最大传输单元,但由于网卡的MTU被修改成了5 KB,Data包得以完整传输。
图10 实际捕获的CCN数据包
实验二由节点C和节点D先后向A节点请求内容大小不一的视频文件,节点C在时间上先于节点D。表1给出了两个节点的文件下载时延对比。
表1 下载时延对比
实验中路由节点设置了200 MB的缓存,节点C向节点A请求视频文件时,响应的Data包被缓存在路由节点的CS结构中。当节点D再次请求相同的视频文件时,直接从路由节点获得了快速响应。由于内存访问速度远高于硬盘的访问速度,所以节点D的下载速度较节点C有3~4倍的提升。
5 结 语
本文提出了一种基于以太网的CCN网络底层实现方案。该方案直接把完整的CCN数据包封装在以太网帧中传输,同时完整地保留了以太网MAC层的功能。该方案实现的CCN网络不仅适用于现有的网络拓扑和网络设备,还可以与TCP/IP协议栈兼容。基于这一方案,本文在Linux平台编写应用程序实现了CCN路由节点的基本功能,路由软件的底层部分利用SOCK_PACKET类型套接字实现对网卡数据的操作,绕过TCP/IP协议栈直接收发以太网帧;路由转发部分主要实现了FIB、PIT和CS三个关键的数据结构。利用该路由软件,本文在实验室环境下实际搭建了底层实现的CCN网络,并成功进行了文件传输实验。
[1] 黄韬, 刘江, 霍如,等. 未来网络体系架构研究综述[J]. 通信学报, 2014, 35(8):184-197.
[2] Lee S W, Kim D, Ko Y B, et al. Cache capacity-aware CCN: Selective caching and cache-aware routing[C]// Global Communications Conference. IEEE, 2014:2114-2119.
[3] Jacobson V, Smetters D K, Thornton J D, et al. Networking named content[J]. Communications of the ACM, 2012, 55(1):117-124.
[4] Project CCNx[ EB/OL]. http://www.ccnx.org/.
[5] Zhang L X, Estrin D, Burke J, et al. Named data networking (NDN) project[J]. Transportation Research Record Journal of the Transportation Research Board, 2010, 1892(1):227-234.
[6] 陈震, 陈硕, 马戈. 内容中心网络底层实现方法、内容中心网络以及通信方法: CN, CN 103327027 A[P]. 2013.
[7] Jumbo frame[OL]. http://en.wikipedia.org/wiki/Jumbo_frame.
[8] 宋敬彬. Linux网络编程[M]. 北京:清华大学出版社,2015:317-323.
[9] 陈震,曹军威.信息中心网络[M]. 北京:清华大学出版社,2013:103-122.
[10] 刘斌, 汪漪. 内容中心网络中名字查找技术的研究[J]. 电信科学, 2014(9):10-17,44.
THE IMPLEMENTATION OF CCN ROUTING NODE BASED ON ETHERNET
Feng Fei Han Yigang Fu Qiuyu Wu Shuyan
(TianjinKeyLaboratoryofOptoelectronicSensorandSensingNetworkTechnology,CollegeofElectronicInformationandOpticalEngineering,NankaiUniversity,Tianjin300350,China)
According to Content-Centric Networking only have the implementation based on overlay network currently, a scheme to implement CCN based on Ethernet is proposed. In this scheme, the position of CCN in the protocol stack is moved to the top of the Ethernet MAC layer, and the CCN packet is directly encapsulated in an Ethernet frame to transport. Thus, it gets rid of the restriction of IP network, and gives full play to the advantage of the CCN network design. Based on this scheme, we design and implement the basic functions of CCN routing node on the Linux platform. With the routing software, we implement the actual deployment of CCN network, and successfully finish the file transfer experiments under CCN environment.
Content-centric networking Underlying implementation Routing node Ethernet
2016-09-20。冯飞,硕士生,主研领域:计算机网络,内容中心网络。韩毅刚,副教授。傅秋宇,硕士生。武淑艳,硕士生。
TP3
A
10.3969/j.issn.1000-386x.2017.07.018