首页> 中国专利> 用于在网络结构上发送数据包的方法、系统和硬件

用于在网络结构上发送数据包的方法、系统和硬件

摘要

在InfiniBand硬件适配器中提供的发送队列从连接的计算机系统接收单个传输,该传输包括工作请求信息、地址矢量和消息数据。该信息足以让适配器生成包报头信息并且发送被请求的消息,从而提供低等待时间的发送机制。该系统在表中存储完成信息,每个专用于各发送队列中的一个。

著录项

  • 公开/公告号CN101222428A

    专利类型发明专利

  • 公开/公告日2008-07-16

    原文格式PDF

  • 申请/专利权人 国际商业机器公司;

    申请/专利号CN200810003108.0

  • 申请日2008-01-10

  • 分类号H04L12/56;H04L29/02;

  • 代理机构北京市柳沈律师事务所;

  • 代理人周少杰

  • 地址 美国纽约阿芒克

  • 入库时间 2023-12-17 20:23:48

法律信息

  • 法律状态公告日

    法律状态信息

    法律状态

  • 2012-05-09

    授权

    授权

  • 2008-09-10

    实质审查的生效

    实质审查的生效

  • 2008-07-16

    公开

    公开

说明书

技术领域

本发明涉及低等待时间(latency)消息传输。具体地,本发明提供了一种允许发送队列等待时间被减少的解决方案。

I/O适配器定义了用于在网络结构上传输之前将消息传递信息从软件消费者传输到适配器的队列对(QP)。工业标准(如从lnfiniBand同业公会可得到的lnfiniBandTM架构规范和来自RDMA联盟的iWarp)规定:在QP上携带的消息信息具有携带与该消息有关的控制信息的工作队列元素(WQE)的形式。上述文献整个地通过引用在此并入。而且,一个或多个数据描述符指向要传输的消息数据或接收的消息要被放置的位置。

背景技术

低等待时间消息传递是在高性能的计算应用中的关键功能。在要求启动通过适配器发送消息的系统存储器和InfiniBand适配器之间的典型的数据交换消耗了大量的时间。

某些SQ应用需要减少在数据传输操作期间导致的等待时间。存在对一种增强标准的SQ操作的机制的需要,使得由这些应用要求的更低的等待时间能够被实现。

发明内容

本发明的实施例提供了在I/O硬件适配器中实现的发送队列,由此消息数据、地址矢量和工作队列元素信息在处理器局部总线上在单个传输中被提供给适配器。它还提供了标准的IB完成信息,并且提供密钥参数的硬件保护(如源LID和分区密钥)。本发明实施例用来实现低等待时间发送的主要方法和结构是最小化在硬件和存储器之间来回的通信。

本发明的实施例包括主机系统,用于生成要在网络结构上发送的多个数据消息。被耦合到主机系统的硬件适配器接收多个数据消息中的至少一个。适配器包括用于存储各数据消息的多个发送队列。主机系统传输各个主机包到硬件适配器,每个主机包包括各数据消息中的一个,并且每个主机包足以让适配器建立与网络结构兼容的相应的包报头。适配器在网络结构上发送具有相应的包报头的数据消息。

本发明的另一个实施例包括耦合到主机系统和网络的适配器。该硬件适配器包括:

发送队列,用于存储请求包,其中每个请求包包括消息数据和报头数据,其足以用于适配器构造具有网络兼容的包报头和消息数据的包,以便在网络上用包报头发送消息数据。

本发明的另一个实施例包括一种在网络结构上发送数据包的方法。该方法包括用于生成并且提供要在网络结构上发送的多个数据消息的各步骤。还生成各个主机包,每个主机包包括各数据消息中的一个,并且每个主机包足以建立与网络结构兼容的相应的包报头。数据消息在记录的队列中被接收和存储,然后每个和其相对应的包报头在网络上被发送。

当结合以下的描述和附图考虑时,本发明的这些和其它的方面和目的将被更好地理解和懂得。然而应该理解:尽管指示本发明的优选实施例和其大量的具体细节,但是仅仅以说明而不是限制的方式给出以下描述。可以在本发明的范围内进行许多改变和修改而不偏离本发明的精神,并且本发明包括所有这样的修改。

附图说明

图1是作为本发明的各实施例的示例性操作环境的分布式计算机系统的图;

图2是作为本发明的各实施例的示例性操作环境的一部分的主机信道适配器的图;

图3是图示作为本发明的各实施例的示例性操作环境的一部分的工作请求的处理的图;

图4图示了现有技术标准的队列对处理;

图5图示了根据本发明的实施例的改进的发送队列配置;

图6图示了本发明的实施例的流程图。

具体实施方式

图1是其中可以实现示例性实施例的分布式计算机系统的图。在图1中表现的分布式计算机系统采用SAN100的形式,并且提供来仅仅用于说明性的目的。下面描述的本发明的各示例性实施例能够在许多其它类型和配置的计算机系统上实现。例如,实现各示例性实施例的计算机系统可以从具有一个处理器和几个输入输出(I/O)适配器的小服务器到具有数百或数千处理器和数千的I/O适配器的大型并行超级计算机系统。

参照图1,SAN100是用于互连分布式计算机系统内的各节点的高带宽、低等待时间网络。节点是附接到网络的一个或多个链路并且形成网络内的消息的起源和/或目的地的任何组件。在图1中描述的示例中,SAN100包括:以主机处理器节点102、主机处理器节点104、冗余阵列独立盘(RAID)子系统节点106和I/O底盘(chassis)节点108形式的各节点。在图1中图示的各节点仅仅用于解释性的目的,因为SAN100能够互连任何数量和任何类型的独立处理器节点、I/O适配器节点和I/O设备节点。各节点中的任何一个能够用作端节点,其在此被定义为在SAN100中产生或最后消耗消息或包的设备。在各示例性实施例中,在分布式计算机系统中的错误处理机制被呈现,其中该错误处理机制允许在分布式计算系统(如SAN100)的各端节点之间可靠的连接和/或可靠的数据报(datagram)通信。

在此使用的消息是数据交换的定义的应用单元,其是在各协同操作的处理之间通信的基本单元。包是由网络协议报头和/或报尾封装的一个单元的数据。报头通常提供用于指引包通过SAN100的控制和路由信息。报尾通常包含控制和循环冗余码校验(CRC)数据以验证包不用损坏的内容传送。

在图1中描述的SAN100包含在分布式计算机系统内支持I/O和处理器间通信(IPC)的通信和管理基础结构。在图1中示出的SAN100包括:交换的通信结构116,其允许许多设备在安全、远程管理的环境中用高带宽和低等待时间并发地传输数据。端节点能够通过多个端口通信,并且利用通过SAN结构的多个路径。通过图1中示出的SAN的多个端口和路径能够被采用用于容错和增加的带宽数据传输。

在图1中的SAN100包括:三个交换机112、114和146;以及路由器117。交换机是将多个链路连接在一起,并且允许使用小报头目的地局部标识符(DLID)字段在子网内从一个链路到另一个链路的包的路由的设备。路由器是将多个子网连接在一起,并且能够使用大报头目的地全局唯一标识符(DGUID)将包从第一子网中的一个链路路由到第二子网中的另一个链路的设备。

在一个实施例中,链路是在任何的两个网络结构元素(如端节点、交换机或路由器)之间的全双工信道。

对于可靠的服务类型,端节点(如主机处理器端节点和I/O适配器端节点)生成请求包并且返回确认包。交换机和路由器将包从源一直传递到目的地。除了在网络的每个阶段被更新的不同的CRC报尾字段外,交换机将包不修改地传递。路由器更新不同的CRC报尾字段,并且当包被路由时修改报头中的其它字段。

在图1中图示的SAN100中,主机处理器节点102、主机处理器节点104以及I/O底盘108包括至少一个信道适配器(CA)以接口连接到SAN100。在各示例性实施例中,每个CA是充分详细地实现到在SAN结构116上传输的源或汇点(sink)包的CA接口的端点。主机处理器节点102包含以主机信道适配器(HCA5)118和120形式的CA。主机处理器节点104包含HCA122和124。主机处理器节点102还包括:中央处理单元126-130和通过总线系统134互连的存储器132。主机处理器节点104类似地包括:中央处理单元136-140和通过总线系统144互连的存储器142。HCA118和120提供从主机处理器节点102到交换机112的连接;而HCA122和124提供从主机处理器节点104到交换机112和114的连接。

在各示例性实施例中,HCA在硬件中实现。在此实现中,HCA硬件卸下大量端点大量中央处理单元I/O适配器通信开销。该HCA端点的硬件实现还允许通过交换网络的多个并发通信,而没有与通信协议相关联的传统开销。在一个实施例中,在图1中的HCA和SAN100在不涉及操作系统内核进程情况下提供给分布式计算机系统的I/O和IPC用户零处理器-复制数据传输,并且采用硬件来提供可靠的容错通信。

如图1中指示的那样,路由器117耦合到其它主机或其它路由器的广域网(WAN)和/或局域网(LAN)连接。在图1中的I/O底盘108包括:I/O交换机146和多个I/O模块148-156。在这些示例中,I/O模块148-156采取适配器卡的形式。在图1中图示的示例适配器卡包括:用于I/O模块148的SCSI适配器卡;用于I/O模块152到光纤信道集线器和光纤信道仲裁环(FC-AL)设备的适配器卡;用于I/O模块150的以太网适配器卡;用于I/O模块154的图形适配器卡;以及用于I/O模块156的视频适配器卡。任何已知类型的适配器卡能够被实现。I/O适配器还包括:在I/O适配器中用来将适配器卡耦合到SAN结构的交换机。这些模块包含目标信道适配器(TCAS)158-166。在图1描述的示例中,RAID子系统节点106包括:处理器168、存储器170、TCA 172、以及多个冗余的和/或有条纹的存储盘单元174。TCA172能够是完全功能性的HCA。

SAN100处理用于I/O的数据通信和处理器间的通信。SAN100支持高带宽和I/O要求的可扩展性(scalability),并且还支持处理器间通信要求的极低的等待时间和低CPU开销。用户客户机能够旁路操作系统内核进程并且直接地访问网络通信硬件(如HCA),其使得有效率的消息传递协议成为可能。SAN100适合于当前的计算模式,并且是用于新形式的I/O和计算机机群通信的构造块。此外,在图1中的SAN100允许I/O适配器节点彼此通信或与分布式计算机系统中的任何处理器节点通信。在I/O适配器附接到SAN100的情况下,作为结果的I/O适配器节点具有与SAN100中的任何主机处理器节点基本上相同的通信能力。

在示例性的实施例中,在图1中所示的SAN100支持信道语义和存储器语义。信道语义有时被称作为发送/接收或推通信操作。信道语义是在传统的源设备推动数据和目的地设备确定该数据的最终目的地的I/O信道中采用的通信类型。在信道语义中,从源进程传输的包指定各目的地进程的通信端口,但是没有指定包将被写入各目的地进程的存储器空间中的哪里。因而,在信道语义中,目的进程预先分配在哪里放置传输的数据。

在存储器语义中,源进程直接地读取或写入远端节点目的进程的虚拟地址空间。远端目的进程只需要通信用于数据的缓冲器的位置,并且不需要涉及任何数据的传输。因而,在存储器语义中,源进程发送包含目的进程的目的地缓冲存储器地址的数据包。在存储器语义中,目的进程事先授权允许源进程访问其存储器。

信道语义和存储器语义典型性地被利用于I/O和处理器间通信。典型的I/O操作采用信道和存储器语义的组合。在图1中所示的分布计算机系统的说明性示例的I/O操作中,主机处理器节点(如主机处理器节点102)通过使用信道语义启动I/O操作以发送盘写命令到盘I/O适配器(如RAID子系统TCA172)。盘I/O适配器检查该命令并且使用存储器语义直接地读来自主机处理器节点的存储器空间的数据缓冲器。在数据缓冲器被读之后,盘I/O适配器采用信道语义将I/O完成消息推回到主机处理器节点。

在各示例性实施例中,在图1中所示的分布计算机系统执行利用虚拟地址和虚拟存储器保护机制的操作以确保对所有存储器正确和适当的访问。在这样的分布计算机系统中运行的应用不要求使用用于任何的操作物理寻址。

现在参照图2,HCA200的图被描述。在图2中所示的HCA200包括:一组QP202-210,其被用来将消息传输到HCA端口212-216。到HCA端口212-216的数据缓冲通过虚拟通道(VL)218-234形成信道,其中每个VL具有其自己的流程控制。子网管理器用用于每个物理端口的局部地址(即,端口的局部标识符(LID))配置信道适配器。子网管理器代理(SMA)236是与子网管理器通信的实体,用于配置信道适配器的目的。存储器转换和保护(MTP)238是将虚拟地址转换为物理的地址并且确认访问权利的机制。直接存储存取(DMA)240使用相对于QP202-210的存储器242提供用于DMA的操作。

单信道适配器(如在图2中所示的HCA200)能够支持数千的QP。相反,在I/O适配器中的TCA典型性地支持数量小得多的QP。每个QP包括两个工作队列:一个发送队列(SQ)和一个接收队列(RQ)。SQ被用来发送信道和存储器语义消息。RQ接收信道语义消息。用户调用操作系统专门的编程接口,其在此被称为“动词”接口,以放置工作请求(WR)到工作队列上。

现在参照图3,描述了图示工作请求的处理的图。在图3中,RQ300、SQ302以及完成队列(CQ)304被呈现用于处理来自和用于用户306.的请求。来自用户306的这些请求最后被发送至硬件308。在该示例中,用户306生成工作请求310和312并且接收工作完成314。如图3中所示,放置到工作队列上的工作请求被称为工作队列元素(WQE)。

SQ302包含WQE322-328,描述了要在SAN结构上传输的数据。RQ300包含WQE316-320,描述从SAN结构进入的信道语义数据放置在何处。WQE通过HCA中的硬件308处理。每个QP通过QP环境管理,其是与特定的QP(如当前的WQE、包序列号、传输参数等)有关的信息块。

动词接口还提供了用于从CQ 304检索已完成的工作的机制。如图3中所示,CQ304包含完成队列元素(CQE)330-336。CQE包含关于先前已完成的WQE的信息。CQ304被用来创建用于多个QP的完成通知的单个点。CQE是在描述已完成的WQE的CQ上的数据结构。该CQE包含足够的信息以确定QP和已完成的特定WQE。CQ环境是包含指针、长度和管理单个CQ所需的其它信息的信息块。

对如图3中所示的SQ302支持的示例WR如下。发送WR是信道语义操作,以推动一组局部数据段到由远端节点的接收WQE引用的数据段。例如,WQE328引用数据段4338、数据段5340以及数据段6342。每个发送WR的数据段包含虚拟邻接的存储器空间。用来引用局部数据段的虚拟地址位于创建局部QP的进程的地址环境中。

在各示例性实施例中,图3中所示的RQ300仅仅支持一种被称为接收WQE的类型的WQE。接收WQE提供描述局部存储器空间的信道语义操作,进入的发送消息被写入该局部存储器空间。接收WQE包括描述若干虚拟邻接的存储器空间的扩散列表。进入的发送消息被写到这些存储器空间。该虚拟地址在创建局部QP的进程的地址环境中。

对处理器间通信,用户-模式软件进程通过QP直接地从缓冲器在存储器驻留的地方传输数据。在各示例性实施例中,通过QP的传输旁路操作系统并且消耗很少主机指令周期。在没有操作系统内核卷入的情况下,QP准许零处理器-复制数据传输。零处理-复制数据传输提供对高带宽和低等待时间通信的有效支持。

当QP被创建时,QP被设为提供选择的传输服务的类型。在各示例性实施例中,实现本发明的分布式计算机系统支持四种类型的传输服务:可靠的连接、不可靠的连接、可靠的数据报以及不可靠的数据报(UD)服务。

现在参照图4,描述了图示用于处理发送请求的标准的QP处理的图。在虚线下面示出了在此经常简单地称作为“硬件”的InfiniBand信道适配器401。虚线上面是系统侧存储器402,被构造来保持要由硬件适配器401传输的发送队列403和消息405。然后硬件适配器通过如InfiniBand结构的网络结构,或通过InfiniBand链路(未示出)发送消息。消息405由在用于顺序处理的发送队列403中被编索引各WQE引用。WQE被标记WQE1-4。发送队列包括系统的消息发送请求列表。软件维持指针指向发送队列末尾,即SQ尾指针406。

硬件适配器本身还包括:具有队列对表格项目(QPTE)0-n409的队列对表格408。每个QPTE能够被构造来包括(尽管各种其它有用的数据能够被存储其中):指向发送队列的头部处的WQE的指针410、SQ长度411、SQWQE长度412、CQPTR413、以及其它环境信息。

在所描述的标准的SQ过程中,为了通过InfiniBand链路发送消息,如InfiniBand协议领域的技术人员所公知的那样,系统发送MMIO(存储器映射的I/O)存储消息到硬件,通知该硬件存在由WQE引用的消息等待被发送。然后该硬件401取出处于发送队列471的头部的WQE,该队列完全地位于系统存储器中。包含在取出的WQE460中的信息包括:虚拟地址、消息长度和LKey。适配器使用LKey和虚拟地址信息来访问保护表格451以及地址转换表450,以便获得该消息的物理地址452。在使用物理地址取出消息数据405后,硬件用从所提取的WQE460获得的存储于适配器中的信息、QP环境以及消息数据构建包。

将要注意到:已经在系统存储器和硬件之间存在若干耗时的通信,以生成要通过InfiniBand链路发送的包,例如MMIO消息、提取WQE、提取消息数据。而且,地址翻译步骤也消耗时间并且通过本发明的实施例的使用而避免。例如,地址翻译步骤典型地要求硬件访问系统存储器中的地址翻译表。通常分层的地址翻译表被采用并且被用于单个虚拟到物理地址翻译的硬件访问若干次。

参照图5,描述了图示用于实现本发明的低等待时间发送队列(LLSQ)501的改进的装置和方法的图。本发明的一个实施例实现了用于上述的不可靠的数据报(UD)传输服务的LLSQ。在包括通过IB结构和路由器的数千节点通信的环境中,本发明提供了用于这些大机群的可缩放性的好处。为了可靠连接的传输服务,每个节点要求QP。因为对用于要求的QP的数量的存储器的需求,这种类型的配置开始随着大机群而出现故障。而且,当数据分散在大量的QP上时,在适配器中高速缓存信息变得效率较低。根据本发明的单个QP实现提供了更好的高速缓存的连贯性、较低的存储器使用和在适配器中要求较少的资源。

参照硬件适配器501,存在图示的在128个字节插槽(slot)上排列的具有存储元素(例如,550和551)的发送队列502。尽管示出了一个发送队列,但是许多发送队列典型地配置在适配器中。然后每个发送队列被映射到不同的系统存储器空间,使得各进程可以被分配每个具有它们自己的存储器空间的专门的SQ。硬件发送队列被循环地排列和处理,也就是说,当适配器到达在发送队列中要发送的消息列表的底部时,它接着返回到顶部以继续处理和发送消息。

为了通过InfiniBand链路(未示出)发送消息,如上所述系统将发送单个MMIO存储消息到硬件(也被称作为“存储聚积”或猝发(burst)MMIO),其中在到硬件的单个传输中的128个字节的信息中,提供用于硬件发送消息必要的全部信息。IBM公司拥有和制造的Power ArchitectureTM,利用了128字节高速缓存线。在此所描述的具体实施例将因此包括从系统存储器对128个字节传输的引用,然而,本发明不限于这种架构,并且能够在具有不同长度的标准高速缓存线的架构中实现。在猝发或“存储聚积”中提供的信息传输包括例如每个包括8个字节的WQE数据511(和521)和地址矢量数据512(和522),以及包括112个字节的消息数据513(和523),或可选择地在特殊情况下,用于总共240个字节的消息数据的附加的128个字节的数据507。该扩展的数据消息长度示例在503被图示,其中存储在数据2b的扩展的数据被附加到112字节数据2a。当较小的控制消息在大机群之间发送时,112字节消息长度特别有用,然而,在LLSQ的该实现中,当需要时通过在被发送到适配器的WQE中指示消息数据长度,能够选择用于另一个高速缓存线的值得的消息数据的添加空间的选项。

作为说明性的示例,在猝发MMIO中提供的WQE数据(典型地为8字节)包括:(没有特定顺序)Op类型,如SEND发送;指示消息数据长度的长度字段;以及QKey。在本改进的发送队列中实现的地址矢量数据包括InfiniBand标准DLID和在InfiniBand结构中寻址目标位置的目的地QP#。因而,硬件适配器在单个MMIO传输中接收它要求的所有信息,以构建标准IB包报头的来通过InfiniBand结构(未示出)发送消息。固定的包报头字段被存储在适配器的QP环境515中并且包括字段,如用于识别消息的源端口的源局部ID(SLID)、用于如果必要通过InfiniBand路由器路由消息的源全局ID(SGID)、以及分区密钥(PKey),它们都与适配器上的端口相关联。如果适配器包括多于一个的端口,则选择其作为WQE信息的一部分,并且为每个相关联的适配器端口存储环境中的字段值。

为了防止该系统盖写(overwrite)在硬件发送队列中存储的未发送消息,在系统存储器中存储的发送队列完成队列(SQCQ)508每个专用于发送队列之一,并且被用于当硬件已经完成发送消息时通知该系统。为了提高效率,在将每个专用于一个硬件发送队列而不是有多个发送队列使用一个的意义上讲,它被独特地设计。当系统要发送消息时,它能够用简单的存储器读取快速检查SQCQ,以便在将数据写入发送队列中的那个插槽之前验证消息是否已经从特定的发送队列插槽被发送。CQE1509对应于WQE1511,CQE2510对应于WQE2521等,尽管为了提高效率,不必为每个WQE存储CQE。当写猝发MMIO或“存储聚积”时,该系统明确地在发送队列上寻址插槽或记录。在已经通过硬件将消息发送到结构之后,如果软件在WQE中请求,则硬件501发送更新的CQE到SQCQ,指示哪个WQE已经被发送。硬件在发送CQ指针514中跟踪将CQE发送到哪里。典型地,例如软件请求每第n个消息发送一个CQE,其中n例如可是在SQ中的插槽数的大约四分之一,以便当发送队列中的空间可用时通知系统。软件通过在WQE中设置一个位请求CQE。每个接收的CQE使用SQ索引在SQ中识别已经从其发送消息到结构的插槽。软件保持最后收到的CQE的记录,并且基于最新接收的CQE确定有多少个插槽打开。在CQE中的插槽号指示被标识的插槽和所有前面的插槽中的消息已经被发送到结构,即它们已经完成并且软件发送新消息到那些插槽的任何一个是安全的。

参照图6,描述了示出本发明实施例的方法的实现的流程图。在第一步骤603,系统发送MMIO存储猝发到硬件,包括WQE、地址矢量和包括请求硬件发送消息的消息数据信息。如果消息请求超过112字节的消息数据,则WQE将指示这在长度字段中。在步骤604,如果消息数据请求额外数据,则在步骤605,硬件将检查在SQ中的额外数据。在步骤606,如果硬件包括多于一个的端口,则在步骤607基于在WQE中提供的信息将选择该端口。在步骤S608,然后包报头信息将由硬件基于在WQE中提供的信息、地址矢量和在硬件中存储的来自SQ环境中的固定报头字段组装。在步骤609,消息经由所选择的端口发送。在步骤610,如果WQE包括对CQE更新的请求,则硬件将CQE存储到由硬件SCQ指针指示的位置处的系统的SQCQ。

替代的实施例

在此描述的相互通信的设备不需要相互连续地通信,除非明确地另有规定。此外,相互通信的设备可能通过一个或者多个媒介直接或间接地通信。此外,具有相互通信的若干组件的实施例的描述不暗示要求所有这样的组件。相反,各种可选择的组件被描述来说明多种可能的实施例。

而且,尽管处理步骤、方法步骤、算法等可以按连续顺序描述,但是这样的处理、方法和算法也可以被配置以按替代的顺序工作。换言之,可以描述的步骤的任何序列或顺序不一定指示要求各步骤要以该顺序执行。在此描述的处理的各步骤可以按任何实际的顺序执行。而且,某些步骤也可以同时、并行或并发地执行。

当在此描述单个设备或物品时,显然多于一个的设备/产品(无论它们是否协作)可以被用来替换单个设备/产品。类似地,当在此描述多于一个设备或产品(无论它们是否协作)时,显然单个设备/产品可以被用来替换多于一个的设备/产品。设备的功能和/或特征可以替代地由没有在此明确描述为具有这样的功能/特征的一个或多个其它设备体现。因而,其它的实施例不必包括该设备本身。

因此,为了说明和描述的目的,已经呈现了对实施例的前面的描述。其意图不在于穷举或限制实施例为在此公开的精确形式。根据上面的教导,许多修改和变化是可能的。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号