数据传输方法、数据端设备与流程

文档序号:17817149发布日期:2019-06-05 21:52
数据传输方法、数据端设备与流程

本申请属于计算机技术领域,尤其涉及一种数据传输方法、数据端设备。



背景技术:

在用户应用程序的某次操作(例如:搜索关键词、读写远端数据等)涉及到网络传输时,经常会遇到高延迟或者是传输超时。这种高延迟或者是超时不仅会影响用户体验,而且还可能导致在服务器端堆积请求,从而严重影响服务的可用性。

如果要有效解决这些问题,那么服务管理员或者是用户需要了解这些高延迟或者是超时的产生原因,从而有针对性地进行修复和优化。在实际的网络传输的过程中,产生延迟的因素除了发送端和接收端的软件问题之外,一般还包括网络通讯链路上的问题。

以TCP(Transmission Control Protocol,传输控制协议)为例,在检测到网络通讯链路出现问题(例如:链路出现拥塞或者大波动)的时候,会触发进行数据段的重传操作。然而,在重传的时候,因为TCP传输的时候,数据是以数据流的形式传输的,并不知道重传的数据对应哪个应用程序或者是对应应用程序发出的哪个数据包,这样就势必会导致对延迟或者超时的原因的分析产生障碍。

针对上述问题,目前尚未提出有效的解决方案。



技术实现要素:

本申请目的在于提供一种数据传输方法、数据端设备,可以实现。

本申请提供一种数据传输方法、数据端设备是这样实现的:

一种数据传输方法,所述方法包括:

在用户层为待传输数据包的包头加入标识字段,以生成发送数据,其中,所述标识字段用于唯一标识所述待传输数据包;

通过协议层传输所述发送数据;

获取被重传的数据,并提取所述被重传的数据对应的标识字段;

根据提取的标识字段,确定被重传的数据所属的用户层的数据包。

一种数据端设备,包括处理器以及用于存储处理器可执行指令的存储器,所述处理器执行所述指令时实现如下步骤:

在用户层为待传输数据包的包头加入标识字段,以生成发送数据,其中,所述标识字段用于唯一标识所述待传输数据包;

通过协议层传输所述发送数据;

获取被重传的数据,并提取所述被重传的数据对应的标识字段;

根据提取的标识字段,确定被重传的数据所属的用户层的数据包。

一种计算机可读存储介质,其上存储有计算机指令,所述指令被执行时实现上述方法的步骤。

本申请提供的数据传输方法、数据端设备,通过在用户层为待传输数据包的包头加入标识字段生成发送数据的方式,使得对于重传的数据包,可以提取其中携带的标识字段,从而可以确定出被重传的数据包对应于用户层传输的哪个数据包。通过上述方式解决了现有的在重传的时候,数据是以数据流的形式传输的,并不知道重传的数据对应哪个应用程序或者是对应应用程序发出的哪个数据包,这样就势必会导致对延迟或者超时的原因的分析产生障碍的问题,达到了简单高效确定出重传数据包与原始数据包的对应关系的技术效果,可以有效分析网络延迟的原因。

附图说明

为了更清楚地说明本申请实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本申请中记载的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。

图1是本申请提供的数据传输系统的架构示意图;

图2是本申请提供的数据传输方法的一种实施例的方法流程图;

图3是本申请提供的传输流程的一种实施例的示意图;

图4是本申请提供的服务器的一种实施例的架构示意图;

图5是本申请提供的数据传输装置的一种实施例的模块结构示意图。

具体实施方式

为了使本技术领域的人员更好地理解本申请中的技术方案,下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都应当属于本申请保护的范围。

考虑如果要解决网络通讯中的乱序和丢包,保证数据以流的形式正确的(包括数据内容和顺序性)传输到目的地。因此,当内核传输协议发送数据段以后,不会立即将数据段清理掉,而是维持在一个队列中。当检测到乱序和丢包后,就会从队列中找到对应的数据重新发送一遍。例如,以TCP协议为例,会在超时(发包后在一定时间内没有收到对应的ACK确认)、推测拥塞(比如:连续收到三个重复ACK,收到SACK等)、收到需要分配ICMP消息时进行重传。

重传操作一般伴随着拥塞窗口的减少,甚至停止对新数据的发送,反映到上层用户层的一个表象就是发包变慢、出现超时,更有甚者出错退出。因为数据传输的过程是通过数据流的方式传输的,用户层传过来的数据在数据流中就是按照流数据的方式传输的,在进行重传都操作时候,对于传输协议而言,也仅是知道对某一段数据流进行重传,但是并不知道这些重传的数据流对应于用户层的哪些数据包。相应的,用户层仅会看出是发包变慢、出现超时等,但是不知道是哪些数据包发生的延迟或超时。

为此,考虑到如果在用户层应用程序的数据包中增加一个用于唯一标识用户层数据包的标识字段(例如:标识ID),并将该标识字段也随着数据包传输至协议层(例如:TCP层),那么在进行数据传输和重传的时候,就可以根据该标识字段确定出重传的数据是属于哪个数据包。即,可以通过该标记ID去关联当初应用程序发送的原始数据包,还可以在应用程序发现某请求高延迟或超时后,通过该请求的标记ID到重传数据事件集合中查找是否有相关的标记ID,从而判断出该请求的高延迟或超时是否是由于网络通讯链路问题造成的,甚至可以进一步判断出产生链路问题的原因。

鉴于现有的在检测到网络通讯链路出现问题(例如:链路出现拥塞或者大波动)的时候,会触发进行数据段的重传操作。然而,在重传的时候,数据是以数据流的形式传输的,并不知道重传的数据对应哪个应用程序或者是对应应用程序发出的哪个数据包,这样就势必会导致对延迟或者超时的原因的分析产生障碍。

为此考虑到如果在数据包中增加标识字段,通过标识字段来对每个数据包进行标识,在重传的时候,也携带这个标识,那么在进行数据重传的时候,也就可以基于该标识字段确定出被重传的数据包对应于原始的哪个数据包,从而可以对延迟或超市的原因可以进行简单准确的分析。

基于此,在本例中提供了一种数据传输系统,如图1所示,包括:发送方101、接收方102,发送方101和接收方102之间通过TCP协议进行数据传输,且在存在网络故障的情况下,触发进行数据重传。

在本例中,在数据包中增加标识字段,通过标识字段来对每个数据包进行标识,在重传的时候,也携带这个标识,那么在进行数据重传的时候,也就可以基于该标识字段确定出被重传的数据包对应于原始的哪个数据包。具体的,在本例中提供了一种数据传输方法,如图2所示,可以包括如下步骤:

S1:在用户层为待传输数据包的包头加入标识字段生成发送数据,其中,所述标识字段用于唯一标识所述待传输数据包;

即,可以在准备发送的数据中,例如,可以是发送方101内存中待发的数据,为该数据增加标识字段,例如,该标识字段用于唯一标识该数据。

为了使得对于处理端而言,可以知晓TCP数据流中哪个位置是标识字段,可以在标识字段之前增加指示信息(可以将该指示信息称为魔数)。例如,该魔数可以是预定字节数量的字段,例如,可以是4字节、8字节等等,优选不常用到的字段。这样,当识别到数据流中有该字段,就可以确定紧接着的预定字节数的字段就是数据包的标识字段。

通过增加标识字段和标识字段指示信息的方式,使得可以确定出重传的数据包与原数据包之间的对应关系,从而可以基于重传确定出网络故障的原因。

S2:通过协议层传输所述发送数据;

在发送方与接收方之间进行数据传输的时候,可以通过传输协议传输,这样数据包在传输的时候,是以数据流的形式传输。

S3:获取被重传的数据中携带的标识字段,确定被重传的数据所属的用户层的数据包。

在上例中,通过在原始数据包中携带标识字段的方式,使得在重传的时候,可以通过该标识字段确定出重传的数据包是来自上层的哪个应用或者哪个数据包。即,对于被重传的数据而言,可以获取被重传数据中携带的标识字段,从而确定出重传的数据包与原数据包之间的对应关系。

该数据包的传输方法可以应用在客户端,也可以应用在服务器端,只要是网络包的发送者,那么都可以通过该方法进行数据包的传输。即,只要是发包方(不是收包方)即可。因为客户端和服务器都是会发网络包请求的,因此,两者都存在发包的可能。当服务器作为发包方的时候,该数据包的传输方法就应用在服务器中,当客户端作为发包方的时候,该数据包的传输方法就应用在客户端。

在一个实施方式中,对于用户层的数据包,在每个数据包的包头都可以增加一个标记ID,进一步的,为了使得后续在进行数据分析和提取的时候,可以知道哪些字段是标记ID,可以通过增加魔数的方式来标识。即,可以在数据包头加入一个魔数和一个标记ID,这样就可以在TCP协议重传数据段时输出该数据段所属的应用层数据包的标记ID。

上述魔数可以为具有一定长度的预先定义的字段,上述的标记ID可以设置为具有一定长度的字节,在数据包中设置魔数和标记ID的时候可以选择空闲的暂时没有用到的字段承载魔数和标记ID。上述列举的魔数和标记ID的长度可以示例性地选为2、4、8、16等等任意一种。在实际实现的时候,可以根据需要选择其它的长度设置魔数和标记ID。

在上例中,通过增加魔数的方式可以在数据流中准确判断出哪些字段是标识字段,哪些字段不是标识字段。

进一步的,考虑到因为在实际实现中,在数据包中增加了标记ID和魔数,可能会涉及到对系统内核中收发包函数进行修改,如果重新编写这些函数,那么会对这些目标系统(即,客户端或者服务器运行的操作系统)进行过大的改动。为了避免这种大规模的改动,在一个实施方式,可以通过但不限于以下方式对目标函数进行修改:

方式1)由操作系统内核或者特权进程在目标程序运行期间在用户指定的代码位置(例如:函数的头、尾部)加入特殊指令集,达到运行用户设定的代码的目的。

例如,在Linux操作系统里,采用称为kprobe的机制,用户可以利用kprobe机制实现动态instrumentation,以在Linux内核中大部分函数指定位置运行设定的代码。

方式2)通过修改特定结构指针的方法来劫持目标函数。

比较而言,方式1的优点在于它是内核正式的、专用于此目的的机制,而且限制条件少、覆盖面大;方式2的优点在于不会丢失事件,劫持的开销几乎没有。

因此,在选择劫持方式的时候,可以根据目标函数的不同选择不同的劫持方式,以便有效地减少劫持的开销,同时达到尽量减少对目标服务器的系统干扰的目的。

下面以Linux系统中TCP传输为例进行说明,具体的,要劫持的Linux内核函数可以包括但不限于以下之一:

B函数:用户层和协议层之间的TCP发送函数,例如:tcp_sendmsg;

D函数:TCP发数据段之前的检测函数,例如:tcp_v4_send_check;

F函数:TCP重传的拆包函数,例如:tcp_fragment;

H函数:TCP重传入口函数,例如:tcp_retransmit_skb。

下面主要以B函数的劫持进行具体说明:

B函数处于应用层和TCP协议层之间,B函数所涉及的参数可以包括:用户通过应用程序传进内核的原始数据包,该原始数据包存储在内存的用户空间里,可以对该函数进行劫持。

考虑到B函数是一个热点函数,因此无法采用上述的方式1,进一步的,因为B函数满足上述方式2的条件,因此可以通过上述方式2对B函数进行劫持,即,通过修改特定结构指针的方法来劫持目标函数。

通过采用劫持函数的方式实现对函数的修改,可以避免对系统大范围的修改,减少了对目标服务器的系统干扰。

举例而言,Linux内核是以sock->ops->sendmsg()的方式来调用B函数(即,sock->ops->sendmsg指针指向B函数)。因此,可以先保存sock->ops->sendmsg(即B)为原始的tcp_sendmsg(即下面的save_tcp_sendmsg),然后,再将劫持函数(A函数,my_tcp_sendmsg)赋值给sock->ops->sendmsg,从而实现对B函数的劫持。

这个过程可以通过如下的C语言伪代码实现:

inet_stream_ops=get_symbol_address_diting("inet_stream_ops");

save_tcp_sendmsg=inet_stream_ops->sendmsg;//save_tcp_sendmsg=B

inet_stream_ops->sendmsg=my_tcp_sendmsg;//inet_stream_ops->sendmsg=A

这样,在内核运行到原本B函数的位置时,就会执行劫持函数A,A函数的实现逻辑为:

A(parameter1,parameter2,…){

prepare job;//A.1准备工作

B(parameter1,parameter2,…);//A.2直接调用相应的原始函数B

ending job;//A.3结束工作

}

相应的,可以通过另外三个劫持函数(C函数、E函数、G函数)分别对D函数、F函数和H函数进行劫持。这三个劫持函数的实现逻辑都可以和A函数一样分成三部分:第一部分*.1实现准备代码,第二部分*.2直接调用原始函数;第三部分*.3实现结尾工作。

上述劫持函数的组成部分仅是一种示意性表述,在实际实现的时候,还可以采用其它的组成方式,例如,仅包括:第一部分*.1实现准备代码和第三部分*.3实现结尾工作。采用哪种方式可以根据实际需要选择,本申请对此不作限定。

与B函数类似,D函数也可以通过上述方式2进行劫持,具体的,可以通过数据结构指针:ipv4_specific->send_check调用D函数。

对于F函数和H函数,因为是非热点函数,无法使用上述的方式2进行劫持,因此,可以选用上述方式1对F函数和H函数进行劫持,即,通过在Linux内核对应的函数指定位置运行设定的代码来劫持目标函数。

以在用户层发送的数据包中增加4个字节的魔数和4个字节的标记ID为例,下面结合图3对整个过程进行描述,在图3中,横轴表示时间,纵轴表示4个劫持函数:A函数、C函数、E函数、G函数,这四个劫持函数分别对应4个原始函数:B函数、D函数、F函数、H函数。函数之间的调用关系通过竖向的箭头表示(箭头指向的目标代表被调用的函数)。虚线竖向箭头表示该调用不是每次都发生的,满足调用条件才会调用。图1中的方框内的*.1、*.2和*.3分别代表上述函数结构逻辑的三个部分。

分别对4个劫持函数说明如下:

1)A函数(my_tcp_sendmsg):用户层和协议层之间的TCP发送函数B的劫持函数。

A.1:prepare job(准备工作):

A.1.1:扫描用户空间数据内存的头部8个字节,如果扫描到前4字节是预先定义的魔数,则将后4字节作为用户传入的标记ID,将获取的标记ID存储到代表本网络链接的sk结构体中;

A.1.2:确定本次发送函数待发送的数据长度,根据本sk结构体中存储的已加入发送队列的最后一个字节的TCP序号,计算出本次发送数据对应的TCP序号窗口;

A.1.3:在本sk结构体中设置标记WRITE;

A.2:调用原始的发布函数B函数;

A.3:ending job(结束工作):

A.3.1:处理B函数的情况Y,遍历本sk结构体发送队列上的所有skb,如果当前处理的skb的TCP序号范围在A.1.2记录的本次发送数据的TCP序号窗口之内,则将A.1.1记录的标记ID存储到当前处理的skb结构体中;

其中,sk为Linux操作系统内核TCP实现中的sock数据结构,skb为Linux操作系统内核TCP实现中的sk_buff数据结构。其中,sk用于描述一条网络链接,内含和这条网络链接相关的各种信息,例如:ip、端口、mss、链接的rtt、当前发包序号、已经收到的确认序号等等;skb用于描述网络数据段(segment),包含和该数据段相关的各种信息,例如:本数据段的TCP序号范围、数据长度、数据所在的内存指针、发包时刻、本段是否重传过等等。

在实现的时候,可以通过在sk数据结构和skb数据结构中寻找无用的字段,用于存储标记ID。在TCP中,可以通过segment(段)来指代某片数据,对于上层应用程序可以通过数据包来指代。一个上层的数据包可能对应多个TCP数据段,一个TCP数据段也可能对应多个上层数据包。

A.3.2:在本sk结构体中清除标记WRITE;

2)B函数(tcp_sendmsg):用户层和协议层之间的TCP发送函数。

检测发送队列上最后一个skb包里是否还有剩余空间,如果有剩余空间,则将本次发送的数据拷贝进去,如果剩余空间不足以容纳本次发送的所有数据,则分配新的skb来容纳剩余的待发送数据量;

检测是否可以立刻发送数据,如果可以立刻发送数据,就立即发送一个skb,否则等待另外时机再发送。因此,在执行的时候,可以立即发送(一个或几个)skb(情况X,其处理见C.1.1),也可以在处理本次发送函数时,将(一个或几个)skb留在发送队列暂不发送(情况Y,其处理见A.3.1)。

3)C函数(my_tcp_send_check):TCP发数据段之前的检测函数D函数的劫持函数。

TCP最终要发送的对象是skb,发送skb的函数需要调用D函数,在本例中,可以采用C函数来劫持D函数。其中,通过C函数来劫持D函数与通过A函数劫持B函数中的情况X类似。

C.1:prepare job(准备工作):

C.1.1:处理上述B函数的情况X--如果sk结构体上存在WRITE标记,且这个skb是新发段而非重传段,则将sk结构体上存储的标记ID存到这个skb结构体上。其中,确定skb是否是新发段可以通过本skb的末TCP序号与sk上等待发送的下一个TCP段始序号值进行比较来判断。

进一步的,因skb大多数情况是本函数参数(clone)skb的原始skb,因此,可以判断是否是clone的,以确保将标记ID存在原始skb结构体而非clone的skb结构体上。

C.1.2:处理TCP拆包情况,因为TCP在发送数据的时候,会由于一些原因(例如:窗口限制等)将一个skb拆成两个来发送。因此,可以检测原始skb的next字段是否为有效的skb,如果是,且该next skb没有记录标记ID,那么就将原始skb上的标记ID存储到next skb结构体上,从而使得skb上都可以携带有标记ID,从而使得对于每个skb都可以识别出其与原始数据包之间的对应关系;

C.2:调用原始的检查函数D函数;

C.3:ending job(结束工作):空。

4)D函数(tcp_v4_send_check):TCP发数据段之前的检测函数。

5)G函数(mytcp_retransmit_skb):TCP重传入口函数H函数的劫持函数。

G.1:prepare job(准备工作):空;

G.2:调用原始重传函数H函数;

G.3:ending job(结束工作):检查H函数,如果成功发送了一个重传skb,则输出对应的事件,具体的,可以输出该重传skb上的一些信息,例如:事件发生时刻、该链接的拥塞控制状态、ip端口四元组、sk指针、TCP序号范围、记分牌、rto、srtt、rttvar等,以及标记ID等。

其中,事件在计算机科学的Tracing领域中,可以指代处理器运行到某指定代码点时,由于满足事先在该代码点设定的条件而触发一系列的操作,这些操作具备可识别性。例如:用户事先在程序代码某处设定布尔变量,当处理器运行到这个位置,且检测到该布尔变量为真时,就可以触发事件,从而执行一系列预先设定的操作。执行的操作可以是记录事件的相关信息,例如:事件名称、事件发生时刻、线程ID、事件携带的其他数据等。

6)H函数(tcp_retransmit_skb):TCP重传入口函数,TCP调用该函数来重传skb。

如果需要拆包,则H函数调用重传拆包函数F函数,进而先调用E函数。另外,当TCP真正决定要重传某个skb时,可以调用TCP发数据段之前的检测函数D函数,从而先调用C函数。但是因为sk上没有WRITE标记了,因此,不会进入C.1.1部分。

7)E函数(my_tcp_fragment):TCP重传的拆包函数F函数的劫持函数,用于处理重传拆包时转存标记ID的情况。

E.1prepare job(准备工作):空;

E.2调用原始重传拆包函数F函数;

E.3检查原始skb的next字段是否是有效的skb,如果是,且该next skb没有记录标记ID,则将这个skb的标记ID存储到next skb结构体上。

8)F函数(tcp_fragment):TCP重传的拆包函数。

在上例中,用户层应用程序在每次发数据包的头部记录一个4字节魔数和一个4字节标记ID,则可以在检测到Linux内核TCP重传某数据段时输出该重传段对应的用户层应用程序数据包的标记ID。通过该标记ID可以判断出用户层应用程序某次数据包(例如一个请求)的网络高延迟或超时是否是因为网络异常造成的。进一步的,尽量避免用kprobe机制对内核热点函数instrumentation,避免在热点路径上进行过重的操作。因此,对目标系统的干扰极低,且不会造成事件丢失。不在热点产生事件,因此,最终产生的结果数据量小,目标系统的存储、传输成本以及后续分析的成本都很小,且不修改内核源码,可以在不重启机器的情况下生效。

本申请实施例所提供的方法实施例可以在移动终端、计算机终端、服务器或者类似的运算装置中执行。以运行在服务器上为例,图4是本发明实施例的一种数据传输方法的服务器的硬件结构框图。如图4所示,服务器10可以包括一个或多个(图中仅示出一个)处理器102(处理器102可以包括但不限于微处理器MCU或可编程逻辑器件FPGA等的处理装置)、用于存储数据的存储器104、以及用于通信功能的传输模块106。本领域普通技术人员可以理解,图4所示的结构仅为示意,其并不对上述电子装置的结构造成限定。例如,服务器10还可包括比图4中所示更多或者更少的组件,或者具有与图4所示不同的配置。

存储器104可用于存储应用软件的软件程序以及模块,如本发明实施例中的数据传输方法对应的程序指令/模块,处理器102通过运行存储在存储器104内的软件程序以及模块,从而执行各种功能应用以及数据处理,即实现上述数据传输方法。存储器104可包括高速随机存储器,还可包括非易失性存储器,如一个或者多个磁性存储装置、闪存、或者其他非易失性固态存储器。在一些实例中,存储器104可进一步包括相对于处理器102远程设置的存储器,这些远程存储器可以通过网络连接至计算机终端10。上述网络的实例包括但不限于互联网、企业内部网、局域网、移动通信网及其组合。

传输模块106用于经由一个网络接收或者发送数据。上述的网络具体实例可包括计算机终端10的通信供应商提供的无线网络。在一个实例中,传输模块106包括一个网络适配器(Network Interface Controller,NIC),其可通过基站与其他网络设备相连从而可与互联网进行通讯。在一个实例中,传输模块106可以为射频(Radio Frequency,RF)模块,其用于通过无线方式与互联网进行通讯。

请参考图5,在软件实施方式中,数据传输方法可以包括生成单元501、传输单元502、获取单元503和确定单元504。其中:

生成单元501,用于在用户层为待传输数据包的包头加入标识字段,以生成发送数据,其中,所述标识字段用于唯一标识所述待传输数据包;

传输单元502,用于通过协议层传输所述发送数据;

获取单元503,用于获取被重传的数据,并提取所述被重传的数据对应的标识字段;

确定单元504,用于根据提取的标识字段,确定被重传的数据所属的用户层的数据包。

在一个实施方式中,生成单元501具体可以用于在所述待传输数据包的包头加入指示信息和标识字段,其中,所述指示信息位于所述标识字段之前,用于指示所述指示信息随后的字段为标识字段。

在一个实施方式中,传输单元502具体可以用于通过用户层与协议层之间的TCP发送函数和TCP发数据段之前的检测函数发送所述发送数据。

在一个实施方式中,传输单元502通过用户层与协议层之间的TCP发送函数和TCP发数据段之前的检测函数发送所述发送数据,可以包括:通过修改结构指针,劫持所述用户层与协议层之间的TCP发送函数和所述TCP发数据段之前的检测函数,以发送所述发送数据。

在一个实施方式中,获取单元503具体用于可以通过TCP重传入口函数重传数据;通过TCP拆包函数确定是否成功重传了数据;在确定重传了数据的情况下,获取被重传的数据。

在一个实施方式中,通过TCP重传入口函数重传数据,可以包括:通过skb携带发送数据进行重传,其中,所述skb中还携带有所述标识字段。

本申请提供的数据传输方法、数据端设备,通过在用户层为待传输数据包的包头加入标识字段生成发送数据的方式,使得对于重传的数据包,可以提取其中携带的标识字段,从而可以确定出被重传的数据包对应于用户层传输的哪个数据包。通过上述方式解决了现有的在重传的时候,数据是以数据流的形式传输的,并不知道重传的数据对应哪个应用程序或者是对应应用程序发出的哪个数据包,这样就势必会导致对延迟或者超时的原因的分析产生障碍的问题,达到了简单高效确定出重传数据包与原始数据包的对应关系的技术效果,可以有效分析网络延迟的原因。

虽然本申请提供了如实施例或流程图所述的方法操作步骤,但基于常规或者无创造性的劳动可以包括更多或者更少的操作步骤。实施例中列举的步骤顺序仅仅为众多步骤执行顺序中的一种方式,不代表唯一的执行顺序。在实际中的装置或客户端产品执行时,可以按照实施例或者附图所示的方法顺序执行或者并行执行(例如并行处理器或者多线程处理的环境)。

上述实施例阐明的装置或模块,具体可以由计算机芯片或实体实现,或者由具有某种功能的产品来实现。为了描述的方便,描述以上装置时以功能分为各种模块分别描述。在实施本申请时可以把各模块的功能在同一个或多个软件和/或硬件中实现。当然,也可以将实现某功能的模块由多个子模块或子单元组合实现。

本申请中所述的方法、装置或模块可以以计算机可读程序代码方式实现控制器按任何适当的方式实现,例如,控制器可以采取例如微处理器或处理器以及存储可由该(微)处理器执行的计算机可读程序代码(例如软件或固件)的计算机可读介质、逻辑门、开关、专用集成电路(Application Specific Integrated Circuit,ASIC)、可编程逻辑控制器和嵌入微控制器的形式,控制器的例子包括但不限于以下微控制器:ARC 625D、Atmel AT91SAM、Microchip PIC18F26K20以及Silicone Labs C8051F320,存储器控制器还可以被实现为存储器的控制逻辑的一部分。本领域技术人员也知道,除了以纯计算机可读程序代码方式实现控制器以外,完全可以通过将方法步骤进行逻辑编程来使得控制器以逻辑门、开关、专用集成电路、可编程逻辑控制器和嵌入微控制器等的形式来实现相同功能。因此这种控制器可以被认为是一种硬件部件,而对其内部包括的用于实现各种功能的装置也可以视为硬件部件内的结构。或者甚至,可以将用于实现各种功能的装置视为既可以是实现方法的软件模块又可以是硬件部件内的结构。

本申请所述装置中的部分模块可以在由计算机执行的计算机可执行指令的一般上下文中描述,例如程序模块。一般地,程序模块包括执行特定任务或实现特定抽象数据类型的例程、程序、对象、组件、数据结构、类等等。也可以在分布式计算环境中实践本申请,在这些分布式计算环境中,由通过通信网络而被连接的远程处理设备来执行任务。在分布式计算环境中,程序模块可以位于包括存储设备在内的本地和远程计算机存储介质中。

通过以上的实施方式的描述可知,本领域的技术人员可以清楚地了解到本申请可借助软件加必需的硬件的方式来实现。基于这样的理解,本申请的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,也可以通过数据迁移的实施过程中体现出来。该计算机软件产品可以存储在存储介质中,如ROM/RAM、磁碟、光盘等,包括若干指令用以使得一台计算机设备(可以是个人计算机,移动终端,服务器,或者网络设备等)执行本申请各个实施例或者实施例的某些部分所述的方法。

本说明书中的各个实施例采用递进的方式描述,各个实施例之间相同或相似的部分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。本申请的全部或者部分可用于众多通用或专用的计算机系统环境或配置中。例如:个人计算机、服务器计算机、手持设备或便携式设备、平板型设备、移动通信终端、多处理器系统、基于微处理器的系统、可编程的电子设备、网络PC、小型计算机、大型计算机、包括以上任何系统或设备的分布式计算环境等等。

虽然通过实施例描绘了本申请,本领域普通技术人员知道,本申请有许多变形和变化而不脱离本申请的精神,希望所附的权利要求包括这些变形和变化而不脱离本申请的精神。

再多了解一些
当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1