具体实施方式
本公开大体上涉及用于传输文件的系统以及管理文件传输的方法。
通过使用文件传输技术,如文件传输协议(FTP)或远程银行同业结算系统交换协议(Protocole d’Echanges pour un Système Interbancaire de Télécompensation,PeSIT),数据传输已被支持。然而,FTP、PeSIT以及其它文件传输技术可以使用多个端口并且需求专门的硬件来管理路由和负载平衡。此外,存在与处于主动和被动模式的FTP有关的在多个端口上需要特别通信的问题。例如,客户端联系服务器来识别用于连接的端口,服务器通过该端口反向通信。此外,建立新的FTP通道可能是复杂和/或昂贵的。另外,一些系统与像身份联合(Identity Federation)这样的安全标准不兼容,并且不支持单点登录(Single Sign-On,SSO)。企业计算系统可能需要包括防火墙在内的安全技术来管理威胁。企业系统可以使用防火墙来阻挡网页通道。
本文公开的是用于传输文件的系统、方法和机器可读介质的示例。根据本公开的示例使用能通过网页型连接上的单个端口进行容错文件传输的标准,来提供文件传输服务。
本公开的示例包括任何类型的文件传输,并且可以在任何类型的环境内使用。在其中可以实施本公开的示例的代表性环境包括从个人到个人、从公司到公司、从公司到政府、从政府到政府等的文件传输。根据本公开的示例提供一种允许在存在软件故障、组件故障、系统故障和/或网络故障的情况下在节点之间可靠地传输文件的文件传输协议。该文件传输协议包括例如网页服务可靠消息收发平台,该网页服务可靠消息收发平台定义简单对象访问协议(SOAP)绑定,以支持可互操作的网页服务。
本公开的示例能够使用基于XML技术进行文件传输。本文中,此文件传输还被称作XFTP。XFTP与安全断言标记语言(SAML)/ws联合相兼容,以支持认证和授权。XFTP还与用于加密和数字签名的安全套接字层(SSL)/传输层安全(TLS)和XML安全标准相兼容。这允许具有不可拒绝性的安全文件传输。这些特征使得XFTP适于面向服务的体系结构(ServiceOriented Architecture,SOA)和基于云的环境,以及适于公司到公司的数据传输情形。
在示例中,XFTP使用当前云基础结构所基于的相同的网页2.0(Web 2.0)标准,这允许对FTP或其它过时标准也许不可能的系统集成。
一些企业可能投资基础结构,如企业服务总线和安全设备。根据本公开的示例允许与包括XML安全网关在内的这种基础结构的可互操作性,这允许重使用现有投资。在示例中,本文公开的XFTP文件传输协议与标准硬件负载平衡器和路由器一起工作。例如,XFTP与像IBM数据力(DataPower)这样的XML安全网关一起工作。XFTP支持SOA的开发并且在单个端口上工作。
现在参考图1,该文件传输方法的示例大体地以附图标记200描绘。该方法包括通过网关引擎接收源文件,如附图标记202所示。该源文件是二进制文件。如附图标记204所示,该方法进一步包括通过分解引擎将源文件分成多个部分。根据消息收发协议,使用单个端口通过可靠传输引擎来传输多个部分,以在软件故障、组件故障、系统故障或者网络故障中任一种存在的情况下在节点之间可靠地传输消息,如附图标记206所示。应当理解,多个部分的传输可以根据特定消息优化协议来进行优化,例如在这种协议被所使用的通信信道支持的情况下。如附图标记208所示,通过重组装引擎将多个部分重组装成源文件的副本。应当理解,图1所示的方法的各示例将进一步参考其它图进行描述。
根据本公开的用于实现XFTP的系统的示例大体地在图2中以10来描绘。应当理解,在图2的整个描述中,可以参考图3、图4A和/或图4B。
现在参考图2、图3和图4A,系统10包括能够接收源文件12(如图4A的附图标记400所示)的网关引擎14。源文件12是二进制文件。网关引擎14包括能够将源文件12分成或解析成多个二进制部分(如图4A的附图标记402所示)的分解引擎16。因此,分解引擎16提供源二进制文件12的拆分。单个二进制部分在图3的附图标记300处示出。多个二进制部分300中的每个包括二进制数据。应当理解,二进制部分300不需要被持久保留/被存储为单独的文件,而是可以按需要简单地存在于存储器中或者直接地从源文件12读取。此外,应当理解,二进制部分300通常可以被称为块(chunk)、段(section)、片(piece)或部分(portion)。
在示例中,源文件12被分解成可以有效地进行传输和随后进行重组装的多个部分300。这使大文件能够以可靠的方式传输。部分300的尺寸可以通过用于传输过程的通信信道27的要求来确定。例如,通信信道27的动态性可能限制任何单个数据传输的最大大小,或者可能存在信道27以峰值效率操作的消息大小。
本文中使用的通信信道27可以指在其上传输数据的端口(其可以是物理连接或虚拟连接)。在示例中,XFTP可以在支持或者能够支持诸如超文本传输协议(HTTP)、简单邮件传输协议(SMTP)、消息队列(MQ)或其它类似示例之类的SOAP的任何信道27上使用。在一些情况下,信道27支持或者能够支持SOAP和MTOM(本文以下进一步介绍)。
系统10进一步包括能够以XML二进制部分300进行编码的XML编码引擎18。XML编码引擎18包括用于为多个部分300中的每个创建XML文档(参见图3中的附图标记302)的封装引擎38。在示例中,封装引擎38是使用XOP标准来对每个二进制部分300进行XML编码的XOP引擎。在使用XOP标准的示例中,封装/XOP引擎38创建XML文档302,XML文档302在其原始形式中包含对二进制数据部分300的XOP引用。在图4A中,以附图标记404示出XML文档302的创建。XML二进制优化封装(XOP)是一种由W3C标准制定组织的贡献者开发的、为包含二进制数据的XML信息集的优化顺序化限定的机制。XML信息集根据W3C被限定为满足特定约束条件的良好形成的文档。消息传输优化机制(MTOM)是W3C消息传输优化机制,其涉及二进制数据向网页服务的有效传输以及二进制数据从网页服务的有效传输。在本文公开的示例中,MTOM使用XOP作为优化和引用机制。
系统10进一步包括源网关24,源网关24能够从XML编码引擎18接收XML文档302和所引用的二进制数据部分300。如图3所示,源网关24通过源网关引擎(未示出)将XML文档302嵌入SOAP消息304内。源网关24的可靠消息收发(RM)源23(本文下面进一步介绍)实现消息收发协议(例如,WS可靠消息收发(WS-ReliableMessaging)协议),并且使用该协议来将所有XML文档302(即,来自原始源文件12)作为完整而有序的消息序列发送。WS可靠消息收发是用于消息传输的由结构化信息标准促进组织(OASIS)开发的协议。WS可靠消息收发可以用于可靠性(与例如经常不可靠的TCP连接不同),并且可以跨任何信道27应用。如图4A所示,在SOAP消息304内嵌入XML文档302和实现消息收发协议可以涉及:首先如附图标记406所示在SOAP封包(envelope)内嵌入XML文档302,然后如附图标记408所示将消息收发协议元数据添加至SOAP封包的头(header)。
如图2所示,源网关24还可以包括其它标准引擎21。其它标准引擎21允许源网关24支持其它XML、WS和/或SOAP标准,以增强通信。其它标准引擎21还可以用来将附加安全协议层添加至SOAP消息304中的每个。例如,WS可靠消息收发在SOAP和网页服务描述语言(WSDL)的模式下提供可扩展性。安全协议层包括XML签名或其它数字签名、XML加密、其它SOAP扩展、传输层安全(TLS)加密、双向认证、联合(Federation)等。XML或其它数字签名用于向接收者验证文件已来自正确的源。SAML和ws-联合可以用于建立发送方和接收方之间的信任,并且SAML还可以用于建立用于发送消息序列的授权。在图4A的附图标记410处,示出向SOAP消息304添加XML加密、数字签名或其它SOAP扩展。
如图2所示,源网关24可以包括两个编码器,其中之一是基64(Base 64)编码器20,其中另一个是MTOM引擎22。如图4A的附图标记412所示,源网关24确定待用于消息传输的通信信道27是否支持MTOM。
当信道27不支持MTOM时,源网关24的MTOM引擎22允许将XML SOAP消息304和经XOP引用的二进制数据部分300作为容器(或在容器中)(如多部分MIME(在图3中以附图标记308示出))以流的方式输送至目的地(例如目的地网关30)。如图4A的附图标记414和426所示,MTOM引擎22可以将MTOM元数据添加至SOAP封包的头,以生成SOAP消息304′(图3),并且MIME308可以用于将SOAP消息304′(包括XML文档302)和二进制数据部分300以流的方式输送至目的地。MTOM的使用可以有利地避免需传输的数据量的增加。
通信信道27能够支持SOAP,但是可能不能支持用于传输原始二进制数据的机制。在这些情况下,至少部分因为信道27不支持MTOM,所以MTOM/XOP不能用于优化该通信。当信道27不支持MTOM时,基64(Base 64)编码器20以二进制数据的基64(Base 64)编码表示代替XML文档302中的XOP引用,如图4A的附图标记418所示。如图3所示,该过程生成经基64(Base64)编码的XML文档302′和没有附件的SOAP消息304″。
如图2所示,应当理解,XFTP网关引擎14、XML编码引擎18和源网关24可以全部是单个组件的一部分,如框26处所示。进一步应当理解,XFTP网关引擎14、XML编码引擎18和源网关24可以是两个或更多个独立组件的任何组合。在示例中,源网关24或其组件可以是支持WS可靠消息收发的IBM数据力(DataPower)XML安全网关,以及其它安全和/或优化标准。
现参考图2和图4A,没有附件的SOAP消息304″或者多部分MIME 308能够跨通信信道27和根据消息收发协议(例如WS可靠消息收发)从源网关24被传输至目的地网关30。传输引擎28(本文中还称为可靠传输引擎)包括源网关24的可靠消息收发(RM)源23和目的地网关30的可靠消息收发(RM)目的地25。应当理解,在此上下文中使用的“可靠”意味着能够克服软件、组件、系统和/或网络的故障。可靠传输可以根据消息收发协议来完成,以在任何这种故障存在的情况下在节点之间可靠地传输单独的消息/分组(例如,SOAP消息304″或者多部分MIME 308)。当使用可靠传输引擎28时,单个端口可以根据消息收发协议提供SOAP消息304″或多部分MIME 308的传输。可靠传输引擎28(包括RM源23和RM目的地25)可以包括具有连通性规则(connectivity rules)、传递确认(delivery confirmation)、次序管理(ordering management)、复制消息收发保护(duplicate messaging protection)或它们的组合的特征。
传输引擎28可以使得单独的消息/分组能够以发送它们的相同顺序被接收。这可以例如使用RM源23和RM目的地25来完成。在该示例中,RM源23能够向序列内的每个消息(例如,向为单个源文件12生成的每个SOAP消息304)分配消息序号。消息序号从1开始,并且消息序号对每个后续消息增加1。以发送消息的相同顺序分配这些消息序号。RM目的地25包括确认范围(AcknowledgementRange)子元素,该确认范围子元素在它们共同的范围内包含由RM目的地25接受的每个消息的消息序号。RM目的地25将在确认范围元素中未接受的任何消息的消息序号排除在外。RM目的地25能够发送被接受的消息序号,以便向RM源23通知消息传递(参见图4A中的附图标记422-426)。如果RM目的地25没有收到消息,则RM目的地25还能够向RM源23返回“非(None)”而不是确认范围。RM源23可以重传未被确认的消息(即,RM目的地25没有确认收到的任何消息)。
在示例中,消息收发协议(例如,WS可靠消息收发)可以被配置为确定关于要回顾消息多远的时间量。WS可靠消息收发可以被配置为适合其操作所跨的信道27的动态性。
如图4A所示,对根据原始源文件12分割的每个二进制数据部分300,重复附图标记404至424的步骤。本方法的该示例然后继续,如图4B所示。现一起参照图2和图4B,为单个源文件12生成的SOAP消息304″或者多部分MIME 308(如参照图2、图3和图4A描述和示出的)全部被传送至目的地网关30,因此收到新消息序列,如图4B的附图标记430所示。目的地网关30可以创建空目的地文件,如图4B的附图标记432所示,该空目的地文件将被用于创建原始源文件12的副本(即,目的地文件56)。
序列内的每个消息被单独地处理,如图4B的附图标记434至450所示。目的地网关30接收单独的SOAP消息304″或者多部分MIME 308,并且使用另一标准引擎36来解密任何附加XML、验证任何数字签名或撤销或删除其它标准引擎21已包括的任何其它SOAP扩展。
然后,目的地网关30确定MTOM是否已经被使用,如图4B的附图标记438所示。换句话说,目的地网关30确定该消息是SOAP消息304″还是多部分MIME308。依据消息的类型,目的地网关30的不同编码器32或34可以用来获取具有对二进制数据的XOP引用的XML文档302。
如图2所示,XFTP系统10的目的地网关30进一步包括两个解码器,即基64(Base64)解码器32和MTOM解码器34。当消息序列包括SOAP消息304″时,基64(Base 64)解码器32将包含经基64编码的二进制的SOAP消息304″的XML文档302′转换为具有对二进制数据的XOP引用的XML文档302。如图4B的附图标记442和446所示,基64(Base 64)解码器32提取具有经基64(Base 64)编码的二进制数据的XML文档304″,然后以对二进制数据的XOP引用代替经基64编码的二进制数据。当消息序列包括多部分MIME 308时,MTOM解码器34能够从SOAP消息304′获取具有对二进制数据的XOP引用的XML文档302。如图4B的附图标记440所示,MTOM解码器34从多部分MIME 308直接提取具有对二进制数据的XOP引用的XML文档302。
XFTP系统10进一步包括XML解码引擎51。XML解码引擎51能够从目的地网关30接收具有对二进制数据的XOP引用的XML文档302和从XML文档302中提取该二进制数据。在示例中,XML解码引擎51能够与读取器40(例如,XOP读取器)一起操作来获取二进制数据部分,以及将该二进制数据传送给XFTP目的地52。
XFTP目的地52能够从XML解码引擎51接收单独的二进制部分300。在示例中,XFTP目的地52能够与重组装引擎50一起操作,来将所有单独的二进制部分300重组装到空目的地文件中(如图4B的附图标记448和450所示),以创建目的地文件56,目的地文件56将成为源文件12的副本。重组装引擎50对这些消息/分组中每个消息/分组的经解码的二进制数据进行重封装/重合成/重构造,并且将它们还原串接在一起,以形成原始源文件12的副本(目的地文件56)。如此,对每个消息执行图4B中的附图标记434至450所示的步骤,以便生成目的地文件56,目的地文件56将具有与原始源文件12相同的格式。
当形成目的地文件56时,XFTP目的地52可以使系统10的用户(如图4B的附图标记452和454所示)可访问目的地文件56。XFTP目的地52可以包括文件系统,从该文件系统中可获取或以其它方式可访问目的地文件56。
在图2中,应当理解,由目的地网关30、XML解码引擎51和XFTP目的地52表示的组件可以在单个组件中实现,如框54所示,或可以是单独组件的任何组合。
现参考图5,描绘了系统10′的另一示例。在此示例中,原始源文件12是二进制文件,如由1和0的序列所描绘的二进制文件。在此示例中,源文件12在XFTP客户端26′处被分割且被编码。此外,在此示例中,在XFTP服务端54′处接收、解码和重组装被编码的部分。
如图5所示,XFTP网关14接收包含二进制数据的源文件12。尽管没有示出,但是XFTP网关14的分解引擎16将文件12分解成部分300A、300B、300C、300D,300A、300B、300C、300D中的每个包含原始源文件12的二进制数据中的一些。每个部分300A、300B、300C、300D的大小被配置为适应对部分300A、300B、300C、300D的传输所使用的通信信道27的动态性、要求等。
然后,部分300A、300B、300C、300D由XML编码引擎18处理,XML编码引擎18针对部分300A、300B、300C、300D中的每个生成XML文档302A、302B、302C、302D。应当理解,每个XML文档302A、302B、302C、302D包括对各自的部分300A、300B、300C、300D的对应二进制数据的XOP引用。
XML文档302A、302B、302C、302D(包括各自的XOP引用)被传送至源网关24去进行附加处理,如上面参考图2、图3和图4A描述的。简而言之,在图5的示例中,包括对原始二进制数据的XOP引用的XML文档302A、302B、302C、302D被嵌入到各自的SOAP消息(304,在图5中未示出)中,并且作为各自的多部分MIME 308A、308B、308C、308D以流的方式输送。在另一示例中,包括对原始二进制数据的XOP引用的XML文档302A、302B、302C、302D可以被嵌入到各自的SOAP消息(例如,304)中,并且对原始二进制数据的引用可以用二进制数据的经基64(Base64)编码的表示来代替,以创建没有附件的SOAP消息(例如,304″)。
如图5所示,各自的多部分MIME 308A、308B、308C、308D穿越通信信道27传送,并且由目的地网关30接收。
由于图5的消息序列包括多部分MIME 308A、308B、308C、308D,因此MTOM解码器34能够从多部分MIME 308A、308B、308C、308D的各自SOAP消息(304′,图5中未示出)中获取具有对二进制数据的XOP引用的XML文档302A、302B、302C、302D。应当理解,当使用基64(Base 64)编码器时,基64(Base 64)解码器32可以用于获取具有对二进制数据的XOP引用的XML文档302A、302B、302C、302D。
XML解码引擎51能够从目的地网关30中接收具有对二进制数据的XOP引用的XML文档302A、302B、302C、302D。XML解码引擎51从各自的XML文档302A、302B、302C、302D中提取二进制数据部分300A、300B、300C、300D。
如图5所示,重组装引擎50接收单独的二进制部分300A、300B、300C、300D并且重组装所有单独的二进制部分300A、300B、300C、300D,以创建源文件12的副本(即目的地文件56,未示出)。
在前面的介绍中,各个组件已经被描述为可包括硬件、关联的程序设计或者它们的组合的引擎。这些组件可以以各种方式实现。图6图示这些组件的实现方式的示例作为本地系统、远程系统和云计算系统中任一种的一部分。如图6所示,源计算系统92可以可操作地通过链路98连接至本地或者远程目的地计算系统94,或者通过链路98′连接至云计算系统96,或者连接至两个系统94、96。远程目的地计算系统94可以可操作地通过链路98″连接至云计算系统96。应当理解,本地或者远程目的地计算系统94可以包括一个或多个独立的计算系统94和/或目的地计算系统94的网络。链路98、98′可以是通过电信链路、红外链路、射频链路或提供电子通信的任何其它连接器或者系统的电缆连接、无线连接、光纤连接或远程连接中的一种或多种。链路98、98′可以至少部分地包括内联网、互联网或者两者的组合。链路98、98′还可以包括中间代理、路由器、交换机、负载均衡器等。应当理解,链路98、98′能够提供用于XFTP系统10操作的通信信道。
源计算系统92和目的地计算系统94中的每个可以是任何个人计算机、便携式计算机、内容服务器、网络PC、个人数字助理(PDA)、蜂窝电话或能够执行在本公开的示例中描述的功能的任何其它计算设备。
如图6所示,该程序设计可以是存储在非瞬态有形存储介质上的处理器可执行指令,该硬件可以包括用于执行那些指令的处理器。在示例中,有形存储介质100和处理器102可以被实现为云96中物理硬件106的示例。源计算系统92和目的地计算系统94中的每个还可以包括各自的处理器102′、102″和有形存储介质100′和100″。在示例中,存储器100、100′、100″存储程序指令,该程序指令在由处理器102、102′、102″执行时实现程序,以便实现本文公开的XFTP文件传输协议的示例。
应当理解,存储器100、100′、100″可以与处理器102、102′、102″集成在相同的各自设备中,或者其可以与各自的计算系统92、94、96分离,但可由各自的计算系统92、94、96访问。
在示例中,程序指令可以是可由处理器102′、102″执行以实现XFTP文件传输协议示例的安装包的一部分。在这些情况下,存储器100′、100″可以是便携式介质,如光盘(CD)、数字视频光盘(DVD)或闪存驱动器;或者存储器100'、100″可以是由可下载该安装包的服务器保持的并且被安装在各自的计算系统92、94上的存储器。在另一示例中,程序指令可以是已经安装在各自的计算系统92、94上的一个或多个应用程序的一部分。在该其它示例中,存储器100'、100″可以包括集成的存储器,如硬驱。
本文使用的云计算系统96指包括多件硬件的计算系统,多件硬件通过网络可操作地联接以使它们能够执行特定计算任务。云96可以包括物理硬件106、软件108和虚拟硬件110的组合。云计算系统96被配置为(i)从计算系统92、94(或从使用计算系统92、94的用户)接收请求,并且(ii)返回请求响应。作为示例,云计算系统96可以是私有云、公共云或混合云。此外,云96可以是包括私有云(或多个私有云)和公共云(或多个公共云)的组合云计算系统。
除其它以外,物理硬件106可以包括处理器、存储器设备以及联网设备等等。虚拟硬件110是一种由物理硬件106处理的且被设计为模拟特定硬件的软件。作为示例,虚拟硬件110可以包括虚拟机(VM),即像物理机器那样支持应用程序执行的计算机的软件实现。
本文中使用的应用程序指可由计算系统执行以促进执行特定任务的一组特定指令。例如,应用程序可以采取为用户提供特定功能(例如文件传输)的基于网页的工具形式。应当理解,本文使用的应用程序不局限于文件传输应用程序,而是指支持使用计算资源来执行特定任务的应用程序,除其它以外如企业应用程序、会计应用程序、多媒体相关应用程序或数据存储应用程序。软件108是被配置为导致虚拟硬件110来执行应用程序的一组指令和数据。如此,云计算系统96可以使特定应用程序可由与各自的计算系统92、94中任一个关联的用户利用。
在云96中执行应用程序可以涉及:接收多个请求,根据由该应用程序实现的特定功能处理这些请求,以及将请求响应返回给请求计算系统94。为执行该应用程序,可以基于对该应用程序提出的需求对云计算系统96的资源(例如,物理硬件106、虚拟硬件110和软件108)进行调整。例如,云96可以基于请求的数量、与该应用程序交互的用户的数量或者对该应用程序的性能的要求(例如,最大响应时间),来改变向该应用程序分配的资源的大小。尽管没有示出,但是应当理解,云96还可以包括允许计算设备92、94与云96的组件进行通信的接口。
仍然参照图6,云计算系统96的物理软件106可以包括处理器102和存储器100。处理器102可以是能够执行在存储器100中存储的程序指令以实现例如文件传输程序104的任何处理器,以便实现本文公开的XFTP文件传输协议的示例。存储器100可以包括操作系统和应用程序,如XFTP文件传输应用程序。操作系统可以是一组程序,该组程序在由处理器102执行时担当可以运行XFTP文件传输应用程序的平台。操作系统的一些示例包括和微软视窗的各种版本。
在图6的云计算系统96中,文件传输程序104可以具有被实现为处理器102的硬件部分,并且可以具有被实现为操作系统和应用程序的程序设计部分。
本文提出的附图有助于描绘本文公开的示例的各种体系结构、功能和操作。在整个说明书中,组件中的许多至少部分地被定义为程序、程序设计或程序指令。这些组件中每个、其多个部分或其各种组合可以整体地或部分地表示包括用于实现任何特定逻辑功能的一个或多个可执行指令的代码的模块、片段或部分。每个组件或者其各种组合可以表示用于实现特定逻辑功能的电路或多个互连的电路。
本文公开的示例可以在供指令执行系统(例如计算系统92、94、96)使用的或与指令执行系统相关的任何非瞬态有形计算机可读介质中实现,指令执行系统例如是基于计算机/处理器的系统、或ASIC(专用集成电路)或可从计算机可读介质获取或获得逻辑并执行包含在其中的指令的另一系统。非瞬态有形计算机可读介质可以是能够包含、存储或保持供计算系统92、94、96使用或者与计算系统92、94、96关联的程序和数据的任何介质。计算机可读介质可以包括诸如电介质、磁性介质、光学介质、电磁介质或半导体介质之类的多种物理介质中任一种。合适的计算机可读介质的更具体示例包括便携式磁性计算机磁盘,如软盘或硬驱、随机存取存储器(RAM)、只读存储器(ROM)、可擦除可编程只读存储器(EPROM)或便携式CD、DVD或闪存驱动器。
应当理解,术语“连接/所连接的/相连”和/或类似术语在本文中被广义地限定为包括各种发散的连接布置和组装技术。这些布置和技术包括但不限于:(1)一个组件与另一组件之间在这两个组件之间没有中间组件情况下的直接通信;和(2)一个组件和另一组件在这两个组件之间有一个或多个组件情况下的通信,假定“连接至”另一组件的这一个组件以某种方式与该另一组件可操作地通信(尽管在这两个组件之间存在一个或多个附加组件)。
在对本文公开的示例进行描述和主张权利时,单数形式“一”、“一种”和“该”包括多个所指物,除非上下文另外清楚地指出。
尽管已经详细地描述若干个示例,但是本领域技术人员将清楚可以修改所公开的示例。因此,前面的描述应该被认为是非限制性的。