专利名称:一种p2p叠加网中请求应答方法、装置和系统的制作方法
技术领域:
本发明涉及计算机网络技术领域,特别涉及一种P2P叠加网中请求应答 方法、装置和系统。
背景技术:
P2P (P2P)技术将大量的对等体(Peer)节点组织起来,形成一个叠加 网络。分布式哈希表(Distributed Hash Table, DHT)是其中一种叠加网 (Overlay )组织技术。DHT算法中利用 一个哈希空间来对叠加网络中的节 点以及要存储到叠加网络中的资源或者信息进行哈希计算。标识叠加网络中 的对等节点的哈希值,称为对等体标识;而标识资源或者信息的哈希值,被 称为4建值。目前IETF的P2P会话初始协议(SIP )工作组正在制定的P2PSIP Peer协议,就是希望能够对Peer之间的行为进行标准化,使形成的P2P叠 加网络能够提供分布式数据库服务。位于叠加网上的对等体,或者其他的节 点,如客户节点,可以利用对等体形成的分布式数据库来存储和访问数据, 例如可以存储和访问SIPURI及其相关联的IP地址信息。
P2P叠加网络上消息的传递依赖于通过特定DHT算法计算得到的哈希 值,这个值可能是对等体标识,也可能是键值。但是,P2P消息的传递是通 过每个对等体以消息相关的哈希值来查找本地保存的路由信息,获得下一跳 对等体,然后将消息继续发送给选择的对等体。每个对等体在接收到消息时, 判断是否由本对等体负责这个键值,如果是,则停止转发消息,而进入特定 的消息处理流程。
目前大部分DHT算法支持的消息类型有加入(JOIN )、离开(LEAVE )、 获取(GET)、推送(PUT)等等。在大部分的P2P应用系统中,叠加网上
7事务的处理是通过请求和与请求相关的应答来完成的。举个例子,如果对等
体A想要知道键值K所对应的信息,通常情况,对等体A需要发送一个GET 请求,并在叠加网上路由。对等体A随后等待GET请求的应答,从而判断 请求是否成功;如果成功,则从应答中得到键值K所对应的信息。
P2P消息的事务中请求和应答的通信模式主要包括迭代方式、递归方式 和半递归方式,从处理时延等角度来看,其中半递归方式是最高效的,也是 目前被广泛采用的通信模式。在半递归的通信模式下,请求在P2P叠加网被 转发,直至转发到目的对等体;目的对等体将应答直接通过IP路由返回给 请求的发送对等体。图1所示为半递归通信模式的示意图。首先,对等体A 生成携带对等体A的路由信息以及所需键值的请求,将该请求发送至其邻 居对等体B,对等体B以所述请求相关的哈希值来查找本地保存的路由信息, 获得下一跳邻居对等体C,将该请求转发到对等体C;对等体C以所述请求 相关的哈希值来查找本地保存的路由信息,获得下一跳邻居对等体D,将该 请求转发到对等体D;对等体D判断自身负责该请求的键值,则生成包含所 述键值对应信息的应答消息,并根据所述请求中的对等体A的路由信息, 将该应答消息直接发送给对等体A。在上述过程中,对等体A是发送请求的 对等体,即发送对等体;对等体D是对该请求进行处理的对等体,即目标 对等体。
网络地址转换(Network Address Translation, NAT )会给叠加网络上对 等体之间的通信带来困难。对于一个稳定的叠加网,可以认为邻居对等体之 间可以进行通信,即使他们之间存在NAT。但是,半递归通信模式下,目 标对等体和发送对等体往往不是邻居对等体,如果它们之间存在NAT,则 很可能出现通信失败。如图2所示,发送对等体A发送请求;请求经过对 等体B、 C最终到达对等体D。对等体D可以利用请求中携带的对等体A 的IP地址信息直接将应答返回给对等体A。但是如果A处于NAT后,A在 请求中携带的地址是私网地址,如果对等体D无法对该地址进行正确的地 址转换,则对等体D发送的应答消息被路由器直接丢弃或者是发送到一个不是A的主机。总之,目的对等体D无法将应答正确的回送给发送对等体 A。
发明内容
有鉴于此,本发明实施例提出一种P2P叠加网中请求应答方法和装置, 可以避免半递归通信模式下由于NAT造成的通信失败。
本发明实施例提出的一种P2P叠加网中请求应答方法,包括如下步骤 目的对等体接收到携带中转节点地址的请求消息,处理请求并生成应答
消息,根据所述请求消息中的中转节点地址,将所述应答消息发送至所述中
转节点,所述中转节点将所述应答消息转发至所述请求消息的发送对等体。 本发明实施例还"t是出一种P2P叠加网中请求应答方法,包括如下步骤 具有公网IP地址的中转节点收到来自发送对等体的请求消息,将所述
请求消息的源IP地址和端口号作为发送对等体的地址信息,将所述请求消
息发送到叠加网中的其它对等体;
中转节点接收到来自目的对等体的应答消息,根据所述发送对等体的地
址信息,将所述应答消息发送至所述发送对等体。
本发明实施例提出的一种P2P叠加网的对等体,包括
中转节点地址信息模块,用于收集与本对等体具有直接连接的叠加网的
对等体或叠加网外的网络节点的地址信息,生成中转节点地址表;
请求消息处理模块,用于将所述中转节点地址信息模块所生成的中转节
点地址表中的地址信息添加到请求消息中。
本发明实施例还提出一种P2P叠加网的对等体,所述对等体包括 应答处理模块,用于根据本对等体所收到的请求消息进行相应处理,并
生成应答消息;
应答消息发送模块,用于根据本对等体所收到的请求消息中的中转节点 地址,发送所述应答处理模块生成的应答消息。本发明实施例还提出一种P2P叠加网的对等体,所述对等体包括 发送对等体地址处理模块,用于根据本对等体所收到的请求消息中的源
IP地址和端口号确定发送对等体地址;
请求消息转发模块,用于转发本对等体所收到的请求消息; 应答消息转发模块,用于根据所述发送对等体地址处理模块所确定的发
送对等体地址,将本对等体所收到的应答消息转发给发送对等体。
本发明实施例提出一种P2P叠加网中的请求应答系统,包括请求消息的
发送对等体、请求消息的目的对等体和中转节点;
所述发送对等体,用于生成携带中转节点地址的请求消息,并向自身的 邻居对等体发送所述请求消息;
所述目的对等体用于当收到叠加网中的节点转发的所述请求消息后,根 据所述请求消息进行处理并生成应答消息,根据所述请求消息中的中转节点 地址将所述应答消息发送给所述中转节点;
所述中转节点用于将所收到的应答消息转发给所述发送对等体。
本发明实施例提出另一种P2P叠加网中的请求应答系统,包括请求消息 的发送对等体、请求消息的目的对等体和中转节点;
所述发送对等体用于生成携带中转节点地址的请求消息,并向所述中转 节点发送所述请求消息;
所述中转节点用于将所述请求消息的源IP地址和端口号作为发送对等 体的地址信息,将所述请求消息发送到叠加网中的自身的邻居对等体;接收 到来自目的对等体的应答消息,根据所述发送对等体的地址信息,将所述应 答消息发送至所述发送对等体;
所述目的对等体用于当收到叠加网中的节点转发的所述请求消息后,根 据所述请求消息进行处理并生成应答消息,根据所述请求消息中的中转节点 地址将所述应答消息发送给所述中转节点。
从以上技术方案可以看出,请求的发送对等体在请求消息中携带能够为 应答消息提供转发功能的节点的IP地址信息,目的对等体利用请求消息中提供的转发应答消息的中转节点的信息,将应答消息发送给中转节点,由中
转节点完成应答消息的转发,从而可以解决P2P叠加网中的半递归路由模式 下的NAT穿越问题。
图1为现有技术中P2P叠加网中半递归通信模式的示意图; 图2为现有技术中由于NAT导致P2P叠加网中半递归通信才莫式通信失 败的示意图3为本发明实施例的P2P叠加网中半递归通信一莫式的示意图4为本发明第一实施例提出的P2P叠加网中的请求消息的处理流程
图5为本发明第 一 实施例提出的另 一种P2P叠加网中的请求消息的处理
流程图。
具体实施例方式
本发明实施例的技术方案就是利用处于NAT后的发送对等体与中转节 点已经建立的直接连接,同时将这些与发送对等体具有直接连接的中转节点 的信息通过请求通知目的对等体。目的对等体则可以利用这些中转节点来中 转应答消息,最终这些中转节点将应答回送给发送对等体。所述中转节点与 目的对等体之间无需进行网络地址转换,中转节点可能是对等体,也可能是 公网服务器,如TURN服务器。
为使本发明的目的、技术方案和优点更加清楚,下面结合附图对本发明 实施例作进一步的详细阐述。
由于请求的发送对等体在叠加网上,是一个功能正常的对等体。因此, 发送对等体的叠加网网络的路由信息中保存有一部分叠加网上其他对等体 的通信信息。即使发送对等体在NAT后,如果发送对等体已经是一个功能 正常的对等节点,则发送对等体和它的路由信息中的对等体能够直接通信。这些邻居对等体中,可能有一些对等体与目的对等体之间可以进行正确通 信,例如是公网节点,即具有公网IP地址,或者是目的对等体的邻居对等
体;同样的,发送对等体可能还与一些公网节点建立了直接连接,这些公网 节点可能不是叠加网上的对等节点,但这些公网节点也能够为发送对等体中 转P2P的消息。
如图3所示,节点A为发送对等体,节点D为目的对等体。节点X和 节点Y是叠加网络上节点A的邻居对等体。而节点Z并不是对等体,与A 建立了直接的连接。节点X、节点Y和节点Z的共同特征是既可以和节点A 通信,也可以和节点D通信,在实际应用中,节点X、节点Y和节点Z往 往是具有公网IP地址的节点。节点A在发送P2P请求之前,判断自身可能 处于NAT后,节点A在请求消息中携带上与其已经建立直接连接的节点的 地址。这些信息随着请求最终到达目的对等体D。节点D在处理完请求后, 将回送应答消息。节点D可以选择将应答发送到上述的X或Y或Z节点, 由这些节点来将应答消息转发给对等节点A,在图3中用虚线表示应答消息。 节点D在发送应答时可以采用 一次将多个应答消息同时发送给X、 Y和Z。 也可按照X、 Y、 Z的先后顺序发送。
本发明第一实施例提出P2P叠加网中的请求消息发送以及应答流程如 图4所示,包括如下步骤
步骤401:发送对等体判断自身地址信息需要进行网络地址转换,则搜 索可以作为中转节点的节点,生成中转节点地址表。搜索中转节点的方式可 以通过以下方式
1、 在叠加网的路由信息中,查找是否有邻居对等体具有公网的IP地址; 如果有,将这些公网对等体选择作为中转节点;
2、 查找自身是否和公网中具有转发功能的服务器存在连接,如果有, 将这些公网服务器选择作为中转节点。
以上只是指出几个可行的搜索方法,中转节点的选择并不局限在上述的 两种类型。
12搜索终端节点的步骤可以只执行一次,以后定期进行更新,也可以在每 次发送请求之前执行。
步骤402:当发送对等体发送请求消息时,将中转节点的公网IP地址 信息携带在请求中发送至邻居对等体。发送对等体可以根据这些中转节点的 属性,对其公网IP地址设置一定的优先级。设置优先级的原则可以包括; 对邻居对等体设置较高优先级,对公网服务器设置较低优先级; 按照中转节点与自身的连接速度设置优先级,速度越快则设置越高的优 先级。
步骤403:当该请求经过叠加网的对等体转发,最终到达目的对等体后, 目的对等体处理完请求,检查请求消息中是否携带有中转节点的地址信息; 如果有,则将应答消息直接发送给中转节点,可以是同时发送给所有中转节 点,或者依次发送。如果中转节点的IP地址具有相应的优先级信息,则可 以按照优先级的高低依次发送应答消息,或者只发送给优先级最高的中转节 点。
步骤404:中转节点接收到应答消息后,首先检查是否和发送对等体有 直接连接;如果有直接连接,则通过已经建立的连接,将应答消息发送给发 送对等体;如果没有直接连接,则中继节点可以选择将应答丢弃,或者将采 用其他的路由方式将消息路由到发送对等体。
步骤405:发送对等体收到来自中转节点的应答消息,如果收到内容相 同的应答消息,则丟弃在后的应答消息。
在某些情况下,可能发送对等体的邻居对等体都需要进行网络地址转 换,例如,发送对等体及其邻居对等体都处于同一个局域网中;或者发送对 等体发送加入(JOIN)消息,但还没有加入到叠加网上,并没有相关的邻居 对等体信息。在这些情况下,发送对等体可以将自身的地址信息通知中转对 等体,通过发送对等体和中转对等体的配合来实现应答的回送,如图5所示, 包括如下步骤
步骤501:发送对等体获得具有公网IP地址的对等体信息,例如可以通过一些带外的方式获得该对等体信息,将这些对等体作为中转对等体,将
其地址信息;汰到请求消息中;
步骤502:发送对等体将请求消息发送给所述中转对等体;
步骤503:中转对等体记录请求报文的源IP地址和端口号,所述源IP 地址和端口号即为发送对等体的地址信息,可以让中转对等体将其后收到的 应答消息转发给发送对等体。中转对等体可以将发送对等体的地址信息存储 在本地,也可以添加到请求消息中。
由于该请求报文中的源IP地址和端口号需要进行网络地址转换,如果 目的对等体直接将该向该源IP地址和端口号对应的地址发送应答消息,则 可能发送失败。而中转对等体能够对该源IP地址和端口号进行正确的网络 地址转换,因此目的对等体将应答消息发送给中转对等体,由中转对等体来 转发该应答消息。中转对等体将发送对等体的地址信息添加到请求消息中, 其目的是在于如果中转对等体本地没有保留发送对等体的地址信息,发送 对等体的地址信息携带在请求消息中传递到目的对等体;目的对等体再将发 送对等体的地址信息携带在应答消息中,中转对等体可以根据应答消息中的 发送对等体地址信息,将该应答消息返回给发送对等体。
步骤504:中转对等体发送该请求消息,请求消息通过在叠加网中转发, 最终到达目的对等体。
步骤505:目的对等体对该请求消息进行处理,生成应答消息,如果请 求消息中包含发送对等体的地址信息,则将该地址信息添加到应答消息中; 然后将应答消息发送给所述中转对等体。
步骤506:当中转对等体接收到应答消息后,根据本地的发送对等体地 址信息或者应答消息中的地址信息,将该应答消息发送给发送对等体。如果 中转对等体与发送对等体之间没有连接,或者应答消息和本地都没有发送对
等体的地址信息,则丢弃该应答消息。
本发明第二实施例提出一种P2P叠加网中的对等体,该对等体除了具有 常规的请求消息的生成、发送以及转发模块之外,还具有中转节点地址信息模块,用于收集与本对等体具有直接连接的叠加网的
对等体或叠加网外的网络节点的地址信息,生成中转节点地址表;
请求消息处理模块,用于将所述中转节点地址信息模块所生成的中转节
点地址表中的地址信息添加到请求消息中。
所述请求消息处理模块进一步包括判断单元,用于判断本对等体的地址
是否需要进行网络地址转换;若判断单元的判断结果为是,则所述请求消息
处理模块将所述中转节点地址表添加到请求消息中。 该对等体相当于第 一 实施例中的发送对等体。
本发明第三实施例提出一种P2P叠加网中的对等体,该对等体包括 应答处理模块,用于根据本对等体所收到的请求消息进行相应处理,并 生成应答消息;
应答消息发送模块,用于根据本对等体所收到的请求消息中的中转节点 地址,发送所述应答处理模块生成的应答消息。
该实施例提出的对等体相当于第一实施例中的目标对等体。
本发明第四实施例提出一种P2P叠加网中的对等体,该对等体包括
发送对等体地址处理模块,用于根据本对等体所收到的请求消息中的源 IP地址和端口号确定发送对等体地址;
请求消息转发模块,用于转发本对等体所收到的请求消息;
应答消息转发模块,用于根据所述发送对等体地址处理模块所确定的发 送对等体地址,将本对等体所收到的应答消息转发给发送对等体。
所述发送对等体地址处理模块进一步包括
记录单元,用于记录所述发送对等体地址。
或者,所述发送对等体地址处理模块进一步包括
发送对等体地址添加单元,用于在所述请求消息转发模块所要转发的请 求消息中,添加所述发送对等体地址。
本发明实施例方案中,请求的发送对等体在请求消息中携带能够为应答 消息提供转发功能的节点的IP地址信息,目的对等体利用请求消息中提供的转发应答消息的中转节点的信息,将应答消息发送给中转节点,由中转节 点完成应答消息的转发,从而可以解决P2P叠加网中的半递归路由模式下的
NAT穿越问题。
以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本 发明的精神和原则之内所作的任何修改、等同替换和改进等,均应包含在本 发明的保护范围之内。
权利要求
1、一种P2P叠加网中的请求应答方法,其特征在于,包括如下步骤目的对等体接收携带中转节点地址的请求消息,处理请求并生成应答消息,并将所述应答消息发送至所述中转节点;所述中转节点将所述应答消息转发至所述请求消息的发送对等体。
2、 根据权利要求1所述的方法,其特征在于,所述目标对等体接收携 带中转节点信息的请求消息之前,进一步包括发送对等体确定自身的地址需要进行网络地址转换NAT,则从预先生 成的中转节点地址表中的选择中转节点,将所述选择的中转节点地址携带在 请求消息中。
3、 根据权利要求2所述的方法,其特征在于,所述生成中转节点地址 表的步骤包括在叠加网的路由信息中,发送对等体查找是否有邻居对等体具有公网的 IP地址;如果有,将这些邻居对等体的IP地址添加到中转节点地址表中;和/或,发送对等体查找自身是否和公网中具有转发功能的服务器存在 连接,如果有,将这些公网服务器的地址添加到中转节点地址表中。
4、 根据权利要求1所述的方法,其特征在于,若中转节点多于一个, 则所述将所述应答消息发送至所述中转节点包括将应答消息同时发送至各 个中转节点,或者依次发送所述应答消息至各个中转节点。
5、 根据权利要求1所述的方法,其特征在于,所述目标对等体接收携 带中转节点地址的请求消息之前,进一步包括发送对等体通过带外方式获得具有公网IP地址的对等体信息,将所述 具有公网IP地址的对等体作为中转节点,将所述中转节点地址添加到请求 消息中,并向所述中转节点发送所述请求消息;所述中转节点将所述请求消息的源IP地址和端口号添加到所述请求消 息中,并将所述请求消息发送到叠加网中的自身的邻居对等体;所述请求消息在叠加网的对等体之间转发最终到达目的对等体;所述中转节点将所述应答消息转发至所述请求消息的发送对等体包括 中转节点根据所述发送对等体的地址信息,将所述应答消息发送至发送对等 体。
6、 根据权利要求5所述的方法,其特征在于,所述中转节点将所述请 求消息的源IP地址和端口号作为发送对等体的地址信息的步骤包括中转 节点将所述发送对等体的地址信息添加到所述请求消息中;所述请求消息在叠加网的对等体之间转发最终到达目的对等体之后,进 一步包括目的对等体根据所收到的请求消息生成应答消息,将所述请求消 息中的发送对等体的地址信息添加到所述应答消息中。
7、 根据权利要求5所述的方法,其特征在于,所述中转节点将所述请 求消息的源IP地址和端口号作为发送对等体的地址信息的步骤包括所述中转节点在本地记录所述发送对等体的地址信息;则所述中转节点将所述应答消息转发至所述请求消息的发送对等体包括所述中转节点根据本地记录的发送对等体的地址信息,将所述应答消息 转发至所述发送对等体。
8、 一种P2P叠加网中请求应答方法,其特4正在于,包括如下步骤 具有公网IP地址的中转节点收到来自发送对等体的请求消息,将所述请求消息的源IP地址和端口号作为发送对等体的地址信息,将所述请求消 息发送到叠加网中的自身的邻居对等体;所述请求消息在叠加网的对等体之 间转发最终到达目的对等体;中转节点接收到来自目的对等体的应答消息,根据所述发送对等体的地 址信息,将所述应答消息发送至所述发送对等体。
9、 根据权利要求8所述的方法,其特征在于,所述中转节点将所述请 求消息的源IP地址和端口号作为发送对等体的地址信息的步骤包括中转 节点将所述发送对等体的地址信息添加到所述请求消息中;所述请求消息在叠加网的对等体之间转发最终到达目的对等体之后,进一步包括目的对等体根据所收到的请求消息生成应答消息,将所述请求消息中的发送对等体的地址信息添加到所述应答消息中。
10、 根据权利要求8所述的方法,其特征在于,所述中转节点将所述请 求消息的源IP地址和端口号作为发送对等体的地址信息的步骤包括所述中转节点在本地记录所述发送对等体的地址信息; 则所述中转节点将所述应答消息转发至所述发送对等体包括 所述中转节点根据本地记录的发送对等体的地址信息,将所述应答消息 转发至所述发送对等体。
11、 根据权利要求8所述的方法,其特征在于,所述中转节点将所述应 答消息转发至所述请求消息的发送对等体包括中转节点接收到应答消息 后,首先检查是否和发送对等体有连接,如果有连接,则通过所述连接将应 答消息发送给发送对等体。
12、 一种P2P叠加网的对等体,其特征在于,包括 中转节点地址信息模块,用于收集与本对等体具有连接的叠加网的对等体或叠加网外的网络节点的地址信息,生成中转节点地址表;请求消息处理模块,用于将所述中转节点地址信息模块所生成的中转节 点地址表中的地址信息添加到请求消息中。
13、 根据权利要求12所述的对等体,其特征在于,所述请求消息处理 模块进一步包括判断单元,用于判断本对等体的地址是否需要进行网络地址 转换;若判断单元的判断结果为是,则所述请求消息处理模块将所述中转节 点地址表添加到请求消息中。
14、 一种P2P叠加网的对等体,其特征在于,所述对等体包括 应答处理模块,用于根据本对等体所收到的请求消息进行相应处理,并生成应答消息;应答消息发送模块,用于根据本对等体所收到的请求消息中的中转节点 地址,发送所述应答处理模块生成的应答消息。
15、 一种p2p叠加网的对等体,其特征在于,所述对等体包括 发送对等体地址处理模块,用于根据本对等体所收到的请求消息中的源ip地址和端口号确定发送对等体地址;请求消息转发模块,用于转发本对等体所收到的请求消息; 应答消息转发模块,用于根据所述发送对等体地址处理模块所确定的发送对等体地址,将本对等体所收到的应答消息转发给发送对等体。
16、 根据权利要求15所述的对等体,其特征在于,所述发送对等体地 址处理模块进一步包括记录单元,用于记录所述发送对等体地址。
17、 根据权利要求15所述的对等体,其特征在于,所述发送对等体地 址处理模块进一步包括发送对等体地址添加单元,用于在所述请求消息转发模块所要转发的请 求消息中,添加所述发送对等体地址。
18、 一种p2p叠加网中的请求应答系统,其特征在于,包括请求消息的 发送对等体、请求消息的目的对等体和中转节点;所述发送对等体,用于生成携带中转节点地址的请求消息,并向自身的 邻居对等体发送所述请求消息;所述目的对等体用于当收到叠加网中的节点转发的所述请求消息后,根 据所述请求消息进行处理并生成应答消息,根据所述请求消息中的中转节点 地址将所述应答消息发送给所述中转节点;所述中转节点用于将所收到的应答消息转发给所述发送对等体。
19、 一种p2p叠加网中的请求应答系统,其特征在于,包括请求消息的 发送对等体、请求消息的目的对等体和中转节点;所述发送对等体用于生成携带中转节点地址的请求消息,并向所述中转 节点发送所述请求消息;所述中转节点用于将所述请求消息的源ip地址和端口号作为发送对等体的地址信息,将所述请求消息发送到叠加网中的自身的邻居对等体;接收到来自目的对等体的应答消息,根据所述发送对等体的地址信息,将所述应答消息发送至所述发送对等体;所述目的对等体用于当收到叠加网中的节点转发的所述请求消息后,根 据所述请求消息进行处理并生成应答消息,根据所述请求消息中的中转节点 地址将所述应答消息发送给所述中转节点。
全文摘要
本发明公开了一种P2P叠加网中请求应答方法,包括如下步骤目的对等体接收到携带中转节点地址的请求消息,处理请求并生成应答消息,根据所述请求消息中的中转节点地址,将所述应答消息发送至所述中转节点,所述中转节点将所述应答消息转发至所述请求消息的发送对等体。本发明还公开了叠加网对等体,以及P2P叠加网中请求应答系统。本发明方案可以解决P2P叠加网中的半递归路由模式下的网络地址转换(NAT)穿越问题。
文档编号H04L1/16GK101425958SQ200710165109
公开日2009年5月6日 申请日期2007年10月29日 优先权日2007年10月29日
发明者江兴烽 申请人:华为技术有限公司