CN103001883B - 一种基于NetFPGA的可编程虚拟路由器内部通信方法 - Google Patents

一种基于NetFPGA的可编程虚拟路由器内部通信方法 Download PDF

Info

Publication number
CN103001883B
CN103001883B CN201210546866.3A CN201210546866A CN103001883B CN 103001883 B CN103001883 B CN 103001883B CN 201210546866 A CN201210546866 A CN 201210546866A CN 103001883 B CN103001883 B CN 103001883B
Authority
CN
China
Prior art keywords
packet
data
netfpga
router
virtual router
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Active
Application number
CN201210546866.3A
Other languages
English (en)
Other versions
CN103001883A (zh
Inventor
徐川
赵磊
唐红
赵国锋
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Chongqing University of Post and Telecommunications
Original Assignee
Chongqing University of Post and Telecommunications
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Chongqing University of Post and Telecommunications filed Critical Chongqing University of Post and Telecommunications
Priority to CN201210546866.3A priority Critical patent/CN103001883B/zh
Publication of CN103001883A publication Critical patent/CN103001883A/zh
Application granted granted Critical
Publication of CN103001883B publication Critical patent/CN103001883B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Abstract

本发明公开了一种基于NetFPGA的可编程虚拟路由器内部通信方法,其包括以下步骤:通过检查进入Linux内核的数据包的入口设备,将其中设备名称为nfc的数据包封装到一个新的IPv4数据包内,目的MAC地址和IP地址为虚拟路由器网卡veth的MAC地址和IP地址,发送到虚拟路由器,去掉封装包的以太网首部和IP首部,分析其数据段并写入对应网卡,由路由软件处理后,将数据包通过主机操作系统发送出去,路由信息通过调用ioctl部署到NetFPGA中。加快了数据包在传输过程中的时延,减少了部署的难度。

Description

一种基于NetFPGA的可编程虚拟路由器内部通信方法
技术领域
本发明涉及通信及计算机技术领域,具体是一种基于NetFPGA的可编程虚拟路由器内部通信方法。
背景技术
未来互联网体系结构、协议、算法与实现技术都需要大量的理论分析和仿真实验,更需要在实验网络系统中进行评估和验证。为了提供验证其算法和新协议的平台,保证不破坏现有的网络结构又能够利用真实的网络流量验证算法和协议,研究者们提出了可编程虚拟化路由器技术。
可编程虚拟路由器包括转发硬件和虚拟路由器两部分:转发硬件的核心是NetFPGA板卡(用于网络的可编程门阵列,由斯坦福大学开发),完成数据包接收和发送;虚拟路由器运行于操作系统为CentOS的主机上,由虚拟化软件OpenVZ(基于Linux内核和作业系统的操作系统级虚拟化技术)生成,完成路由计算和路由交换功能。转发硬件和虚拟路由器之间通过主机操作系统通信。
然而,目前对可编程路由器的研究都还停留在原型构造阶段,只是对路由器的整体架构进行了描述,没有涉及到内部的实现细节,即使是一些已经做出原型系统的设计,其着眼点也放在硬件的设计与开发上,对整体的通信过程也仅仅是作出一个概括性的描述,而没有给出一个具体可行的方案。
发明内容
本发明解决的问题是:在Linux内核支持数据包转发的基础上,提供一种虚拟可编程路由器的内部通信方法,使得虚拟路由器与网络上其他路由器、虚拟路由器与底层硬件之间正确的交换数据包。
本发明采用了以下技术方案:
一种基于NetFPGA的可编程虚拟路由器内部通信方法,包括以下步骤:捕获进入Linux内核的NetFPGA数据包,将该数据包封装后发送到虚拟路由器;经所述虚拟路由器处理后的数据包通过主机操作系统转发出去,并将路由信息部署到NetFPGA 中。
A、初始化建立以下模块:数据包入口设备检查模块;产生虚拟网卡nf的网卡虚拟模块,nf的MAC称为vMAC;数据封装模块,在数据包封装模块存放vMAC-VR映射表(虚拟网卡 - 虚拟路由器映射表,包含nf网卡MAC地址vMAC,虚拟路由器标识符VRID,虚拟路由器网卡veth的MAC地址veMAC和IP地址veIP),nfc信息表(NetFPGA板载网卡nfc的配置信息,包括网卡名称interface,MAC地址,IP地址);数据分发模块,信息接收模块。
B、在Linux内核网络协议栈入口处设置数据包入口设备检查模块,检查每一个流入Linux内核的数据包的入口设备名称。
C、如果入口设备名称为nfc则触发数据封装模块,并将该流入Linux内核的数据包缓冲区skb(数据包在Linux内核中的表现形式)和入口设备名称nfc传送到数据封装模块,由数据封装模块将skb封装到一个新的IPv4数据包,然后该新的数据包通过Linux内核发送到虚拟路由器;由NetFPGA板卡发送给主机的数据包包括三类:a.路由信息包,b.需要进行路由计算的普通数据包,c.出错数据包,a、b、c三类统称为P1。
D、如果入口设备名称不为nfc,则不作任何处理。
在步骤C之后还包括如下步骤:
C1、在数据包封装模块接到触发通知后,获取skb中的协议数据区skb->head中的MAC地址字段即dMAC,将dMAC与在vMAC-VR映射表中的表项vMAC比较,查找对应的VR(Virtual Router)信息的IP地址veIP(虚拟路由器IP地址)和MAC地址veMAC(虚拟路由器MAC地址)。
C2、如果在vMAC-VR映射表中找到对应此MAC地址的VR信息,则查找nfc信息表,查到入口设备的MAC地址nfcMAC和入口设备的IP地址nfcIP,将该skb中包含的协议数据区skb->head封装到一个新的IPv4数据包newHead中,对于步骤C中所述的三种数据包封装方法相同;否则将数据包丢弃。
C3、将步骤C中所述数据包P1中的skb->head替换为skb->newHead,替换后的数据包称为P2,替换步骤为释放skb->head,并将skb->head赋值为NULL;将skb->head指向newHead,即skb->head=newHead;重新对P2作CRC校验,然后将P2送回内核网络协议栈处理队列,数据包P2会由Linux内核自动转发到指定虚拟路由器。
C4、数据分发模块会将虚拟路由器网卡veth设置为混杂模式,采用libpcap库(Packet Capture library,即数据包捕获函数库)抓取veth上的数据包,将抓取到的数据包P2去掉协议头后,得到与P1数据相同的P3,将P3解包后得到获取目的MAC地址即dMAC,然后将dMAC与虚拟路由器的网卡nf的MAC地址比较。
C5、如果比较结果相同,则将此数据包送往此虚拟网卡n。
C6、如果比较结果不同,则将此数据包丢弃。
所述步骤C5之后还包括:
C7、送往网卡nf的数据包P3由上层路由软件(如XORP或者Qugga等)读取,对于C3中所述数据包P1的a、c两类,路由软件处理后没有任何输出,对于数据包P1的b类,经处理后得到与P1结构相同的P4,将P4封装成以太网数据包P5(如图6)后从网卡veth发送出去。
C8、在虚拟路由器之外,即主机操作系统内,位于主机操作系统的用户空间路由信息接收模块通过监控网关venet,捕获每一个从veth发送出去的数据包(ARP广播包),对其中抓取的数据包P5,去掉以太网首部后,得到P4,根据P4中的目的IP地址及目的MAC地址,形成一条路由信息。通过调用NetFPGA的驱动程序API将路由信息部署到NetFPGA中;数据段通过libnet函数库封装成标准IPv4数据包P6由主机操作系统的网卡发送出去。
具体地,利用TUN/TAP模拟与所述NetFPGA所带网卡数量相同的路由器虚拟网卡veth,使虚拟路由器更加贴近真实环境。
具体地,通过libnet将经虚拟路由器处理后的数据包封装成一个ARP广播包,并通过路由器虚拟网卡veth发送出去。
信息接收模块监控网关venet,对每一个发送出去的ARP广播包,解包后去掉以太网首部,分析数据段内容获取路由信息,然后将数据段发送出去,通过调用NetFPGA的API将路由信息部署到NetFPGA中。
所述通过libnet将经虚拟路由器处理后的数据包封装成一个ARP广播包的步骤包括:调用libnet_init_packet初始化一个数据包;调用libnet_build_ethernet封装一个以太网数据包;libnet_open_raw_sock打开一个套接字;调用libnet_write_link_layer发送一个链路层数据包。
具体地,所述获取路由信息的步骤包括:
通过libpcap库抓取网关venet上的数据包,去掉以太网首部,获得数据段;
申请一段新的缓冲区,将所述数据段的第7~12字节、31~35字节复制进去,然后调用ioctl命令将其部署到NetFPGA中;
通过libnet将所述数据段发送出去。
本发明通过一种隧道方式将NetFPGA反馈给主机的数据包分发到相应的虚拟路由器,依托于内核网络协议栈内的Netfilter框架,仅通过少量代码就能够实现传输目的,加快了数据包在传输过程中的时延,减少了部署的难度;模拟了NetFPGA的接口特性,使用户在使用中更加贴近真实环境;可编程虚拟化路由器是未来网络研究项目中重要的试验平台,本发明填补了其研究中虚拟路由器内部通信方法缺失的空白。
附图说明
图1为系统结构示意图;
图2为NetFPGA原始数据包P1格式;
图3为vMAC_VR映射表,VRID为虚拟路由器编号,vMAC是虚拟网卡nf的MAC地址,veMAC、veIP为虚拟路由器网卡veth的MAC地址和IP地址;
图4为nfc信息表,此表包含了NetFPGA板载网卡的信息,包括MAC地址和IP地址;
图5为封装数据包newHead格式;
图6为封装数据包P5格式;
图7为虚拟路由器接收数据包流程图;
图8为数据包发送及路由信息部署流程图。
具体实施方式
本发明基于NetFPGA的可编程虚拟路由器通信方法需要设置以下功能模块:
数据包入口设备检查模块:通过读取每一个流入Linux内核的数据包缓冲区skb的input_dev结构,获取输入设备的名称。
数据封装模块:将从NetFPGA送往主机的原始数据包封装到一个新的IPv4数据包内,并初始化vMAC_VR映射表和nf信息表;
网卡虚拟模块:在OpenVZ虚拟机通过TUN/TAP虚拟出多个以太网虚拟网卡nf,TUN是操作系统内核中的虚拟网络设备,向运行于操作系统上的软件提供与硬件的网络设备完全相同的功能,供虚拟路由器使用;网卡nf有如下特性:操作系统通过TUN/TAP设备向绑定该设备的用户空间的程序发送数据,反之,用户空间的程序也可以像操作硬件网络设备那样,通过TUN/TAP设备发送数据。在后种情况下,TUN/TAP设备向操作系统的网络栈投递(或“注入”)数据包,从而模拟从外部接受数据的过程;初始化虚拟路由器VR标识符VRID。
数据分发模块:捕捉虚拟路由器网卡veth上的数据包,并将其中的NetFPGA数据包写入对应的网卡nf;
信息接收模块:通过侦听网关venet,分析由网卡veth发送出去的数据包,获取路由信息,并通过调用NetFPGA的驱动程序API将路由信息下发到NetFPGA中。
本发明包括以下步骤:
步骤一:将所述数据包入口设备检查模块设置在Linux内核网络协议栈入口处,即在内核协议栈入口函数netif_receive_skb出增加一个函数,对进入内核的每一个数据包缓冲区skb,检查缓冲区内成员in_device的值,即入口设备的名称。
步骤二:如果入口设备的名称不是nfcx(x为网卡编号),则不做任何处理,将该数据包送回内核数据包处理队列;如果入口设备的名称为nfcx,则触发数据封装模块,并将该数据包缓冲区skb和输入设备名称nfcx传递给该模块;由NetFPGA板卡发送给主机的数据包包括三类:a.路由信息包,b.需要进行路由计算的普通数据包,c.出错数据包,对于这三类信息包,封装方法相同,将其统称为P1。
步骤三:获取步骤二中所述数据包P1的协议数据区skb->head中7~12字节所包含的目的MAC地址dMAC,并根据此MAC地址与vMAC-VR映射表(如图3)中的表项vMAC比较,查找对应虚拟路由器VR自带网卡veth的MAC地址veMAC及IP地址veIP。
步骤四:如果没有在映射表中找到对应信息,则将此数据包丢弃;如果在映射表中查找到对应信息,再次根据网卡名称nfcx查找nfc信息表(如图4),查找输入设备nfcx的MAC地址nfcMAC及IP地址nfcIP,根据这些信息封装一个新的IPv4数据包newHead,数据包格式如图5,以太网首部中源MAC地址为nfcMAC,目的MAC地址为veMAC,类型字段type为0x0800,IP首部中源IP地址为nfcIP,目的IP地址为veIP,protocol为177,IP数据段包括VRID和传递进来的数据包协议数据区skb->head。
步骤五:将步骤二中所述数据包P1的协议数据区skb->head替换为新封装的数据包skb->newHead,并重新作CRC校验,此时数据包P1变成数据包P2,最后将整个缓冲区skb送回内核协议栈处理队列,Linux内核会将数据包自动转发到对应的虚拟路由器。
步骤六:数据分发模块将OpenVZ虚拟机自带网卡veth设置为混杂模式,捕捉、分析到达网卡数据包,如果是一个IPv4数据包并且protocol字段是177,则这个数据包是P2,去掉P2的以太网首部和IP首部,读取VRID字段并与本路由器的VRID比较,如果不同,则将数据包丢弃;如果VRID相同,去掉VRID段,得到结构、数据与P1相同的数据包P3。
步骤七:读取P3的第7~12字节,获取目的MAC地址,即dMAC,分别与由网卡虚拟模块产生的各个虚拟网卡nfx(x为网卡编号)的MAC地址比较,如果MAC地址相同,则将P3写入该网卡。
步骤八:写入nfx的数据包P3,会由路由软件,如XORP、Qugga等读取并处理,对于步骤三中所述数据包P1中的a、c两类,经过路由软件处理后不会有任何输出,P1中的b类经过处理后会产生格式与P3相同的数据包P4,P3与P4内容上唯一不同的地方是P4的目的MAC被路由软件修改成了下一跳的MAC地址。
步骤九:通过Libnet将P4封装成一个以太网数据包P5(如图6),源MAC地址为veth的MAC地址veMAC,目的MAC地址为广播地址FF:FF:FF:FF:FF:FF,TYPE字段为0xCCFE,payload(负载)为P4,然后通过网卡veth直接发送出去;封装的具体步骤包括:1.调用libnet_init初始化一个数据包;2.根据步骤九中所述的信息,调用libnet_build_ethernet将P4封装成一个以太网数据包P5;3.调用libnet_write将数据包P5发送出去。
步骤十:路由信息分析模块监控位于主机操作系统内的网关venet,抓取从veth上面发送出去的数据包,分析这些数据包中以太网首部中的目的MAC地址和TYPE字段,如果目的MAC地址为FF:FF:FF:FF:FF:FF,TYPE字段为0xCCFE,那么这个数据包就是步骤九中所述的从网卡veth发送出去的数据包P5,去掉数据包P5的以太网首部区域,获取经路由软件处理后产生的数据包P4。
步骤十一:分析P4,获取目的MAC地址和目的IP地址,记录成一条路由信息,通过NetFPGA提供的参数,调用ioctl将信息存储至NetFPGA中。
步骤十二:将P4通过主机自带网卡ethx发送出去。具体步骤包括:1. 分析P4以太网首部,获取源MAC地址、目的MAC地址、TYPE字段,IP首部的ihl(首部长度)、TOS(服务类型)、tot_len(总长度)、TTL(生存时间)、protocol(协议)、源IP地址、目的IP地址,payload(负载)指针;2.调用libnet_init初始化一个数据包;3. 根据步骤1中所述的11条信息,调用libnet_build_ipv4创建一个标准IPv4数据包P6;4.调用libnet_write将数据包P6发送出去。

Claims (6)

1. 一种基于NetFPGA的可编程虚拟路由器内部通信方法,其特征在于,包括以下步骤:
步骤一,捕获进入Linux内核的NetFPGA数据包,将该数据包封装后发送到虚拟路由器;
步骤二,经所述虚拟路由器处理后的数据包通过主机操作系统转发出去,并将路由信息部署到NetFPGA 中;
其中,所述步骤一包括:
初始化建立数据封装模块,在数据封装模块中存放vMAC-VR映射表和nfc信息表;
在Linux内核网络协议栈入口处设置数据包入口设备检查模块,检查每一个流入Linux内核的数据包的入口设备名称;
如果入口设备名称为nfc则触发数据封装模块,并将该流入Linux内核的数据包缓冲区skb和入口设备名称nfc传送到数据封装模块,由数据封装模块将skb封装到一个新的IPv4数据包,然后该新的数据包通过Linux内核发送到虚拟路由器;
如果入口设备名称不为nfc则不作任何处理。
2.根据权利要求1所述一种基于NetFPGA的可编程虚拟路由器内部通信方法,其特征在于:所述数据封装模块将skb封装到一个新的IPv4数据包的步骤包括:
获取skb中的协议数据区skb->head中的MAC地址字段,并在vMAC-VR映射表中查找VR信息的IP地址,即虚拟路由器IP地址veIP和虚拟路由器MAC地址veMAC;
如果在vMAC-VR映射表中找到VR信息,则查找nfc信息表,查到入口设备的MAC地址nfcMAC和入口设备的IP地址nfcIP,将该skb中包含的协议数据区skb->head封装到一个新的IPv4数据包newHead中;否则将数据包丢弃。
3.根据权利要求1所述一种基于NetFPGA的可编程虚拟路由器内部通信方法,其特征在于:利用TUN/TAP模拟与所述NetFPGA所带网卡数量相同的路由器虚拟网卡veth。
4.根据权利要求1所述一种基于NetFPGA的可编程虚拟路由器内部通信方法,其特征在于:所述经所述虚拟路由器处理后的数据包通过主机操作系统转发出去,并将路由信息部署到NetFPGA 中的步骤包括:
通过libnet将经虚拟路由器处理后的数据包封装成一个ARP广播包,并通过路由器虚拟网卡veth发送出去;
信息接收模块监控网关venet,对每一个发送出去的ARP广播包,解包后去掉以太网首部,分析数据段内容获取路由信息,然后将数据段发送出去,通过调用NetFPGA的API将路由信息部署到NetFPGA中。
5.如权利要求4所述的一种基于NetFPGA的可编程虚拟路由器内部通信方法,其特征在于:所述通过libnet将经虚拟路由器处理后的数据包封装成一个ARP广播包的步骤包括:调用libnet_init_packet初始化一个数据包;调用libnet_build_ethernet封装一个以太网数据包;libnet_open_raw_sock打开一个套接字;调用libnet_write_link_layer发送一个链路层数据包。
6.如权利要求4所述的一种基于NetFPGA的可编程虚拟路由器内部通信方法,其特征在于:所述获取路由信息的步骤包括:
通过libpcap库抓取网关venet上的数据包,去掉以太网首部,获得数据段;
申请一段新的缓冲区,将所述数据段的第7~12字节、31~35字节复制进去,然后调用ioctl命令将其部署到NetFPGA中;
通过libnet将所述数据段发送出去。
CN201210546866.3A 2012-12-17 2012-12-17 一种基于NetFPGA的可编程虚拟路由器内部通信方法 Active CN103001883B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201210546866.3A CN103001883B (zh) 2012-12-17 2012-12-17 一种基于NetFPGA的可编程虚拟路由器内部通信方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201210546866.3A CN103001883B (zh) 2012-12-17 2012-12-17 一种基于NetFPGA的可编程虚拟路由器内部通信方法

Publications (2)

Publication Number Publication Date
CN103001883A CN103001883A (zh) 2013-03-27
CN103001883B true CN103001883B (zh) 2015-07-15

Family

ID=47930036

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201210546866.3A Active CN103001883B (zh) 2012-12-17 2012-12-17 一种基于NetFPGA的可编程虚拟路由器内部通信方法

Country Status (1)

Country Link
CN (1) CN103001883B (zh)

Families Citing this family (7)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN103259735B (zh) * 2013-05-15 2016-05-11 重庆邮电大学 一种基于NetFPGA的可编程虚拟化路由器的通信方法
CN103856407B (zh) * 2014-03-25 2016-09-07 重庆邮电大学 一种基于NetFPGA可编程虚拟路由器的数据包加速转发方法及装置
CN105162674A (zh) * 2015-10-16 2015-12-16 上海斐讯数据通信技术有限公司 一种物理机访问虚拟网络的方法及网卡
CN105847087B (zh) * 2016-05-12 2019-02-12 西安航天动力技术研究所 非注入式网络侦听装置
US10841208B2 (en) * 2016-08-05 2020-11-17 Huawei Technologies Co., Ltd. Slice/service-based routing in virtual networks
US11102164B1 (en) 2020-09-14 2021-08-24 Microsoft Technology Licensing, Llc Software defined networking operations for programmable connected devices
CN112953833B (zh) * 2021-03-25 2022-04-15 全讯汇聚网络科技(北京)有限公司 基于网桥实现三层路由转发的方法、系统及网关设备

Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN102231709A (zh) * 2011-07-04 2011-11-02 清华大学 虚拟路由装置的控制平面结构及其控制方法
CN102231708A (zh) * 2011-07-04 2011-11-02 清华大学 虚拟路由装置及其路由方法

Patent Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN102231709A (zh) * 2011-07-04 2011-11-02 清华大学 虚拟路由装置的控制平面结构及其控制方法
CN102231708A (zh) * 2011-07-04 2011-11-02 清华大学 虚拟路由装置及其路由方法

Also Published As

Publication number Publication date
CN103001883A (zh) 2013-03-27

Similar Documents

Publication Publication Date Title
CN103001883B (zh) 一种基于NetFPGA的可编程虚拟路由器内部通信方法
CN103259735B (zh) 一种基于NetFPGA的可编程虚拟化路由器的通信方法
CN102291272B (zh) 设备或网络的远程动态测试方法及装置
CN100493004C (zh) 支持远程报文镜像的报文镜像方法和网络设备
CN103391296B (zh) 一种控制器、转发器及通道建立方法和系统
CN107689931A (zh) 一种基于国产fpga的实现以太网交换功能系统及方法
CN108307434A (zh) 用于流控制的方法和设备
CN106233673A (zh) 网络服务插入
CN105471907B (zh) 一种基于Openflow的虚拟防火墙传输控制方法及系统
CN104135548B (zh) 基于fpga的静态nat实现方法及装置
WO2016062142A1 (zh) 报文汇聚传输的方法、装置和系统
CN107147655A (zh) 一种网络双协议栈并行处理模型及其处理方法
US20130223337A1 (en) Mobile device to generate multiple maximum transfer units and data transfer method
CN113328915B (zh) 一种基于SRv6的随路网络测量方法
CN109428949A (zh) 一种基于sdn实现arp代理的方法和装置
CN105515816B (zh) 检测层次信息的处理方法及装置
CN110311860A (zh) Vxlan下多链路负载均衡方法及装置
CN102438017B (zh) 基于路由功能的Modbus和BACnet Ethernet协议转化装置及转化方法
CN105052106B (zh) 用于接收和传输互联网协议(ip)数据包的方法和系统
CN109005150B (zh) 基于以太网mac地址的无链接通信方法及系统
CN105516116A (zh) 一种基于ForCES控制件控制OpenFlow交换机的系统及协议转换方法
CN107959631A (zh) 一种基于OpenWrt操作系统的6LoWPAN边界路由器的实现方法
CN112637075A (zh) 一种基于fpga的udp/ip协议栈实现方法及fpga芯片
CN102907046B (zh) 用于处理消息的方法
Higuera et al. Understanding the IEEE 1451 standard in 6loWPAN sensor networks

Legal Events

Date Code Title Description
C06 Publication
PB01 Publication
C10 Entry into substantive examination
SE01 Entry into force of request for substantive examination
C14 Grant of patent or utility model
GR01 Patent grant