利用集成主机协议栈管理卸载IPSEC的方法转让专利

申请号 : CN200510138099.2

文献号 : CN1819584B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : A·K·齐哈布拉J·T·平克顿S·N·卡尼亚

申请人 : 微软公司

摘要 :

本发明提供一种机制,用于在主机和可计算机化系统的目标处理设备之间传递安全因特网协议(IPSec)安全关联功能(SA)的处理器控制,例如主机CPU和NIC中的处理器。本发明的一方面,与认证和/或加密相关联的计算被卸载,而同时主机维持控制何时SA功能被卸载、上载、无效和更新密钥。所述设备互相配合以维持SA规格,包括对SA期限的软硬限制的支持。目标的定时器需求被最小化。被卸载的SA功能可以被嵌入到网络栈的中间软件层的其它被卸载的状态对象。

权利要求 :

1.一种在计算机化系统中使用的方法,所述计算机化系统包括安全因特网协议层和网络协议栈的一个或多个中间软件层序列,每个所述中间软件层含有一网络协议状态对象,所述安全因特网协议层含有一状态对象,所述方法用于执行在一个或多个目标处理组件和一个或多个源处理组件之间转移控制的步骤,需要所述控制来为安全关联SA卸载块中的至少一个安全关联和多个状态对象处理至少一个安全关联功能,同时仍然维持已建立的网络通信的完整性,所述方法包括:打包SA卸载块的状态对象,并通过驻留在所述安全因特网协议层下方的中间软件层发送所述SA卸载块的状态对象,驻留在安全因特网协议层下方的每个所述中间软件层将其网络协议状态对象添加至所述SA卸载块的状态对象;

生成卸载块数据结构,所述卸载块数据结构包括所述SA卸载块的状态对象和所述安全因特网协议层下方的中间软件层的网络协议状态对象;

将所述卸载块数据结构从所述源处理组件传送至所述目标处理组件;以及接收指示所述目标处理组件已接收到所述卸载块数据结构并准备好处理至少一个安全关联功能的完成消息,其中所述SA卸载块包括SA,且当软期限到达时,进行SA密钥更新。

2.如权利要求1所述的方法,其特征在于,还包括:通过驻留在安全因特网协议层下方的中间软件层将所述SA卸载块的SA资源需求发送至目标处理组件,驻留在安全因特网协议层下方的每个所述中间软件层将其资源需求添加至所述SA卸载块的SA资源需求。

3.如权利要求2所述的方法,其特征在于,通过驻留在安全因特网协议层下的中间软件层将所述SA卸载块的SA资源需求发送至目标处理组件的步骤包括,将所述SA资源需求打包成卸载块数据结构的步骤。

4.如权利要求1所述的方法,其特征在于,所述目标处理组件和源处理组件之一为外围设备。

5.如权利要求1所述的方法,其特征在于,所述SA卸载块的状态对象包括多个状态变量,所述多个状态变量包括高速缓存的状态变量。

6.如权利要求5所述的方法,其特征在于,所述高速缓存的状态变量包括操作码变量、对加密字节的软限制和硬限制、和标志的至少其中之一。

7.如权利要求6所述的方法,其特征在于,所述高速缓存的状态变量还包括OLDSPI标志。

8.如权利要求1所述的方法,其特征在于,所述SA卸载块的状态对象包括多个状态变量,所述多个状态变量包括常量状态变量。

9.如权利要求8所述的方法,其特征在于,所述常量状态变量包括本地和远程端口、本地和远程IP地址、协议类型和安全关联标志。

10.如权利要求9所述的方法,其特征在于,所述安全关联标志包括DynamicSA标志、InfiiniteLife标志以及传入安全关联的标志。

11.如权利要求1所述的方法,其特征在于,所述SA卸载块状态对象包括多个状态变量,所述多个状态变量包括委托的状态变量。

12.如权利要求11所述的方法,其特征在于,所述委托的状态变量包括标志、经SA传送的字节计数、SA空闲的时间信号数、经SA传送的机密字节数、经SA传送的认证字节数、以及传入或传出参数之一。

13.如权利要求1所述的方法,其特征在于,还包括将数据报转发至目标处理组件的步骤,所述数据报是在将控制从源处理组件转移至目标处理组件的步骤期间收到的。

14.如权利要求1所述的方法,其特征在于,还包括如果高速缓存的变量在控制从源处理组件转移至目标处理组件的步骤期间改变,则更新所述高速缓存的变量。

15.如权利要求14所述的方法,其特征在于,所述高速缓存变量包括操作码变量、对加密字节的软限制和硬限制、和标记中的至少一个。

16.如权利要求15所述的方法,其特征在于,所述操作码变量指示是否应添加、删除或替换SA。

17.如权利要求1所述的方法,其特征在于,所述卸载块数据结构将状态对象和网络协议状态对象与下一块的指针和从属块指针链接在一起,并且如果所述安全因特网协议层上方的协议栈启动从源处理组件至目标处理组件的控制转移,则所述SA卸载块的从属块指针是非NULL的。

18.如权利要求1所述的方法,其特征在于,还包括在完成源处理组件和目标处理组件之间的控制转移之后,把安全关联添加至所述SA卸载块。

19.如权利要求1所述的方法,其特征在于,还包括在完成源处理组件和目标处理组件之间的控制转移后,删除所述SA卸载块中的安全关联。

20.如权利要求1所述的方法,其特征在于,还包括在完成源处理组件和目标处理组件之间的控制转移之后,使用另一安全关联替换所述SA卸载块中的安全关联。

说明书 :

利用集成主机协议栈管理卸载IPSEC的方法

[0001] 相关专利申请的交叉引用
[0002] 本专利申请要求于2004年11月12日提交的美国临时专利申请第60/627,395号的优先权。

技术领域

[0003] 本发明通常涉及计算机网络技术。特别地,本发明通常涉及一种用于优化网络计算任务的卸载的机制。

背景技术

[0004] 操作系统、应用软件、网络技术和相关技术的复杂度和精密度继续以惊人的速度增长,导致计算机功能的增强。由于额外的任务必须由CPU执行以实现增长的功能,所以这种增长的功能通常会导致中央处理单元(CPU)的负载(后面也被称为“CPU开销”)增加。 [0005] CPU开销的增长已经很明显的一个领域是网络化应用领域,其中由于高带宽媒体的增长,使网络速度得到了增长。网络速度甚至可以与CPU处理器速度和主计算机本地存储器的访问速度相匹敌。由于多数操作系统所使用的分层体系结构,例如七层开放系统互连(OSI)模型或Windows操作系统所使用的层次模型,这些网络化应用进一步加重了主处理器的负担。
[0006] 如大家熟知的,这种模型被用来描述至网络的物理连接和终端用户应用之间的数据流。最基本的功能,例如输入数据比特到网线被最底层执行,而专注应用的细节功能则在顶层被执行。实质上,每一层的目的都是为下一个较高层提供服务,而向较高层屏蔽服务实际上如何实现的细节。所述层被抽象成好像每一层都在和其它计算机中的相同层进行通信。
[0007] 当数据包在各层之间传递时,在它上面所执行的多种功能可以是依赖软件的,这样通常就需要相当数量的CPU处理器和存储器资源。例如,在各层的包上执行的特定功能是非常依赖CPU的,如,包求和计算和验正、信息摘要计算、TCP分割、TCP重新传输和响应(ACK)处理、防止服务攻击的包过滤和用户 数据报协议(UDP)包的分割。当这些功能中的某个功能被执行时,所导致的对CPU的需求能极大地影响整个计算机系统的吞吐量和性能。
[0008] 随着在线交易和电信使用的增长,数据传输的安全性变得日益重要。这需要对数据包执行额外的安全功能。这些安全功能包括保证数据在不同的通信网络之间传输时的私密性,保证数据包是来自被认证的终端主机、应用或用户,以及保证数据在不同网络之间传输期间没有被修改。为了此应用的目的,安全数据传输被定义成联合任何一个或多个私密性、认证或数据完整性的数据传输被认为是端到端的。数个标准已经被开发以通过数据网络进行安全的数据传输。这些标准为远程系统提供一种方法以通过消息交换和计算来建立安全会话,因此,允许敏感的数据在通过不同的通信网络被传输时保持安全和免除篡改(如,不被篡改)。因特网安全协议(“IPSec”)可以用来在因特网上建立安全的主机到主机的管道、用户级安全、应用级安全、连接级安全和虚拟专用网络。IPSec定义了一系列用于加密和认证的密码规范。IPSec也支持多个密钥交换算法,包括为应用之间建立的安全会话建立密钥的因特网密钥交换(“IKE”)算法。数据的加密和解密(例如,SSL加密和IP安全加密)是依赖CPU的。例如,对TCP发送处理的当前估计大约是传送一个字节的数据需要2个周期。对于IPSec认证,CPU开销发生变化,但是取整数大约是每字节15个周期。对于加密,CPU开销上升到大约每字节25个周期至每字节145个周期之间。 [0009] 从上述数字可见,执行任务来建立安全会话是依赖CPU的。主机处理器执行所有这些任务会导致系统性能受损害,因为资源被这些任务消耗了。系统性能的降低根据网络元素(例如,路由、交换、服务、管理网络存储等等)的功能以许多方式影响网络和用户。 [0010] 随着CPU资源需求的增长,计算机硬件外围设备(例如网络接口卡(NIC))和类似硬件的容量和吞吐量也随着增长。这些外围设备通常配备有能执行许多任务和功能的专用处理器和存储器,所述任务和功能原本是由CPU来执行的。
[0011] 协处理器被开发以分担一些来自主处理器的任务。一些协处理器被开发以为主处理器执行特定的基本任务(例如,哈希数据)。然而,增加任务专用协处理器并不能分担来自主处理器的相当数量的安全会话建立任务。一种选择是为系统增加多个协处理器,每个处理器执行一个不同的任务。这样的选择受限于物理限制(例如,计算机中用于连接卡的插槽的数量)并且会引入在主处理器 和多个协处理器之间的多通信问题。 [0012] 其它的处理器被开发以执行建立安全会话所需要的多于一个的任务。作为一个例子,假设处理器能执行密码运算(即,加密和解密)、密钥生成运算和哈希运算。当服务器收到建立一个安全会话的请求时,服务器必须调用处理器来解密预先掌握的来自客户的密文。为产生主密钥素材,主处理器必须对处理器(每个哈希运算一次)作出大约二十次调用。如这个例子所揭示的,能执行多个任务的处理器并不能解决来自主处理器和协处理器之间多通信的资源消耗问题。
[0013] 相应地,目前的技术需要减少来自处理器到处理器(例如一个外围设备),的相关IPSec功能卸载的开销。特别地,需要解决在卸载IPSec功能的同时维持对单个连接需求的处理。

发明内容

[0014] 本发明通过提供一种可靠的卸载和上载计算的方法,来克服现有技术中的一个或多个前述问题,所述计算包括与IPSec认证和/或解密相关联的包产生。 [0015] 在网络栈中,两个或多个IPSec安全关联可以穿越一个或多个相同的中间软件层。每个软件层具有一个状态对象,所述状态对象可以包括一个或多个常量状态变量、高速缓存状态变量和委托状态变量。对于任一软件层,主机通过层的委托状态变量把处理控制卸载到外围设备以使外围设备能独立地传送数据。对于高速缓存状态变量,主机保留对高速缓存状态变量的控制,并且当高速缓存状态变量变化时,更新外围设备。对于常量状态变量,它们的值在卸载的生命周期里面是不变的。这样,虽然主机可以把状态对象卸载到外围设备,甚至当事件引起高速缓存或委托状态变量发生变化时,系统的状态也会保持一致。 [0016] 在两个主机之间数据传送的路径由路径状态对象来表示。如果两个连接通过相同的路径传送数据,那么它们将共享相同的路径状态对象。这样就产生了状态对象的层次,通常是采用反向树的数据结构形式。主机可以把整个反向树数据结构卸载到外围设备,允许主机立即将处理控制卸载到多个连接的外围设备。这种在安全关联(SA)功能被卸载、上载、无效和密钥更新时主机保持控制的情况下能清洁地卸载多个、特定网络功能,例如与认证和/或加密相关联的计算的能力允许主机在没有包括所需的网络功能、网络管理、完整性、纠错和 安全时保持CPU的周期,并进一步允许本发明应用到广泛的环境。所述设备协助SA维持规格,包括支持SA期限的软件和硬限制。目标的定时器需求被最小化。被卸载的SA功能可以被嵌入到网络栈的中间软件层的其它被卸载的状态对象。 [0017] 本发明的其它特征和优点将在下面的描述中阐明,部分将从描述中显而易见,或将通过实施本发明得知。本发明的特征和优点可以通过所附的权利要求中特别指出的手段及其组合来实现和获得。根据本发明的这些和其它的特征将从下面的描述与所附的权利要求中变得完全显而易见,或者可以通过后面阐述的发明实施中得知。

附图说明

[0018] 为了描述获得本发明上述的及其它优点和特征的手段,通过参考具体实施方式将引入本发明上述简要描述的更详细的描述,所述具体实施方式被所附的附图示例。应当理解,这些附图仅仅描述了本发明的典型实施方式而并不能被认为是对它的范围的限制,本发明将通过使用附图得到更详细具体的描述和解释,其中:
[0019] 附图1是根据本发明可以实现特征的适合的计算机系统。
[0020] 附图2a是一个框图,示例了根据本发明的网络栈的功能层和IP安全交替路径; [0021] 附图2b是一个框图,示例了根据本发明的嵌入在其它卸载管道中的具有IP安全交替路径的网络栈功能层;
[0022] 附图3a是一个框图,示例了根据本发明的网络栈的功能层和IP安全旁路路径; [0023] 附图3b是一个框图,示例了根据本发明的嵌入在其它卸载管道中的具有IP安全旁路路径的NDIS路径的功能层;
[0024] 附图4是一个梯状图,示例了根据本发明教导的卸载机制;
[0025] 附图5A-5D是对象图,示例了关于中间软件层状态对象的反向树; [0026] 附图6A-6B框图,示例了根据本发明的关于块指针集合的反向树; [0027] 附图7显示了根据本发明教导的在网络协议栈的中间软件层之间可能的信号序列,该信号序列用于更新状态对象的高速缓存状态部分;
[0028] 附图8是在网络协议栈的中间软件层之间可能的信号序列,其中外围设备 请求终止一个卸载的TCP连接;
[0029] 附图9是一个框图,示例了根据本发明的网络栈的功能层和IP安全路径和其它旁路路径;
[0030] 附图10是一个框图,示例了附图9中IP安全路径的数据传送模式; [0031] 附图11是一个框图,示例了根据本发明的关于块指针集合的具有IP安全关联的反向树;
[0032] 附图12是一个框图,示例了根据本发明的关于块指针集合的具有IP安全关联的反向树;
[0033] 附图13是一个梯状图,示例了根据本发明教导的IP安全块卸载机制; [0034] 附图14a-14b示例了网络协议栈的中间软件层之间可能的信号序列,其中外围设备请求终止一个卸载的IP安全关联;
[0035] 附图15是一个梯状图,示例了用于对卸载IP安全结构中的安全关联进行密钥更新的事件序列;以及
[0036] 附图16是一个框图,示例了IP安全卸载的安全威胁模型。

具体实施方式

[0037] 本发明通常涉及计算机网络技术。特别地,本发明通常涉及用于最优化与IPSec认证和/或加密(称为“IPSec操作”)相关联的计算任务的卸载的机制,所述计算任务的卸载典型地由主机处理器卸载至处理模块执行,并且在适当时刻返回控制给主机处理器。所述处理模块在如下所述的软件、硬件或软件和硬件的混和中处理卸载了的IPSec操作。所述处理模块可以位于一个独立的接口卡中、母板中的一部分、内部或外部卡中、多处理器单元中的另一个处理器中等等。另一种方法是将处理模块的功能嵌入到外围设备,例如,网络接口卡,所述网络接口卡(如下面描述的软件、硬件或软件和硬件的混合)处理卸载了的网络栈操作。所述外围设备可以具有一个或多个处理器。
[0038] 解释的方式而非限制,阅读说明书和权利要求后将会知道“外围设备”可以包括这样的组件,如网络接口卡,也可以是具有网络适配器的通常的CPU、具有专用CPU的网络处理引擎、具有卸载NIC的传统微端口或硬件状态机执行等等。因此,下面的讨论描述了一种创造性的方法使得在CPU周期方面是有成本效益的。
[0039] 本发明的其它特征和优点将在下面的描述中阐明,部分将通过详细描述变 得明显,或者可以通过对本发明的实施来得知。本发明的特征和优点可以通过所附的权利要求中特别指定的手段及其组合来实现与获得。根据本发明的这些和其它的特征将从下面的描述与所附的权利要求变得完全地显而易见,或者可以通过后面阐述的发明实施中得知。 [0040] 根据本发明的落入本发明范围的实施例也包括用于装载或具有存储在其上的计算机可执行指令或数据结构的计算机可读介质。这样的计算机可读介质可以是能被通用或特殊目的的计算机访问的任何可用介质。通过例子,但并不是限制,这样的计算机可读介质可以包括RAM、ROM、EEPROM、CD-ROM、或其它光盘存储器、磁盘存储器或其它磁存储设备,或任何其它能用作以计算机可执行指令或数据结构形式装载或存储所需程序代码的介质,所述介质能被通用或专用计算机访问。
[0041] 当信息通过网络或其它通信连接(可以是有线,无线或有线无线的结合)传送或提供给计算机,计算机适当地将所述连接看作是一种计算机可读媒体。这样,任何连接可以被适当地作为计算机可读媒体。上述的结合也可以被包括于计算机可读介质的范围之内。计算机可执行指令包括,例如,能引起通用计算机、专用计算机或专用处理设备执行特定功能或功能组的指令和数据。
[0042] 参考附图,其中相同的附图标记指代相同的组成单元,本发明被示例为在一个合适的计算环境中实现。虽然没有被要求,本发明仍将以被个人计算机执行的计算机可执行指令(例如程序模块)的通用上下文来描述。通常,程序模块包括执行特定任务或执行特定抽象数据类型的例行程序、程序、对象、组件、数据结构等等。此外,本领域普通技术人员将会了解本发明可以在其它计算机系统配置中被实施,所述其它计算机系统配置包括手持设备、多处理器系统、基于微处理器或可编程的消费者电子设备、网络PC、小型计算机、大型计算机、网络外围设备(如,网络打印机)等。本发明也可以在分布式计算环境中被实施,其中任务通过通信网络连接的远程处理设备来执行。在分布式计算环境中,程序模块可以被存储在本地和远程存储设备中。
[0043] 参考附图1,简要概述了本发明能被执行的合适的计算环境。附图1示例了一个计算系统环境100的例子,本发明能在其上被执行。所述计算系统环境100仅仅是一个适合的计算环境的例子,并非意图对本发明的使用范围或功能做出任何限制。所述计算系统环境100也不能被解释为对例子中的操作环境100 所示例的任何一个或组件的联合有任何的依赖或要求。
[0044] 本发明与大量其它通用或专用的计算系统环境或配置共同运作。公知的适合本发明的计算系统、环境和/或配置的例子包括,但不限于,个人计算机、服务器计算机、手提或膝上型设备、多处理器系统、基于微处理器的系统、机顶盒、可编程消费者电子设备、网络PC、小型计算机、大型计算机、网络外围设备(例如,网络打印机)、包括上述任意系统或设备的分布式计算环境等等。
[0045] 本发明可以在被计算机执行的计算机可执行指令(如程序模块)的通用上下文中被描述。通常,程序模块包括执行特定任务或执行特定抽象数据类型的例行程序、程序、对象、组件、数据结构等。本发明也可以在分布式计算环境中被实施,其中任务通过通信网络连接的远程处理设备来执行。在分布式计算环境中,程序模块可以被存储在包括存储设备的本地或者远程计算机的存储介质中。
[0046] 参考附图1,用于实现本发明的示例系统包括计算机110形式的通用计算设备。计算机110的组件可以包括,但不限于,处理单元120、系统存储器130和耦合到多个系统组件的系统总线121,其中包括系统存储器到处理单元120的总线。处理单元120可以具有单个处理器或多个处理器。系统总线121可以是总线结构的几种类型中的任意结构,其中总线结构包括存储器总线或存储器控制器、外围设备总线、交叉条、交换总线结构和使用任一多种总线体系结构的本地总线。系统总线121也可以是总线的层次结构。通过示例,但非限制,这样的体系结构包括工业标准体系结构(ISA)总线、微通道体系结构(MCA)总线、增强的ISA(EISA)总线、视频电子标准联盟(VESA)本地总线、无缓冲非统一存储器访问(NC-NUMA)体系结构总线、连续缓冲非统一存储器访问(CC-NUMA)体系结构总线、GIGARING网络总线、FICON总线和也被公知为中层总线的外围组件互连(PCI)总线。 [0047] 计算机110典型地包括多种计算机可读介质。计算机可读介质可以是任何可用的能被计算机110访问的介质,并且包括易失和非易失介质,可拆卸和不可拆卸介质。通过例子,但不限于,计算机可读介质可以包括计算机存储介质和通信介质。计算机存储介质包括易失和非易失、可拆卸和不可拆卸介质,所述介质可以用任何方法或技术来存储例如计算机可读指令、数据结构、程序模块或其它数据的信息。计算机存储介质包括,但不限于,RAM、ROM、EEPROM、 闪存或其它存储技术、CD-ROM、数字通用磁盘(DVD)或其它光盘存储器、磁盒、磁带、磁盘存储器或其它磁存储设备或任何可用于存储所需信息并能被计算机
110访问的其它媒介。通信介质典型地包含计算机可读指令、数据结构、程序模块或其它调制数据信号(例如载波或其它传输机制)数据,及包括任何信息传送介质。术语“调制数据信号”表示具有一个或多个它自身特征的集合或能被变换用来在信号中进行信息编码的信号。通过例子,但不限于,通信介质包括有线介质如有线网络或直接有线连接,及无线介质如声音、RF、红外和其它无线介质。上述的任何组合也包括在计算机可读介质的范围中。 [0048] 系统存储器130包括计算机存储介质,所述计算机存储介质以易失和/或非易失存储器(例如只读存储器(ROM)131)及随机访问存储器(RAM)132的形式出现。基本输入/输出系统133(BIOS),包括有助于计算机110内的组件之间传递信息的基本例程(例如启动期间),典型地被存储在ROM 131中。RAM132典型地包括能立即访问和/或被处理单元
120现场执行的数据和/或程序模块。通过例子,但并不限于,附图1示例了操作系统134、应用程序135、其它程序模块136和程序数据137。
[0049] 计算机110还可以包括其它可拆卸/非可拆卸、易失/非易失计算机存储介质。仅通过例子,附图1示例了硬盘驱动器141可读取或写入非可拆卸、非易失磁盘介质,磁盘驱动器151可读取或写入可拆卸、非易失磁盘152,及光盘驱动器155可读取或写入可拆卸、非易失光盘156(如CD ROM)或其它光介质。其它可用在示例的操作环境中的可拆卸/非可拆卸、易失/非易失计算机存储介质包括,但不限于,磁性盒带、闪存卡、数字通用盘、数字视频带、固态RAM、固态ROM等等。硬盘驱动器141典型地通过非可拆卸存储器接口(例如接口140)连接到系统总线121,及磁盘驱动器151和光盘驱动器155典型地通过可拆卸存储器接口例如接口150连接到系统总线121。
[0050] 上面讨论的在附图1中示例的驱动器及它们相关的计算机存储介质,为计算机110提供计算机可读指令、数据结构、程序模块和其它数据的存储。在附图1中,例如,硬盘驱动器141被示例为用于存储操作系统144、应用程序145、其它程序模块146和程序数据
147。注意,这些组件可以相同或不同于操作系统134、应用程序135、其它程序模块136和程序数据137。这里对操作系统144、应用程序145、其它程序模块146和程序数据147给出了不同的编号来示例,在 细小的方面,它们是不同的版本。
[0051] 用户可以通过输入设备例如键盘162和点击设备161(通常指鼠标、轨迹球或触摸板)为计算机110输入命令和信息。其它输入设备(未示出)包括麦克风、游戏操作杆、游戏垫、圆盘式卫星电视天线、扫描仪、视频输入等等。这些和其它输入设备通常通过耦合到系统总线上的用户输入接口160来连接到处理单元120,但是也可以通过其它接口和总线结构例如并行端口、游戏端口或通用串行总线(USB)来连接。监视器191或其它类型的显示设备也通过接口(例如视频接口190)连接到系统总线121。除了监视器之外,计算机可以包括其它外围输入设备,例如可能通过输出外围接口195连接的扬声器197、打印机196和视频输出。
[0052] 计算机110可以通过逻辑连接到一个或多个远程计算机,例如远程计算机180,在网络环境中进行操作。虽然附图1只示例了存储器存储设备181,但是远程计算机180可以是另一台个人计算机、服务器、路由器、网络外围设备(例如,打印机)、网络PC、同等设备或其它通用网络节点,及典型地包括许多或所有上面描述的有关个人计算机110的组成元素。附图1描述的逻辑连接包括局域网(LAN)171和广域网(WAN)173,也可以包括其它网络。这样的网络环境在办公室、企业范围计算机网络、内联网和因特网中是常见的。 [0053] 当在LAN网络环境中使用时,个人计算机110通过网络接口或适配器(例如,网络接口卡(NIC))170连接到LAN 171。虽然只用单个方框来表示,网络接口170具有许多实施例及可以用多种方式实现。一种方式是处理模块具有直接连接到系统总线的一个或多个处理器,所述系统总线具有直接连接到系统总线的网络接口卡,其中处理单元和网络接口卡通过系统总线相互通信。处理模块按照下面描述在软件、硬件或软件和硬件的混合体中处理卸载了的网络栈操作。处理模块可以是单独的接口卡、母板的一部分、内部或外部卡,或者是多处理器单元中的另一个处理器等等。另一种方式是把处理模块的功能嵌入外围设备,例如,嵌入到按照下面描述的在软件、硬件或软件和硬件的混合体中处理卸载了的网络栈操作的网络接口卡。所述外围设备可以具有一个或多个处理器。当在WAN网络环境中使用时,计算机110典型地包括调制解调器172或者其它用于通过WAN 173(例如因特网)来建立通信的手段。调制解调器172可以是内置或者外置,可以通过用户输入接口160或其它适合的机制连接到系 统总线121。在网络环境中,描述的和个人计算机110相关的程序模块,或者是其中的部分,可以被存储在远程存储设备中。通过例子,但不限于,附图1示例了驻留在存储设备181中的远程应用程序185。可以理解的是,所示的网络连接仅是一个实例,其它在计算机之间建立通信连接的方式也可以被使用。
[0054] 在下面的描述中,本发明的描述将参考由一个或多个计算机执行的动作或由标记表示的操作,除非有其它的指定。如此,可以理解有时被指为被计算机执行的这样的动作和操作包括对具有结构化形式的代表数据的电子信号的操作,所述操作由计算机的处理单元执行。所述操作对数据进行转换或将其保持在计算机存储系统的存储位置,其可以通过本领域普通技术人员所熟知的方式进行重新配置或改变计算机的操作。数据被保持在其中的数据结构是根据数据格式定义的具有特定属性的存储器的物理位置。然而,本发明虽然如前面背景中所描述的,但并不意味着是一种限制,本领域普通技术人员将会理解此后描述的许多种动作和操作都可以在硬件中被执行。
[0055] 在下面的描述中,能执行网络栈操作功能的外围设备将用于描述本发明。如下面使用的,外围设备204不仅指一个外围设备,而且还包括任何上面所描述的处理模块的其它实施例,其中在处理卸载的IPSec操作(即,外围设备在软件、硬件、软件和硬件的混合体中处理卸载的IPSec操作)方面描述所述的外围设备。附图2a示例了一些组成网络模型的组件和本发明的组件之间的相互关系。附图2b示例了当本发明的组件被嵌入到另一个管道时,一些组成网络模型的组件和本发明的组件之间的相互关系。在正常操作期间,网络消息被应用程序200通过网络栈202传送到外围设备204,消息在所述外围设备204被传送到网络上的其它设备和应用程序。此外,可以使用外围设备接收来自其它设备和应用程序的网络消息,然后通过网络栈202将网络消息传送到应用程序200。网络栈202包括一个或多个中间软件层206。从应用程序200传送的数据经过中间软件层206,在这里对数据执行特定的操作,例如,数据打包、可靠的数据传送和计算消息摘要。
[0056] IPSec转换208用来从对中间软件层206(即,至少一个中间层要求IPSec操作或具有一个IPSec层)执行IPSec操作中卸载处理单元120。虽然单独地示例了IPSec转换208,可以注意到IPSec转换208可以被集成到网络栈202的中间层中。其它中间层可以在IPSec转换之上(未示出)。在卸载了IPSec操作之 后,数据通过管道210送到外围设备
204,由外围设备204执行IPSec操作。在这个等级层次中,在IPSec转换和IPSec操作之上的中间软件层并不是必须独占地驻留在主机或外围设备中,它允许任意的中间层被完全卸载、保留在主机中或者为两者的结合(例如,卸载一个或多个特定连接)。 [0057] 参考附图2b,IPSec管道210可以位于其它管道的上面或下面。例如,IPSEC管道
210可以位于TCP管道220的上面或下面。转换222用于从对中间软件层206执行的网络栈操作中卸载处理单元120。虽然转换222被单独地显示,但可以注意到转换222可以被集成到网络栈202的中间层顶部。在卸载了网络栈操作之后,根据被使用的网络栈202的类型,数据通过管道210或220传送到外围设备204,作为外围设备204执行网络栈操作之用。例如,如果TCP连接没有被卸载,或另一个传输协议(例如UDP)正在被使用,IPSec操作通过管道210被传送到外围设备204用于执行IPSec操作。类似地,如果TCP连接被卸载,TCP操作通过管道220被传送到外围设备204。如果TCP连接需要IPSec封装/解封装,卸载目标(例如,外围设备)将对抱应用IPSec SA卸载对象。在这个等级层次中,中间软件层和IPSec操作并是不必须独占地驻留在主机或外围设备中,它允许任意中间层被完全卸载、保持在主机中或者为两者的结合(例如,卸载一个或多个特定的连接)。 [0058] 连接可以是可靠的和非可靠的数据传送及单播或多播数据传送的任意结合。如果中间层保持在主机中,则主机更新外围设备204中的高速缓存变量(如下面描述的)。例如,伴随着一个网络层的路由缓冲入口(RCE)被卸载到外围设备204,用于连接的传输层的传输控制模块(TCB)状态入口被卸载。转换222继续通过共享相同的RCE的网络栈202为不同的TCB传送流量,而同时转换222通过管道220为卸载的TCB发送流量。IPSec转换
208通过管道210为卸载的安全关联(SA)发送卸载的IPSec功能的流量,并可为要求IPSec认证和/或加密/解密的流量传送/接收来自管道220的流量。
[0059] 转换208(或222)通过向中间层206发送卸载请求来启动卸载。每个中间层206拒绝卸载请求或者在卸载请求上附加资源信息并发送该卸载请求至网络栈202中的相邻的软件层。卸载请求包括资源信息(潜在地用于每个网络层),所述资源信息有助于外围设备204决定是否能成功地卸载连接。当外围设备204收到卸载请求时,它计算其是否具有可用于卸载连接和/或IPSec操作的可用的 资源。如果卸载是不可能的,则外围设备204拒绝卸载请求。否则,外围设备204接受卸载请求并为连接分配资源。外围设备204通过发送具有一个参数列表的完成消息给中间软件层206来完成卸载请求。参数列表为中间软件层206和转换208(或222)提供信息以允许中间软件层206和转换208(或222)与外围设备进行通信。当每个中间软件层206接收到完成的消息时,它从参数列表中为删除本层信息并将余下的完成消息传送给下个中间层206,或者如果没有额外的中间层206时,传送给转换208(或222)。
[0060] 当中间层206接收到卸载的完成消息时或者在原始卸载请求期间,中间层206传送它的状态给外围设备204。每个状态可以有三种类型的变量(也称为“状态变量”):CONST、CACHED、和DELEGATED。相应于任何给出的中间层206的状态对象可以具有所有三种状态类型,或三种状态类型的子集。CONST状态变量是在卸载的连接的生命期间不变的常量。
[0061] 当卸载网络栈和/或IPSec操作(此后也简单地称为“卸载期间”)的处理控制时,CONST状态变量被提供给外围设备204,但是当状态对象被上载到主机协议栈(此后也简单地称为“上载期间”)时,外围设备204并不返回所述变量给适合的中间层206。这是因为中间层206保持CONST状态变量的值,这样允许在上载期间被传送的数据结构变得更小。
[0062] 主处理器维持对CACHED状态变量的所有权并保证在主处理器中CACHED状态变量的任何改变都在外围设备204中被更新。改变CACHED状态变量的控制消息由网络栈202处理。结果,在卸载期间主机将把CACHED状态变量写入外围设备,但是在上载期间其不必把CACHED状态变量从外围设备读回。这进一步减少了与上载相关的开销。 [0063] 主处理器把DELEGATED状态变量的所有权传递给外围设备204。DELEGATED状态变量在卸载期间被写一次并在上载期间被读回。通过仅传回对DELEGATED状态变量的控制,与把连接上载回给主机相关的开销被最小化。
[0064] 相应地,在卸载期间,其对给定状态对象的一些状态变量的控制被保持在主处理器中,而对给定状态对象的其它状态变量的控制被传给外围设备204,所以,对状态对象的控制在主处理器和外围设备204之间共享。因此,与每个中间层相关的状态的处理控制被清晰地在主处理器和外围设备之间分配,这样它们各自拥有状态的独占部分。 [0065] 主机处理器在需要时可以查询外围设备204的DELEGATED状态变量。主机处理器还可以查询CONST或CACHED状态变量用于诊断。将状态分成三种类型(或“变量”)使得网络栈202和管道210、220清晰地共存。任何给外围设备的状态变量(不论是否对这些状态变量的控制都被传送给外围设备)可以被包括在初始的卸载请求中,用于最优化外围设备和主机栈之间的交互次数。这将在下面两种情况之一的时候完成,状态对象不包括委托状态或者主机栈能确定委托状态变量不会在初始卸载请求和卸载请求完成之间发生改变。 [0066] 可以由外围设备204或者主机栈202启动上载。主机栈对IPSec操作的启动可以源自IPSec层214之上的层或者IPSec层214自身。对网络栈操作的上载也可以直接由中间层206来启动,因为,例如,中间层206使路径或相邻的入口无效。一旦上载被启动,外围设备204完成列出的的请求并把状态对象返回给主机栈。转换222排列任何进一步的传输请求并且停止发布接收缓存给外围设备204。在上载期间,主机栈的中间层重新获取状态对象的控制,并且完成上载请求。在上载请求完成之后,外围设备204释放上载所不再使用的资源。
[0067] 在一些情形下,用于特定连接或状态对象的数据可以通过其它外围设备到达或者主机协议栈(例如,IP分段、处理IP选择或扩展头或引起TCP分段到达不同网络接口的路由噪声)可以要求对其进行处理。如果这种情况发生,中间层206也可以具有转发接口用来发送接收到的数据给外围设备204。当外围设备处在与连接或状态对象相关的上载的中间时,中间层206可以尝试转发数据给外围设备204。因此,外围设备204可以不再具有处理数据包所必须的状态对象的控制。如果这种情况发生,外围设备204返回一个错误消息给中间层206指示一个上载正在处理。错误消息通知中间层206停止转发到来的数据并且缓存后续数据直到中间层收到状态对象。可选地,在损害外围设备204的额外缓冲存储器的情况下,到来的数据可以被转发到外围设备204,外围设备204缓冲数据以在上载状态对象完成时提供数据。可选地,如果中间层206知道一个上载正在发生,中间层可以选择缓冲请求直到上载完成并在之后处理所述数据。
[0068] 由中间软件层206可以把多个连接卸载给外围设备204。中间软件层206维持了一个具有上层状态对象(即,中间软件层206之上的层的状态对象)数目的参考计数器,所述上层状态对象引用卸载的中间软件层的状态对象。这里使用的状态对象是特定层的状态变量(也称为“状态”)的集合。如前面提到的, 这样的状态变量可以被分类为CONST、CACHED或DELEGATED。如果特定中间层的卸载的状态变量的参考数目减少到零(例如,在上载请求期间),则中间层206发送一个消息到外围设备204以上载中间层状态对象,外围设备204发送相应的委托状态变量到中间层206并删除中间层206的状态变量。注意,上载请求可以在引起参考计数减少至零的原始的上载请求期间发生,或者推迟至迟一些的时间。
[0069] 附图3a描述了根据本发明的一个实施例,其中硬件层314包括一个外围设备,可以是,例如,网络接口卡(NIC)。附图3b描述了根据本发明的一个实施例,其中硬件层314包括一个外围设备,可以是,例如,网络接口卡(NIC)并且IPSec管道308被嵌入到另一个管道320(如TCP管道)中。此外,附图3a示例了包括IPSec转换322和网络栈318的软件层,所述网络栈318包括传输层300、网络层302和组帧层304。网络层302也被称为“路径层”而组帧层304也被称为“邻接层”。
[0070] 通常,应用程序200在操作期间通过网络栈318发送网络消息给外围设备(例如,硬件314)。从应用程序200发送来的数据经传输层300到达IPSec转换306,所述IPSec转换306控制所述数据是否发送至基于主机的网络栈318或IPSec管道308。传输层300可以是TCP层、UDP层、ICMP层等等。注意,转换306可以被合并到网络栈318的一个层中。位于网络栈318中的软件层接收来自应用程序300的数据,将所述数据打包成包的形式,并通过NDIS微驱动程序310将所述作为结果的包发送到外围设备硬件314。当接收到网络包时,软件层也提供相反的功能,即它把有效载荷交给应用程序的。当包经过栈318传递时,网络栈318可执行的其它任务包括为没有被卸载的安全关联进行数据加密和解密、可靠数据传输及计算或校验消息摘要(例如,数据包的校验和或CRC)。假如没有被卸载,许多这些任务是由主机处理器执行并且其是依赖处理器的。
[0071] 参考附图3b,应用程序200在执行期间通过网络栈318发送网络消息给外围设备(例如,硬件314)。发送自应用程序200的数据途经TLI(传输层接口)转换322,所述转换322控制所述数据是否向下发送至基于主机的网络栈318或管道320。注意,TLI转换322可以被合并到网络栈318的顶层。在网络栈318中的软件层接收来自应用程序200的数据,将数据打包成包的形式,并通过NDIS 微驱动程序310发送作为结果的包至外围设备硬件314。软件层和网络栈318执行与前面描述的相同的功能。
[0072] TLI转换322被用来从CPU卸载栈操作到外围设备,即经管道320和管道驱动程序312发送卸载了的连接的数据给外围设备。本领域普通技术人员通过阅读说明书和权利要求可知NDIS驱动程序310和管道驱动程序312可以是相同的驱动程序。本领域普通技术人员还可以知道NDIS微驱动程序310和管道驱动程序312的上部边缘是 操作系统中的NDIS API。为了解释,在基于协议栈的传输控制协议(TCP)之下的安全因特网协议被用来解释本发明。不过,本领域普通技术人员在看完本描述之后将知晓,根据本发明的规则,许多类型的外围设备可以被使用并且许多其它网络栈可以被卸载。此外,本发明还可以用于卸载更高功能的协议例如因特网小型计算机系统接口(iSCSI)、网络文件系统(NFS)或普通接口文件系统(CIFS)。被卸载的协议可以是面向连接的(例如,TCP)或者是无连接的(例如,IPSEC或UDP)。
[0073] 有许多原因会引起执行网络连接卸载。通过例子,但不是限制,其中一些原因在下面给出。系统管理员可以选择卸载一个特定服务。如果流量(根据字节数或数据包数)正消耗大量的资源,则特定的连接可以被卸载。此外,除IPSec服务之外的某些类型的服务也可以被卸载。此外,管理策略可以驱动处理卸载。例如,管理员可以具有使来自编制内的所有连接首先被卸载或者所有用于特定应用程序的连接被首先卸载的策略。正被使用的系统资源(例如,CPU的利用、数据缓冲的使用、页表格缓冲的使用、存储带宽)可以引导处理器卸载连接。
[0074] 在描述卸载IPSec功能的步骤之前,首先将描述卸载TCP连接的步骤。附图4示例了用于卸载TCP连接的三个处理步骤,其中没有示出附图3b中的应用层200,其位置应该位于TLI转换322的左边。此外,为了简单起见,虽然根据本发明的其它类型的外围设备(包括具有网络适配器的通用CPU)也能执行相同的功能,外围设备370在附图4中示例为NIC。通常,附图4示例了分配卸载TCP连接所需的资源的过程,提供句柄至每一层(例如,传输层300、网络层302、组帧层304)和转换306、322,并且把每层300、302、304的状态卸载给外围设备370。在卸载转换期间,TLI转换322缓冲所有发送给或接收自应用程序的消息。可选地,传输层300缓冲数据。当卸载完成后,被缓冲的数据 被传送到外围设备370。当到来的包在卸载转换期间被接收时,外围设备370继续将数据通过层300、302、304和转换306、322上传,直到传输层委托状态被传送至外围设备370。如果传输层300在卸载转换期间收到到来的包,它将数据作为传输状态对象的委托状态的一部分或者独立地转发到NIC 370。
[0075] TLI转换322通过发送一个卸载请求400给传输层300来启动卸载。卸载请求包括指向下一层的本地状态的指针(例如,用于传输层300的TCB指针、用于网络层302的RCE指针、用于组帧层304的ARP入口指针或用于NDIS微驱动程序310的NDIS微端口指针)。卸载请求还包括卸载类型(例如,用于TLI转换322的TCP、用于网络层302的IPv6等等)和用于帮助外围设备370决定是否能够成功卸载TCP连接的资源信息。TLI转换322也可对外围设备370提供一个卸载句柄。TLI转换322将停止发送应用程序发送或接收缓冲至传输层300,并将它们排队以等待传输层300发送一个完成消息420。
[0076] 传输层300拒绝卸载请求或者发送卸载请求402给网络层302,其中卸载请求402具有添加了TCP资源信息的TLI转换资源信息。传输层300也能提供一个卸载句柄给外围设备370。如果具有任何未完成的应用程序发送或接收缓冲挂起,则传输层300返回缓冲给TLI转换322。
[0077] 网络层302接收卸载请求402并且拒绝卸载连接或者发送卸载请求404给组帧层304,其中卸载请求404具有添加了网络资源需求的TCP资源信息和TLI转换资源信息。网络层302也可以提供一个卸载句柄给外围设备370。
[0078] 组帧层304拒绝卸载连接或者发送卸载请求406给外围设备370,其中卸载请求406具有添加了组帧资源需求的网络资源需求、TCP资源信息和TLI转换资源信息。组帧层
304也可以提供一个卸载句柄给外围设备370。
[0079] 外围设备370接收卸载请求并计算其是否具有可用于卸载TCP连接的资源。如果NIC确定卸载是不可能的,它就拒绝卸载请求。如果NIC确定卸载是可能的,它就接受卸载请求并分配用于连接的资源(例如,TCB、路由高速缓冲入口(RCE)、地址解析协议(ARP)表入口(ATE))。外围设备370创建参数链表和分发表并把它们交给层300、302、304,并通过发送具有参数链表的完成消息408给组帧层304来完成卸载请求。参数包括一个卸载句柄和用于每个层300、302、304的分发表。
[0080] 如这里使用的,卸载句柄表示允许软件层和外围设备通信或者外围设备和 软件层通信的一种机制。通过例子但并不限于,卸载句柄可以是基于指针的句柄、用于查询数组的整数、哈希表(例如,哈希函数)、软件层(或网络栈)和外围设备之间的通信通道或者由软件层向下传送的外围设备用来查找状态对象的一系列参数。
[0081] 通过例子但并不限于,中间软件层(300、302和304)和外围设备370之间通信的机制(称为分发表)可以是函数调用指针,用于查找一个数列、哈希表(例如,哈希功能)、软件层(或网络栈)和外围设备之间的通信通道或者由软件层向下传送的外围设备用来查询状态对象的一系列参数。分发表可以在外围设备初始化期间或晚一些时候被交换。 [0082] 分发表用于直接发送数据到外围设备370或者直接从外围设备370接收数据。分发表也可以用于提供诊断。例如,可以在两个中间层之间或者在最末端和外围设备之间插入一个软件层,用于监视系统并抑制错误以保证系统功能正常。此外,分发表还可以由软件层在需要时添加额外的功能进行修补。例如,可以增加软件层以提供滤波器驱动程序或虚拟外围设备的功能。典型地,修补通过被插入中间层的函数指针改写分发表来完成。然后,当插入的中间层的函数指针被调用并且插入的中间层完成了它的工作时,插入的中间层调用来自原始分发表的原始的函数指针。
[0083] 当组帧层304接收到完成消息时,组帧层304在ARP表的入口存储组帧层的卸载句柄和分发表,以便于更新(例如,目的MAC地址发生变化或者封装类型发生变化)。然后,组帧层304利用与ATE相关的状态来更新310外围设备370。组帧层304从链表中删除它的状态并转发(如箭头412所指示的)链表中的剩余信息给网络层302。
[0084] 网络层302存储网络层302的卸载句柄和分发表。然后,网络层302利用与RCE相关联的状态来更新(如箭头414所指示的)外围设备370。网络层302从链表中删除网络层的信息并发送具有参数链表(如箭头416所指示的)和分发表的完成消息给传输层300。网络层302可以转发在卸载期间接收到的任何缓冲IP分段到外围设备370以进行处理,或者它可以在网络层中处理IP分段并将它们转发给传输层300。
[0085] 传输层300存储传输层的卸载句柄并发送(如箭头418所指示的)它的状态至外围设备370。然后,传输层发送完成消息420。在一个可选的实施例中, 传输层和TLI转换是相同的层而不需要消息420。
[0086] 在一个可选的实施例中,层的状态对象和卸载请求一起被发送。例如,组帧层状态对象、网络层状态对象和传输层状态对象与卸载请求一起被发送,并且仅仅在高速缓存状态在卸载请求和完成事件之间发生改变时才进行更新。如果委托状态不存在或者不能在卸载请求和完成卸载请求之间发生改变,则整个层状态对象只能和卸载请求一起被发送。如果在卸载序列期间接收到的消息能够改变DELEGATED状态,则所述消息通常将不被处理(应当被缓存),并且当卸载完成时,消息必须被转发到卸载的外围设备进行处理。然而,被分类为CACHED的状态变量可以与卸载请求一起被发送并且可以在卸载请求和完成卸载请求之间被改变。如果上述情况发生,则在CACHED状态的改变中所发生的改变必须被记录,并且当卸载完成时,必须在外围设备中更新CACHED状态。
[0087] 一旦TLI转换322接收到完成消息420,TLI转换322就传送(如箭头422所指示的)应用程序发送和接收缓冲到外围设备370。TLI转换322使用分发表来递送所有待处理的的和未来的接收缓冲并发送到NIC370进行处理。在卸载请求走向完成期间,每层300、302和304拒绝用于卸载的状态对象(例如,与层相关的状态对象)的新的卸载请求或者将它们排队直到卸载完成。在一个可选的实施例中,应用程序缓冲在初始的卸载请求中被向下传送。
[0088] 传输层300还可以具有处理到来的TCP数据的能力,并且当传输状态对象没有在初始的卸载请求402中被卸载到外围设备370时将TCP有效载荷递交给TLI转换322。在这之后,如果到来的TCP数据通过网络栈318到达,则到来的数据被发送到外围设备370并由外围设备来处理。
[0089] 对于后来的引用前面的卸载状态的卸载请求,网络层302和组帧层304把接收自在先卸载的外围设备370的卸载句柄传送给外围设备370。这个信号通知外围设备370,其中外围设备370早已经为网络层302和组帧层304分配了资源,这节约了外围设备370的资源并加速了卸载。
[0090] 如前面已经指出的,层300、302、304传送它们的状态给外围设备370。每个状态具有三种类型的状态变量:CONST、CACHED和DELEGATED。CONST状态变量是,如名字所暗示的,在卸载的连接的生命期间不变的常量。这样,当连接终止时主机将不需要把CONST状态变量读回层中。相似地,主机处理器保持CACHED状态变量的所有权并保证在主机处理器中CACHED变 量的任何改变都在外围设备370中被更新。结果,主机写入但不需要读回CACHED类型的状态变量(除非系统诊断请求这样做)。因此,主机CPU仅传送DELEGATED状态变量的所有权给外围设备370。DELEGATED状态变量在卸载发生时被写一次,并且当卸载终止时被读回。由于外围设备(例如,NIC)仅需要传回DELEGATED状态变量,连接传送回主机的开销被最小化。而且,主机CPU仅在需要时(例如,为了统计)查询外围设备370中的DELEGATED状态变量。
[0091] 传输层300的CONST状态变量可以包括目的端口、源端口、控制传输层行为(例如,视窗缩放是否被允许或者SACK是否被允许)的一个或多个标记、SEND和RECV窗口的比例因子、远程端点(远程MSS)所发布的初始的最大的分段尺寸和潜在的其它参数。如这里已经描述的,每个前面所提到的TCP CONST变量的值是常数,它的值在TCP连接的生命周期中不会改变。
[0092] 传输层300的CACHED状态变量可以是TCP状态变量和IP状态变量。如果执行使网络层的值在每个连接的基础上被重写,则IP状态变量可以在传输结构中被要求。这些CACHED状态变量可以包括一个或多个标记(例如,是否是“Nagle”算法,或是否是TCP“保持存活”被激活),还包括“保持存活(Keep-Alive)”设置(例如,间隔、探查数和delta)、有效的最大分段尺寸(或有效的MSS)、初始默认接收窗口(InitialRcvWnd)、由外围设备370所指示的接收中被复制的字节数、根据IPv4的流量类型把包区分优先次序的服务类型(TOS)和最终把IPv6包在网络中区分优先次序的流量类型和流标记。
[0093] DELEGATED状态变量可以包括目前在因特网工程任务组(IETF)RFC 793中指定的TCP状态、一个或多个标记(例如,连接可终止地被远程端点关闭)、下一个所期望的TCP接收分段(例如,RCV.NEXT)的序列号、接收窗口尺寸(RCV.WND)、第一个未应答的数据(SUD.UNA)的序列号、下一个被发送的TCP分段(SND.NEXT)的序列号、发送窗口尺寸(SND.WND)、用于最后窗口更新(SndWL1)的分段序列号、用于最后窗口更新(SndWL2)的分段应答号、已经发送的最大序列号(SND.MAX)、最大发送窗口(MAX_WIN)当前拥塞窗口(CWnd)。 [0094] DELEGATED状态变量可以进一步包括,慢启动阈值(SSTHRESH)、平滑环路时间(SRTT)、环路时间变更(RttVar)、在下一个TCPACK(TsRecent) 中发送的时间戳值、最近被接收的时间戳是在多久以前(TsRecentAge)、接收到了多少用于相同序列号(DupAckCont)的ACK、被发送的保持存活的探查号(KeepAlive ProbeCount)、直到下一个保持存活超时的剩余时间(KeepAlive TimeoutDelta)、已经发送的重新传输的数量(KeepAlive Count)、直到下次重传超时所剩余的时间(Retransmit TimeoutDelta)、指向被缓冲的接收数据的指针(BufferedData-当卸载或上载进行时接收到的TCP数据)。
[0095] 网络层302的CONST状态变量可包括目的地IP地址(用于IPv4或者IPv6)和源IP地址(用于IPv4或者IPv6)。网络层302的CACHED状态变量可以包括路径最大传输单元(PathMTU)。网络层302的DELEGATED状态变量可包括IP包ID开始值。组帧层304的CACHED状态变量可以包括目的媒体访问控制(MAC)地址、源MAC地址、用于IETF RFC 2461邻近发现(例如,主机可达delta和NIC可达delta)的参数和指示头格式(例如,LLC/SNAP(逻辑链路控制/子网访问协议)格式或DIX(Digital、Intel、Xerox)格式)的标记。 [0096] 传输层状态可以包括网络层状态对象的一个句柄并且网络层状态可以包括组帧层状态对象的一个句柄,因为网络层(也称为“路径”)状态可以在多连接之间共享,并且组帧层(也称为“邻接”)状态可以在多路径(例如,所有流量都经过一个路由器)之间共享。维持这个层次等级出于几个原因。一个连接可以要求一个用于网络层的NIC句柄,因为IP ID名字空间可以通过基于每条路径的所有卸载的连接来管理,或者因为路径MTU的更新可以在网络层被完成一次并作用于所有TCP连接而不是为每个TCP连接进行单独设置。一个路径为组帧层状态对象要求一个NIC句柄,因为路由更新能改变下一跳的地址,即指向一个新的MAC地址。这个等级层次也精简需要由NIC维持的状态的数量。例如,为IPv4的ARP更新能把IP地址的映射改变为MAC地址的映射(例如,服务器上的接口故障恢复)。主机维持MAC地址为高速缓存变量,这样它只需要完成单个高速缓存状态更新以及把所有的连接故障恢复到新的接口。
[0097] 一旦主机卸载了一个TCP连接,外围设备370就负责为它发送的包分配包标识符(例如,IP ID)。IP ID基于每个接口或者每个层状态对象被卸载。无论怎样,外围设备370被分配一部分IP ID名字空间。在一个实施例中,外围设备370当IP ID名字空间初始化时被分配了总的名字空间的一半,并且主机协议栈基于每个外围设备维持它的部分IP_ID名字空间。另一个实施例使主机协议栈 基于每条路径维持IP_ID名字空间。当网络状态对象被传送到外围设备370时,外围设备被分配一个IP包DI的开始值进行使用。外围设备370可以使用下面的公式来产生它发送的IP包的一个IP ID:
[0098] Cur_IPID= [(Start_IPID_For_This_Path)+(Counter_For_This_Path)mod32K]mod 64K
[0099] Counter_For_This_Path=Counter_For_This_Path+1
[0100] 可选地,外围设备可以被静态地分配一半名字空间。
[0101] 如果一个实施例动态地传送IPID起始地址到外围设备370,那么当卸载的连接被上载或无效时,外围设备370传送它将使用的下一个IPID值给网络层,用于存储发生的下一个卸载,并且主机处理单元继续使用分配给它的部分IP ID名字空间。主机处理单元可以使用全部的IP ID名字空间,但是更适宜的是仅在网络上的IP包的最大生命周期超时的时候。
[0102] 如果外围设备370被从系统中删除,外围设备使用过的最后的值需要被保存,以防外围设备370在最大包生命周期内被重新插入系统。如果外围设备370在最大包生命周期之后被插入,则最后的值不需要被保存。
[0103] 外围设备370把数据按照数据接收的顺序放入接收缓冲,并且以它们被发送给卸载的连接的顺序填充应用程序缓冲。许多应用程序在发送接收缓冲之前等待一个接收指示。在一个实施例中,外围设备370具有一个全局缓冲池,在当一个连接的数据到达并且没有应用程序接收缓冲被发布的时候使用。全局缓冲池越过卸载的连接被使用,并且可以用来执行:1)处理无序TCP传输;2)IP数据报碎片整理;3)如果应用程序发送的缓冲对于零拷贝算法来说太小时,使用缓冲拷贝算法而不是零拷贝算法;及4)当应用程序不具有预先发布的缓冲时,用于为应用程序指示数据的指示机制。可选地,如果使用缓冲资源的效率无关紧要时,全连接缓冲池可以被使用。这样,全局缓冲池仅在如下情况时使用,即应用程序不预先发送缓冲或者缺少系统资源(例如,没有足够的资源用于在内存中保持应用程序缓冲)。
[0104] 参考附图5A-5D,典型的接收卸载的外围设备(例如,NIC)可以具有代表卸载的反向树数据结构500。在附图中,虚线代表由外围设备分配的新的状态。在附图5A中,外围设备具有耦合到路由高速缓存入口504的ARP入口502,路由高速缓存入口耦合到一个网络连接如TCP入口506。如果,例如,所有的 网络连接(例如,TCP)流量通过一个路由器,则下一跳通常将会是同样的ARP入口502。如果路由高速缓存入口504被用于下一个网络连接卸载,则仅有的新的资源是新卸载的TCP状态对象。这样,当主机CPU沿网络协议栈向下启动一个卸载时,早就已经卸载了它们的状态(例如,网络层302和组帧层304)的中间软件层将简单地插入在先前的卸载请求上分配的外围设备产生的卸载句柄。外围设备170仅需分配新的资源(例如,TCP入口508)并且为支持网络协议栈的新资源发送卸载句柄。 [0105] 反向树500目前具有耦合到路由高速缓存入口504(见附图5b)的TCP入口508。这个方法节省了外围设备资源并加速了卸载。另外,如果高速缓存变量状态发生变化,则仅需要更新单个结构。如果管道中的多个软件层的所有状态作为单一入口被卸载,则顶层软件层下面的任何状态的更新都需要多重更新。
[0106] 附图5C示例了具有更复杂的配置的反向树500。其具有通过ARP表入口502的两个路由高速缓存入口,即504和510。TCP网络连接506和508使用路由高速缓存入口504。TCP网络连接512和514引用路由高速缓存入口510。如果任何ARP更新发生(例如,多家服务器接口使用免费的ARP更新来恢复故障),则仅入口502必须被更新。这使得潜在的上千或者成百上千的连接被故障恢复到一个新接口,所述新接口仅具有外围设备需求的单一更新。附图5D示例了在路由更新发生之后两个独立的反向树(入口502-508和入口510-516)融合为一个单一的反向树400。在路由更新之前,路由高速缓存入口510的下一跳ARP入口是ARP表入口516。路由更新之后,下一跳ARP表入口是ARP表入口502。
这样,当组帧层、网络层和传输层的状态作为单一入口被卸载时,使用反向树使路由更新的处理更加高效,而不是进行成千上万的更新。重要的是,反向树的概念可以在某些时候被扩展以卸载多个连接。
[0107] 附图6A和6B示例了根据本发明的具有特定引用块链表句柄(或“块链表”)的额外的特征。通常,块链表是在管道卸载或管道终止期间分配给卸载目标(例如,外围设备)的一个数据结构。这样,在“上载”的情况下,处理网络连接的组件把块链表返回给主机,并且在“卸载”的情况下,向下传送给外围设备,因此引用的起点是任意的。块链表数据结构包括一系列指向特定下一层状态对象(从属块)或者同一层状态对象(下一块)的指针。 [0108] 特别地,从属块指针向上指向等级层次中的下一个级别,并且用于在网络 协议栈的中间软件层之间通知卸载目标任何现存的从属。例如,邻接(或组帧层)状态对象将从属于路径(或网络层)状态对象,而路径层状态对象可以从属于相同层次等级的TCP连接。然而,下一块指针,指示在不同层次等级中相同级别的数据结构。例如,在第一TCP连接中的路径(或网络层)状态对象可以指向不同TCP连接中的路径状态对象。
[0109] 类似于附图5A-5D中所示的,附图6A示例了一个反向树数据结构。附图6A中的反向树显示了具有不同TCP层状态入口的两个TCP连接604和606(即,TCP连接1和TCP连接2),及公共路径(或网络层)状态入口602,和公共邻接状态入口600。然而,不同的网络连接608(即,TCP连接3)具有单独的路径状态入口610及公共邻接状态入口600。整个层次等级序列可以由把连接指向下一个软件层的一系列路径句柄在每个软件层之间进行定义。例如,路径句柄612和614各自把TCP状态入口604和606指向路径状态入口602,状态入口602反过来又具有指向邻接状态入口600的句柄616。类似地,TCP状态入口608具有指向路径状态入口610的句柄618,路径状态入口610又通过句柄620指向公共邻接状态入口600。根据本发明,附图6A还可以用下一块指针来表达,那样就同时包括了多个网络连接管道。
[0110] 附图6B示例了在同时卸载的不同网络连接中,块链表句柄如何(多个下一和从属块指针的集合)与多个网络连接块相联系。如附图6A、附图6B以软件层块的方式表示反向树,所述软件层块包括多个软件状态句柄。所示的是具有公共路径块644的TCP块640和642,及公共邻接块646。第三TCP块648具有路径块650和相同的邻接块646。块链表句柄将呈现出邻接块646包括指向路径块644的从属块指针660的状态。然而,与前面所述的附图5A中的反向树相比,邻接块646还可以通过下一块指针662指向另外一个反向树数据结构。如果下一块指针662丢失(例如,NULL值),这可以信号指示在块链表中的该层没有其它的反向树。相似地,路径块644具有指向路径块650的下一块指针664(即反向树中的完全不同的连接“分支”)。
[0111] 在邻接块646的情况下,路径块644和650都各自具有从属块指针666和668,及下一块指针664和670,这样,路径块650也可以指向不同连接路径的一个完全不同的反向树(例如,672)。此外,每个TCP块640、642和648具有下一块指针672、674和676,下一块指针672、674和676能在相同的反向树 (例如674)中指向另一个TCP块,或者可以指出在这个树中不存在其它块(例如,672和676)。然而,这些指针不是静态的。即,在例如当路径路由改变时,连接也可以改变,它能将下一个邻接改变为不同的路由。这样,例如,路径块650可以改变它所使用的邻接入口,从邻接入口1646改变成某个其它邻接(例如,邻接入口2(未示出))。相应地,使用块链表能使多个连接、路径和邻接入口在单一的程序调用中被卸载或终止。
[0112] 通过例子但并不限于,第一卸载请求可以要求卸载目标(例如,NIC)为每个数据结构(例如,640、642、644、646等)分配一个状态和句柄,并返回卸载目标的句柄给主机网络栈。一个可选的实施例是,卸载目标基于每一个TCP连接分配状态,并且把所有的从属路径和邻接状态复制到TCP连接状态中。然后卸载目标为路径入口分配一个状态结构,但利用指向每个包含路径状态拷贝的TCP状态的指针初始化所述状态。相似的例程可以适用于邻接状态。这允许用于数据传送的所有状态被包括在单一的数据结构中,因此,使得用于发送数据的状态查找的数目减少。例如,对于TCP块640发送包处理,状态查找的数目从三减少到一。如果在特定入口中卸载目标分配的句柄是无效的,则该状态对象是一个新的卸载请求。主机栈的后续卸载请求可以重新使用现存的路径或者邻接状态入口。块链表可以仅包括每层的一个状态对象(例如,单个邻接状态对象、路径状态对象和TCP状态对象),或者可以是附图6A-6B中定义的更复杂的结构。这个更复杂的结构(如指出的)使多个连接、路径和邻接入口在单一的程序调用中被卸载或者被终止。
[0113] 一旦主机(如已经指出的)卸载了连接,可能需要一个或多个软件层来更新在它们各自状态对象中的变化。附图7示例了网络协议栈中软件层之间的可能的信号序列,在本发明中用它来更新状态对象的高速缓存状态部分。如已经指出的,这通过当软件层利用层中的CACHED状态变量的改变更新外围设备时完成。更新状态对象的CACHED状态变量允许中间软件层和外围设备状态变成一致。
[0114] 相应地,附图7显示了,当每个软件层利用外围设备更新它的CACHED状态变量时,每个软件层向下发送一个更新信号到网络协议栈直到该信号到达微端口驱动程序730。例如,如果TCP层720需要用外围设备来更新它的CACHED状态变量,则TCP层720发送一个信号702到网络层(路径)722, 网络层722发送一个更新信号704到组帧层(邻接)724,组帧层(邻接)724依次发送一个更新信号706到网络驱动器接口规范(NDIS)726,网络驱动器接口规范(NDIS)726发送信号708到微端口驱动程序730。一旦CACHED状态变量被外围设备更新后,微端口驱动程序730转播一个信号710到NDIS 726,然后继续一系列转播712、714和716到TCP层,发信号表明TCPCACHED状态变量已经利用外围设备进行更新。一个可选的实施例是,CACHED状态的更新直接到达卸载目标而不通过中间层。 [0115] 由于本发明使用块链表数据结构,这些系列更新和确认步骤仅需发生在软件层最初更新CACHED状态变量时。即,例如,如果组帧层(邻接)724需要利用NIC更新它的状态对象的CACHED状态变量部分,则仅需发生步骤706、708、710和712。因此,网络协议栈的上层软件层将不必参与更新组帧层的CACHED状态的信号转播。利用块链表更新多个连接状态的变化的能力也使每个卸载的网络连接具有高度连接完整性。在一个可选实施例中,可以允许在执行更新的软件层和微端口驱动程序730之间直接发生更新通信。不过这需要到微端口驱动程序730的大量的调用接口,并且当额外的网络协议层被填加至卸载时,不容易进行扩展。
[0116] 如果主机CPU或外围设备需要终止卸载的连接或状态对象,本发明提供一个相似的信号序列步骤。作为基本的事件,主机或者卸载目标都可以终止一个卸载。通过终止和/或无效TCP连接依赖的路径或者邻接状态对象,中间协议层也可以直接终止一个卸载的TCP连接。这最终将引起TCP连接超时或者导致来自卸载目标的一个由于无效的路径或邻接状态对象而不能传输的通知,该通知将引起卸载目标请求终止该TCP连接卸载。连接卸载可以因为许多原因被终止。通常,将会有一个管理机制告知协议栈来卸载指定的连接。如果卸载目标请求终止一个管理员曾指定卸载的连接的卸载,主机将同意该终止,并为管理程序记录一个事件日志。
[0117] 可选地,如果网络接口无效(例如,媒体断开连接事件),卸载目标将不必请求终止卸载的状态对象。主机将通过正常的信号事件被通知该事件并且决定最佳的反应过程。而且,如果连接被重置(当接收到TCP RST分段时发生),则卸载目标将指示给主机连接卸载将被终止。如果下一跳的地址改变,则引起邻接状态对象改变,主机栈将保证新的状态对象在旧的状态对象被无效前被创 建。这允许卸载目标确定是否邻接或者路径状态对象不再有效,这不是因为路径和/或邻接状态对象中的来自主机栈的更新的临时竞争条件。一个可选实施例是,不确定新的状态对象在旧的状态对象被无效前被创建及依靠卸载目标来处理竞争条件(即,它可以请求一个上载,但该上载将不被同意)。
[0118] 附图8示例了网络栈中的中间软件层之间的可能的信号序列,其中外围设备请求终止一个卸载的TCP连接。在外围设备决定终止卸载的事件中,外围设备通过调用一个“指示”功能(如主机栈所发布的)来请求主机栈终止卸载,并且包括外围设备希望终止卸载的原因。这个原因可以是多种原因,包括外围设备不支持特定网络协议层的特征的情形,例如,它接收到紧急数据但是不支持它。外围设备终止请求,例如,跟随通过协议层的开始于从微端口驱动程序830到NDIS 826的调用802的一系列信号(802、804),其依次发送终止请求信号804到TCP层820。一旦主机处理了外围设备的终止请求,则主机通过完成它向微端口驱动程序830来确认请求。注意,一些上载请求是强制的(即,主机通常将上载)并且一些上载请求是可选的(即,主机可以上载)。
[0119] 一旦主机栈决定终止卸载,附图8示例了主机栈通过每个中间软件层发送一个信号警告终止中间层。例如,TCP 820发送一个信号810到终止的网络层822,网络层发送一个信号812到终止的组帧层824,以及向下通过网络协议栈的信号814和816。在中间软件层的最高层(例如,TCP)的情况下,一旦TCP传输层820(即,传输层300)请求终止,则TCP(或者传输)层将停止递送新的应用程序发送或接收缓冲给卸载目标,并且将开始缓冲任何收到的TCP段直到外围设备成功上载网络连接。相反地,网络协议栈中的每个低层软件层将进行检查,以查看是否各自的层是它们的状态对象的最后从属块链表数据结构。如果各自的中间层没有更多的从属块,那么各自的层也将通过填加额外的块链表数据结构到链表来请求终止它们各自的状态对象,以及包括用于中间层各自的状态对象的卸载目标句柄。如果它确实具有额外的从属块,则它将简单地转发上载请求给下一层而不必请求上载它的状态对象。参见信号814和816。
[0120] 当卸载目标(例如,外围设备)已经通过网络协议栈确定请求的终止时,卸载目标停止处理到来的网络连接数据,并且把流出的网络连接数据的处理带动一致状态。关于未完成的请求(即,应用程序层在确认卸载终止前已经传送了的网络连接数据缓冲),卸载目标向上通过网络协议栈回应一个状态信号 (840、842),该信号表明连接“上载”正在“处理中”并且返回缓冲的所有权给TCP层820。如果存在任意接收到的网络连接数据,所述的网络连接数据已经由外围设备发送了接收响应给远程计算机(即,在WAN上的远程同位计算机),但是主机的应用程序还没有传送用于消耗(用于最终的处理)的缓冲,那么外围设备将把这个传送的缓冲打包成TCPDELEGATED状态变量的一部分并返回给中间软件层。 [0121] 在任一种情况下,外围设备为每个中间软件级返回每个DELEGATED状态变量(例如,通过NDIS 826)的控制(例如,信号852、854、856),所以主机CPU重新获得对DELEGATED状态的控制。这样,卸载目标确保生成来自不同层的请求的DELEGATED状态的一致的快照,将状态填充进与卸载块链表结构相关联的状态结构中,并且调用终止卸载完成功能(850)。再次,因为卸载的块链表数据结构,连接终止调用可以同时针对一个或多个连接。 [0122] 也可以提供管理一个或多个物理外围设备驱动程序的一个或多个虚拟设备驱动程序,例如一个或多个NIC驱动程序。虚拟设备驱动程序可以将单个媒体访问控制(MAC)地址公开给主机栈,并提供主机栈和虚拟驱动程序管理的一个或多个外围设备驱动程序之间的映射。或者虚拟设备驱动程序可有效地为一个(或多个)物理外围设备提供至主机栈的多个逻辑接口,使得主机栈能管理网络流量,就好像网络比物理外围设备更多一样。因此,外围设备驱动程序是以抽象的方式存在,以至于主机栈看见一个或更多个虚拟设备驱动程序,但主机栈却不知道下面的一个或更多个外围设备驱动程序。注意,虚拟设备驱动程序可以与物理设备驱动程序分离或者可以嵌入在物理设备内部。在一个可选实施例中,没有使用虚拟设备驱动程序,并且单个物理外围设备能激活多个源MAC地址。
[0123] 通过允许虚拟外围设备参与外围设备的初始化过程,虚拟外围设备被激活,因此,虚拟外围设备可以通过自己重新定向所有到物理设备的调用,并且潜在地通知主机栈与系统物理外围设备相比更多或更少的虚拟外围设备。
[0124] 在数据传送过程中,因为在外围设备队列里的故障恢复支持,虚拟外围设备可以检测出特定的外围设备是否失效。有不同的机制支持该功能,包括检测媒体传感是否丢失,或者从卸载的外围设备到网络转换的恒定心跳是否是固定时间间隔的重复信号的形式。如果外围设备检测到心跳消失(例如,不再检测 到信号)则外围设备驱动程序将该事件以信号方式发送至虚拟外围设备。
[0125] 本发明使虚拟外围设备能够重新获得卸载的状态对象并且尝试移动网络流量到队列中的另一个外围设备。虚拟外围设备可以以不同方式完成该功能,当其它物理外围设备发生故障恢复时通过利用主机网络栈来管理栈,或者暂停新的协议卸载请求并且移动状态对象至新的物理外围设备自身。
[0126] 如果虚拟外围设备在转换期间选择允许主机协议栈来管理卸载的状态对象或连接(在TCP情况下),则虚拟外围设备请求主机协议栈停止至外围设备的卸载连接并且上载主机已经卸载到外围设备的现存状态对象。直到虚拟外围设备重新激活卸载,主机在它的中间软件层处理链路或连接。
[0127] 虚拟设备驱动程序了解具有一个或多个外围设备的队列中所有可用的外围设备。一旦外围设备失效,虚拟设备驱动程序就选择新的能够接收连接卸载或状态对象的外围设备。虚拟设备驱动程序检测新的外围设备可以具有什么资源,并初始化外围设备中所要求的任何状态。一旦外围设备被初始化完,则虚拟设备重新激活状态对象的卸载。 [0128] 当主机栈被重新激活以卸载至特定的虚拟外围设备,它重新为自己的卸载容量查询虚拟外围设备。主机将使用新的容量列表来选择哪一个状态对象或连接能被卸载。这可以根据新的外围设备所通知的容量通过传送反向树控制(即通过传送委托、高速缓存和常量状态变量)重新卸载连接至虚拟外围设备(因此,为新的外围设备)。可选地,如果新的外围设备并不支持卸载,主机自己将只继续通过中间软件层来处理连接,而不是尝试卸载它们。
[0129] 可选地,虚拟外围设备可以选择在外围设备自身之间管理被卸载的状态对象的转换。如果能完成,则外围设备仍能使用上述事件序列来在它(而不是将卸载的状态对象移动回主机协议栈)移动状态时直接停止卸载请求,且当故障恢复完成时,通知任何容量的变化。
[0130] 由于随着卸载容量发生变化,主机维持一致的状态,即使特定状态对象或连接也可以被卸载,并且由于主机可以在最初外围设备故障恢复事件中和新的外围设备重新协商参数,所以,当前发明提供了新颖、鲁棒的立即卸载和上载一个或多个状态对象或连接的方法,而不受外围设备失效的影响。
[0131] 如果虚拟外围设备被配置以支持一个或多个物理外围设备上的多个虚拟LAN,则虚拟外围设备将再次截取该物理设备的初始化,并反过来通知一个或 多个虚拟外围设备至主机栈,并确保所有至特定虚拟适配器的调用被映射至适当的虚拟LAN标志和物理外围设备。在卸载期间,通过添加组帧层状态对象或通过为虚拟外围设备创建新的状态对象,虚拟ID在最初的卸载请求中被传送。特别地,本发明使虚拟设备立刻在块链表结构中的组帧层下面插入结构至块链表结构,或者将VID添加至组帧层块链表状态对象。前述方法也能使虚拟外围设备指定物理外围设备不透明的数据(潜在地卖主所有权数据)。当连接被上载时,如果在卸载期间由虚拟外围设备添加了额外的状态对象,则虚拟外围设备删除该结构并将剩余的块链表交给主机协议栈。
[0132] 既然已经描述了卸载和上载TCP连接的方法,接下来将描述卸载与IPSec认证和/或加密相关联的计算的方法。安全关联(SA)是提供安全服务给它所承载的流量的单工“连接”。为了保护典型的、双向的两台主机之间的通信,需要两个安全关联(每个方向一个)。安全关联是由三个部分唯一标识的,包括安全参数索引(SPI)、IP目的地址和安全协议(例如AH[认证头]或ESP[封装安全有效载荷])标识符。技术上,如果AH和ESP保护被应用于负载流,则两个(或多个)SA被创建以在单个方向上对负载流提供保护。如果在两个方向(典型的)上需要保护,则潜在地必须需要四个SA如果AH和ESP都被激活。用于解释目的,用于AH、ESP或AH封装中的ESP的安全关联称为单个SA卸载块。SA卸载块可以包括用于单向网络流量或双向通信所必需的SA状态。另外,SA卸载块可以包括多个SA。在下面的描述中,将提到各种命令。下面将讨论这些命令。
[0133] 通常,当卸载块内的特定SA被卸载、上载、无效或密钥更新时,主机栈维持全部控制。当SA无效时,主机栈和卸载目标共同维持所有的矩阵,包括支持SA期限的软限制和硬限制。通常,所采用的方法将减少对IPSec卸载目标的定时器要求。软期限时间限制由主机栈完成。硬期限由主机栈和卸载完成-主机栈维持定时器以删除SA,且卸载目标对每个发出或收到的包进行时间比较以保证没有超出硬时间限制。软件和硬件字节数限制和包限制(对封包序列号进行保护)都由卸载目标完成。
[0134] 图9示例了组成网络模型和本发明的组件的某些部分之间的相互关系。在正常运行期间,网络化信息由应用900通过网络栈902发送到外围设备904,在此,信息被发送至网络上的其它设备和应用。另外,可以使用外围设备接收来 自其它设备和应用的网络化信息,然后外围设备通过网络栈902传送这些网络化信息至应用900。网络栈902包括一个或多个中间网络层906。应用900发送出的数据穿过中间软件层906,中间软件层可能对这些数据执行特定的操作如打包这些数据、进行可靠的数据传输和计算消息摘要。中间软件层包括传输层908、路径层910(也称为“网络层”)和邻接层912(也称为“组帧层”)。注意,路径层910为没有被卸载的SA提供IPSec操作。
[0135] 转换914被用来从为中间软件层906执行网络栈操作中卸载处理单元120。IPSec转换922被用来为中间层906从执行IPSec操作和/或从管道916、918卸载处理单元120。尽管914是单独地示出,应该注意,转换914也可以被集成进网络栈902的中间层顶部。类似地,IPSec转换922可以被集成进网络栈902的中间层。卸载网络栈操作后,数据通过管道916或918被发送至外围设备904以便外围设备904执行网络栈操作。IPSec操作被通过IPSec转换922和管道920发送至外围设备904以执行IPSec操作。如果所有网络流量被通过IPSec转换920(例如管道916或者918)之上的管道卸载,则实际的数据传输不会经过IPSec转换922发生。在这种情况下,IPSec CACHED状态通过管道920维持且卸载目标为管道916(或918)的流量封装/解封装IPSec。在这种层次结构中,中间软件层和IPSec操作不必独占地驻留在主机或外围设备中,而且它允许任何中间层被完全卸载、留在主机中或者二者组合(例如,卸载一个或多个特定连接)。另外,管道可以层叠在管道上面或管道下面(例如,IPSEC管道可以在TCP管道上面或者下面,且TCP管道可以在RDMA管道下面或IPSec管道上面)。每个管道916、918、920提供能力以卸载顶层协议或所需的下层协议。例如,IPSec管道920支持IPSec功能卸载,也支持路径层(例如,IPv4或者IPv6功能)和组帧层(例如,MAC层封装)卸载。
[0136] 接下来转到图10,至IPSec管道的数据传送可以以一种或两种模式发生。第一种模式是当仅有的数据传送是至卸载的TCP连接。在第一种模式中,在正常的数据传送过程中,IPSec管道接口仅用来控制功能(例如,密钥更新)。数据传送直接发生在至或来自最高级管道(例如TCP管道916)如接口1000所示。第二种模式是当数据传送发生在卸载的和非卸载的状态的混合时。如果数据传送是通过卸载的连接和非卸载(或者其它协议如UDP)的连接发生,则卸载目标必须能接受数据以从两个源进行加密/解密:IPSec管道920(如接口1002所 示)和在TCP管道与IPSec功能之间的卸载目标内部的接口1000。特别地,对传出的流量,未加密/未认证的数据可以交给卸载目标以通过IPSec管道920或通过卸载目标内部的至它的TCP模块的接口1000被加密/认证。对于传入的流量,卸载目标必须为卸载的SA解密/认证包并且确定是否它们应该被交给IPSec管道接口1002或者TCP卸载引擎的内部接口1000。
[0137] 反向树数据结构类似于图6A中的反向树。IPSec管道920在路径状态对象之上创建卸载状态的新层以封装安全关联卸载块状态。如果TCP连接正被卸载,则状态对象被插入到反向树的TCP状态对象和路径状态对象之间。这由于下述问题。一个问题是多个TCP状态对象可以映射至相同的安全关联。例如,单个安全关联可以保护所有端口80在两个主计算机之间的流量。另一个问题是多个安全关联能匹配至同一个路径入口。例如,如果在两个主计算机之间存在两个不同的安全关联,例如,如果一个用来保护web流量而另一个用来保护SMTP流量,然后它们两个将映射至相同的路径入口。另一个问题是TCP状态对象可以不具有与之相关联的安全策略。它可以直接映射至一个路径入口。换句话说,应用到机器上的安全策略可以不需要针对特定子网或主机的安全。这样所有去往该子网/主机或者源自该子网/主机的流量将被免除IPSec安全要求。
[0138] 图11示例了具有IPSec状态对象的反向树数据结构。如图6A所示,存在两个具有不同TCP层状态入口的TCP连接604和606(即TCP Conn1和TCP Conn2),但是具有不同的IPSec状态入口1100、1102。IPSEC状态入口具有公共路径(或网络层)状态入口602和公共邻接状态入口600。不同的网络连接608(即TCP Conn3)除了公共邻接状态入口600以外,不具有IPSec入口而具有单独的路径状态入口610。整个顺序层次能够由在每个软件层之间的一组指向下个软件层路径连接的句柄定义。例如,路径句柄1104把TCP状态入口604指向IPSec状态入口1100而路径句柄1106把TCP状态入口606指向IPSec状态入口
1102。路径句柄612和614分别把IPSec状态入口1100和1102指向路径状态入口602,而状态入口602反过来把句柄616指向邻接状态入口600。类似地,TCP状态入口608具有指向路径状态入口610的句柄618,句柄618反过来通过句柄620指向公共邻接状态入口
600。根据本发明,图11可用下一块指针来表达,因此同时包括多个网络连接管道。 [0139] 图12示例了块链表句柄(各种下一个和从属块指针的集合,以表示路径从 属)如何与同时卸载的不同网络连接间的多个网络连接块相互联系。与图11一样,图12指示根据包含各种软件状态句柄的软件层块的反向树。所示的TCP块640和642分别具有IPSec块1200和1202,公共路径块644以及公共邻接块646。块链表句柄可以表示状态:邻接块
646包括指向路径块644的从属块指针666。路径块644包括指向IPSec块1200的从属块指针666。IPSec块1200可以通过下一块指针1204指向另一反向树数据结构。如果下一块指针662丢失(例如为NULL值),则将在块链表中以信号指示在反向树的该层没有其它反向树。
[0140] 对于路径块644的情况,IPSec块1200和1202分别具有从属块指针1206和1208,以及下一块指针1204和1210,因此IPSec块1202也可以指向不同的完全不同的反向树连接路径。另外,每个TCP块640、642具有下一块指针674、676,它们可以指向相同的反向树中的另一个TCP块或可以指示树中不存在更多块。但是,这些指针不是静态的。也就是说,如果路径路由改变了,这些链路将会改变,它可以改变下一个邻接至不同的路由。在这种情况下,例如,路径块644可能改变它所使用的邻接状态入口,从邻接入口1646改至其它邻接(如邻接入口2(未示出))。因此,使用块链表能够在单个程序调用中卸载或终止多个连接、路径和邻接入口。
[0141] 参考图12,在运行期间,TCP层最初创建一个卸载请求,该卸载请求包括两个TCP状态对象640、642(即块)、Conn1和Conn2,用BlockListHand1指向TCPConn1,并且TCPConn1的NextBlock指向TCPConn2。因为状态在之前未被卸载过,所以微端口句柄为NULL(即TCPHdnl1和TCPHndl2为NULL)。状态对象被标识为具有需要IPSec的策略,使卸载请求被交至IPSec层。IPSec层查找相关的FilterID和相关联的SA,如下面所述。它封包SA卸载块状态并在TCP状态对象640、642及IPSec状态对象1200、1202上安排DependentBlock和NextBlock指针。然后它把BlockListHnd1指向IPSec SABlock1从而将卸载请求交给路径层。路径层确定两个IPSec状态对象都依赖相同的路径入口1。它适当地分配状态,固定指针,并把BlockListHnd1交至指向PathEntry1的邻接层。相似的事件顺发生在邻接层,使整个状态结构与NeighborEntry1状态对象一起被交至已卸载的目标。 [0142] 假设卸载目标同意卸载该状态,则它将为每个状态对象创建不透明的卸载句柄并在状态对象(如TCPHndl1、SABlockHndl1等)中设置它的值。当每层 调用完成例程时,每个状态对象的微端口卸载句柄被存储进主机栈,以使任何将来的请求能包括该句柄。如果其它的卸载请求发生在相同的状态上,状态对象被分配并被插入树中,但是除了微端口卸载块句柄外没有状态被初始化。
[0143] IPSec状态对象的内容基于下面的设计原则。一个原则是基于算法的轮询过于昂贵(例如,使主机管理对字节和包、传出空闲间隔的软件或硬限制)。另一个原则是处理高速连接软件中的主要的存活(Keepalive)SA(如下所述),将引起不能接受的将由软件处理的高百分比的传入IPSec包。这样,在一个实施例中的卸载目标处理单个存活SA(例如两个传入SA的总和)。但是,尽管理论上能够具有多于一个的存活SA,可能性还是相当低,并且它实质上增加了所需的卸载目标状态,本发明还允许任何其它存活SA留在主机栈中。另一个原则是卸载目标中定时器的数量应该减少。特别地,用于SA生命周期的定时器和将删除存活SA的定时器不被卸载。
[0144] 另一个原则是IPv4选项和IPv6扩展头的卸载处理被看是不值得要的,因为很少使用、增加的复杂度、将被新的选项/扩展定义的概率以及潜在的安全攻击。这样,主机栈处理接收到的IP选项/扩展头并生成所需的IP选项/扩展头。一种例外是IP分段和碎片整理。由于UDP流量,分段和IP数据包碎片整理被认为是值得要的。
[0145] 如上所述,软件层具有状态对象,它可以包括一个或多个常量状态变量、高速缓存状态变量和委托状态变量。IPSec卸载对象具有数据结构,该数据结构也可以包含常量、高速缓存和委托状态变量。IPSec卸载对象可以具有当前出现的任何数量的SA。在一个实施例中,出现的SA的数量被限制为3,以限制卸载到外围设备的状态的数量。 [0146] IPSEC对象的CONST状态变量包括分类特定安全关联的数据包所需的信息,和特定于传入和传出安全关联的信息。CONST变量包括本地和远程端口、本地和远程IP地址、协议类型和安全关联标志。本地端口(或远程接口)设置为零的设置指示本地端口(或远程端口)为通配符端口,这意味着所有的端口都可以被使用。相似地,如果协议类型为零,则所有的协议都可以被使用。
[0147] 安全关联标志包括DynamicSA、InfiniteLife和用于传入SA的标志。DynamicSA标志提供是否SA密钥更新或手动的SA的指示。InfiniteLife标志指明是否SA具有无限的生命周期。如果InfiniteLife标志没有被设置,则它指示 SA密钥更新被执行,当软期限(如下所述)到达时,进行SA密钥更新。对于手动的SA,设置InfiniteLife标志指示SA将永远停留在存活状态。如果InfiniteLife标志没有被设置,SA将在硬期限到达时变为无效。传入SA标志包括InBoundAHReplay和InBoundESPReplay,它们指示是否为AH或ESP分别激活重放检查。
[0148] CACHED状态变量包括增加、删除或重写(例如替换)一个SA的变量,用于决定SA的生命周期和特定于传入和传出SA的信息。CACHED变量包括操作码、基于加密字节的软限制和硬限制、对至软期限和硬期限的数据包数量的软限制和硬限制、标志、如果AH和/或ESP被激活时的AH和/或ESP参数、传出空闲间隔和其它变量。注意,NIC遵守软件和硬限制。当到达软限制时,NIC警告网络栈为主机处理单元对SA进行密钥更新。当硬限制到达时,NIC放弃安全关联。
[0149] 操作码变量指示是否SA应当被增加、删除或替换。如果SA正被替换,则设置OLDSPI标志。如果被替换的SA具有激活的AH,则OLD SPI标志被设置为AH SPI。如果被替换的SA的AH没有被激活,则OLDSPI标志被设置为ESP SPI。SPI是每个IP地址的唯一标识符,用它来识别SA。它指示哪个SA正根据其变量被操作。
[0150] 软限制能基于多个因素达到,包括何时该被加密的千字节达到了特定限制。如果数量达到了,卸载目标将警告主机栈,在何时SA被典型地进行密钥更新。传入SA(即,传入连接的SA相对于传出连接的传出SA)没有一进行密钥更就新立即被无效,因为网络可以把包存储一段时间。为了把旧SA所有封装和/或认证的包从网络上排出,SA在一段时间被移动到保持存活状态(即,保持存活的SA)以允许包从网络上排出。典型地,软限制被设置成大约为硬限制的50%以允许在该段时间内利用新的SA(例如,进行过密钥更新的)替换该SA。在软限制中,密钥更新过程被启动。指示何时SA被抛弃的硬限制可以基于多个因素达到,包括何时加密的千字节达到一个特定限制。
[0151] 类似于对加密字节数量的限制,软件到期的数据包数的软限制是在网络栈被警告开始密钥更新过程之前被发出的数据包数。当发出的数据包数的硬限制达到时,该SA被丢弃。
[0152] 标志用来指示是否SA为传入SA或传出SA,是否AH被激活,是否ESP 被机密地激活,以及是否ESP的完整性被激活。传出空闲间隙被用来启动密钥更新。如果上一次在SA上发现传出包的时间与传出空闲间隙相同,则密钥更新被启动。如果AH标志被设置,有效的AH参数包括AHSPI、AHAlgorithm(AH完整性算法-{MD5、SHA1、SHA-256、SHA-384、SHA-512、proprietary1(所有权算法)})、AHKeyLength(AH完整密钥长度)和AHKey(AH完整密钥)。依赖于conf/integrity标志被如何设置,有效的ESP参数包括ESPSPI、ESPIntAlgorithm(ESP完整算法-{MD5、SHA1、SHA-256、SHA-384、SHA-512、proprietary1}、ESPIntKeyLength(ESP完整密钥长度)、ESPIntKey(ESP完整密钥)、ESPConfAlgorithm(ESP机密算法-{DES、3DES,AES-128,AES-192,AES-256,proprietary1})、ESPBlockLength、ESPContKeyLength(ESP机密密钥长度)和ESPConfKey(ESP机密密钥)。
[0153] DELEGATED变量包括运行信息和特定于传入和传出安全关联的信息。DELEGATED变量包括标志、多个经SA传送的字节、SA已经空闲的时间信号数、经SA传送的机密字节数、经SA传送的认证字节数量和传出或传入参数。
[0154] 所述标志包括指示SA当前是否有效的有效标志。传出和传入参数包括如果AH被激活时的AH参数和依赖于conf/integrity标志被如何设置时有效的ESP参数。传出AH参数包括LastPackeyNum(经SA发送的上一个AH包的序列号)。传出ESP参数包括CurrentIV(当前初始化向量)和LastPacketNum(经SA发送的上一个ESP包的序列号)。传入AH参数包括CurrentReplayMap(当前AH重放位图)和CurrentReplaySeq(当前AH重放上一个序列号)。传入ESP参数包括CurrentReplayMap(当前ESP重放位图)和CurrentReplaySeq(当前ESP重放上一个序列号)。
[0155] 整体的体系结构组成和变量都已被描述完,接下来将描述卸载IPSec状态对象的步骤。卸载目标例如外围设备904(例如NIC)使用组合了外围设备的容量的数据结构和由栈902设置的初始配置参数。外围设备指定的容量包括能被卸载至NIC的传出安全关联的数量、能被卸载至NIC的传入安全关联的数量和标志。能被卸载的传入SA的数量至少必须和能被卸载至NIC的传出SA的数量一样多。考虑到存活SA(例如,每个SA卸载块可以具有一个传出SA和两个传入SA),建议传入SA的数量为传出SA数量的两倍。在一个可选实施例中,卸载目标发布它能支持的SA卸载块的数量和标志。SA卸载块的参数值包括每 个SA卸载块具有一个传出SA和两个传入SA的能力。
[0156] 标志包括IPSec IPv4标志、IPSec IPv6标志、认证支持标志和加密支持标志。如果IPSec IPv4标志被设置,卸载目标必须为它支持的所有认证和加密算法提供IPv4支持。如果IPSec IPv6标志被设置,则卸载块必须为它支持的所有认证和加密提供IPv4支持。认证支持标志指示所支持的认证算法。可能支持的算法包括MD5_Ah、MD5_Esp、MD5_AhEsp、SHa1_Ah、SHA1_Esp、SHA1_AhEsp、SHA256_Ah、SHA256_Esp、SHA256_AhEsp、SHA384_Ah、SHA384_Esp、SHA384_AhEsp、SHA512_Ah、SHA512_Esp、SHA512_AhEsp和所有权算法。加密支持标志指示所支持的加密算法。可以支持的算法包括DES_Esp、3DES_Esp、AES128_Esp、AES192_Esp、AES256_Esp、UMAC_Esp和所有权算法。
[0157] 如果栈决定使用所报告的任何容量组合,栈将设置初始配置参数。初始配置参数包括ReplayWindowSize、EnableSecurityAudit、Idle timeout time和Ticks per Second。ReplayWindowSize参数表明接收到的包必须在窗口大小之内。如果包没有包括在窗口大小之内,它将被丢弃。如果EnableSecurityAudit被设置,当接收处理发生错误时,在适当的统计被更新后该包不被丢弃。相反,包被使用IPSecReceiveIndicate接口使用为接收出错的数据缓冲格式传送给IPSec层。Idle超时时间是SA可以空闲的最大时间数量。Ticks per Second用来与其它卸载目标同步时序。
[0158] 有两种方法启动SA卸载块的卸载。一种卸载可以由IPSec模块922来启动或者它可以由中间层转换914(例如,通过TCP管道,作为TCP卸载请求的结果)来启动。卸载目标必须接收所有或一个都不接收SA卸载块中的SA。在卸载启动请求中,可以有多个SA卸载块。卸载目标可以在一个卸载启动请求中分别接受或拒绝SA卸载块。 [0159] 现在参考图13,示例了卸载SA卸载块的步骤。在下面的描述中,IPSec模块922将是请求卸载的组件,而不管它是否包括TCP块。在图13中,实线是必需的调用,虚线是可选调用(根据特定状态)。所有调用被显示为异步的,但这不是必须的。返回最初的异步调用的返回箭头没有被示出以减少混乱以助于理解发明。注意,在一个实施例中,卸载初始请求(例如InitiateOffload)可以包括一个、两个和三个将被卸载的SA,且它可以是一个传出SA和两个传入SA 的任意组合。调用序列沿协议栈向下,目的是使每层能够标志潜在地正被卸载的资源,以发布任何资源需求,如果卸载成功,则为向上调用发布NIC可能需要的任何句柄,并集合在网络层1322和组帧层1324中的CONST、CACHED和DELEGATED状态。 [0160] 卸载可以在当TCP层1320请求卸载且卸载具有要求IPSec的策略时开始。当上述情况发生时,卸载请求被交给IPSec模块1328(线1350)。IPSec模块1328打包与SA卸载块(包括在一个实施例中的,包括一个至三个SA的状态)相关联的状态,并发送该状态到网络层1322(线1352)。任何在卸载状态被快照之后从相关联的SA发出或被SA收到的包将被缓存直至卸载请求完成。注意,一个或多个SA卸载块能在单个调用中被卸载。网络层为每个网络状态对象(如上所述)打包它的状态,添加它的状态至IPSec状态并为IPSec模块和网络层发送组合状态至组帧层(线1354)。组帧层为每个组帧状态对象打包它的状态并添加它的状态至组合状态,并发送组合状态至NDIS 1326(线1356)。NDIS把状态卸载块链表(参见图12)交给微端口1330(线1358)。微端口1330查看状态以确定是否它能接受该卸载请求。上面所述的评估规则适用于卸载块链表(即资源深度第一满足,出错代码放置于何处等)。这包括为每个成功卸载的卸载块链表数据结构分配卸载句柄。 [0161] 如果接受卸载则卸载目标(即,微端口1330)为该请求调用完成例程。注意,如果SA卸载块包括将要期满的SA,则不尝试卸载。完成例程指示卸载目标已经完全地俘获了状态,并且能在任何时刻开始接收IPSec数据(用或不用TCP管道),并向主机栈指示接收到的数据。注意,这意味着数据可以在卸载启动请求完成前被指示给IPSec层1328。完成调用为每个卸载块(线1360)返回卸载句柄。组帧层接收卸载请求完成(线1362)。如果目的MAC地址在卸载期间发生变化,则邻接层使卸载更新调使用卸载句柄来为邻接状态对象(线1364)更新高速缓存状态。
[0162] 网络层接收卸载请求完成(线1366)。如果路径MTU(最大传输单元)更新发生在最初的卸载请求和完成之间,则将使用路径状态对象(线1368)的卸载句柄为卸载目标生成卸载更新调用。IPSec层1328接收卸载请求完成(线1370)。注意,在网络层执行处理完成后,网络层必须决定如果IPSec卸载没有被请求,是否卸载块链表中的剩余数据结构应该被直接交给IPSec或者TCP。 IPSec高速缓存状态不能在卸载请求期间发生变化。但是,IPSec层可以具有缓冲的传出或传入数据报。这时,它将使用卸载转发接口(线1372)使用由卸载目标返回的卸载句柄把任何传入数据报转发至NIC。它还将把在卸载(线1374)期间发布的任何传出数据报交至卸载目标。
[0163] 如果TCP层1320请求了卸载,如果在最初的卸载请求(线1376)中存在一个或多个TCP卸载块,则TCP层1320接收卸载请求完成。如果任何高速缓存状态发生改变,则对TCP管道916进行普通的处理,这可能要求缓冲的接收到的分段被交至卸载目标或卸载更新以使之发生。
[0164] 注意,当卸载请求是由IPSec(例如TCP)之上的协议栈层启动的,则在IPSec块链表数据结构中的从属块指针是非NULL的(参见图12)。如果SA卸载块已经被下载,则IPSec层1328将只简单地利用SA卸载块的微端口句柄初始化卸载块数据结构。所有其它层(IPSec、路径和邻接)的处理都相同。这种情况下功能上关键的不同是卸载目标如何处理卸载请求。如果它选择接受上层的卸载请求,则它必须保证当完成例程被调用时,任何为状态对象定义的流量将被直接通过适合的管道(即,不是IPSec管道)交给该层。没有卸载的其它连接或其它上层协议(例如,UDP)的IPSec管道数据的传送保持不变(即使用SA卸载块继续运行数据传送和事件接口)。
[0165] 关于同步,IPSec层1328通过有限地缓冲到来的和流出的数据报保证SA状态在卸载启动期间不发生变化,直到卸载完成。如果需要过多的缓冲,则IPSec层1328可以选择在该时间帧丢包。如果特定IPSec状态、路径状态或邻接状态的附加卸载请求(例如,更新高速缓存状态、无效状态、卸载上层管道等)发生,并且它们没有被卸载,则这些新的卸载请求将被阻塞直至完成当前卸载请求。上述要求被要求,是因为在发生任何进一步的卸载状态处理之前,卸载目标必须为每个卸载块返回微端口卸载句柄。注意,其它连接、路径、SA卸载块或邻接结构的卸载请求可以并行发生。
[0166] 在卸载目标1330为卸载启动请求调用完成之后,它可以立即使用在卸载启动请求期间提供的句柄启动指示接收数据至IPSec层1328。这意味着IPSec层1328能在请求完成程序被调用(并为卸载目标返回微端口句柄)之前启动处理输入数据。处理可以包括缓冲直至卸载启动请求完成发生。
[0167] 用于选择哪个IPSec SA卸载块最适合卸载的IPSec卸载试探法很大程度上 基于哪个SA卸载块具有与卸载适合度相结合的最大的流量。能够使SA卸载块不被卸载的状况包括传入传出SA不对称和特定SA转发接口正被过量操作。可能引起卸载或在卸载目标中保持卸载的SA卸载块的状况很大程度上包括通过SA卸载块的媒体流量数量和是否SA卸载块具有从属的TCP卸载块。
[0168] 当TCP卸载请求发生时可能出现的一个问题是,需要一个将到期或者在密钥更新中的SA。在该事件中,尽管密钥更新正在发生,仍将允许卸载。一旦密钥更新完成,卸载更新接口将被用来更新卸载目标。注意,卸载目标实行软件和硬限制,且在该情况下,当卸载启动请求被调用时,就已经达到了软限制。如果卸载目标收到超过任何软限制的SA卸载请求,它不应该为软限制产生事件。它必须照常处理硬限制。如果TCP卸载请求发生依靠需要IPSec的策略,但没有IPSec SA已被协商,则IPSec模块可以挂起卸载请求(即,稍后异步地完成它)或简单地不允许具有合适原因代码的请求,以使TCP管道916知道稍后它可以再试。
[0169] IPSec驱动程序可以因为多种原因上载一个连接。这些原因包括:过多的数据正由IPSec层通过IPSecOffloadForward接口被转发至卸载目标、没有邻接入口、没有路径入口、卸载目标上(这个指示可以由IPSec层1328直接收到并被适当地处理-这样卸载目标就不生成上载所有指示)的媒体断开、如果主机栈试图添加或者替换已卸载的SA卸载块并且卸载目标调用失败、策略变化、管理控制和低带宽连接(没有多少数据正在被传送)。 [0170] SA卸载块的卸载可由两种方式被终止(即被上载回主机栈)。微端口可以启动上载或者主机栈可以启动上载。主机栈的上载启动可以由IPSec层之上的一个层或者IPSec层本身发起。
[0171] 注意,可以存在卸载的TCP连接(如果卸载目标支持TCP管道),卸载的TCP连接防止特定SA卸载块被上载,直至从属TCP状态对象的参考计数变为零。这保证了所有卸载的TCP状态对象将在IPSec卸载状态对象被上载之前被上载。这样,如果没有在之前执行TCP“上载全部”(即,在对IPSec管道执行之前,它必须先对TCP管道执行“全部上载”,以保证所有的状态被上载),支持IPSec管道和TCP管道的卸载目标就不能执行IPSec“上载全部”。
[0172] 在一个实施例中,唯一被支持的上载是“空闲上载”,其中主机栈可以花大量时间执行上载。这种优化使IPSec层无需保持对所有具有卸载的状态对象的上 层管道的跟踪。如果卸载目标能够强制上载,并且存在很多从属于卸载的SA卸载块的上层管道对象,则在SA卸载块能被上载之前,所有上层管道将不得不首先上载它们的状态,或卸载目标将必须容纳IPSec状态在数据传送(不只是被无效)中间被上载的上层管道。每个SA卸载块需要被跟踪的主机栈状态可以非常大,并且与SA卸载块的数量成比例。例如,如果每个SA卸载块存在100,000个TCP连接并且存在许多SA卸载块,这将导致主机栈存储和跟踪大量的状态,以辨别哪个TCP连接需要被上载。本发明的实施例改为标志IPSec状态对象为“上载已请求”。然后,周期的定时器启动以再评估在上层管道中卸载的状态。定时器“走”卸载的状态连接以查看是否某些从属IPSec状态对象已经请求一个上载。如果已经请求一个上载,则上层管道将上载它的状态。当IPSec状态对象的参考计数走到零,IPSec状态对象也被上载。这样,尽管上载目标在等待实际的上载,它必须继续经由SA卸载块传送数据。所有SA都可以被要求上载,基于几个原因,包括卡复位、电源状态改变(即电源状态改至不允许卸载目标维持卸载的状态的电平)、至不同卸载目标的“队”NIC上的故障恢复事件或者卸载资源的管理重分配它要求所有卸载的SA被上载。
[0173] 现在转向图14a-b,示例了终止卸载的调用顺序。卸载目标可以随意地请求终止一个卸载(图14a),或IPSec层之上的层(如TCP)可以请求终止它们的状态。如果SA卸载块参考计数(如下所述)为零,则SA卸载块可以被终止。无论请求来自何处,实际上都是由IPSec层执行终止卸载的命令。
[0174] 图14a示例了卸载目标请求终止一个卸载所执行的步骤。因为上面段落中所列的任何一个或多个原因,微端口1330决定上载一个SA卸载块(包括一个至三个SA,包含的)。微端口通过指定SA卸载块句柄和原因代码(线1400)指示一个终止卸载的请求。卸载目标必须继续处理发送和接收数据报的请求,尽管正在处理终止卸载的请求。NDIS为该SA卸载块使用具有IPSec上下文的IPSec预注册的上载-指示句柄,并发送上载指示至IPSec层1328(线1402)。IPSec层获得上载指示并完成请求(线1404)。根据上载请求的原因和是否存在SA卸载块的从属TCP的卸载的状态对象,它可以启动一个终止卸载的请求或者决定不启动该请求。
[0175] 转向图14b,IPSec层1328利用它具有的用于SA卸载块(1410)的PATH句柄为网络层调用终止卸载。IPSec层保证没有对该SA卸载块的附加调用将被 调用(例如更新、发送或者额外的终止请求)。如果对该PATH的参考计数为1(即,终止卸载的请求将把该值降为零),则网络层1322将添加它的OffloadBlock(仅包括卸载句柄)至块链表。无论网络层1322有没有添加句柄,它然后将向下调用具有适当的邻接句柄(线1412)的组帧层1324。如果网络层已经请求了一个卸载,则组帧层1324将跟随如网络层1322同样的步骤。
无论组帧层是否请求一个卸载,它将调用NDIS(线1414)。NDIS调用具有块链表(线1416)的微端口。卸载目标1330打包SA状态以把它返回给主机协议栈。它必须保证状态是自我一致的。微端口1330必须向上释放卸载块链表(TCP、路径和邻接入口)中任何与有效的句柄相关联的状态/资源。
[0176] 微端口完成终止卸载的请求(线1420)。在完成之前,它必须完成所有利用UPLOAD_IN_PROGRESS调用(例如卸载发送,卸载更新等)对SA卸载块列出的请求,并必须等待所有OffloadReceiveIndicate调用被完成。在它调用终止请求的完成接口之后立即重新使用相关联的状态是免费的。一旦状态被交回到主机协议栈层(例如网络栈902),则所有收到的被上载的SA卸载块中的SA数据报必须通过常规NDIS接口发送。该请求完成上溯栈并且每层中卸载的状态被恢复(线1422、1424、1426)。
[0177] 如果存在为SA卸载的TCP状态对象,则IPSec管道922并不支持立即终止一个卸载。相反,采用了懒散方法。IPSec状态对象被无效,而同时IPSec层1328等待所有从属TCP状态对象被终止。周期性地,TCP栈1320将重新验证在原处的滤波器是否仍然是适当的。如果不是,TCP将终止TCP状态对象的卸载。当所有TCP状态对象都已被终止,则IPSec层1328将终止SA卸载块的卸载。
[0178] 如之前提到的,IPSec层1328保持SA卸载块的参考计数。原因是如果卸载目标支持TCP管道和其它类型的管道,则可能发生所述层为它的状态对象请求终止卸载。IPSec保持每个SA卸载块基础上的参考计数(即SA卸载块参考计数)。对于从属状态对象的每个新的卸载请求,IPSec将增加参考计数。对于每个从属状态的终止,IPSec将减少参考计数。注意,具有单个参考计数并不编址是否是IPSec层本身启动了卸载。当所有从属块已被上载时,它不一定意味着IPSec层希望上载。因为IPSec不能说出由上层增加的参考计数或是否是它自己增加的参考计数的区别,所以当IPSec自身请求卸载工作时,也不是简单地增加 参考计数。为处理该种情况,可以用单独的内部标志,这允许IPSec标记SA卸载块为自己启动的卸载,使得可以保留控制。
[0179] 注意,网络栈(如网络栈902)可以在卸载终止的中间接收用于SA卸载块的IPSec数据报。这发生在:当卸载目标响应一个终止事件已打包它的委托状态,并且一个被终止的SA的IPSec数据报到达时。由于卸载目标不能在委托状态已被打包后处理到来的数据报,所以卸载目标通过常规NDIS路径向上转发该数据报至主机栈。如果IPSec层仍然没有接收到完成消息,IPSec层将缓冲接收到的数据报直至接收到卸载终止的完成消息,然后正常处理数据报。注意,数据传送接口使部分被处理的数据报从卸载目标发送至主机以进行选项/扩展头处理。如果上载发生在该选项/扩展头处理中间,主机栈将简单地接管该处理。 [0180] 如之前提到的,IPSec管道922支持两种模式的数据传送。一种模式中,IPSec层922是管道的上边界,且所有的数据传送是以数据报单元的形式。另一种模式中,IPSec管道嵌入在另一个管道(如TCP管道916)内部。注意,两种模式能被同时激活(见附图10)。
在IPSec管道和卸载目标之间发生数据传送可能由于几种原因。这些原因包括:使用传统软件栈发送和接收非卸载的SA,如果IPSec层的SA已经被卸载,则IPSec层直接发送IP数据报至卸载目标,IPSec层接收为已被卸载的SA定义的数据报并转发IPSec数据报至卸载目标以进行处理,以及卸载目标接收使用卸载的SA的数据报,并且不存在用于数据报的更高级卸载管道且卸载目标发送解密/认证有效载荷至IPSec层。
[0181] 在操作期间,上层协议(例如UDP或TCP)交给IPSec一个格式化的数据报以进行传输。一个异步接口被用来为SA卸载块把缓冲列表与微端口卸载句柄一起交至卸载目标。当缓冲列表被重新使用时(即当传输完成时),卸载目标完成异步请求。如之前指示的,缓冲被用来传送消息和数据,包括数据报。直接利用IPv4选项处理和IPv6扩展头处理警告向卸载目标直接公布发送缓冲。因为任何应用流量都可能要求发送IPV6扩展头或IPv4选项,所以发送IPv6扩展头或IPV4选项需要被保存。为了传输IPSec IPv6数据报,主机协议栈创建IPv6扩展头并将它们作为OffloadSend的一部分传送给卸载目标,因为它们将被当作输出数据报的一部分进行传输。为了最大的灵活性,OffloadSend包括两个指针-一个指向IPv6扩展头的指针将被插入在IPSec扩展头(注意,可能存在两个:一个AH,一个ESP)之前,而另一个指向IPv6扩展头指针将被插入到IPSec 扩展头之后。为了传输IPSec IPv4数据报,主机协议栈创建IPv4选项头并把它们作为OffloadSend的一部分传送到卸载目标,因为它们将被当作输出数据报的一部分进行传输。在OffloadSend中使用单个指针指向将被插入到输出数据报的IPv4选项头。如果卸载目标支持IP分段,则IP选项/扩展头就必须在每个包中进行复制。注意,因为所有传输头已被放进数据报中,所以并不是严格需要按顺序传输。但是,为保证上层协议得到最高的性能,还是高度推荐按顺序传输。 [0182] 如果在卸载目标接收到的数据报中出现IPv6扩展头,且第一个头不是IPSec,则卸载目标必须沿常规数据路径向上转发该数据报至主机栈。主机栈902将处理扩展头直至发现IPSec头,然后转发数据报至IPSec模块922,IPSec模块922将使用IPSecOffloadForward接口把数据报和所有IP扩展头一起按顺序向下发送至卸载目标
904。卸载目标然后为IPSec执行IPSec扩展头处理。注意,如果AH被激活,则所有IPSec扩展头必须出现以激活数据报验证(即在可变和不可变字段进行哈希运算)。如果当卸载目标完成时没有余下的IPv6扩展头,则卸载目标用包括全部或部分IP头的包格式调用IPSecOffloadReceiveIndicate。如果还有更多IPv6扩展头出现(在IPSec扩展头之后),则卸载目标用包括未处理的扩展头和应用有效载荷(解密/认证)的包格式调用IPSecOffloadReceiveIndicate。
[0183] 如果第一扩展头是IPv6,则卸载目标处理IPv6头直至找到非IPSec扩展头或者找到ULP头。如果找到了非IPSec扩展头,则卸载目标利用包括IP头、解密/认证ULP有效载荷和至下个IPv6扩展头的偏移量的全体的包格式调用IPSecOffloadReceiveIndicate。 [0184] 如果在收到时出现IPv4选项,卸载目标必须经常规NIC接口向上转发收到的数据报至主机栈902。主机栈将处理该选项,发送数据报至IPSec模块922以进行处理,并且IPSec模块922将通过IPSecOffloadForward接口转发数据报和所有出现的选项至卸载目标904。卸载目标不对转发的包进行IPv4选项处理;它只是在AH被激活(即,它必须能解析IPv4选项-可变与不可变-用于AH哈希或为ESP查找IPSec头)时使用IP选项。在处理IPSec选项后,IP头和ULP解密/认证有效载荷与一个对未被处理的任何IP选项(即在IPSec头之后出现的任何IP选项)的偏移一起被传送回主机栈。
[0185] 如果上层协议不是TCP,则IPSec管道可以使卸载目标生成IP分段。例如, TCP将重新分段它的传出缓冲以在路径MTU发生变化时与之相匹配,但是UDP则不需要。这样,如果通过发送路径的数据报大小超过路径MTU,则卸载目标必须能生成IPv4分段。为了接收IPSec数据报,如果下一个头是IPSec头(IPv4)或者包括IPSec扩展头(IPv6)的扩展头,则IP分段(或者IPv4或IPv6)应当由卸载目标处理。但是,因为卸载目标具有限量的缓冲,如果数据报到达并且没有可用的IP碎片整理的缓冲空间,则卸载目标必须不能丢弃该包。相反,它必须(尝试)向上发送至常规NIC数据路径上。另外,在数据报被沿常规路径向上发送后,卸载目标必须把所有已经在它的碎片整理缓存或者后来到达的具有同样分段ID的分段,在网络包生命周期内(典型地,120秒),当成被发送的数据报,向上沿常规路径转发。如果卸载目标在跟踪被转发到主机栈的IP分段ID时用完所有空间,它必须向主机栈转发所有分段。注意,因为关联跟踪被发送至主机栈的IP分段的状态很重要,所以支持碎片整理是可选的。
[0186] 卸载目标不应该对可以发送的发送请求的数量设置任何限制。如果卸载目标不具有处理正被发送给它的发送请求所需的存储器,则卸载目标需要用软件管理缓存。如果缓存被发送且没有有效的传出SA(例如,传出SA在开始时没有出现或者它通过一个卸载更新调用被删除了),卸载目标将返回出错并不再传输缓存。如果缓存被发送了并且传出SA已被无效,则应当丢弃该缓存且本次调用应当以出错结束。
[0187] 注意,IPSec模块922可以具有多个使用单个SA卸载块的上层。结果是,没有机制来预先公布缓存至卸载目标,因为它将要求上层协议状态被嵌入在接收缓存中。因此,IPSec管道922仅使用一个指示接口,其中卸载目标具有缓冲池,该缓冲池用来存储有效载荷直至收到并处理一个完整的数据报。一旦收到并处理(即解密/认证)一个完整的数据报,卸载目标直接指示数据报至IPSec层922。卸载目标指示至主机栈的信息如表1所示。 [0188]
[0189] 表1
[0190] 如果接收到一个IPSec数据报,该IPSec数据报的目的IP地址具有与传入卸载的SA(例如,SA或者没有出现,或者通过卸载更新接口已被删除)不匹配的SPI,则卸载目标必须向上转发收到的数据报至网络栈。
[0191] 如果收到的数据报的IPSec处理以出错失败,则必须增加适当的统计,以及如果接口上的EnableSecurityAudit标志被设置且发现SPI匹配卸载的SA,则包内容被转发至主机。使用IPSecReceiveIndicate调用把包内容转发至主机。注意,如果卸载的SA的SPI没有找到,甚至IPSec卸载目标发现错误,则卸载目标必须不处理它并且相反沿常规接收路径向上发送到来的数据报。如果收到的数据报包括MAC层广播或多播地址,并且SPI/网络层地址与卸载的SA卸载块相匹配,则卸载目标必须放弃该包并增加统计,除非接口EnableSecurityAudit标志被设置。如果EnableSecurityAudit被设置,则不处理数据报而把数据报通过IPSec管道接口转发至网络栈。
[0192] 注意,由于几个原因,IPSec层转发包括IPSec数据报的包至卸载目标。这些原因包括:数据报在与SA卸载块被发送至的接口不同的接口到达,数据报包括IPv4或IPv6选项/扩展头,并且因此由卸载目标通过常规NIC接口把数据报向上发送至主机栈以进行路径层处理,在卸载启动过程期间的竞争条件,以及卸载终止处理中的竞争条件。转发IPSec数据报的过程中使用了转发接口。至卸载目标的转发接口是异步的,并把目标信息交给下一个未处理的IP选项/扩展头(或有效载荷,如果所有选项/扩展头被处理完),目标信息包括SA卸载块微端口句柄、标志(认证的、解密的)、NetBufferList,而NetBufferList包括整个接收到的包括MAC头、缓存偏移的包。如果IPSec层检测出通过转发接口的流量过多,它可以上载该SA卸载块。
[0193] 如上面指示的,第二种数据传送的模式是其中IPSec管道被嵌入在另一个管道916、918内部。例如,如果TCP管道层叠在IPSec管道上面,数据传送可以通过IPSec管道和TCP管道发生,或仅通过TCP管道,这取决于系统工作负荷。如果所有数据传输正通过更高层管道发生,则不使用OffloadSend和OffloadReceiveIndicate IPSec管道接口(下面详细描述)。所有其它接口都被使用了,包括转发接口、事件指示接口、终止卸载和无效卸载接口。这些接口的所有功能保持相同,不管上层级别管道是什么。如上述提到的,如果一个上载被请求,则处理是“空闲”的。TCP栈将周期性地精选不再有效的卸载(即执行终止卸载)的状态对象。当SA卸载块的参考计数达到零时,SA卸载块将被上载。注意,尽管IPSec管道正在等待参考数到达零以便可以终止卸载的执行,这可为一个特定的SA卸载块完成一个OffloadInvalidate。
[0194] 当数据传送是通过TCP管道时,传输处理是直接了当的。在发送侧,TCP管道传送一个由卸载目标分割成TCP分段的应用缓冲。卸载目标有足够的状态(在InitiateOffload调用期间从OffloadBlockList向下递交)来在一个SA卸载块中发现适当的传出SA。卸载目标执行如SA指示的IPSec处理并且发送数据报。在接收侧,如果使用了TCP管道,则IPSec管道需要在TCP处理到来的IPSec有效载荷之前解密包(如果SA能够加密)。另外,IPSec管道需要在TCP处理之前认证数据包(如果能够)以保证TCP出错误处理以与主机栈同样的方式执行(例如,如果认证/解密出现错误,则不增加TCP统计)。在TCP处理发生之前,卸载目标必须验证,是利用当InitiateOffload发生时,被TCP状态对象引用的SA卸载块处理到来的IPSec数据报。注意,SPI值将在卸载的生命周期内发生变化,并且,可能存在两个SPI与传入流量的特定的SA卸载块相关联(一个主动和一个存活)。 [0195] 如果存活SA超过一个,则主机栈负责处理所有到来的数据报。IPSec管道卸载目标被要求通过常规NIC接口发送所有未被识别的数据报(也就是包含一未被卸载的SPI)至主机栈以进行处理。主机栈处理IPSec数据报,然后将数据报转发给TCP。然后,TCP通过TCP管道转发接口把它转发给卸载目标以进行正常的处理,利用一个标志表示TCP分段已通过安全处理。要求该标志是因为,否则的话,卸载目标不能分辩出一个明文错误(如上所叙)和一个已通过安全检查的接收分段。
[0196] 以上描述的TCP管道体系结构使应用预先公布接收缓冲以将其直接发送给卸载目标。卸载目标可潜在地对直接进入这些缓冲(在TCP处理之后)的认证/解密数据进行直接存取访问。这样,TCP能够为一个应用提供零拷贝数据接收。在一个实施例中,在IPSec管道上下文中,在卸载目标修改预先公布的缓冲内容之前,它对(如果能)有效载荷进行认证。
[0197] 尽管SA卸载块被卸载,IPSec管道为SA卸载块提供重要的多功能性处理更新。多功能性领域之一是密钥更新。密钥更新的原因包含达到了的SA的生命周期(即,已经达到了SA最大的有效时间)和指示一个SA应当被密钥更新(例如,达到一个软限制)的卸载目标。SA卸载块不会为密钥更新而进行上载。相反,所有密钥更新操作在原处完成。 [0198] 现在转到图15,在密钥更新过程中,IKE(因特网密钥交换)首先在发起方检 测到一个新的传入安全关联,然后发送一个消息给响应方。响应方检测到一个新的传入和一个新的传出安全关联。来自响应方的应答允许发起方检测到一个传出安全关联。IPSec驱动程序不能立刻摆脱旧的传入安全关联以获得一个新的传入安全关联。在发起方的情况,IKE消息不得不到达对等端,对等端必须处理它以检测到一个新传入和传出安全关联。在发起方能够删除旧的传入SA之前,所有运行中的数据需要被处理(也就是说,所有由IPSec输出的包以及仍然或在响应方NIC输出队列中的包或者在网络中“运行”的包)。旧的SA被称为存活SA。
[0199] 类似地,在响应方删除它的旧的传入SA之前,响应方必须等待发起方检测到一个新的传出SA并处理旧的传入SA中的所有已排队和在运行中的包。为了提供此功能,在密钥更新过程中,在某段时间里有两个传入的安全关联同时存活是必要的,因为主机不知道传入的IPSec包经过哪个SA可以进入。考虑到这一点,用一个定时器保存在检测到新的传出SA后的某段时间(例如20秒、50秒、120秒等)内存活的存活传入SA。注意,如果软限制设置为比该存活SA的固定时间更快过期,则一个以上的存活SA是有效的就有可能。本发明支持多于一个的存活SA(虽然如以前描述的,仅一个将被卸载,),尽管一些实施方式可能不支持多于一个的存活SA。
[0200] 一个SA的最大生命周期由IPSec层决定(也就是说,它将管理相关联的定时器,而不是卸载目标)。如果达到软限制,则发生SA密钥更新。如果达到硬限制,将调用更新卸载接口来删除适当的SA。如果SA变成存活SA,则IPSec层将维持定时器并在适当时间删除该SA。这导致卸载目标仅仅需要一个定时器功能。所需的定时器功能是传入SA的空闲时间。对于其它时序操作例如传出SA的空闲时间,卸载目标仅仅需要比较时间戳。上述方法通过减少硬件中处理定时器功能的数量而降低了卸载IPSec功能的硬件成本。在硬件中处理定时器功能通常是一个昂贵的操作。
[0201] 卸载目标执行的其它比较是传出SA的空闲时间、传出SA的生命周期硬限制(为每个包进行比较)、传入SA的生命周期硬限制(为每个包进行比较)、软件和硬字节计数的限制(为每个包进行比较)以及软件和硬件包计数的限制(为每个包进行比较)。 [0202] 现在已描述了卸载IPSec功能所采用的全部步骤和一些实现细节,接下来 将描述接口。IPSec管道体系结构设计通过使用特定于某一层(例如,邻接层、路径层、TCP层和IPSec层)的状态对象句柄来平衡TCP管道的现存的调用接口。公共调用以及与它们相对应的完成调用是InitiateOffload、InitiateOffloadComplete、TerminateOffload、TerminateOffloadComplete、UpdateOffload、UpdateOffloadComplete、QueryOffload 和QueryOffloadComplete。InitiateOffload被用来启动一个卸载。TerminateOffload被用来终止一个卸载块。UpdateOffload如上所述,被用来为IPSec卸载块更新变量和/或增加、删除或者替换一个或更多个安全关联。QueryOffload被用来为委托变量查询卸载的块。 [0203] 与TCP管道不公共的接口包括IPSecOffloadTargetEvent接口和数据传送接口。 [0204] InitiateOffload接口提供一种新型的卸载块结构称为SA卸载块。在最初的卸载过程中,微端口创建一个SA卸载块句柄,主机栈使用该SA卸载块句柄引用卸载的状态。SA卸载块可以包含一个或更多个SA,即传出SA、传入SA和存活SA的任意组合。InitiateOffload接口,最小化支持以下的状态卸载:一个传入SA,一个传出SA;两个传入SA(其中一个是存活SA)和一个传出SA;一个传入SA;以及一个传出SA。 [0205] OffloadUpdate接口允许管理SA卸载块中的特定的SA。卸载目标句柄、传入/传出SA标志和SPI的组合被用来从SA块内部(如前面提到的,尽管技术上SPI只是针对特定的IP地址是唯一的,但确实存在一个传出SA,并且如果存在两个传入SA,它们都将具有相同的IP地址,因此不需要IP地址)选择一个特定的SA。InitiateOffload接口提供能力以进行卸载,无论SA当前是否有效(一个实施例中限制了支持单个存活的SA),然后当另外的SA被检测到(例如,一个SA被移至存活状态以及一个新的SA被检测到)、重写(在某些情况下的传出SA或传入激活的SA)或者使用OffloadUpdate接口删除时,就更新卸载的状态。为提供支持,接口为Add(new_zPI)、Replace(old_SPI,new_SPI)和Delete(old_SPI)创建语义,语义可以被结合在一个单个调用中以支持下述功能:增加一个传出SA;增加一个传入SA;替换一个传出SA;替换一个传入SA;增加一个传入SA和替换一个传出SA;
替换一个传入SA和替换一个传出SA;删除一个传入SA;删除一个传入SA和一个传出SA;
删除两个传入SA和一个传出SA;以及删除一个传出SA。如果另外的SA被增且新SA的硬件不够用,则微 端口更新失败。如果发生失败,主机栈将上载SA卸载块。 [0206] 一个SA可以由于以下理由被删除:存活的SA过期(传入SA);达到了最大SA生命周期;以及由于管理原因。一个UpdateOffload删除操作适用于包含在删除操作中的SA卸载块内部的特定SA。一旦UpdateOffload调用完成,卸载目标必须删除所有与该特定SA相关联的状态。例如,删除操作可以把卸载的SA的数量由3改为2,并且随后执行UpdateOffload增加操作。对删除的SA的所有接收或发送处理是相同的,就象SA从来没有被卸载过。如果卸载的TCP管道连接依赖于IPSec管道SA卸载块且所要求的传出SA已经被删除,则TCP管道连接必须不再传输任何数据,并以与路径状态被无效时相似的方式处理出错(例如,指示主机栈没有传出流量的有效状态存在,也没有正常的TCP重新传输超时处理)。
[0207] 当一个新的传出SA被检测出具有OffloadUpdate替换操作,卸载目标重写整个旧的传出SA状态(高速缓存和委托状态-常量状态也相同)。卸载目标需要完成对传出包的处理,该包当前处于使用旧SA的中间,以使特定数据报或者用旧SA状态完全编码或者用新SA状态完全编码。注意,OffloadSend请求可以包括多个IPSec数据报,潜在的表示大量数据。出于该原因,卸载目标应该能在OffloadSend请求中间停止处理,完成它已经启动的任何IPSec数据报编码,并且把其余的OffloadSend(及任何其它已经被排队的)转换成新的传出SA。一旦完成至新的SA的转换,就可以完成OffloadUpdate调用。注意,OffloadUpdate替换能够改变AH和ESP SPI以及潜在地与它们相关联的算法、密钥、生命周期等。
[0208] 由于通用接口和主机维持存活的定时器,卸载目标并不明白是否传入SA处于存活状态、幼虫主动状态或者主动状态。结果是,由上述接口支持特定行为。这些行为包括:IPSec双向数据传送的初始密钥:
[0209] ●幼虫主动传入SA(由发起方)的InitiateOffload。
[0210] ●传出和传入SA(由响应方)的InitiateOffload。
[0211] ●UpdateOffload以增加传出SA(由发起方在幼虫主动传入SA被用InitiateOffload卸载后)。
[0212] 第一次IPSec SA密钥更新:
[0213] ●UpdateOffload以增加新的传入SA(发起方-旧的传入SA成为存活 SA,但是卸载目标不知道)。
[0214] ●UpdateOffload以增加新的传入SA和替换旧的传出SA(由响应方)。 [0215] ●UpdateOffload以替换传出SA(发起方)。
[0216] 第2次(或更多)IPSec SA密钥更新:
[0217] ●UpdateOffload以替换传入SA(发起方)。
[0218] ●UpdateOffload以替换传入SA和替换旧的传出SA(由响应方)。 [0219] ●UpdateOffload以替换传出SA(发起方)。
[0220] 最后,在存活定时器启动后或者如果SA生命周期期满没有进行密钥更新: [0221] ●UpdateOffload以删除传入SA(发起方和响应方)。
[0222] ●UpdateOffload以删除传入SA和传出SA(没有存活出现)。
[0223] ●UpdateOffload以删除呼人SA和传出SA。
[0224] 由于增加、替换和删除组合的复杂度,管道采用的方法能够更新包括一个、两个或三个SA,其中每个SA在集合{增加、删除、替换}中具有一个运算符。为了简化至卸载目标的接口,如果新的IPSec滤波器被检测,该滤波器将需要一个卸载的TCP连接以使用IPSec进行启动,卸载的连接将被上载,然后被重新卸载。使用SA卸载块句柄、传入/传出SA和SPI的组合来在SA卸载块被完成时查找SA,以使主机栈不用负责管理SA块内部的单个SA的位置。如果IPSec SA卸载块需要多于一个的存活SA,那么其余的存活SA可以由主机软件栈处理。
[0225] 从卸载目标至主机的指示调用接口被用来指示通用事件(例如,对管道来说是公共的)和IPSec的特定事件。EventIndicate调用被用于通用事件。IPSecEventIndicate调用被用于IPSec的特定事件。SA期限或卸载目标启动密钥更新将使卸载目标调用IPSecEventIndicate,以或请求密钥更新或通知IPSec层一个特定SA已经过期。IPSecEventIndicate包括下述参数:SA卸载块句柄、SPI、指定是否SPI是传入或传出SA的标志、ActionRequested和ActionReason。ActionRequested和与之相关联的ActionReason是ReKeyRequest和SAInvalidated。
[0226] 与 ReKeyRequest 相 关 联 的 事 件 通 知 是 KbytesSoftReached 和OutboundPacketSoftReached。KbytesSoftReached事件通知主机被传送的千字节 数量已经达到软限制的阈值,并且SA密钥更新处理应当被启动。OutboundPacketSoftReached事件通知主机被送至约定日期的数据包数已经达到软限制,并且主机栈应当开始密钥更新操作。
[0227] SAInvalidated事件提供指示至主机栈,指示因为已经达到了限制,所 以 SA 被 无 效( 即,过 期 )。SAInvalidated 事 件 包 括 KbytesHardReached、OutboundPacketHardReached、IdleTimeReached和包计数限制击中。KbytesHardReached指示被传送的千字节数量已经达到硬限制并且SA必须被无效。OutboundPackedHardReached指示被发送的数据包数已经达到硬限制。IdleTimeReached指示在指定数量的时间内SA没有传送数据。对于传出SA,检查由IPSec数据报的尝试传输来驱动。最后一次传输的时间被保存,并与当前时间比较。如果大于阈值,卸载目标通知主机,丢弃该包,并标记SA为无效。这个检查要求确保如果远程端点崩溃则不会发生死锁。典型的空闲时间是2分钟。对于传入SA,检查由定时器驱动以确保资源以及时方式被整理。一接收到特定SA的IPSec包,定时器就被复位。典型空闲时间是5分钟。包计数限制击中指示达到了包计数限制。 [0228] 数 据 传 送 接 口 包 括 OffloadSend、OffloadSendComplete 和OffloadReceiveIndicate。OffloadSend和OffloadSendComplete假设主机栈能创建IPv4选项或IPv6扩展头以插入到数据报中被传输。这包括在AH和ESP头之前或之后插入选项。
因此,OffloadSend接口包括两个附加指针指向IPv6扩展头,以被包括在AH/ESP头之前或之后,如之前所描述的(一个可选实施例允许第三指针,以在AH和ESP头之间包括选项)。
对于IPv4,就像前面描述的那样,接口激活单个IPv4选项链表。一个可选实施例允许第二或第三指针以激活将在AH和ESP头之前、之间或之后的选项。OffloadReceiveIndicate(用于IPSec接收)指示数据已经被接收。OffloadReceiveIndicate包括SPI和整个IP头和有效载荷(可选实施例可以包括MAC头,或者如果没有选项出现,则只包括IPSec有效载荷),具有至IP选项/扩展头的索引至下一个未处理的头,以及一组指示任何对于日期进行处理的结果的标志。注意,AH和/或ESP头不必包括有效数据。
[0229] QueryOffload接口允许主机栈查询一个SA的卸载的状态。参数为SA卸载块句柄和OffloadBlockList。QueryOffload接口典型地用于查询SA的委托状态。 这对于多种原因是必要的。在调试期间,它也可以查询常量和高速缓存变量以确保卸载目标和主机处于同步。
[0230] OffloadInvalidate接口信号指示卸载的SA已被无效。SA卸载块内部的特定SA可以过期(变无效),因为卸载目标引起无效或因为主机调用了OffloadInvalidate。注意,无效的SA不同于删除的SA。用操作码Delete通过OffloadUpdate接口能删除一个SA。在该种情况下,卸载目标中没有留下SA的状态。但是,如果SA被无效,卸载目标中保留该状态直至发生SA卸载块TerminateOffload。终止卸载将请求所有委托状态被传送回主机。OffloadInvalidate可以由于管理原因发生(例如,策略的改变)或由于请求了终止卸载,但是从属TCP状态对象参考计数是非零的,因此卸载仍不能被终止。当等到参考计数为零时,SA被无效。OffloadInvalidate的参数是微端口SA卸载块句柄和OffloadBlockList。
如果被无效的SA是传出SA,则对OffloadSend的调用必须以出错完成且不发送数据。如果被无效的SA是传入SA,则收到的数据报被丢弃(除非接口统计被激活)且适当的出错计数器被增加。
[0231] 接下来转向统计,卸载目标维持统计以使主机统计报告不受影响,无论SA卸载块是否被卸载。主机协议栈维持每一个主机统计和每一个SA统计。无论何时主机范围的统计被查询,IPSec管道将为它的接口统计查询每个IPSec管道有能力的接口。IPSec卸载目标维持TCP管道为路径层定义的统计和为数据链路层(即,组帧层)定义的正常的NDIS统计。另外,它必须维持以下的IPSec统计,该统计只当IPSec数据报被卸载目标(即,没有沿常规数据路径向上发送)消耗时被增加。
[0232] 每个 接 口统 计 包括 32位计 数 器和 64位计 数 器。32位 计数 器 为NumBadSPIPackets、NumPacketsNotDecrypted、NumPacketsNotAuthenticated和 NumPacketsWithReplayDetection。64 位 计 数 器 为 ConfidentialBytesSent、ConfidentialBytesReceived、AuthenticatedBytesSent、AuthenticatedBytesReceived、OffloadedBytesSent和OffloadBytesReceived。注意,这些计数器不必要求硬件实现64位计数器。例如,硬件可以利用主机微端口的进位事件实现32位计数器,以保持跟踪较高的32位。每个接口统计纯粹由主机栈维持,不与卸载目标交互的为:NumActiveAssociations、NumOffloadedSAs、NumPendingKeyOps、NumKeyAdditions、NumKeyDeletions、NumReKeys、NumActiveTunnels、 TransportBytesSent、TransportBytesReceived、BytesSentInTunnels和BytesReceivedInTunnels。
[0233] 每个SA统计要求卸载目标跟踪某些统计以支持软件和硬限制。相同的每一接口计数器被用来在每一SA基础上实现统计查询。OffloadQuery接口将被用来获取特定SA的委托状态以填充下面的64位计数器值,如果是一个卸载的SA的统计查 询:ConfidentialBytesSent( 对 传 出 SA 用DELEGATED 参 数 CurrentConfBytes);ConfidentialBytesReceived( 对 传 入 SA 用 DELEGATED 参 数 CurrentConfBytes);
AuthenticatedBytesSent( 对 传 出 SA 用 DELEGATED 参 数 CurrentAuthBytes);
AuthenticatedBytesReceived( 对 传 入 SA 用 DELEGATED 参 数 CurrentAuthBytes);
TotalBytesSent(对传出SA用DELEGATED参数CurrentBytes);TotalBytesReceived(对传入SA用DELEGATED参数CurrentBytes);OffloadedBytesSent(当卸载被启动时,主机栈将记录TotalBytesSent的值。当需要OffloadedBytesSent参数时,主机栈将为卸载目标查询DELEGATED状态以为SA找到CurrentBytes,并返回该值减去当SA被卸载时的值);以及OffloadedBytesReceived(与OffloadedBytesSent同样的方法,但适用于传入SA)。 [0234] 安全威胁是正在上升的问题。本发明考虑了已知的威胁。现在转向图16,外部的威胁可以从位于TLNPI接口(假设在用户模式-核模式组件为可信任的组件)之上的应用或从电线注入系统。电线源可以使一个或四个数据路径起作用。这四个数据路径是传统的网络栈数据路径、卸载NIC数据路径、从主机栈至卸载NIC(通过在不同的接口上发送包)的IPSec转发接口,以及在IPSec引擎和TCP引擎(仅当卸载目标支持TCP管道时可能)之间的可选卸载目标内部接口。也存在特权模式接口以允许管理员控制卸载管理器优先次序。
[0235] 不是数据路径的内部攻击点为:加载新的固件至NIC(不是所有NIC都支持该操作);训练控制路径以更新卸载的IPSec SA卸载块中的状态;以及训练控制路径以强迫一个上载或下载。
[0236] 关于SA设置/拆卸不存在新的威胁,因为主机栈执行所有SA设置和拆卸。因此,现存的对协议栈的安全分析请求SA设置。所有控制包,例如IKE、ICMP、ARP以及RIPv4消息也由主机栈处理,因此,主机栈对处理留在原处的消息变麻木。但是,如果主机栈状态被更新,并且高速缓存拷贝驻留在NIC,可以使 至IPSec卸载目标的控制路径被训练。 [0237] 如果SA状态由于各种原因被卸载,则主机栈能通过转发接口将IPSec数据报转发至NIC。一个原因是IPv4选项。如果一个数据报包括IPv4选项,则数据报在IPSec处理之前被向上转发至主机栈用于IPv4选项处理,然后被转发至卸载目标。另一个原因是IPv6扩展头。如果数据报包括IPv6选项,则数据报被向上转发至主机栈。因为IPv6扩展头必须被按次序处理,有许多病态的情况能引起多个主机栈和卸载目标之间的差错。最坏的情况是如果该包使用了AH和ESP,并且在AH头前、在AH和ESP头之间和ESP头之后存在IPv6扩展头。另一个原因是IP分段,卸载目标能重组IP分段,但是如果超出了重组空间,则它具有为特定数据报通过常规主机接口移走所有分段的选项。如果上述情况发生,主机重组数据报。数据报一旦被重组,如果它们使目标是卸载的SA的IPSec包,则它们被转发至IPSec卸载目标以进行处理。另一个原因是IPSec数据报从一个不同的接口接收并由主机IPSec栈收到。再一个原因是当卸载发生时,IPSec数据报被发向主机栈。这是临时的状况。 [0238] 在危险中的资产列表包括:常规NIC(对常规路径的安全分析中没有发生变化);卸载NIC资源(主要地,IPSec SA卸载块、IP重组缓冲、IPSec发送缓冲(不是存在于所有NIC上)和CPU(如果存在));系统稳定性;IPSec SA卸载块状态(包括信任)、路径状态、邻接状态;以及数据完整性。注意,IPSec管道支持“安全审计”模式,该模式要求卸载目标转发任何收到的数据报,该数据报通常因为错误(在增加适当的错误计数器之后)被丢弃给主机栈。尽管这并不必要地减轻任何特定威胁,但它保证系统管理员维持检查哪个包正在攻击系统的能力。
[0239] 关于哄骗、欺诈和批判,电线攻击的传统形式的特定类型并不适用,因为SA卸载块只是在SA的IKE商议后被卸载。假设匿名攻击和中间人攻击是不可能的(目标在于假设IPSec认证或加密算法没有被破解)。如果IP地址:SPI匹配卸载的SA,则卸载目标将只处理到来的包。如果对手攻击一个卸载的SA,则硬件可以比主机更快地丢掉该包,因此,系统将比传统软件栈更负责。如果对手攻击非卸载的SA或者不使用IPSec,则威胁模型与现存的软件栈威胁模块是相同的。如果对手用IP段(v4或v6)试图哄骗、欺诈或批判,则转发接口可以起到作用。希望网络CPU的利用仍将比单独的主机栈更好,因为主机栈不 须执行哈希或解密以验证包是恶意的。主机栈只不过重组该包,把它转发到卸载目标,并且卸载目标将丢弃该攻击包(且增加计数器,如果记录被激活,还潜在地把它转发至主机)。 [0240] 关于信息泄漏,几乎没有机会是针对信息泄漏的新的机制,因为没有新的电线协议,且只有API变化允许特权管理员设置卸载管理器区分优先顺序,并且允许任何应用能够查看是否SA现在已被卸载。所关心的是,是否能使用各种攻击尽力强迫上载/卸载以消耗有价值的资源(主要为卸载SA被限制的数量)和/或CPU资源。用于攻击的一个方法是尝试引起上载/卸载,然后查询接口以查看是否卸载/上载成功,并继续重复该攻击形式以使之更成功。对这种攻击工作,攻击者不得不或者位于本地主机,或者能从远程位置查询位于主机上的统计。虽然系统管理员能检测到它,并且他们能从子网/主机应用启发以使卸载失效,或者限制至本地连接的卸载,或者是某种组合。
[0241] 可论证地,信息泄漏的另一种形式可以在当远程节点能使代码被加载至卸载的NIC上(下面更详细地讨论)时发生。另一个问题是,因为密钥现在在卸载目标和操作系统中,是否任何新的攻击都被暴露。因为不存在从用户模式访问硬件的机制,所以,攻击资源的唯一方式是,是否内核已被危及安全。
[0242] 关于拒绝服务攻击,对IPSec管道的攻击可以由非认证的远程端点或一个被感染的、认证的远程端点完成。如前所述的,如果一个未知的攻击者试图攻击一个卸载的SA,因为很早就丢弃了攻击包,所以系统性能实际上将比如果它们攻击一个非卸载的SA性能更好。远程节点可以攻击的主要资源是IP重组缓冲、强迫上载卸载的SA、卸载NIC CPU周期、主机CPU周期和系统稳定性。
[0243] 关于攻击IP重组缓冲,如果远程节点发送IP分段,IP重组缓冲空间的相当的数量可以与相关联的卸载NIC CPU周期一起被消耗,以处理数据报并发送该重组的数据报至IPSec引擎。目的在于,卸载目标把任何超出它的缓冲空间的数据报上传给主机(当然,卸载目标必须当心不存储卸载目标中的某个给定IP数据报,并向上转发其它分段至主机)。这使主机能跟踪IP分段攻击。注意,如果卸载的SA正被攻击,则希望存在网络增益,因为被主机栈节约的计算周期试图加密/解密该数据报。主机栈将拆解该包,然后把它转发至卸载的SA以被认证/解密。使用该方法,如果攻击者试图过载运行该重组缓冲,主机栈减轻继续在原处。
[0244] 关于强迫上载卸载的SA,如果正被上载的SA正被大量的应用使用,它可能影响系统性能。特别相关的是,如果存在“神秘”接收包或可能强迫一个上载的发送包。最通用的组策略是对所有两个末端节点间的通信使用SA卸载块。这样,如果神秘包是可能的,则两个主机之间所有的通信都将受到影响。IPSec管道已被明确指定不允许远程或者本地应用引起上载。这样,这种类型的攻击就是不可能的。但是,缓解确实增加了接口的相当的复杂度,因为对IP选项/扩展头处理所需的转发。这造成对CPU周期的如下讨论的潜在攻击。 [0245] 关于攻击CPU周期,主要的方法是通过过度使用转发接口以消耗主机的CPU周期。注意,此处用来分析的关键标准是,是否在特定处理路径上,卸载目标比主机栈在卸载不出现时本来具有的周期引入更多CPU周期。远程节点可以创建SA(将卸载至特定NIC),并且然后在当前路径和可选路径之间向后或向前往复式传送,使IPSec数据报到达不同的NIC。
可以相信,转发数据报至卸载目标以及丢弃攻击数据报的整个CPU周期少于认证或解密该包所需的周期。因此,IPSec管道的网络效果是通过丢失攻击包而减少计算周期。另一种对转发接口的攻击是发送IPv4/v6选择或扩展头。关于IPv4选项和Ipv6扩展头存在相当的复杂度以保证既不能a)已被认证的远程主机、但具有恶意的应用不能强迫上载,也不能b)本地应用不能发送可以要求上载的包。
[0246] 因为没有神秘的包被允许,所以所有IPv4选项和IPv6扩展头被主机处理(这保证转发兼容性如新选项被创建,并且删除在卸载目标中潜在的攻击表面)。但是,这种方法引入了通过转发接口激活IP选项/扩展头处理的攻击形式。对于IPv4,不需要按次序处理选项。因此,卸载目标将转发数据报至主机以进行选项处理(即非卸载包代码路径)。在主机处理选项后,它可能转发数据报至卸载目标以进行IPSec处理。再次,因为周期数减少(由于卸载甚至穿过转发端口),所以希望攻击将比主机栈没有卸载时消耗更多的CPU周期。对于IPv6,最坏的情况是包具有AH和ESP包头。如果,扩展头在IPSec AH头之前、在AH和ESP头之间或者在ESP头之后,为保证按次序进行扩展头处理,则包可以理论上穿越I/O总线5次(如果只是IPSec卸载被激活)以及潜在的7次(如果IPSec管道和TCP管道被激活)。下面的顺序是病态的事件排序:首先,数据报被向上转发至主机栈以处理初始的扩展头。数据报然后被转发至卸载目标以进行AH处理,并且它被成功地认证(即,一个认证的主机被感染)。在卸载目 标执行AH处理之后,它进行传送,以及,卸载目标指示至主机栈的数据报以进行进一步的扩展头处理。主机栈处理扩展头并转发数据报至卸载目标以进行ESP处理。卸载目标执行ESP处理、数据报传送以及卸载目标指示至主机栈的数据报以进行进一步的扩展头处理。主机栈结束扩展头处理,转发数据报至TCP,TCP转发数据报至卸载TCP连接。卸载目标处理TCP分段并向应用指示该有效载荷。
[0247] 上面的包格式很难生成,因为IPSec栈将不在AH和ESP头之间传送IPv6扩展头。另外,如果TCP通过转发接口发现重要的流量,它将上载该连接。这把传输减到5并且可能是3个传输。如果攻击端是未知的(典型的攻击),当认证失败时,在数据报被转发至卸载目标以进行AH处理之后,处理被停止。如果远程端点能传送认证和解密(例如,信任的端点被感染了病毒),然后可能执行上述序列。IPSec管道将包括一种机制以记录过多的转发,以使管理员能对冒犯端点采取正确的行动。因为这种情况只发生在经认证的被感染客户,缓解是直接转发的:探测一个滤波器以停止任何来自客户的其它流量。 [0248] 根据是否攻击包将比纯粹的软件主机栈消耗更多的CPU来检查上面的说法,CPU利用的主要增加是转发开销和IPSec管道接收指示开销。CPU利用的主要减少由认证/解密卸载引起。根据数据报大小,网络效果在卸载的情况(全MTU数据报)是明显胜利或者平局(例如,网络CPU利用大致相同)。这样,由于认证的远程主机,主要的负面影响是总线带宽的利用,这似乎不是很严重的冒险。
[0249] 另一个基于DOS的攻击是注入邻接更新或路由更新以使不正确的MAC地址将被选中或者不正确的接口将被选中。这是主机栈中现存的安全问题,并且因为主机栈继续处理所有这些类型的消息,由于IPSec管道不会出现新的攻击情况。微妙的不同是,主机和NIC(由于高速缓存状态的更新)额外的CPU周期可以在攻击中被消耗。但是,这与更重要的能改变MAC地址(注意,这也可以被认为是哄骗和/批判的形式)的攻击窗口相比是一个相对较小的负面影响。
[0250] 另一种形式的攻击是提高特权。关于提高特权的主要关系是是否有某种不安全的机制实现(或bug)卸载IPSec,能激活远程节点以加载代码至卸载目标。对NIC制造商的要求应该包括制造商必须不能使代码直接被装载至NIC,除非远程实体已被认证。 [0251] 提高特权的另一种形式是当系统管理员已配置卸载管理器禁止SA被卸载(即连接得到了比管理员指定的更好的服务)时强迫一个卸载,或者通过猜测启发以在队列中提高自己,改变SA相比其它用于卸载的处理的优先权。这回顾了上面讨论的信息泄漏攻击。 [0252] 根据许多本发明的原理可能适用的实施例,应该认识到,此处根据附图描述的实施例只是示例性的,而不是用来限制本发明的范围。例如,本领域技术人员将理解示例的实施例中软件中所示的元素也可以用硬件实施,反之亦然,或者所列的实施例在布局和细节上可以被修改而不脱离本发明的精神。因此,这里描述的本发明的意图是将所有实施例落在下述权利要求和它们的等价物的范围内。因此,本发明的范围是,由所附的权利要求而不是前述的说明书指示。所有内涵和权利要求等价范围的改变都包括在它们的范围之内。