发明的详细描述
参见附图(其中相应的指示数字代表相应的部件),本发明被图示成在一个合适的计算环境中实现。尽管并未要求,本发明仍将以由个人计算机执行的计算机可执行指令(如程序模块)的一般上下文环境来描述。一般而言,程序模块包括执行特定任务或实现特定抽象数据类型的过程、程序、对象、组件、数据结构等。而且,那些本领域的普通技术人员将明白,本发明也可能以其它计算机系统配置来实现,包括手持设备、多处理器系统、基于微处理器或可编程的消费电子品、网络PC、小型机、大型机、联网外设(如联网打印机)等等。本发明还可能在分布式计算环境中实现,在其中任务由通过一个通信网络连接的远端处理设备来执行。在分布式计算环境中,程序模块既可位于本地,也可位于远端存储器存储设备。
图1图示了本发明可以在其上实现的合适的计算系统环境100的一个示例。该计算系统环境100只是合适计算环境的一个示例,并非提出对本发明的使用范围或功能的任何限制。该计算系统环境100也不能解释成对在该示例性操作环境100中任何成分或其组合具有任何依赖或要求。
本发明可以通过许多其它通用或专用计算系统环境或配置来操作。可以适于本发明使用的众所周知的计算系统、环境和/或配置的例子包括(但不限于)个人计算机、服务器计算机、手持或膝上设备、多处理器系统、基于微处理器的系统、机顶盒、可编程消费电子品、网络PC、小型机、大型机、联网外设(如联网打印机)、包括以上系统或设备中任何一种的分布式计算环境等等。
本发明可以在由计算机执行的计算机可执行指令(如程序模块)的一般上下文环境中来描述。一般而言,程序模块包括执行特定任务或实现特定抽象数据类型的过程、程序、对象、类、组件、数据结构等。本发明还可以在分布式计算环境中实现,其中由通过通信网络连接的远端处理设备来执行任务。在一个分布式计算环境中,程序模块可以位于本地和包括存储器存储设备的远端计算机存储媒介中。
参照图1,一个用于实现本发明的示例性系统100包括一个计算机110形式的通用计算设备。计算机110的部件可以包括一个处理单元120、一个系统存储器130,和一个将包括系统存储器的多种系统部件连接到处理单元120的系统总线121。该系统总线121可以是几种总线结构类型中的任何一种,包括存储器总线或存储器控制器、外围总线、交叉条、交换总线构造,以及使用多种总线架构中任何一种的局部总线。该系统总线121还可以是一种总线的层次结构。举例而言(但非限制),这样的架构包括工业标准架构(ISA)总线、微通道架构(MCA)总线、增强ISA(EISA)总线、视频电子标准联盟(VESA)局部总线、无缓冲非统一存储器存取(NC-NUMA)架构总线、连缓冲非统一存储器存取(CC-NUMA)架构总线以及也称为中间层总线的外围部件互连(PCI)总线。
计算机110一般包括多种计算机可读取媒介。计算机可读取媒介可以包括可由计算机110访问的任何可用的媒介,包括易失和非易失媒介、可擦除和不可擦除媒介。举例而言(但非限制),计算机可读取媒介可以包括计算机存储媒介和通信媒介。计算机存储媒介包括以用于存储信息(如计算机可读取指令、数据结构、程序模块或其它数据)的任何方法或技术实现的易失和非易失媒介、可擦除和不可擦除媒介。计算机存储媒介包括(但不限于)RAM、ROM、EEPROM、闪存或其它存储器技术、CD-ROM、数字通用盘(DVD)或其它光盘存储器、盒式磁带、磁带、磁盘存储器或其它磁存储设备,或任何可用以存储所希望的信息并可由计算机110访问的其它媒介。通信媒介一般以调制数据信号(如某种载波或其它传输机制)来具体表达计算机可读取指令、数据结构、程序模块或其它数据,包括任何信息传递媒介。术语“调制数据信号”意为某种信号,其一种或多种特征能以某种方式设定或改变,以在信号中编码信息。举例而言(但非限制),通信媒介包括有线媒介(如有线网络或直接线缆连接)和无线媒介(如声波、RF、红外以及其它无线媒介)。上述任何一种的组合也应当包括在计算机可读取媒介的范围内。
系统存储器130包括易失和/或不易失存储器形式的计算机存储媒介,如只读存储器(ROM)131和随机访问存储器(RAM)132。在ROM 131中一般存储着一个基本输入/输出系统133(BIOS),包含(如在启动期间)帮助在计算机110内元素间传输信息的基本过程。RAM 132一般包含可立即由处理单元120的数据和/或正在处理单元120上执行的程序模块。举例而言(但非限制),图1图示了操作系统134、应用程序135、其它程序模块136和程序数据137。
计算机110还可以包括其它可擦除/不可擦除、易失/不易失的计算机存储媒介。仅举例而言,图1图示了一个读取或写入不可擦除的不易失磁媒介的硬盘驱动器141、一个读取或写入可擦除的不易失磁盘152的磁盘驱动器151,和一个读取或写入可擦除的不易失光盘156(如CD-ROM或其它光媒介)的光盘驱动器155。其它可以在该示例性操作环境中使用的可擦除/不可擦除、易失/不易失的计算机存储媒介包括(但不限于)盒式磁带、闪存卡、数字万用盘、数字录影带、固态RAM、固态ROM等等。硬盘驱动器141一般通过一个不可擦除存储器接口(如接口140)与系统总线121相连,而磁盘驱动器151和光盘驱动器155一般通过一个可擦除存储器接口(如接口150)与系统总线121相连。
上面所讨论并在图1中图示的这些驱动器和与其相关的计算机存储媒介为计算机110提供对计算机可读取指令、数据结构、程序模块和其它数据的存储。举例而言,在图1中,硬盘驱动器141被图示成存储着操作系统144、应用程序145、其它程序模块146和程序数据147。请注意这些部分可以与存储操作系统134、应用程序135、其它程序模块136和程序数据137相同,也可以不同。这里对存储操作系统144、应用程序145、其它程序模块146和程序数据147给予了不同的编号,以说明它们至少可以是不同的拷贝。
用户可以通过输入设备如键盘162和指点设备161(普通称为鼠标、轨迹球或触摸板),将命令和信息输入计算机110。其它的输入设备(未示出)可以包括话筒、游戏杆、游戏手柄、卫星天线、扫描仪、视频输入等等。这些以及其它的输入设备通常通过与系统总线121连接的用户输入接口160连接到处理单元120,但也可能由其它接口和总线结构来连接,如并口、游戏口或通用串行总线(USB)。监视器191或其它类型的显示设备也通过一个接口(如视频接口190)连接到系统总线121。除监视器以外,计算机还可以包括其它外围输出设备,如扬声器197、打印机196和视频输出,它们可以通过输出外围接口195来连接。
计算机110可以使用与一个或多个远端计算机(如远端计算机180)的逻辑连接在一个联网环境中运作。远端计算机180可能是另一台个人计算机、服务器、路由器、网络外设(如打印机)、网络PC、对等设备或其它普通网络节点,一般包括上面关于个人计算机110所描述的多个或所有元素,尽管在图1中只图示了存储器存储设备181。在图1中所描述的逻辑连接包括局域网(LAN)171和广域网(WAN)173,但也可以包括其它的网络。这样的联网环境在办公室、企业范围计算机网络、内联网和互联网中是很普通的。
当在一个LAN联网环境中使用时,个人计算机110通过一个网络接口或适配器(如网络接口卡(NIC))170连接到LAN 171。当在一个WAN联网环境中使用时,计算机110一般包括一个调制解调器172或其它用以在WAN173(如互联网)上建立通信的手段。调制解调器172(可以是内置或外置的)可以通过网络用户输入接口160或其它适当的机制连接到系统总线121。在联网环境中,关于个人计算机110所描述的程序模块(或其部分)可以存储在远端存储器存储设备中。举例而言(但非限制),图1将远端应用程序185图示成驻留在存储器设备181上。能够明白,所示出的网络连接是示例性的,也可以使用在计算机间建立通信链路的其它手段。
在下面的描述中,除非另外指出,本发明将参照由一台或多台计算机执行的动作或操作的符号表示来描述。这样,就能够理解这样的(有时候称为由计算机执行的)动作或操作包括由计算机的处理单元操作以结构化形式表示数据的电子信号。这一操作在计算机的存储器系统中的位置转换或维护数据,这将以本领域的普通技术人员所充分理解的方式来重新配置或者改变该计算机的操作。在其中维护数据的数据结构是具有由该数据的格式所定义的特定属性的存储器的物理位置。然而,虽然本发明以前面的上下文环境所描述,但并不意味着限制,如本领域的普通技术人员将明白的那样,此后所描述的多种动作和操作也可以用硬件来实现。
图2图表示构成网络模型和本发明的部件的某些部分间的相互关系。在正常操作中,联网消息由应用200通过网络栈202发送给外围设备204,在该外围设备向其它的网络上的设备和应用发送消息,并从其它设备和应用接收消息。网络栈202包括一个或多个中间软件层206。从应用200所发送的数据穿过这些中间软件层206,在这些中间软件层可以在数据上执行特定的操作,如将数据打包、可靠数据传输、数据加密和计算消息摘要。
转换208被用来将处理单元120从对中间软件层206执行网络栈操作中卸载。虽然转换208没有单独示出,但应当注意转换208可以集成到网络栈202的最高的中间层中。数据通过管道210发送给外围设备204,使外围设备204能执行网络栈操作。在这一层次结构中,中间软件层不需要排他地驻留在主机或外围设备中,它允许任何中间层或者完全卸载,或者仍保留在主机中,或者是这两者的某种组合(如卸载一个或多个特定的连接)。而且,管道可以层叠在管道的上面(如一个IPSEC管道可以层叠在一个TCP管道的上面)。连接可以是可靠与不可靠数据传输及单址广播与多址广播数据传输的任意组合。如果某个中间层仍保留在主机中,则该主机更新在外围设备204中的缓存变量(如下面所描述的那样)。举例来说,可以卸载一个用于传输层的对于连接的传输控制块(TCB)状态入口,同时将一个用于网络层的路由缓存入口(RCE)卸载到外围设备204。转换208接着通过共享同一RCE的网络栈202发送对于一个不同的TCB的流量,同时对该卸载了的TCB则通过管道210发送流量。
转换208通过向中间层206发送一个卸载请求来启动卸载。卸载请求包括能帮助外围设备204确定其是否能成功卸载该连接的资源信息。各个中间层206或者拒绝该卸载请求,或者将资源信息添加到该卸载请求中并将该卸载请求发送给在网络栈202中的相邻软件层。当外围设备204接收到该卸载请求后,它计算其是否具有可用于卸载该连接的资源。如果卸载不可能,则外围设备204拒绝该卸载请求。不然,则外围设备204接受该卸载请求,并为该连接分配资源。外围设备204通过向中间软件层206发送一个具有参数链表的完成消息,来完成该卸载请求。参数链表向中间软件层206和转换208提供信息,使该中间软件层206和转换208能与该外围设备通信。各个中间软件层从该参数链表中删除用于其层次的信息。
当一个中间层206接收到对于卸载的完成消息时,该中间层206将其状态传递给外围设备204。每个状态可以具有三种变量:CONST、CACHED和DELEGATED。一个状态可以具有所有三种变量,或者这三种变量的某个子集。CONST变量是在所卸载连接的生命期间不变的常量,它们在连接上载时不读回到这些层中。主机处理单元120维持对CACHED变量的拥有权,并确保将在主机处理单元中对CACHED变量的任何变化都更新到外围设备204中。改变CACHED状态的控制消息由网络栈202处理。其结果是,在上载连接时主机将写入但不需要读回CACHED变量。主机处理单元120将DELEGATED变量的拥有权传递给外围设备204。DELEGATED变量在卸载发生时写入一次,并在卸载终止时读回。通过只传回DELEGATED变量,就最小化了将连接传回主机的开销。必须在网络栈202和因多种原因被卸载(即委托)的外围设备204间共享(如控制)的状态被清晰地在网络栈202和管道210(如在TCP卸载中的IP ID)之间分开,这样网络栈202和外围设备204两者各自拥有该状态的一个排他的部分。在需要时(如为了统计),主机处理单元120向外围设备204查询DELEGATED变量。主机处理单元120还可以查询CONST或CACHED变量以作诊断。将状态分成三类使网络栈202能清楚地与管道210共存。应当注意,状态可以包括在卸载请求中。这可以做到,如果该状态不包含委托的状态变量,或者包含在启动卸载请求和完成卸载请求间不变的委托的状态变量。
外围设备204或主机确定什么时候上载一个卸载了的连接。上载由外围设备204或者由转换208来启动。一旦启动了上载后,外围设备204就完成所有具有适当状态的未完成的请求,并将最高的中间层的委托状态传递给转换208。转换208将任何进一步的传输请求排队,并停止发送接收缓冲。转换208命令最高的中间层接管对委托状态的控制。最高的中间层接管对委托状态的控制,并向转换208发送一个完成消息。在转换208接收到该完成消息后,转换208向外围设备204确认该上载,这使外围设备204能释放不再使用的资源。
应当注意,最高的中间层将对于所卸载连接的输入数据包转发给外围设备以作处理,直至其接管对委托状态的控制。数据包可能在外围设备204将委托状态传递给转换208的时候到最高的中间层接管对委托状态的控制的时候之间到达。在外围设备204将委托状态传递给转换208后,就可不再处理输入数据包。在接收到输入数据时,外围设备204将一个差错消息发送给最高的中间层,指示一个上载正在进行。该差错消息通知最高的中间层停止转发输入数据并缓冲进一步的数据,直至最高的中间层接收到委托状态。可作替换的是,以在外围设备204上额外缓冲存储器的代价,可以将输入数据转发给外围设备204,使该外围设备204缓冲数据。
可以由一个中间软件层206将多个连接卸载到外围设备204。由中间软件层206维护一个上层状态对象(即在该中间软件层206上面的层的状态对象)数目的参考计数器,这指涉用于卸载的中间软件层的状态对象。这里所用的状态对象是这里所用的分类成CONST、CACHED或DELEGATED的用于特定层的状态变量的某个集合。如果一个中间软件层的卸载了的状态对象没有其上面某一层对其的指涉,则中间层206向外围设备204发送一个消息,以上载对于中间层的状态对象,并将委托状态变量发送给中间层206。外围设备204删除对于中间层206的状态对象,而中间层206将一个完成消息发送给转换208。
现在请看图3,现已描述了总体概念,而本发明的细节将以某个实施例来描述,在该实施例中外围设备204是NIC 170,转换208是一个传输层接口转换(TLI)306,而网络栈202包含一个传输层300、一个网络层302和一个分割层304。网络层302也称为路径层,而分割层304也称为邻接层。
在操作中,联网消息由应用200通过网络栈202传送给NIC 170。从应用200发送的数据穿过TLI转换306,该转换控制该数据下传给基于主机的网络栈202还是管道308。请注意TLI转换306可以集成到网络栈202的最高层中。在网络栈202中的软件层从应用200接收数据,以包的形式将其打包,并将其通过NDIS微驱程310发送给外围设备硬件314。在数据包穿过栈202时网络栈202可能执行的其它任务包括数据加密、可靠数据传输,以及计算某种消息摘要(如对数据包求和校验或CRC校验)。这些任务中的许多由处理单元120执行,并且是依赖处理器的。
TLI转换306用来通过将用于连接的数据经管道308(以及管道驱程312)发送给NIC 170而将处理单元120从执行栈操作中卸载。那些本领域的普通技术人员将明白,NDIS微驱程310和管道驱程312的上边界就是Microsoft操作系统中的NDIS API。为解释起见,将用一个基于传输控制协议(TCP)的协议栈来解释本发明。然而,本领域的普通技术人员将明白,利用本发明的原则,还可以使用许多种类的外围设备,可以卸载其它的网络栈。例如,也可以卸载基于流控制传输协议(SCTP)或用户数据报协议(UDP)的协议栈。而且,本发明还可以用来卸载更高的功能协议,如互联网小型计算机系统接口(iSCSI)、网络文件系统(NFS)或通用接口文件系统(CIFS)。
发生卸载有许多理由。举例来说(但非限制),某个系统管理员可以选择某个特定的服务来卸载。如果连接上的流量(以字节或包的数量而言)消耗数量重大的资源,则可以卸载某个特定连接。可以卸载多种服务。例如,可以卸载安全协议,如IPSEC。可以用策略来驱动卸载。例如,某个管理员可以具有一个策略,先卸载所有来自某个组织内的连接。所使用的系统资源(如CPU占用率、数据缓存使用率、页表缓存使用率、存储器带宽)也可以导致主机处理器卸载连接。
图4图示了卸载一个TCP连接所采取的步骤。使用了一个三个阶段的过程。总的来说,这三阶段的过程就是分配卸载该TCP连接所需要的资源,提供对300、302、304、306各层的句柄,以及将300、302、304、306各层的状态卸载到NIC 170。在卸载转换期间,TLI转换306缓冲从应用200发送的所有消息。可作替换的是,传输层300缓冲这些数据。当卸载完成后,所缓冲的数据用和卸载数据传输相同的机制传输到NIC 170。当在卸载转换期间接收到输入包后,NIC 170接着将这些数据向上移动穿过层300、302、304、306,直至将传输层委托状态传递到NIC 170。
TLI转换306通过向传输层300发送一个卸载请求来启动卸载(行400)。该卸载请求包括一个对下一层的本地状态的指针(如用于传输层300的TCB指针、用于网络层302的RCE指针、用于分割层304的ARP表指针或用于NDIS微驱程310的NDIS微端口指针)、卸载类型(用于TLI转换306的TCP、用于网络层302的IPv6等),以及帮助NIC 170确定其是否能成功卸载该TCP连接的资源信息。TLI转换306还可以向NIC 170提供分派表。传输层300或者拒绝该卸载请求,或者将TCP资源信息加到TLI转换资源信息上,向网络层302发送一个卸载请求(行402)。
网络层302接收该卸载请求,并且或者拒绝该卸载请求,或者将网络资源信息加到TCP资源信息和TLI转换资源信息上,向分割层304发送一个卸载请求(行404)。网络层302还可以向NIC 170提供分派表。分割层304或者拒绝卸载该连接,或者限制资源信息加到网络资源信息、TCP资源信息和TLI转换资源信息上,向NIC 170发送一个卸载请求(行306)。
NIC 170接收该卸载请求,并计算其是否具有可用于卸载该TCP连接的资源。如果NIC确定该卸载不可能,就拒绝该卸载请求。如果NIC确定该卸载是可能的,则接受该卸载请求,并为该连接分配资源(如TCB、路由缓存入口(RCE)、地址解析协议(ARP)表入口(ATE))。NIC 170创建一个参数的链表和分派表以传递给层300、302、304和306,并通过向分割层304发送一个具有该参数链表的完成消息来完成该卸载请求(行408)。这些参数包括对于300、302、304、306各层的卸载句柄和分派表。在这里所使用时,卸载句柄意为一种使软件层能与外围设备通信的机制。举例而言(并非限制),该卸载句柄可以是一个基于指针的句柄、一个用作数组查找的整数值、一个哈希表(如一个哈希函数)、一个软件层(或网络栈)与外围设备间的通信信道,或者一组由软件层传下来而由外围设备用来查找状态对象的参数。
分派表被用来直接向NIC 170发送数据或直接从NIC 170接收数据。分派表还可以用来提供诊断。举例来说,可以增加一个软件层来监视系统和探测差错,以确保系统正恰当地发挥作用。而且,如果需要,分派表还可以由能增加额外功能的软件层来补缀。例如,可以增加一个软件层来提供一个过滤驱程的功能。补缀一般通过抓取指向所增加的函数所插入的原先函数的指针,并将其重新引导(即指向)到所增加的函数来完成。在插入了补缀后,所增加的函数执行其功能,并在需要原先的功能时调用原先的函数。
分割层304将用于分割层的卸载句柄和分派表存储在其ARP表入口中,以便在目标MAC地址变化或封装类型变化时容易地更新。而后分割层304更新与ATE相关联的NIC 170的状态(行410)。分割层304将其状态从链表中删除,并将链表中留下的信息转发给网络层302(行412)。
网络层302存储用于网络层302的卸载句柄和分派表。网络层302也将其状态发送给NIC 170(行414)。网络层302将网络层信息从链表中删除,并向传输层300发送一个具有具有参数链表和分派表的完成消息(行416)。网络层302可以将其接收的用于卸载后状态的IP分段转发给NIC 170以作处理,或者可以在网络层中处理这些IP分段并将它们发送给传输层300。
在某个可替代实施例中,层的状态对象与卸载请求一起发送。举例来说,分割层状态对象和网络层状态对象与卸载请求一起发送,并且只有当缓存状态在卸载请求与完成事件之间变化时,才更新该状态。如果委托状态不出现,或者不能在卸载请求与卸载请求的完成之间变化,则整个层的状态对象只能与卸载请求一起发送。然而,即使委托状态出现,并能在卸载请求与卸载请求的完成之间变化,被分类成CONST的状态变量也能与卸载请求一起发送。
传输层300存储用于传输层的卸载句柄,并将其状态发送给NIC 170(行418)。如果有任何未完成的发送或接收缓冲。则传输层300将该缓冲返回给TLI转换306。一旦传输层300开始将该缓冲传递回TLI转换306,则TLI转换306将停止向传输层300发送缓冲,并将它们排列起来,等待传输层向TLI转换204发送一个具有参数链表和分派表的完成消息。传输层300返回所有缓冲,而后发送该完成消息(行420)。当TLI转换306接收到该完成消息后,就将发送和接收缓冲传输给NIC 170(行422)。TLI转换306使用分派表来将正在和将要接收的缓冲传送给NIC 170以作处理。在卸载请求等待完成期
间,300、302、304各层或者拒绝对于所卸载状态对象(即与某层相关联的状态对象)的新的卸载请求,或者将它们排列起来直至卸载完成。
如果传输状态没有卸载到NIC 170,传输层300仍然具有处理输入TCB数据并将这些数据传递到TLI转换306的能力。如果TCB数据在卸载中到达,传输层300可以或者保持这些数据,或者处理这些数据并将其传递给TLI转换306。在传输层300将其状态发送给NIC 170(行418)时到TLI转换将缓冲传输给NIC 170(行422)时之间,通过网络栈202来到的输入TCB数据都被发送给NIC 170。
对于后续的卸载请求,网络层302和分割层304将它们在以前的卸载从NIC170所接收的卸载句柄传递给NIC170。这告知NIC 170用于网络层302和分割层304的资源已经分配过了,这能保存NIC的资源并加快卸载。
如前面所指明的那样,300、302、304层将其状态传递给NIC 170。每个状态具有三种变量:CONST、CACHED和DELEGATED。CONST变量是在所卸载连接的生命期间不变的常量,它们在连接终止时不读回到这些层中。主机处理单元120维持对CACHED变量的拥有权,并确保将在主机处理单元中对CACHED变量的任何变化都更新到NIC 170中。其结果是,主机将写入但不会读回CACHED变量(除非系统诊断要求如此)。主机处理单元120将DELEGATED变量的拥有权传输给NIC 170。DELEGATED变量在卸载发生时写入一次,并在卸载终止时读回。通过只传回DELEGATED变量,就最小化了将连接传回主机的开销。在需要时(如为了统计),主机处理单元120向NIC 170查询DELEGATED变量。
用于传输层300的CONST变量包括目标端口、来源端口、一个指示存在‘照料’地址变化的移动IP情形的标志、SEND和RECV窗口缩放因子,以及用于网络层302的NIC句柄。用于传输层300的CACHED变量是TCP变量和IP变量。TCP变量包括有效MSS、将由NIC 170复制到接收指示中的字节数量、一个关闭Nagling的标志、一个指示需要Keep-Alive的标志,以及Keep-Alive设定(即探测的间隔、数量,以及增量)。IP变量包括TOS和TTL。DELEGATED变量包括当前TCP状态、用于下一RECV的顺序号(即RCV.NEXT)、接收窗口尺寸(RCV.WND)、用于第一个Un-Acked数据的顺序号(SND.UNA)、用于下一SEND的顺序号(SND.NEXT)、所发送的最大顺序号(SND.MAX)、最大发送窗口(MAX_WIN)、当前充塞窗口(CWIN)、慢启动阈值(SSTHRESH)、平滑了的RTT(8*A)、增量(8*D)、当前重发计数、剩余用于下一次重发的时间,以及要显示的时间戳。
用于网络层302的CONST变量包括(对于IPv4或IPv6的)目标IP地址和(对于IPv4或IPv6的)来源IP地址。用于网络层302的CACHED变量包括用于分割层304的NIC句柄。用于网络层302的DELEGATED变量包括IP包ID起始值。用于分割层304的CACHED变量包括ARP地址和一个指示报头格式(如LLC/SNAP[逻辑链路控制/子网访问协议]或DIX[Digital、Intel、Xerox])的标志。
传输层状态包括一个对于网络层的句柄,而网络层状态包括一个对于分割层的句柄,因为网络层状态可以在多个连接间共享而分割层状态可以在多个路径(如IP别名)间共享。这一层次结构因几个原因而维持。一个连接要求一个对于网络层的句柄,因为IP ID命名空间必须在每个路径基础上跨越所有已卸载的连接来管理。一个路径则要求一个对于分割层的句柄,因为一个路由更新可以改变下一跳的地址,从而指向一个新的MAC地址。这一层次结构也精简了所需要由NIC维护的状态的数量。举例来说,一个对于IPv4的ARP更新可以改变从一个IP地址到一个MAC地址的映射(如一个在服务器上的故障切换接口)。主机将MAC地址作为一个缓存的变量来维护,从而只需要进行一次缓存的状态的更新,则所有连接都故障切换到新的接口。
当一个TCP连接卸载后,NIC 170负责对其发送的包赋予包标识符(如IPID)。IP ID以每个接口基础或者以每个层状态对象基础来卸载。NIC 170被赋予IP ID命名空间的一部分。在某一实施例中,NIC 170被赋予IP ID命名空间的一半,并被给予一个IP包ID起始值,以在将网络状态传递给NIC 170时使用。NIC 170用以下公式来在其发送的IP包上产生一个IP ID:
Cur_IPID=[(Start_IPID_For_This_Path)+(Counter_For_This_Path)mod 32K]mod 64K
Counter_For_This_Path=Counter_For_This_Path+1
当已卸载的连接上载或失效时,NIC 170将其将使用的下一个IPID值传输给网络层,以存储用于下一次发生的卸载,而主机处理单元120接着使用其所被赋予的IP ID命名空间的部分。主机处理单元120可以使用全部的IP ID命名空间,但计数器需要在每次发生卸载时设定。
NIC 170将数据按所接收的顺序放入接收缓冲,并按它们所传送用于卸载了的连接的顺序填充应用缓冲。许多应用在传送接收缓冲前等待一个接收指示。在某一实施例中,NIC 170具有一个全局缓冲池(pool),在用于一个连接的数据到达而没有传送应用接收缓冲时使用。全局缓冲池被跨越卸载了的连接而使用,可以用来实现:1)处理打乱了次序的TCP传输;2)拼合IP数据报分段;3)一种缓冲复制算法(而不是某种零复制算法),如果该应用传送对于零复制算法而言太小的缓冲。可作替换的是,如果不需顾虑资源的高效使用,则可以使用一种按每个连接的缓冲池。但是,如果某个NIC不支持按每个连接的缓冲池,或者由于缺乏系统资源(如没有足够的资源来将应用缓冲插入存储器),则使用全局缓冲池。
现在转到图5a-5d,NIC 170具有一棵倒转的树500,在卸载发生后表示该卸载。在这些图中,点线表示由NIC 170分配的新状态。在图5a中,NIC 170具有一个ARP入口502,连接到一个路由缓存入口504,而路由缓存入口504连接到一个TCP入口506。如果,举例来说,所有流量都去到一个路由,则下一跳将总是到同一个ARP入口502。如果路由缓存入口504被用于下一次TCP连接卸载,则唯一新的资源是新的卸载了的TCB。这样当在网络栈202向下启动一次卸载时,已经卸载其状态的中间软件层(如网络层302和分割层304)将简单地插入在以前的卸载请求中所分配的NIC产生的卸载句柄。NIC170只需要分配新的资源(如TCP入口508),并将用于这些新资源的卸载句柄向上发送回网络栈202。该倒转的树500现在具有连接到路由缓存入口504的TCP入口508(见图5b)。这一方法节省了NIC资源,并加速了卸载。而且,如果某个缓存变量的状态改变,则只有一个结构需要更新。如果用于管道中多个软件层的所有状态都被卸载成一个入口,则在最高软件层下面的任何状态更新都需要多次更新。
图5C以某种更为复杂的配置显示了该倒转的树500。有两个路由缓存入口504和510穿过ARP表入口502。TCP连接506和508使用路由缓存入口504。TCP连接512和514则涉及路由缓存入口510。如果发生任何ARP更新(如某个多宿服务器的接口进行故障切换),则只有入口502必须更新。这使潜在的成钱上万的连接能只需要对NIC 170的一次更新就故障切换到某个新的接口。图5d显示了在发生一次路由更新后将两棵独立的倒转的树(入口502-508和入口510-516)合并成一棵倒转的树500。在路由更新前,对于路由缓存入口510的下一跳的ARP表入口是ARP表入口516。在路由更新后,下一跳的ARP表入口是ARP表入口502。这样,如果网络栈状态被卸载成一个入口,倒转的树的使用就使路由更新能对NIC 170作为一个交易来处理,而不是成千上万次更新。
现在转到图6,一旦一个连接被卸载到NIC 170后,就有两条到NIC 170的路径。第一条路径是通过NDIS微驱程310通过分割层304、网络层302和传输层300。第二条路径通过该卸载后的连接608,成为一个管道。从主计算机的观点来看,这两条路径就通信而言一切都是一样的。缓存的状态变量将这两条路径与在NIC 170中按前面所指示的那样更新缓存状态变量的处理单元120同步。缓存变量的更新以箭头602、604、606来指示。
当一个输入数据包到达时,NIC 170确定该输入数据包是通过卸载了的路径还是未卸载的路径(即通过NDIS微驱程310的NDIS路径和层304、302、300)。在某一实施例中,NIC 170通过在来源与目标TCP端口号、来源与目标IP地址以及协议类型上执行一个哈希函数来确定哪条路径来发送输入数据包。如果该哈希符合所卸载连接的参数(即遍历一个哈希链并完全符合该连接的所有部分),则使用管道608。如果该哈希不符合哈希索引,则使用通过网络栈202的未卸载路径。更新缓存状态的控制消息由主机处理。这导致NIC170不需要处理所卸载连接以外的任何控制消息,如ICMP、DNS和RIP消息。
本发明提供用户使用已有工具(如Netstat)获取多种信息(包括在主机上的所有连接、连接参数如协议类型、本地和远端绑定的端口和IP地址、连接状态、进程ID等等)来得到统计的能力。统计在本发明中统计一每层或每个层状态对象为基础来搜集。在一层内,可以将层状态对象分组来搜集跨越多个层状态对象的统计。例如,对网络层的统计可以分离,使统计对于所使用的每个协议(如IPv4和IPv6)。与CONST和CACHED状态变量相关的统计由主机提供,而与DELEGATED状态变量相关的统计由外围设备204提供。当作出一个查询时,与DELEGATED状态变量相关的统计被附加到与CONST和CACHED状态变量相关的统计上。
还有一类跨越主机层状态和外围设备层状态的整个分组而累加的统计,如包计数。另一种统计是对系统中某个功能的状态的列表(如对系统中每个TCB状态的列表)。对TCB的统计是由主机跟踪的统计和由外围设备跟踪的统计的组合。同样,对包计数的统计是主机层状态统计和外围设备层状态统计的和。
在下面的表1中图示了用于TCP MIB(管理信息基数)的主机和外围设备204间的分离的一个示例,而在下面的表2中显示了IPv4的MIB统计。在这些表中,第一列是数据域,第二列指明是外围设备还是主机负责跟踪统计,而第三列指示该数据域如何跟踪。外围设备所负责的统计以每个层状态对象或每层为基础来跟踪。这里所用的“每层”意为统计按每层每外围设备每协议来跟踪。然而请注意,当从主机状态和来自外围设备的状态同步统计时,一般以每个协议为基础来表现。主机网络栈可以不查询外围设备而产生的统计被归类成“栈具有完备的信息”或“只由栈完成”。“栈具有完备的信息”类指示外围设备知道统计,但不跟踪统计。“只由栈完成”类指示外围设备不知道统计。适配器统计是通过正规NDIS接口来查询的。适配器统计包括如已发送字节、已接收字节等变量。
TCPStats结构数据域 |
责任 |
如何跟踪数据域 |
ts_RtoAlgorithm |
主机网络栈 |
栈具有完备的信息 |
ts_toMin |
主机网络栈 |
栈具有完备的信息 |
ts_RtoMax |
主机网络栈 |
栈具有完备的信息 |
ts_MaxConn |
主机网络栈 |
栈具有完备的信息 |
ts_ActiveOpens |
主机网络栈 |
只由栈完成 |
ts_PassiveOpens |
主机网络栈 |
只由栈完成 |
ts_AttemptFails |
主机网络栈 |
只由栈完成 |
ts_EstabResets |
主机网络栈 |
栈具有完备的信息 |
ts_CurrEstab |
主机网络栈与外围设备 |
每层 |
ts_InSegs |
主机网络栈与外围设备 |
每层 |
ts_OutSegs |
主机网络栈与外围设备 |
每层 |
ts_RetransSegs |
主机网络栈与外围设备 |
每层 |
ts_InErrs |
主机网络栈与外围设备 |
每层 |
ts_OutRsts |
主机网络栈与外围设备 |
每层 |
ts_NumCons |
主机网络栈 |
栈具有完备的信息 |
表1TCP MIB统计分离
ts_RtoAlgorithm是一个用以确定用于重发未应答字节的超时值的某个算法的值。ts_RtoMin是一个由用于重发超时的TCP实现所允许的最小值的以微秒测量的值。ts_RtoMax是一个由用于重发超时的TCP实现所允许的最大值的以微秒测量的值。ts_MaxConn是可以支持的TCP连接的总数。ts_ActiveOpens是TCP连接从CLOSED状态向SYN_SENT状态直接转变的次数。ts_PassiveOpens是TCP连接从LISTEN状态向SYN_RCVD状态直接转变的次数。ts_AttemptFails是TCP连接从SYN_SENT状态或SYN_RCVD状态向CLOSED状态直接转变的次数加上从SYN_RCVD状态向LISTEN状态直接转变的次数。ts_EstabResets是TCP连接从ESTABLISHED状态或CLOSE-WAIT状态向CLOSED状态直接转变的次数。ts_CurrEstab是当前状态是ESTABLISHED状态或CLOSE-WAIT状态的TCP连接数。ts_InSegs是已接收的分段的总数,包括那些错误接收的分段。ts_OutSegs是已发送的分段的总数,包括那些在当前连接上的的分段,但不包括那些只包含重发字节的分段。ts_RetransSegs是已重发的分段的总数。ts_InErrs是错误接收的分段(如错误的TCP求和校验)的总数。ts_OutRsts是包含RST标志发送的TCP分段的数量。ts_NumCons是当前存在的TCP连接的总数。
IPSNMPInfo结构数据域 |
责任 |
如何跟踪数据域 |
ipsi_Forwarding |
主机网络栈 |
只由栈完成 |
ipsi_DefaultTTL |
主机网络栈 |
栈具有完备的信息 |
ipsi_InReceives |
主机网络栈与外围设备 |
每层 |
ipsi_InHdrErrors |
主机网络栈与外围设备 |
每层 |
ipsi_InAddrErrors |
主机网络栈 |
只由栈完成 |
ipsi_Forwdatagrams |
主机网络栈 |
只由栈完成 |
ipsi_UnknownProtos |
主机网络栈 |
只由栈完成 |
ipsi_InDiscards |
主机网络栈与外围设备 |
每层 |
ipsi_InDelivers |
主机网络栈与外围设备 |
每层 |
ipsi_OutRequests |
主机网络栈与外围设备 |
每层 |
ipsi_RoutingDiscards |
主机网络栈 |
只由栈完成 |
ipsi_OutDiscards |
主机网络栈与外围设备 |
每层 |
ipsi_OutNooutes |
主机网络栈与外围设备 |
每层 |
ipsi_ReasmTimeout |
主机网络栈 |
栈具有完备的信息 |
ipsi_ReasmReqds |
主机网络栈与外围设备 |
每层 |
ipsi_ReasmOKs |
主机网络栈与外围设备 |
每层 |
ipsi_ReasmFails |
主机网络栈与外围设备 |
每层 |
ipsi_FragOKs |
主机网络栈 |
只由栈完成 |
ipsi_FragFails |
主机网络栈 |
只由栈完成 |
ipsi_FragCreates |
主机网络栈 |
只由栈完成 |
ipsi_NumIf |
主机网络栈 |
只由栈完成 |
ipsi_NumAddr |
主机网络栈 |
只由栈完成 |
ipsi_NumRoutes |
主机网络栈 |
只由栈完成 |
表2IPv4MIB统计分离
ipsi_Porwarding是一个提供对主机是否担当对于转发由主机接收(但未指向主机)的数据报的IP路由的指示的值。ipsi_DefaultTTL是在传输层协议不提供TTL值时,插入由该实体发生的数据报的IP报头的Time-To-Live数据域的缺省值。ipsi_InReceives是从接口接收的输入数据报的总数,包括那些错误接收的数据报。ipsi_InHdrErrors是由于在其IP报头中的差错(包括错误求和校验、版本号不符、其它格式差错、存活时间超出、在处理其IP选项中发现的错误等等)而丢弃的输入数据报的数量。ipsi_InAddrErrors是由于在其IP报头的目标数据域中的IP地址不是一个能在主机接收的可用地址而丢弃的输入数据报的数量。ipsi_Forwdatagrams是主机不是其最终IP目的地的输入数据报的数量,其结果是要尝试找到一个路由来将这些数据报转发到该最终目的地。ipsi_UnknownProtos是成功接收但由于某个未知或不支持的协议而丢弃的本地地址的数据报的数量。ipsi_InDiscards是未遇到问题阻止其继续处理但丢弃(如由于缺乏缓冲空间)的输入IP数据报的数量。ipsi_InDelivers是成功交付IP用户协议的输入数据报的总数。ipsi_OutRequests是本地IP用户协议(包括ICMP)作为对传输的回应而提供给IP的IP数据报的总数。ipsi_RoutingDiscards是选择来丢弃的路由入口(即使其有效)的数量。ipsi_OutDiscards是未遇到问题阻止其传输到其目的地但丢弃(如由于缺乏缓冲空间)的输出IP数据报的数量。ipsi_OutNoRoutes是由于未能找到路由来将其传送到其目的地而丢弃的IP数据报的数量。ipsi_ReasmTimeout是在其等待在主机重新组装时保持所接收分段的最大秒数。ipsi ReasmReqds是需要在主机重新组装的所接收IP分段的数量。ipsi_ReasmOKs是成功重新组装的IP数据报的数量。ipsi_ReasmFails是由IP重新组装算法所检测到的故障(如超时、差错等等)数量。ipsi_FragOKs是在主机成功分段的IP数据报的数量。ipsi_FragFails是由于其需要在主机分段但无法分段(如由于设置了其“不分段”标志)而丢弃的IP数据报的数量。ipsi_FragCreates是作为在主机分段的结果而产生的IP数据报分段的数量。ipsi_NumIf是可用的接口总数。ipsi_NumAddr是在系统中的唯一IP地址的总数。ipsi_NumRoutes是当前活动的路由的总数。
本发明还提供了一种从外围设备将一个卸载了的网络连接上载到主机的方法。有许多发生上载的原因。举例来说(但非限制),下面就提供了某些原因。路由可能改变,就要求将流量在某个不同的接口上发送。连接的流量表现可能变化成不再适合于卸载。例如,流量可能不够,或缺乏活动性,或流控制连接长过某个设定的时间(如没有接收到窗口更新)。而且,如果有太多的IP分段、太多的无序流量、使用超出带宽的数据、太多的重发、某保持活动超时、某安全关联失效且未更新,或有太多的数据要转发到外围设备,则外围设备可能不能支持特定的功能,流量表现可能不适合于卸载。对于上载一个已卸载连接的其它原因是由于资源问题。例如,外围设备可能缺乏资源来继续处理该连接。另一个连接可能具有比已卸载连接更高的优先级,而在外围设备资源的可用性低于某个阈值时上载某个连接可以使较高优先级的连接能继续使用外围设备资源。
系统资源可能改变,使主机处理器具有资源来处理一个已卸载的连接。管道可能要求与原先卸载不同的资源(如安全过滤的改变等等)。主机可以确定外围设备的资源是否接近能由主机处理单元更高效地处理一个卸载连接的阈值水平。举例来说,这些阈值可能包括流量大小(字节或包的数量)、分段的数量、窗口尺寸,以及卸载类型。
现在转到图7,上载由外围设备204(如NIC 170)或者TLI转换306启动。连接可能由于多种原因而上载。这些原因包括连接转移到另一个外围设备、发生某种媒介断开、太多无序分段、太多数据被转发给外围设备204、应用200非传送前缓冲、太多IP分段、某个低带宽连接,以及太多重发。
图7显示了由TLI转换306启动的上载(行700)。请注意,如果由NIC 170启动该上载,则行700不会出现。当上载启动后,NIC 170完成所有具适当状态的未完成请求,并将委托的传输层状态传递给交换层(行702)。NIC 170可能不会完成某次传输或完全填充某个接收缓冲,而只是确保所有的传输和接收状态与传递回传输层300的委托状态同步。TLI转换306排列任何更多的传送请求,并停止传送接收缓冲。TLI转换306命令传输层控制委托的传输状态(行704)。传输层300停止向NIC 170转发其接收到的任何片段,控制委托状态,并向TLI转换306发送一个完成消息(行706)。在TLI转换306接收到传输层300已控制委托传输状态的确认后,则向NIC 170确认上载(行708),使NIC 170能释放资源。传输层300还通知网络层302在完成消息发送给TLI转换前或后的上载连接(行710)。
应当注意,传输层300将用于已卸载连接的输入数据包转发给NIC 170以作处理,直至其控制委托状态(行706)。数据包可能在NIC 170将委托状态传递给TLI转换306时(行702)和传输层300控制委托状态时(行706)之间到达。一旦NIC 170将委托状态传递给TLI转换306后,它就不能再处理输入数据包。当NIC 170接收到一个用于上载连接的输入包时,就将一个差错消息发送给传输层300,指示正在进行上载并可能丢弃该输入包。差错消息通知传输层300停止转发输入数据。在某一实施例中,传输层300缓冲更多的数据,直至其接收到委托状态。
可以由中间软件层将多个连接卸载到外围设备。由中间软件层维护一个从中间软件层向外围设备卸载连接数量的参考计数器。如果该参考计数器为零,则向下一个中间软件层产生一个上载请求。这将使下一层的参考计数减小。如果下一层的参考计数为零,则该上载请求继续沿网络栈202向下。这一过程重复,直至某个中间软件层的参考计数为非零,或外围设备接收到该上载请求。网络层302将与NIC 170相关联的已卸载状态对象数量的参考计数减小。如果该参考计数为零,则没有TCB使用在NIC 170中对网络层302所分配的资源。当该参考计数为零时,网络层302向NIC 170发送一个消息,以对网络层302上载状态对象,并将委托网络状态变量发送给网络层302(行712)。NIC 170删除该状态,并将委托网络状态变量和NIC 170将使用的下一个IPID值发送给网络层302(行714)。网络层302存储这一信息,以在再次卸载连接时用作初始值。网络层302还向分割层304发送一个消息,使分割层304减小其参考计数(行716)。
分割层304也维护一个参考计数,并在接收到来自网络层302的消息时减小其参考计数。如果在分割层304中的该参考计数为零,则分割层向NIC 170发送一个消息,以删除分割层状态(行718)。NIC 170删除在NIC 170中的状态变量,并将其具有的任何委托状态变量发送给分割层(行720)。分割层304向网络层302发送一个完成消息(行722),而网络层302向传输层发送一个完成消息(行724)。
可能要求一个TCP连接在其生命期中的任何点都使用安全连接,而安全连接使用如IPSEC的安全协议。如果某个连接是IP安全的,而外围设备204不能处理安全性,则该连接不能卸载。当卸载某个安全IP连接时,安全性相关的状态被分成CONST、CACHED和DELEGATED变量,并按前面所描述的那样处理。主机处理单元120管理控制消息,如密钥重议。外围设备204使用这些安全性相关的状态变量来执行所有必要的IPSEC数据操作。
现在转到图8,图示了卸载一个安全连接的步骤。在后面的描述中,前面在图4中所描述的步骤仍是相同的,不再重复。为说明目的,将使用一个以传输模式操作的IPSEC连接。当传输层300将一个以TCP资源信息叠加到TLI转换资源信息上的卸载请求发送给IPSEC层800时,开始一个IPSEC层卸载(行402’)。IPSEC层800将一个以IPSEC资源信息叠加到TCP资源信息和TLI转换资源信息上的卸载请求发送给网络层302(行802)。资源需求包括IPSEC层需要卸载的安全关联的数量。如果NIC接受了该卸载请求,则其分配资源来处理这些安全关联。网络层302将一个具有参数链表和分派表的完成消息发送给IPSEC层,而不是传输层300(行804)。
当IPSEC层800接收到该完成消息时,如果IPSEC层状态前面没有卸载,也没有将安全关联中的委托状态的拥有权传输给NIC 170,则将该状态发送给NIC 170,作为内联描述符和外联描述符的一部分(行806)。如果该状态已经卸载,则IPSEC层增加一个参考计数。当该拥有权传输后,NIC 170解密和加密所有包。IPSEC层700将一个具有参数链表和分派表的完成消息发送给传输层(行414’)。
从IPSEC层800传递给NIC 170的CONST状态变量由将包分类到特定安全关联所需要的信息和对内联与外联安全关联特定的信息所组成。CONST变量包括来源和目的端口、协议类型,以及安全关联变量。
CACHED状态变量由用于判定安全关联生命期的因子和对内联与外联安全关联特定的信息所组成。CACHED变量包括基于加密了的字节的一个软限制(如在字节计数上的再键入)和一个硬限制(如在字节计数上的停止)、在安全关联可以使用的最大时间上的一个软限制(如在某个预定义记号上的再键入)和一个硬限制(如在某个预定义记号上的停止),以及在安全关联可以使用的最大休眠期上的一个硬限制(如最大休眠记号)。NIC 170遵从这些软限制和硬限制。当达到某个软限制时,NIC 170通知主机处理单元120。当达到某个硬限制时,NIC 170丢弃该安全关联。
DELEGATED变量由运行信息和对内联与外联安全关联特定的信息所组成。DELEGATED变量包括一个对以该安全关联加密或解密的字节的计数、该安全关联的生命期,以及该安全关联的休眠期。
现在转到图9,图示了从外围设备将一个已卸载的网络连接以IPSEC上载到主机。在后面的描述中,前面在图7中所描述的步骤仍是相同的,不再重复。在将完成消息发送给交换层306前或后,传输层300将上载连接通知给IPSEC层800(行710’)。减少与所有安全关联相关的参考计数。如果没有参考计数为零,则IPSEC层将一个完成消息发送给传输层300(行724’)。如果所卸载的连接是使用特定安全关联的最后一个连接,则IPSEC层800发送一个消息给NIC 170,以将委托状态变量上载到IPSEC层800(行900)。NIC170将该委托状态变量返回给IPSEC层800(行902)。NIC 170停止使用安全关联,并将属于安全关联的包通过栈202发送给IPSEC层800。IPSEC层800将一个完成消息发送给NIC 170,而NIC 170释放为安全关联所分配的资源(行904)。
如果安全关联参考计数为零,则IPSEC层800还发送一个消息给网络层302,将上载了的状态通知网络层302(行906)。在分割层304将一个完成消息发送给网络层302(行722)后,网络层302将一个完成消息发送给IPSEC层(行908)。IPSEC层800将一个完成消息发送给传输层(行724’)。
当卸载用于传输层300、网络层302、分割层304或IPSEC层800的状态时,有可能会到来一个更新(如ARP更新或RIP更新)。如果更新在接收到完成消息前发生,则简单地更新本地状态,并且如果该状态对象是与卸载请求一起发送的,则设置一个标志,以指示该状态已经变化。
如果在调用NIC的更新缓存状态的更新过程时发生更新,则存在某种可能的赛跑。如果那时有一个单独的消息更新该状态,使NIC更新过程被调用,则由于排程的问题,NIC有可能会先看到第二个调用,导致在原先的更新到达时使用陈旧的数据。如果使用了陈旧的数据,就会使用错误的入口,直至下一个更新到达,而这可能导致大量数据被发送到错误的地方,或者被丢弃。对这种赛跑有两种可能的解决方案。第一种解决方案是使完成消息总是执行第二个更新,如果大量数据到来,这可能导致递归问题。第二种解决方案是对更新增加一个序列号,以确保总是使用最近的序列号。
IPSEC支持的另一种运作模式是隧道,在其中数据包被作为安全连接的一部分而封装在一个新的包中。隧道表现成是一个对网络栈202的虚拟接口。卸载一个IPSEC隧道的步骤与在传输模式中卸载一个IPSEC连接的步骤相类似。在传输模式中,一个IPSEC报头位于IP报头和TCP报头之间。在隧道模式中,使用UDP来提供隧道。报头链是TCP报头到IPSEC报头到UDP报头到IP报头到分割层报头。为建立一个隧道,将描述已议定安全连接的一个内联描述符和一个外联描述符发送给外围设备。这些描述符包含用于该连接的状态变量和建立该连接所需要的其它信息。用于隧道的CACHED和DELEGATED状态变量与传输模式CACHED和DELEGATED状态变量相同。用于隧道的CONST状态变量包括来源和目标端口、本地地址、远端地址、协议类型,以及安全关联变量。
已描述了一种将网络栈连接卸载与上载到某个外围设备的方法,维护着与主机处理单元的某种紧密同步。该方法可以与许多协议一起使用。举例而言,可以使用的协议包括TCP、SCTP等等。
考虑到可以对其应用本发明的原则的许多可能的实施例,应当明白这里关于附图所描述的实施例只是说明性的,不能认为是限制发明的范围。举例而言,那些本领域的普通技术人员会明白,以软件示出的所说明实施例的元素可以以硬件实现,反之亦然,所说明实施例可以不背离本发明的精神而在排列与细节上加以修改。因此,这里所描述的本发明预期在以下权利要求及其等价物范围内的所有实施例。