路由设备IPv6网络隧道功能驱动研究
2022-08-23蒋建峰
蒋建峰
(1.苏州工业园区服务外包职业学院,江苏 苏州 215123;2.南京邮电大学 计算机学院,江苏 南京 210003)
0 引 言
随着智能终端、移动设备的不断增加,IPv4网络的地址空间已经面临耗尽的危险。IPv6网络已经在运营商核心网,教育网的核心设备上成功部署。但是在很长一段时间内IPv4网络仍然占据着一席之地,因此产生了大量的IPv6孤立网络群,在下一代通信网络中IPv6网络与IPv4网络共存是一个常态。
基于业务的融合,IPv4网络与IPv6网络无法相互分离,当前双栈,隧道技术能够很好地实现在IPv4网络上对IPv6业务的承载,保证业务的共存和过渡,已定义的隧道技术种类很多,主要包括手工配置隧道、兼容地址自动配置隧道、6over4、6to4隧道等[1-3]。
国内外学者对于IPv6网络过渡技术的研究很多,主要有三种主流的过渡技术:双栈、网络地址转换和隧道技术。而这三种过渡技术都是基于软件实现数据包的封装,这就要求网络设备具有良好的CPU计算性能,而在数据包的封装过程中会影响设备的数据转发效率。由于硬件条件的限制,通过硬件驱动的方法来提升隧道数据包的转发效率的研究还很少。
当前利用隧道技术进行数据转发的行为,多数网络设备厂家只是注重软件的驱动,虽然使用软件的驱动能够解决数据的封装,但是对于网络的延迟和通信速率没有很好的性能保障。该文通过驱动指令指导数据发送,在性能方面有明显的优势。
1 隧道技术
1.1 手工隧道
手工隧道[4-5]是实现IPv6孤岛连接的一个基本方法,通过手工指定隧道的源和目的,在IPv4主干网络中建立一条永久虚链路。手工隧道主要有GRE隧道和IPv6手动隧道。手工隧道转发的原理如图1所示。
图1 手工隧道原理
1.2 自动隧道
自动隧道是目前实现IPv6孤岛连接的主要隧道技术,包括IPv4兼容IPv6隧道、ISATAP隧道[6-8]、6to4隧道、6 to 4relay等。
1.3 6to4隧道
6to4隧道是一种自动连接隧道[9-10],通过在IPv6地址中嵌入IPv4地址信息,自动获取隧道的目的方,6to4地址格式如表1所示。
表1 6to4地址格式
6to4隧道的地址是一种特殊的IPv6地址,6to4地址以2002为固定的前16位前缀,紧跟着的32位是由IPv4地址转换而来的地址,其格式为:2002:abcd:efgh:子网号::接口ID/64。6to4隧道可以实现利用IPv4网络完成IPv6网络的互连,克服了IPv4兼容IPv6自动隧道使用的局限性。
6to4隧道的地址只能是以2002前缀的网络,所以如果要和其他的IPv6网络通信,必须有一台6to4路由器作为网关转发到IPv6网络的报文,这台路由器就叫做6to4中继(6to4 relay)路由器。6to4中继路由器负责转发去往其他IPv6网络的数据,所以,当边缘设备需要和外界IPv6网络通信时,必须要配置到底中继的静态路由。
因此,可以看出6to4隧道不仅可以克服手动隧道配置的点对点单一性,而且其扩展隧道6to4relay能够与IPv6网络进行互联,所以该文主要对6to4隧道的原理以及驱动实现进行研究。
2 系统结构图及芯片转发流程
驱动是平台操作系统和硬件通信的程序,可以说相当于硬件的接口,操作系统只能通过这个接口,才能控制硬件设备的工作,基于硬件的数据转发比软件操作的速度要快很多。隧道驱动模块系统结构如图2所示。
图2 系统结构
平台模块负责与用户交互,当用户进行配置时,创建隧道命令时,平台模块将这个指令传递给驱动相关模块,主控板和接口板的平台是一套代码,维护相同的资源。
驱动的实现设计主控板和接口板,需要两套代码对应不同的处理方式,维护的资源也不相同,主控板主要负责数据层面的处理,接口板负责转发层面的处理。平台下发指令给驱动时先与主控板的驱动模块进行交互,主控板驱动进行相应处理后同步下发指令给各个接口板进行处理。最终驱动模块将相关信息下发芯片后,隧道报文从接口板上的端口进入后芯片就会正确指导报文的转发。
NP芯片(network processor)编程模式简单,可以很方便地通过微码编程进行实现,是该研究所使用的芯片,NP芯片三层单播转发流程如图3所示。
图3 NP芯片单播三层转发流程
(1)报文从入接口进入芯片,首先查询INSW(in logical switch)表,对于IPv6报文,INSW中L3和IPv6相关标记置1,允许报文进行三层转发。
(2)报文在芯片中继续查询MAC2ME表项,如果报文中以太头的mac地址与接口的mac相同,说明报文是要本机处理走三层转发。
(3)使用报文IP头中的DIP作为KEY查询FIB(forward information base)表项,进行最长匹配查找,得到的KEY为OUTINFO的ID,如果是等价路由则会得到一个BASEID和ECMP标记,进行等价负载分担。
(4)通过OUTINFO ID查询OUTINFO(out interface info)表项,这个表项中存储着报文的出端口信息以及ARP INDEX。
(5)报文出crossbar后,使用ARP INDEX查询ARP表项,得到目的MAC地址,封装MAC头后从接口转发出去。
3 系统关键技术
3.1 芯片隧道转发流程
隧道技术的关键是封装与解封装过程[11-12],在三层单播转发基础上实现隧道功能即在入隧道时可以对报文进行封装,由于OUTINFO表项内存大,易于扩展,所以在OUTINFO表中可以添加隧道标记以及隧道信息,如果为隧道报文就会以封装的新的IP头的目的IP重新查找IPv4 FIB表进行正常的转发,具体如图4所示。
图4 入隧道报文转发流程
出隧道流程是对报文的解封装过程,在MAC2ME后增加对报文类型判断,如果为隧道报文,就会以sip+dip+protocol+payload为key查询TNLEND表项,如果是在本机终结则执行解封装过程,随后进行正常的IPv6报文转发,如图5所示。
图5 出隧道报文转发流程
3.2 驱动隧道模块实施方案
3.2.1 初始化阶段
主控板主要负责隧道资源池的初始化,隧道计数的维护,隧道引用者的记录,资源池的初始化状态以及分配回收过程如图6所示。
图6 隧道资源索引分配
接口板主要记录隧道属性相关信息,并对这些信息进行维护、更新、删除,下发芯片硬件指导芯片对报文进行转发。
接口板维护的信息包括:
(1)隧道基本信息。
{
隧道类型;
隧道目的IP;
隧道源IP;
OUTINFOID;
TNLEND标记;
}
隧道驱动信息是以设备支持的最大隧道数目为数组下标,在初始化时申请相应的内存,以后有隧道创建删除更新时直接对驱动隧道信息进行操作。
(2)TNLEND信息。
{
隧道目的IP;
隧道源IP;
隧道协议类型;
负载类型;
引用计数;
}
TNLEND信息以链表形式存储,因为多个隧道可能会共用一个TNLEND,所以初始化时只申请首节点,后续再进行添加删除更新等操作。
(3)6to4 relay信息。
{
6to4 ID;
6to4Relay ID;
DIP;
OUTINFOID;
}
由于6to4隧道可以扩展出多个6to4 relay隧道,6to4 relay与6to4隧道不同的信息在于DIP以及OUTINFO信息,所以需要建立两者的映射关系,在初始化时,以设备最大支持隧道数目为值,为每个隧道都创建一个链表,但只申请首节点内存,后续有6to4 relay隧道创建时再加入链表。
3.2.2 隧道创建事件响应
(1)用户创建6to4隧道时,配置隧道的SIP、DIP、隧道类型、隧道的IP地址,主控板平台模块会将这些信息保存下来,然后主控板的平台隧道模块会通知主控板的驱动隧道模块隧道的创建,驱动会从主控板的隧道资源池分配一个索引并且回填到平台隧道信息中,隧道使用计数加一,并且将这个隧道资源的引用者设置为隧道模块。
(2)主控板的平台隧道模块将隧道信息同步给接口板,接口板的平台隧道模块再通知驱动隧道的建立,驱动隧道模块将平台带来的信息经过处理储存在驱动信息中,并且申请OUTINFO资源,将相关信息如6to4隧道标示以及SIP下发到芯片的OUTINFO信息中并且ID保存在驱动隧道信息中。
TNLEND的下发条件比较严格,TNLEND下发需要隧道为UP状态,隧道UP的条件如下:
(1)自动隧道会用SIP检查配置该IP的接口是否为UP状态,如果为UP,则隧道UP,手动隧道还需要检查DIP是否可达。
(2)当两条隧道配置相同的SIP时,有一个先达到UP条件,另一条隧道就不能UP。
隧道UP后,会将SIP、DIP、隧道协议类型、负载类型作为KEY下发到TNLEND表中,Result为隧道终结解封装隧道IP头;由于TNLEND是以HashTree表形式存储在芯片内存上,所以具有相同KEY的报文会查询到同一张TNLEND表,对于驱动也可以将具有相同属性的隧道TNLEND信息保存在驱动TNLEND链表中的同一个节点中,只是将引用计数加一。
表项下发好后,还不能实现6to4隧道功能,需要在设备上配置一条静态路由,目的ip为2002::掩码为16位,下一条为6to4 tunnel,这样驱动单播模块就会下发一条fib表项到芯片,且fib表项的Result为6to4隧道申请的OUTINFOID,这样就将路由与隧道关联起来,当有目的IP地址为6to4地址时的报文查询fib时,会进入隧道转发流程。
3.2.3 Relay隧道创建事件响应
6to4 relay隧道比较特殊,由于平台不区分6to4隧道与6to4中继隧道,所以并不能创建隧道类型为6to4 relay的隧道,所以6to4 relay隧道创建的流程如下:
(1)6to4 relay隧道的创建需要2001::/64位网段的用户进行通信,配置一条静态路由,目的IP为2001::/16,下一跳为在连接该网段的6to4 relay中继路由器的6to4地址下一跳,由于下一跳地址为非直连网段,所以会进行路由迭代使用下一跳的IP作为目的IP查询路由表,得到下一跳为6to4隧道。
(2)主控板平台模块会通知驱动单播模块下发一条带有隧道标记的路由,这时需要驱动自己判断是否为中继路由,判断条件为路由下一跳地址是6to4地址,路由目的地址不是6to4,路由带有隧道标记,路由下一跳出接口指向6to4隧道ID。当满足以上条件时,驱动单播模块会通知驱动隧道模块进入6to4 relay分支。
(3)主控板的驱动隧道模块响应单播模块的隧道创建事件,分配一个隧道索引给单播模块,并且将这个索引的引用者设置为单播模块,之所以要为每个隧道资源设置占用者是因为有可能会出现下面这种时序问题情况。由于单播模块和隧道模块处于不同的任务队列,在板件通信的时候可能会出现由于任务异步通信原因发生资源抢占,最终在删除6to4 relay隧道时会将IP隧道保存好的驱动软件表项以及下发的硬件表项全部删除,导致平台收到隧道创建成功的应答,并且在用户侧成功配置隧道,但是隧道功能却是没有实现,如图7所示。
图7 任务异步通信机制导致资源抢占示意图
所以为每个隧道资源标记使用者,如果有在申请隧道资源时,在主控板分配资源后,会检查该资源的引用者是否为本模块,如果不是则返回平台信息,要求重新申请隧道资源,这就是重刷机制。
主控板的驱动单播模块将路由信息以及隧道索引同步给接口板的驱动单播模块,然后接口板的驱动单播模块通知驱动隧道模块6to4 relay隧道的建立,并将新申请的隧道索引以及相关联的6to4隧道索引带给驱动隧道模块。
(4)驱动隧道模块会为6to4 relay隧道申请OUTINFO资源,然后以相关联的6to4隧道信息中的SIP和路由下一跳的6to4地址高位偏移两字节后的4字节作为DIP以及6to4 relay标记下发OUTINFO,将6to4 relay信息加入到驱动6to4 relay链表中,便于维护,TNLEND表项下发过程与6to4隧道TNLEND类似。
(5)当驱动隧道模块将6to4 relay创建好后,会通知单播模块,单播模块这时会将路由表项下发芯片,并且FIB表项中的key为6to4 relay申请的OUTINFO ID。这时6to4 relay隧道功能完成,当与2001::/64网段用户通信时,查询fib表会进入6to4 relay隧道转发流程[4]。
4 实验结果
RouterA为6to4路由器,网络地址使用IPv6 6to4地址。RouterB是6to4中继路由器,连接到网络2001::/16。需要在RouterA和RouterB之间配置6to4隧道,使Hosts可以与网络中的IPv6 Hosts通信,网络拓扑如图8所示。
图8 6to4 relay组网图
设备主要配置部分命令如下:
[RouterA]ipv6
[RouterA-GigabitEthernet3/1/2]ip address 2.1.1.1 255.255.255.0
[RouterA-GigabitEthernet3/1/2]ipv6 address 2002:0201:0101:1::1/64
[RouterA]interface tunnel 0
[RouterA-Tunnel0]ipv6 address 2002:0201:0101::1/64
[RouterA-Tunnel0]source GigabitEthernet3/1/2
[RouterA-Tunnel0]tunnel-protocol ipv6-ipv4 6to4
[RouterA]ipv6 route-static 2002:0601:0101::64 tunnel 0
[RouterA]ipv6 route-static ::0 2002:0601::1
完成配置后,验证配置结果如下所示,Host A可以Ping通Host B。
D:>ping6 -s 2002:201:101::2 2001::2
Pinging 2001::2
From 2002:201:101:1::2 with 32 bytes of data:
Reply from 2001::2 bytes=32 time=13ms
通过仿真软件[13-15]连续抓取通信报文统计,当数据发送速率比较低的时候,网络数据包的延迟,语音的抖动影响很小;当数据包发送速率较大时,通过软件算法实现隧道技术的网络数据延迟较大,而且语音的抖动比较严重,通过硬件驱动算法之后能改善数据包的延迟,并且保证了语音和视频的延迟抖动,充分保证了网络的利用率。
如图9和图10显示,当发送的数据包数量明显增加时,由硬件驱动的数据转发延迟明显较小,而且随着数量的增加,软件驱动的数据转发延迟增幅较大。实验结果表明,说明该驱动方案能够很好地提升网络性能。
图9 网络延迟性能比较
图10 网络抖动性能比较
5 结束语
随着运营商和企业IPv6网络的部署,IPv4和IPv6网络将在很长一段时间内共存。IPv6隧道实现了IPv4海洋中IPv6孤岛的连接。当IPv6网络进行大规模部署时,隧道技术是实现通信网络的关键过渡技术,它将IPv6报文封装在IPv4报文中实现骨干网络的连接,并且6to4隧道能够实现隧道目的IPv4地址的自动匹配。依据IPv6隧道技术设计了一套驱动流程,基于NP芯片实现了驱动的设计指导隧道报文转发。实验结果显示,驱动能够很好的指导报文的转发,并且在网络延迟和抖动方面有着显著的性能优势。