(57)【要約】【課題】ホストのネットワークスタックと周辺機器との間で、オフロードされたネットワークスタックコネクションを同期及びアップロードする方法を提供する。【解決手段】定数、ホストによって処理されるキャッシュされた変数、及び機器によって処理される委託変数に分類される状態変数を含む、スタック２０２の各層の状態オブジェクトが機器２０４に送られる。ネットワークスタック２０２と周辺機器２０４によって更新すべき状態を明確に分割する。例えば、統計は、ホスト、機器、又はホストと機器によって追跡される。ホストと周辺機器の両方によって追跡された統計を重複のない部分に分割し、組み合わせて統計を得る。アップロードが開始されると、機器は不変の状態に達し、委託された状態をスタックに渡す。スタック２０２の各層は各自の委託された状態の管理権を得、機器２０４のリソースが解放される。【選択図】図２
2011018373.tif 000002
【特許請求の範囲】
【請求項１】
複数のソフトウェア層を有するホスト中で、ホストと周辺機器との間でオフロードされたネットワークスタックの状態オブジェクトを同期する方法であって、各ソフトウェア層は少なくとも１つの状態変数を有し、
前記複数のソフトウェア層の各ソフトウェア層について、
前記少なくとも１つの状態変数を、プロセッサによりメモリに記憶された不変変数、プロセッサによりメモリにキャッシュされた変数、及びプロセッサにより前記周辺機器に委託された変数の１つにプロセッサが分類するステップと、
前記少なくとも１つの状態変数を前記周辺機器にプロセッサが送るステップと、
前記ネットワークスタックの状態オブジェクトがオフロードされる間に、前記少なくとも１つの状態変数が前記キャッシュされた変数に分類された場合に、
前記キャッシュされた変数の値をホストにより制御するステップと、
前記キャッシュされた変数が変化した場合に、前記周辺機器中の前記キャッシュされた変数の値の更新をホストが制御するステップと、
前記ネットワークスタック状態オブジェクトがオフロードされる間に、前記少なくとも１つの状態変数が委託された変数として分類された場合に、
前記周辺機器により前記少なくとも１つの状態変数の値を制御するステップと、
プロセッサが前記少なくとも１つの前記値を変化するステップと
を備えたことを特徴とするオフロードされたネットワークスタックの状態オブジェクトを同期する方法。
【請求項２】
前記複数のソフトウェア層の１つはトランスポート層であり、前記プロセッサが分類するステップは、前記少なくとも１つの状態変数を、不変変数に分類するステップであり、前記少なくとも１つの状態変数は、宛先ポート、送信元ポート、ウィンドウのスケール係数、及びオフロードハンドルの少なくとも１つを含むことを特徴とする請求項１に記載のオフロードされたネットワークスタックの状態オブジェクトを同期する方法。
【請求項３】
前記複数のソフトウェア層の１つはネットワーク層であり、前記プロセッサが分類するステップは、前記少なくとも１つの状態変数を、不変変数に分類するステップであり、前記少なくとも１つの状態変数は、宛先ＩＰアドレス及び送信元ＩＰアドレスの少なくとも１つを含むことを特徴とする請求項１に記載のオフロードされたネットワークスタックの状態オブジェクトを同期する方法。
【請求項４】
前記複数のソフトウェア層の１つはＴＣＰ層であり、前記プロセッサが分類するステップは、前記少なくとも１つの状態変数を、キャッシュされた変数に分類するステップであり、前記少なくとも１つの状態変数は、ＴＣＰ変数及びＩＰ変数の少なくとも１つを含むことを特徴とする請求項１に記載のオフロードされたネットワークスタックの状態オブジェクトを同期する方法。
【請求項５】
前記複数のソフトウェア層の１つはネットワーク層であり、前記プロセッサが分類するステップは、前記少なくとも１つの状態変数を、キャッシュされた変数に分類するステップであり、前記少なくとも１つの状態変数はオフロードハンドルを含むことを特徴とする請求項１に記載のオフロードされたネットワークスタックの状態オブジェクトを同期する方法。
【請求項６】
前記複数のソフトウェア層の１つはＩＰセキュリティ層であり、前記プロセッサが分類するステップは、前記少なくとも１つの状態変数を、不変変数に分類するステップであり、前記不変変数は、送信元ポート、宛先ポート、プロトコルタイプ、及びセキュリティアソシエーション変数の少なくとも１つを含むことを特徴とする請求項１に記載のオフロードされたネットワークスタックの状態オブジェクトを同期する方法。
【請求項７】
複数の中間ソフトウェア層についての少なくとも１つのオフロードされた状態及び前記オフロードされた状態に関連付けられたプロトコルを処理している周辺機器中でオフロードハンドルを使用してリソースを節減する方法であって、前記少なくとも１つのオフロードされた状態は状態オブジェクトを有し、
前記オフロードハンドルは、ソフトウェア層に前記周辺機器との通信を許容する機構であり、
第１のオフロードされた状態の初期状態オブジェクトをプロセッサが格納するステップと、
前記周辺機器から前記初期状態オブジェクトの初期オフロードハンドルをプロセッサが受け取るステップと、
前記状態オブジェクトが前記初期状態オブジェクトである場合、次のオフロード時に前記初期オフロードハンドルを前記周辺機器にプロセッサが渡すステップと、
前記状態オブジェクトが新しい状態オブジェクトである場合、前記次のオフロード時に新しいオフロードハンドルをプロセッサが受け取るステップと
を備えたことを特徴とするリソースを節減する方法。
【請求項８】
前記初期状態オブジェクトは初期トランスポート状態オブジェクトを含み、前記初期オフロードハンドルは初期トランスポートオフロードハンドルを含み、前記新しいオフロードハンドルは新しいトランスポートオフロードハンドルを含み、前記状態オブジェクトが前記初期状態オブジェクトである場合に次のオフロード時に前記初期オフロードハンドルを前記周辺機器に渡すステップと、前記状態オブジェクトが新しい状態オブジェクトである場合に前記次のオフロード時に新しいオフロードハンドルを受け取るステップとは、
前記トランスポート状態オブジェクトが前記初期トランスポート状態オブジェクトである場合、次のオフロード時に前記初期トランスポートオフロードハンドルを前記周辺機器にプロセッサが渡すステップと、
前記トランスポート状態オブジェクトが新しいトランスポート状態オブジェクトである場合、前記次のオフロード時に新しいトランスポートオフロードハンドルをプロセッサが受け取るステップと
を含むことを特徴とする請求項７に記載のリソースを節減する方法。
【請求項９】
前記初期状態オブジェクトは初期ネットワーク状態オブジェクトを含み、前記初期オフロードハンドルは初期ネットワーク層オフロードハンドルを含み、前記新しいオフロードハンドルは新しいネットワーク層オフロードハンドルを含み、前記状態オブジェクトが前記初期状態オブジェクトである場合に次のオフロード時に前記初期オフロードハンドルを前記周辺機器に渡すステップと、前記状態オブジェクトが新しい状態オブジェクトである場合に前記次のオフロード時に新しい状態オフロードを受け取るステップとは、
前記ネットワーク状態オブジェクトが前記初期ネットワーク状態オブジェクトである場合は、次のオフロード時に前記初期ネットワーク層オフロードハンドルを前記周辺機器にプロセッサが渡すステップと、
前記ネットワーク状態オブジェクトが新しいネットワーク状態オブジェクトである場合は、前記次のオフロード時に新しいネットワーク層オフロードハンドルをプロセッサが受け取るステップと
を含むことを特徴とする請求項７に記載のリソースを節減する方法。
【請求項１０】
前記初期状態オブジェクトは初期フレーミング状態オブジェクトを含み、前記初期オフロードハンドルは初期フレーミング層オフロードハンドルを含み、前記新しいオフロードハンドルは新しいフレーミング層オフロードハンドルを含み、前記状態オブジェクトが前記初期状態オブジェクトである場合に次のオフロード時に前記初期オフロードハンドルを前記周辺機器に渡すステップと、前記状態オブジェクトが新しい状態オブジェクトである場合に前記次のオフロード時に新しいオフロードハンドルを受け取るステップとは、
前記フレーミング状態オブジェクトが前記初期フレーミング状態オブジェクトである場合は、次のオフロード時に前記初期フレーミング層オフロードハンドルを前記周辺機器にプロセッサが渡すステップと、
前記フレーミング状態オブジェクトが新しいフレーミング状態オブジェクトである場合、前記次のオフロード時に新しいフレーミング層オフロードハンドルをプロセッサが受け取るステップと
を含むことを特徴とする請求項７に記載のリソースを節減する方法。
【請求項１１】
請求項７に記載のステップを行うことを特徴とするコンピュータ読み取り可能な記録媒体。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、一般には、コンピュータシステムの効率、速度、及び／又はスループットを高める、オフロードされたネットワークスタックの状態オブジェクトをアップロードする方法及びそれを同期する方法に関する。より詳細には、特定のハードウェアコンポーネントにオフロードされた、通例はホストプロセッサによって行われるコンピューティングタスクを同期し、アップロードする方法に係る、オフロードされたネットワークスタックの状態オブジェクトをアップロードする方法、オフロードされたネットワークスタックの状態オブジェクト及び少なくとも１つの関連付けられたプロトコルをアップロードする方法、オフロードされたネットワークスタックの状態オブジェクトを同期する方法、リソースを節減する方法、オフロードされたネットワークスタックについての統計を得る方法及び記録媒体に関する。
【背景技術】
【０００２】
オペレーティングシステム、アプリケーションソフトウェア、ネットワーキング、ネットワーク通信などの複雑性と高度化は、劇的な速度で高まり続けている。複雑性と高度化の結果の１つは、アプリケーション及びシステムの機能性の向上である。このように機能性が増した結果、しばしば、増大したシステム及びアプリケーション機能を実行するためにＣＰＵが行わなければならない追加的な動作に起因するＣＰＵオーバーヘッドの増大が生じる。
【０００３】
ＣＰＵオーバーヘッドの増大が直ちに明白になる領域の１つは、高い処理能力（帯域幅；bandwidth）の媒体における発展によりネットワーク速度が増しているネットワーク型アプリケーションの領域である。ネットワーク速度は、多くの場合、ホストコンピュータのＣＰＵのプロセッサ速度とメモリの処理能力に匹敵し、次第にそれらを上回りつつある。こうしたネットワーク型アプリケーションはさらに、Ｗｉｎｄｏｗｓ（登録商標）オペレーティングシステムで使用される７階層ＩＳＯモデルあるいは階層化モデルなど、大半のオペレーティングシステムで用いられる階層化アーキテクチャのためにホストプロセッサに負担をかける。よく知られるように、このようなモデルは、ネットワークへの物理コネクション（connection）とエンドユーザアプリケーションとの間のデータフローを記述するのに使用される。データビットをネットワークケーブルに乗せるなどの最も基本的な機能は下層で行われ、一方アプリケーションの詳細に対応する機能は上層で行われる。基本的に、各層の目的は次に高い層にサービスを提供し、１つ上の層を実際のサービスの実装方式の詳細から隠蔽することである。層は、各層がもう一方のコンピュータ上の同じ層と通信していると認識するような方式で抽象化されている。
【０００４】
データパケットが層間を進む際にデータパケットに行われる各種の機能は、ソフトウェア集約型であり、しばしば相当量のＣＰＵプロセッサリソースとメモリリソースを必要とする。例えば、様々な層でパケットに行われる特定の機能はきわめてＣＰＵ集約型であり、このような機能には、パケットのチェックサムの計算及び検証、データの暗号化及び解読（例えばＳＳＬ（Secure Socket Layer）暗号化やＩＰ（Internet Protocol）セキュリティ暗号化）、メッセージダイジェストの計算、ＴＣＰ（Transmission Control Protocol）のセグメント化、ＴＣＰの再送及び肯定応答（ＡＣＫ）の処理、Ｄｏｓアタック（denial of services attacks）から防御するためのパケットフィルタリング、及びユーザデータグラムプロトコル（ＵＤＰ）パケットのフラグメント化などがある。こうした各機能を行うと、結果的なＣＰＵに対する要求が、コンピュータシステム全体のスループット及びパフォーマンスに大きく影響する可能性がある。
【０００５】
ＣＰＵリソースに対する要求は増しているが、ネットワークインタフェースカード（ＮＩＣ）などのコンピュータハードウェアの周辺機器の能力とスループットも高まっている。こうした周辺機器はしばしば、本来はＣＰＵによって行われるタスクと機能の多くを行うことができる専用のプロセッサとメモリを備える。
【０００６】
コンピュータ業界はこの能力を認識し、以前はＣＰＵで行っていたＣＰＵ集約型のタスクと機能をオフロード（offload）する方法を開発した。例えば、Ａｎａｎｄ他による特許（特許文献１参照）、２０００年９月７日付け出願の「Method and Computer Program Product for Offloading Processing Tasks from Software to Hardware」という名称の特許出願、及び２０００年１１月２９日付け出願の「Method and Computer Program Product for Offloading Processing Tasks from Software to Hardware」という名称の特許出願は、周辺機器に照会を行い、集約型のタスクと機能を行うことが可能な周辺機器に、特定のプロセッサタスクをオフロードする解決法を提供する。通例オフロードされる特定のタスクには、ＴＣＰ（伝送制御プロトコル）及び／又はＩＰ（インターネットプロトコル）のチェックサムの計算、ＬＳＯ（ｌａｒｇｅ  ｓｅｎｄ  ｏｆｆｌｏａｄ）などのＴＣＰのセグメント化、及びセキュアインターネットプロトコル（ＩＰＳＥＣ）の暗号化及び解読などのタスクが含まれる。
【先行技術文献】
【特許文献】
【０００７】
【特許文献１】米国特許第６，１４１，７０５号明細書
【発明の概要】
【発明が解決しようとする課題】
【０００８】
これらのオフロード機構は、ネットワークスタックに最少数の変更を行わなければならないという二次的な要件がある点で制限されている。この二次的要件の結果、周辺機器に到達することが出来ないオフロードタスク及び機能により、ネットワークスタック全体がトラバース（traverse）されるため、オフロードが長いコードパスを有するという別の制限が生じる。さらなる制限はネットワークスタックとの統合に欠けることである。ネットワークスタックが周辺機器に照会を行う又はパラメータを設定するための、明確に定義されたインタフェース、あるいは周辺機器がネットワークスタックに能力の通知又は変更を知らせるための、インタフェースは存在しない。例えば、ＬＳＯ要求の処理中にルートが変わった場合、フォールバック機構は、スタックがタイムアウトを待ち、ＬＳＯ要求を再送することである。
【０００９】
周辺機器の製造者が試みた別の手法は、ＴＣＰコネクション全体をコアスタックからネットワークインタフェースカード（ＮＩＣ）にオフロードすることである。この手法では、独自のインタフェースを使用することによりプロトコルスタック全体をバイパスし、また周辺機器がＴＣＰメッセージ、ＩＰ（インターネットプロトコル）メッセージ、ＩＣＭＰ（インターネット制御メッセージプロトコル）メッセージ、ＤＮＳ（ドメイン名サーバ）メッセージ、及びＲＩＰ（Routing Information Protocol）メッセージすべてを処理することを必要とするため、ＮＩＣですべてを処理することが必要とされる。さらに、この手法はマルチホーム環境に対応せず、またホストのオペレーティングシステムのネットワーク管理ユーティリティとうまく一体化しない。一旦状態が変化すると、オフロードされたコネクションが容易に機能しなくなる可能性がある。
【００１０】
本発明は、このような課題に鑑みてなされたもので、その目的とするところは、ホストのネットワークスタックと周辺機器との間で、オフロードされたネットワークスタックコネクションを効率的に同期及びアップロードすることができる、オフロードされたネットワークスタックの状態オブジェクトをアップロードする方法及びそれを同期する方法を提供することにある。
【課題を解決するための手段】
【００１１】
本発明は、ＴＣＰベースのプロトコルスタックなどのネットワークスタックコネクションをオフロードする方法を提供する。通常は複数のソフトウェアレイヤを有するＮＤＩＳ（ネットワークドライバインタフェース仕様）パスを通じて周辺機器に送られるデータを、スイッチ層から周辺機器へ通じるパスにオフロードする。ネットワークスタックとプロセッサとの厳密な同期を維持する。スタックをオフロードする要求は、ＮＤＩＳパスを通じて周辺機器に送られる。この要求はリソース要件のリストを含んでおり、周辺機器はリソースの割り振りに必要な情報を得る。ＮＤＩＳパスの各層は、各自のリソース要件をリストに追加する。周辺機器が要求を受け入れる場合、周辺機器はリソースを割り振り、ソフトウェア層が周辺機器と通信することができるように各ソフトウェア層にオフロードハンドルを送る。
【００１２】
周辺機器によるオフロードの受け入れがソフトウェア層に伝えられると、各ソフトウェア層の状態を周辺機器に送る。あるいはオフロード要求とともに状態を送り、状態の変更だけを周辺機器に送る。各状態は状態変数を備え、各状態変数は、不変変数、キャッシュされた変数、又は委託変数に分類される。不変変数は、プロトコルスタックがオフロードされている時間中に変化しない。キャッシュ変数はＣＰＵによって扱われ、委託変数は周辺機器によって扱われる。
【００１３】
本発明は、オフロードされたネットワークコネクションを周辺機器からホストにアップロードする方法も提供する。アップロードは、周辺機器又はスイッチ層によって開始される。アップロードが開始されると、周辺機器はすべての未処理の要求を完了し、委託された状態をスイッチ層に渡す。委託された状態がホストによって受け付けられると、周辺機器での状態のリソースが解放される。
【００１４】
オフロード又はアップロードの移行中に、更新（例えばＡＲＰ（Address Resolution Protocol）の更新やＲＩＰの更新）が到着する可能性がある。周辺機器で複数の更新メッセージを受信した場合は、通し番号を使用して最も新しい更新メッセージを使用することを保証し、周辺機器は古いデータを使用しない。
【００１５】
添付図面を参照して進める以下の例示的実施形態の詳細な説明から、本発明のさらなる特徴及び利点が明らかになろう。
【発明の効果】
【００１６】
以上説明したように本発明によれば、ホストのネットワークスタックと周辺機器との間で、オフロードされたネットワークスタックコネクションを効率的に同期及びアップロードすることができる。
【図面の簡単な説明】
【００１７】
【図１】本発明の実施形態の例示的コンピュータシステムを示す概略的なブロック図である。
【図２】本発明の実施形態のネットワークスタックの機能層及びバイパス経路を表すブロック図である。
【図３】本発明の実施形態のＮＤＩＳパスの機能層及びバイパス経路を表すブロック図である。
【図４】本発明の実施形態のオフロード機構を表すラダー図である。
【図５Ａ】本発明の逆ツリーを表す図である。
【図５Ｂ】本発明の実施形態の逆ツリーを表す図である。
【図５Ｃ】本発明の実施形態の逆ツリーを表す図である。
【図５Ｄ】本発明の実施形態の逆ツリーを表す図である。
【図６】本発明の実施形態のホストコンピュータと周辺機器の同期を表すブロック図である。
【図７】本発明の実施形態のアップロード機構を表すラダー図である。
【図８】本発明の実施形態の教示によるセキュアプロトコルスタックコネクションのオフロード機構を表すラダー図である。
【図９】本発明の実施形態の教示によるセキュアなオフロードされたプロトコルスタックコネクションのアップロード機構を表すラダー図である。
【発明を実施するための形態】
【００１８】
以下、図面を参照して本発明の実施形態を詳細に説明する。特許請求の範囲に本発明の特徴を具体的に述べるが、本発明とその目的及び利点は添付図面と合わせて解釈する以下の詳細な説明により最も正しく理解することができる。
【００１９】
同様の要素を同様の参照符号で示す複数の図面に、適切なコンピューティング環境で実施した本発明を示している。必須ではないが、本発明はパーソナルコンピュータによって実行されるプログラムモジュールなどのコンピュータ実行可能命令との一般的な関連で説明する。一般に、プログラムモジュールには、特定タスクを行うか、あるいは特定の抽象データ型を実装するルーチン、プログラム、オブジェクト、コンポーネント、データ構造などが含まれる。さらに、当業者は、本発明は、ハンドヘルドデバイス、マルチプロセッサシステム、マイクロプロセッサベース又はプログラム可能な家庭用電化製品、ネットワークＰＣ（personal computer）、ミニコンピュータ、メインフレームコンピュータ、ネットワーク周辺機器（例えばネットワークプリンタ）などを含む他のコンピュータシステム構成で実施することが可能であることを認識されよう。本発明は、通信ネットワークを通じてリンクされたリモートの処理装置によってタスクを行う分散コンピューティング環境で実施することもできる。分散コンピューティング環境では、プログラムモジュールはローカル及びリモート両方のメモリ記憶装置に置くことができる。
【００２０】
図１は、本発明を実施することが可能な適切なコンピューティングシステム環境１００の一例である。コンピューティングシステム環境１００は適切なコンピューティング環境の一例に過ぎず、本発明の使用又は機能の範囲について何らの制限を示唆するものではない。またコンピューティングシステム環境１００は、例示的動作環境１００に示す構成要素のいずれか１つ又は組合せに関連する依存性又は必要性を有するものとも解釈すべきでない。
【００２１】
本発明は、数多くの他の汎用又は特殊目的のコンピューティングシステム環境又は構成で動作することができる。本発明に使用するのに適している可能性があるよく知られるコンピューティングシステム、環境、及び／又は構成の例には、これらに限定しないが、パーソナルコンピュータ、サーバコンピュータ、ハンドヘルド又はラップトップデバイス、マルチプロセッサシステム、マイクロプロセッサベースのシステム、セットトップボックス、プログラム可能な家庭用電化製品、ネットワークＰＣ、ミニコンピュータ、メインフレームコンピュータ、ネットワーク周辺機器（例えばネットワークプリンタ）、上述のシステム又はデバイスのいずれかを含む分散コンピューティング環境などがある。
【００２２】
本発明は、コンピュータによって実行されるプログラムモジュールなどのコンピュータ実行可能命令の一般的な状況で説明することができる。一般に、プログラムモジュールには、特定タスクを行うか、あるいは特定の抽象データ型を実装するルーチン、プログラム、オブジェクト、コンポーネント、データ構造などが含まれる。本発明は、通信ネットワークを通じてリンクされたリモートの処理装置によってタスクを行う分散コンピューティング環境で実施することもできる。分散コンピューティング環境では、メモリ記憶装置を含むローカル及びリモート両方のコンピュータ記憶媒体にプログラムモジュールを置くことができる。
【００２３】
図１を参照すると、本発明を実施する例示的システムは、コンピュータ１１０の形態の汎用コンピューティングデバイスを含む。コンピュータ１１０の構成要素には、これらに限定しないが、プロセッサ１２０、システムメモリ１３０、及びシステムメモリを含む各種のシステム構成要素をプロセッサ１２０に結合するシステムバス１２１が含まれる。システムバス１２１は、各種のバスアーキテクチャの任意のものを使用したメモリバス又はメモリコントローラ、ペリフェラルバス、クロスバー、交換バスファブリック、及びローカルバスを含む数タイプのバス構造のいずれでもよい。システムバス１２１は、バスの階層であってもよい。これらに限定しないが、このようなアーキテクチャの例には、ＩＳＡ（Ｉｎｄｕｓｔｒｙ  Ｓｔａｎｄａｒｄ  Ａｒｃｈｉｔｅｃｔｕｒｅ）バス、ＭＣＡ（Ｍｉｃｒｏ  Ｃｈａｎｎｅｌ  Ａｒｃｈｉｔｅｃｔｕｒｅ）バス、ＥＩＳＡ（Ｅｎｈａｎｃｅｄ  ＩＳＡ）バス、ＶＥＳＡ（Ｖｉｄｅｏ  Ｅｌｅｃｔｒｏｎｉｃｓ  Ｓｔａｎｄａｒｄｓ  Ａｓｓｏｃｉａｔｅ）ローカルバス、ＮＣ−ＮＵＭＡ（Ｎｏ  Ｃａｃｈｅ  Ｎｏｎ−Ｕｎｉｆｏｒｍ  Ｍｅｍｏｒｙ  Ａｃｃｅｓｓ）アーキテクチャバス、ＣＣ−ＮＵＭＡ（Ｃａｃｈｅ−Ｃｏｈｅｒｅｎｔ  Ｎｏｎ−Ｕｎｉｆｏｒｍ  Ｍｅｍｏｒｙ  Ａｃｃｅｓｓ）アーキテクチャバス、及びメザニンバスとも称されるＰＣＩ（Ｐｅｒｉｐｈｅｒａｌ  Ｃｏｍｐｏｎｅｎｔ  Ｉｎｔｅｒｃｏｎｎｅｃｔｓ）バスが含まれる。
【００２４】
コンピュータ１１０は通例各種のコンピュータ可読媒体を含む。コンピュータ可読媒体は、コンピュータ１１０がアクセスすることができる任意の利用可能媒体でよく、揮発性及び不揮発性の媒体、リムーバル及びノンリムーバル媒体を含む。これに限定しないが、例としてコンピュータ可読媒体は、コンピュータ記憶媒体及び通信媒体を含むことができる。コンピュータ記憶媒体には、コンピュータ可読命令、データ構造、プログラムモジュール、又はその他のデータなどの情報を記憶するための任意の方法又は技術に実現された揮発性及び不揮発性の媒体、リムーバル及びノンリムーバルの媒体が含まれる。コンピュータ記憶媒体には、これらに限定しないが、ＲＡＭ（random access memory）、ＲＯＭ（read only member）、ＥＥＰＲＯＭ（electrically erasable PROM）、フラッシュメモリ又は他のメモリ技術、ＣＤ（compact disc [disk]）−ＲＯＭ、デジタル多用途ディスク（ＤＶＤ）又は他の光ディスク記憶、磁気カセット、磁気テープ、磁気ディスク記憶又は他の磁気記憶装置、あるいは所望の情報の記憶に用いることができ、コンピュータ１１０によるアクセスが可能な任意の他の媒体が含まれる。通信媒体は、通例、搬送波又は他の搬送機構などの、変調データ信号にコンピュータ可読命令、データ構造、プログラムモジュール、又は他のデータを統合し、任意の情報伝達媒体を含む。用語「変調データ信号」とは、信号中に情報を符号化するような方式でその特性の１つ又は複数を設定又は変化させた信号を意味する。例として、通信媒体には、有線ネットワーク又は直接配線コネクションなどの有線媒体と、音響、ＲＦ（radio frequencies）、赤外線、及び他の無線媒体などの無線媒体が含まれるが、これらに限定しない。上記の媒体のいずれの組合せもコンピュータ可読媒体の範囲に含めるべきである。
【００２５】
システムメモリ１３０には、ＲＯＭ１３１及びＲＡＭ１３２など、揮発性及び／又は不揮発性メモリの形態のコンピュータ記憶媒体が含まれる。起動時などにコンピュータ１１０内の要素間の情報伝達を助ける基本ルーチンを含むＢＩＯＳ１３３（Basic Input/Output System）は、通例ＲＯＭ１３１に格納される。ＲＡＭ１３２は通例、プロセッサ１２０から即座にアクセス可能な、かつ／又は現在プロセッサ１２０によって操作中のデータ及び／又はプログラムモジュールを含む。これらに限定しないが、例として、図１にはオペレーティングシステム１３４、アプリケーションプログラム１３５、他のプログラムモジュール１３６、及びプログラムデータ１３７を示している。
【００２６】
コンピュータ１１０は、他のリムーバル／ノンリムーバル、揮発性／不揮発性のコンピュータ記憶媒体も含むことができる。例に過ぎないが、図１には、ノンリムーバル、不揮発性の磁気媒体の読み取り又は書き込みを行うハードディスクドライブ１４１、リムーバル、不揮発性の磁気ディスク１５２の読み取り又は書き込みを行う磁気ディスクドライブ１５１、及びＣＤ−ＲＯＭや他の光媒体などのリムーバル、不揮発性の光ディスク１５６の読み取り又は書き込みを行う光ディスクドライブ１５５を示す。例示的動作環境で使用できるこの他のリムーバル／ノンリムーバル、揮発性／不揮発性のコンピュータ記憶媒体には、これらに限定しないが、磁気テープカセット、フラッシュメモリカード、デジタル多用途ディスク、デジタルビデオテープ、ソリッドステートＲＡＭ、ソリッドステートＲＯＭなどが含まれる。ハードディスクドライブ１４１は通例、インタフェース１４０などのノンリムーバルのメモリインタフェースを通じてシステムバス１２１に接続され、磁気ディスクドライブ１５１及び光ディスクドライブ１５５は通例、インタフェース１５０などリムーバルなメモリインタフェースによってシステムバス１２１に接続される。
【００２７】
上記で説明し、図１に示すドライブとそれに関連付けられたコンピュータ記憶媒体は、コンピュータ可読命令、データ構造、プログラムモジュール、及びコンピュータ１１０のその他のデータの記憶を提供する。例えば図１では、ハードディスクドライブ１４１にオペレーティングシステム１４４、アプリケーションプログラム１４５、他のプログラムモジュール１４６、及びプログラムデータ１４７を記憶している。これらのコンポーネントは、オペレーティングシステム１３４、アプリケーションプログラム１３５、他のプログラムモジュール１３６、及びプログラムデータ１３７と同じものでも、異なるものでもよいことに留意されたい。ここではオペレーティングシステム１４４、アプリケーションプログラム１４５、他のプログラムモジュール１４６、及びプログラムデータ１４７には、それらが少なくとも異なるコピーであることを表すために異なる参照符号をつけている。
【００２８】
ユーザは、キーボード１６２、及び一般にはマウス、トラックボール、タッチパッドと称されるポインティングデバイス１６１などの入力装置を通じてコンピュータ１１０にコマンドと情報を入力することができる。この他の入力装置（図示せず）には、マイクロフォン、ジョイスティック、ゲームパッド、衛星放送受信アンテナ、スキャナ、ビデオ入力などがある。これら及び他の入力装置は、システムバスに結合されたユーザ入力インタフェース１６０を通じてプロセッサ１２０に接続することが多いが、パラレルポート、ゲームポート、あるいはユニバーサルシリアルバス（ＵＳＢ）など他のインタフェース及びバス構造によって接続することも可能である。モニタ１９１又は他タイプの表示装置も、ビデオインタフェース１９０などのインタフェースを介してシステムバス１２１に接続される。コンピュータは、モニタに加えて、スピーカ１９７、プリンタ１９６、及びビデオ出力など他の周辺出力装置も含むことができ、それらは出力周辺インタフェース１９５を通じて接続することができる。
【００２９】
コンピュータ１１０は、リモートコンピュータ１８０など１つ又は複数のリモートコンピュータへの論理コネクションを使用するネットワーク環境で動作することができる。リモートコンピュータ１８０は、別のパーソナルコンピュータ、サーバ、ルータ、ネットワーク周辺機器（例えばプリンタ）、ネットワークＰＣ、ピアデバイス、あるいはその他の一般的なネットワークノードでよく、図１にはメモリ記憶装置１８１しか示していないが、通例はパーソナルコンピュータ１１０との関連で上述した要素の多く又はすべてを含む。図１に示す論理コネクションには、構内ネットワーク（ＬＡＮ）１７１と広域ネットワーク（ＷＡＮ）１７３が含まれるが、他のネットワークを含むことも可能である。このようなネットワーキング環境は、オフィス、企業内のコンピュータネットワーク、イントラネット、及びインターネットに一般的に見られる。
【００３０】
ＬＡＮネットワーキング環境で使用する場合、パーソナルコンピュータ１１０はネットワークインタフェースあるいはアダプタ（例えばネットワークインタフェースカード（ＮＩＣ））１７０を通じてＬＡＮ１７１に接続される。ＷＡＮネットワーキング環境で使用する場合、コンピュータ１１０は通例、インターネットなどのＷＡＮ１７３を通じて通信を確立するためのモデム１７２又はその他の手段を含む。モデム１７２は内蔵型でも外付け型でもよく、ユーザ入力インタフェース１６０又は他の適切な機構を介してシステムバス１２１に接続することができる。ネットワーク環境では、パーソナルコンピュータ１１０との関連で図示したプログラムモジュール、又はその一部をリモートのメモリ記憶装置に格納することができる。これに限定しないが、例として図１ではリモートアプリケーションプログラム１８５がメモリ記憶装置１８１に常駐している。図のネットワークコネクションは例示的なものであり、コンピュータ間に通信リンクを確立する他の手段を使用できることは理解されよう。
【００３１】
以下の説明では、特に指示しない限りは、１つ又は複数のコンピュータによって行われる動作及びオペレーションの記号的表現を参照して本発明を説明する。このため、個所によってはコンピュータによって実行すると述べるそのような動作及びオペレーションには、コンピュータのプロセッサによる、構造化された形でデータを表す電気信号の操作が含まれることは理解されよう。この操作ではデータを変形するか、又はコンピュータのメモリシステム中の位置にデータを保持するが、それにより当業者に周知の方式でコンピュータの動作が再設定されるか、あるいはその他の形で変更される。データが保持されるデータ構造は、そのデータの形式によって定義される特定のプロパティを持つメモリの物理的位置である。ただし、本発明は前述の状況で説明するが、それは制限的なものではなく、当業者は、下記の各種の動作及びオペレーションはハードウェアに実装することも可能であることを理解されよう。
【００３２】
図２に、本発明のネットワーキングモデル及びコンポーネントを構成するコンポーネントの一部の相互関係を示す。通常の動作中は、ネットワーク上の他のデバイス及びアプリケーションにメッセージを送信し、他のデバイス及びアプリケーションからメッセージを受信する周辺機器２０４に、アプリケーション２００によりネットワークスタック２０２を通じてネットワーク化メッセージが送られる。ネットワークスタック２０２は、１つ又は複数の中間ソフトウェア層２０６を含む。アプリケーション２００から送られたデータは中間ソフトウェア層２０６を通過し、ここでデータのパッケージング、高信頼データ送信、データの暗号化、及びメッセージダイジェストの計算といった特定の操作をデータに行うことができる。
【００３３】
スイッチ２０８は、中間ソフトウェア層２０６のためのネットワークスタック動作の実行からプロセッサ１２０をオフロードするのに使用される。図にはスイッチ２０８を分離して示しているが、スイッチ２０８はネットワークスタック２０２の中間層の最上層に統合してもよいことに留意されたい。周辺機器２０４がネットワークスタック動作を行うために、チムニー（ｃｈｉｍｎｅｙ）２１０を介して周辺機器２０４にデータが送られる。この階層では、中間ソフトウェア層は排他的に（ｅｘｃｌｕｓｉｖｅｌｙ）ホスト又は周辺機器に常駐しなくともよく、中間層の任意の層を、完全にオフロードする、ホストに留める、あるいはその両方の組合せ（例えば１つ又は複数の特定のコネクションをオフロードするなど）がいずれも可能である。さらに、チムニー同士を階層化してもよい（例えばＩＰＳＥＣのチムニーをＴＣＰチムニーの上に重ねることができる）。コネクションは、高信頼データ転送と低信頼データ転送、及びユニキャストのデータ転送とマルチキャストのデータ転送の任意の組合せでよい。ある中間層がホストに留まる場合、ホストは周辺機器２０４中のキャッシュ変数を更新する（下記で説明する）。例えば、コネクションのトランスポート制御ブロック（ＴＣＢ）状態エントリをトランスポート層のためにオフロードし、ネットワーク層のルートキャッシュエントリ（ＲＣＥ）を周辺機器２０４にオフロードすることができる。スイッチ２０８は、オフロードされたＴＣＢのためにチムニー２１０を通じてトラフィックを送るのと同時に、同じＲＣＥを共有するネットワークスタック２０２を通じて別のＴＣＢにトラフィックを送り続ける。
【００３４】
スイッチ２０８は、中間層２０６にオフロード要求を送ることによりオフロードを開始する。オフロード要求は、周辺機器２０４がそのコネクションをうまくオフロードできるかどうかを判定するのを助けるリソース情報を含んでいる。各中間層２０６は、オフロード要求を拒絶するか、又はオフロード要求にリソース情報を追加して、ネットワークスタック２０２で隣接するソフトウェア層にオフロード要求を送る。周辺機器２０４はオフロード要求を受け取ると、そのコネクションをオフロードするのに利用できるリソースを持っているかどうかを計算する。周辺機器２０４は、オフロードが可能でない場合はオフロード要求を拒絶する。そうでない場合、周辺機器２０４はオフロード要求を受け入れ、コネクションのためのリソースを割り振る。周辺機器２０４は、パラメータの連結リストを含む完了メッセージを中間ソフトウェア層２０６に送ることによりオフロード要求を完了する。パラメータの連結リストは中間ソフトウェア層２０６とスイッチ２０８に情報を提供して、中間ソフトウェア層２０６とスイッチ２０８が周辺機器と通信できるようにする。各中間ソフトウェア層２０６は、パラメータの連結リストからその層の情報を取り除く。
【００３５】
中間層２０６は、オフロードの完了メッセージを受け取るとその層の状態を周辺機器２０４に渡す。各状態は、３タイプの変数ＣＯＮＳＴ、ＣＡＣＨＥＤ、及びＤＥＬＥＧＡＴＥＤを有することができる。状態は、３タイプの変数すべてか、３タイプの変数のサブセットを有することができる。ＣＯＮＳＴ変数は、オフロードされたコネクションの寿命中に変わることのない定数である。ＣＯＮＳＴ変数は、コネクションがアップロードされたときに層に読み戻されない。ホストプロセッサ１２０は、ＣＡＣＨＥＤ変数の所有権を保持し、ホストプロセッサ１２０におけるＣＡＣＨＥＤ変数の変更がいずれも周辺機器２０４で更新されることを保証する。ＣＡＣＨＥＤ状態を変化させる制御メッセージはネットワークスタック２０２によって処理される。結果として、ホストはＣＡＣＨＥＤ変数を書くが、コネクションがアップロードされたときに読み戻す必要はない。ホストプロセッサ１２０は、ＤＥＬＥＧＡＴＥＤ変数の所有権を周辺機器２０４に移す。ＤＥＬＥＧＡＴＥＤ変数は、オフロードが発生したときに１回書かれ、オフロードが終了したときに読み戻される。ＤＥＬＥＧＡＴＥＤ変数を転送して戻すだけにすることにより、コネクションをホストに転送して戻すオーバーヘッドを最小限に抑える。様々なパフォーマンス上の理由によりオフロードされている（すなわち委託されている）、ネットワークスタック２０２と周辺機器２０４との間で共有（例えば制御）すべき状態は、ネットワークスタック２０２とチムニー２１０に明確に分割され（例えばＴＣＰのオフロードにおけるＩＰ  ＩＤ）、ネットワークスタック２０２と周辺機器２０４はどちらも状態の排他的部分を各自所有する。ホストプロセッサ１２０は、必要な際（例えば統計のため）には、周辺機器２０４にＤＥＬＥＧＡＴＥ変数を照会する。ホストプロセッサ１２０は、また診断のためにＣＯＮＳＴ又はＣＡＣＨＥＤ変数を照会することができる。状態を３つのカテゴリに分けることにより、ネットワークスタック２０２がチムニー２１０と明確に共存することが可能になる。状態はオフロード要求に含めてもよいことに留意されたい。これは、状態が委託状態変数を含まないか、又は最初のオフロード要求からそのオフロード要求の完了までに変化しない委託状態変数を含む場合に行うことができる。
【００３６】
周辺機器２０４又はホストが、オフロードされたコネクションをいつアップロードするかを決定する。アップロードは、周辺機器２０４又はスイッチ２０８によって開始される。アップロードが開始されると、周辺機器２０４はすべての未処理の要求を適切な状態で完了し、最上位の中間層の委託された状態をスイッチ２０８に渡す。スイッチ２０８は、以後の送信要求をキューに入れ、受信バッファをポスト（ｐｏｓｔ）することを停止する。スイッチ２０８は、最上位の中間層に委託された状態を管理するように命令する。最上位の中間層は委託状態の管理権を得、スイッチ２０８に完了メッセージを送る。スイッチ２０８は完了メッセージを受け取ると、周辺機器２０４へアップロードを確認し、これにより周辺機器２０４はもはや使用されていないリソースを解放することができる。
【００３７】
最上位の中間層は、その層が委託された状態の管理権を得るまでは、オフロードされたコネクションに対する着信データパケットを処理のために周辺機器２０４に転送することに留意されたい。周辺機器２０４が委託された状態をスイッチ２０８に渡した時から、最上位の中間層が委託された状態の管理権を得る時までにデータパケットが到着する可能性がある。周辺機器２０４は、委託された状態をスイッチ２０８に渡してしまうと着信データパケットを処理することはできない。周辺機器２０４は、着信データを受け取ると最上位の中間層にエラーメッセージを送ってアップロードが進行中であることを知らせる。エラーメッセージは、最上位の中間層に、着信データの転送をやめ、その層が委託された状態を受け取るまで以降のデータはバッファに入れるように通知する。あるいは、周辺機器２０４の付加的なバッファメモリを犠牲にして、着信データを周辺機器２０４に転送して周辺機器２０４がデータをバッファに入れることも可能である。
【００３８】
中間ソフトウェア層２０６により複数のコネクションを周辺機器２０４にオフロードすることが可能である。オフロードのために中間ソフトウェア層の状態オブジェクトを参照する、より上の層の状態オブジェクト（すなわち中間ソフトウェア層２０６より上の層の状態オブジェクト）の数の、参照カウンタが、中間ソフトウェア層２０６によって保持される。本明細書で使用する状態オブジェクトとは、ここで用いるＣＯＮＳＴ、ＣＡＣＨＥＤ、又はＤＥＬＥＧＡＴＥＤと分類される特定層の状態変数の集合である。ある中間層のオフロードされた状態オブジェクトにその上の層による参照がない場合、その中間層２０６は周辺機器２０４にメッセージを送って、その中間層の状態オブジェクトをアップロードさせ、中間層２０６へ委託された状態変数を送らせる。周辺機器２０４は中間層２０６の状態オブジェクトを削除し、中間層２０６はスイッチ２０８に完了メッセージを送る。
【００３９】
全般的な概念を説明したので、次いで図３を参照して一実施形態において本発明の詳細を説明する。この実施形態では、周辺機器２０４はＮＩＣ１７０であり、スイッチ２０８はトランスポート層インタフェーススイッチ（ＴＬＩ）３０６であり、ネットワークスタック２０２はトランスポート層３００、ネットワーク層３０２、及びフレーミング層３０４を備える。ネットワーク層３０２はパス（ｐａｔｈ）層としても知られ、フレーミング層３０４は隣接層としても知られる。
【００４０】
動作中に、ネットワーク化メッセージは、アプリケーション２００によりネットワークスタック２０２を通じてＮＩＣ１７０に送られる。アプリケーション２００から送られたデータはＴＬＩスイッチ３０６を通過し、スイッチ３０６はデータがホストベースのネットワークスタック２０２に行くのか、チムニー３０８に行くのかを制御する。ＴＬＩスイッチ３０６は、ネットワークスタック２０２の最上層に統合してもよいことに留意されたい。ネットワークスタック２０２のソフトウェア層は、アプリケーション２００からデータを受け取り、それをパケット形態にパッケージし、ＮＤＩＳミニドライバ３１０を介して周辺機器ハードウェア３１４に送る。データパケットがスタック２０２を通過する際にネットワークスタック２０２によって行うことのできる他のタスクには、データの暗号化、高信頼データ送信、及びメッセージダイジェスト（例えばデータパケットのチェックサムやＣＲＣ）の計算が含まれる。これらのタスクの多くはプロセッサ１２０によって行われ、プロセッサ集約型である。
【００４１】
ＴＬＩスイッチ３０６は、コネクションについてのデータをチムニー３０８（及びチムニードライバ３１２）を介してＮＩＣ１７０に送ることによりプロセッサ１２０をスタック動作の実行からオフロードするために使用される。当業者は、ＮＤＩＳミニドライバ３１０及びチムニードライバ３１２の上端は、ＭｉｃｒｏｓｏｆｔオペレーティングシステムのＮＤＩＳ  ＡＰＩであることを認識されよう。説明のために、伝送制御プロトコル（ＴＣＰ）ベースのプロトコルスタックを使用して本発明を説明する。ただし、当業者には、多種の周辺機器を使用することができ、また本発明の教示を使用して他のネットワークスタックをオフロードできることが認識されることが理解されよう。例えば、ストリーム制御伝送プロトコル（ＳＣＴＰ）又はユーザデータグラムプロトコル（ＵＤＰ）ベースのプロトコルスタックをオフロードすることができる。さらに、本発明は、インターネットスモールコンピュータシステムインタフェース（ｉＳＣＳＩ）、ネットワークファイルシステム（ＮＦＳ）、あるいは共通インタフェースファイルシステム（ＣＩＦＳ）などのより高機能なプロトコルのオフロードにも使用することができる。
【００４２】
オフロードは多くの理由で行われる。これらに限定しないが、例として理由の一部を以下に挙げる。システム管理者は、オフロードする特定のサービスを選択することができる。（バイト数又はパケット数から見た）コネクションのトラフィックが相当量のリソースを消費している場合は、特定のコネクションをオフロードすることができる。複数タイプのサービスをオフロードすることができる。例えば、ＩＰＳＥＣなどのセキュリティプロトコルをオフロードすることができる。オフロードはポリシーによって操作することができる。例えば、管理者は、ある組織内からのすべてのコネクションを最初にオフロードするというポリシーを備えることができる。使用中のシステムリソース（例えばＣＰＵ利用、データキャッシュ使用、ページテーブルキャッシュ使用、メモリの処理能力）により、ホストプロセッサがコネクションをオフロードするようにすることができる。
【００４３】
図４に、ＴＣＰコネクションをオフロードする際にとるステップを表す。３段階のプロセスを使用している。一般に、３段階のプロセスは、ＴＣＰコネクションのオフロードに必要なリソースの割り振り、各層３００、３０２、３０４、３０６へのハンドルの提供、及びＮＩＣ１７０への各層３００、３０２、３０４、３０６の状態のオフロードである。オフロードの移行中は、ＴＬＩスイッチ３０６はアプリケーション２００から送られるすべてのメッセージをバッファに入れる。あるいは、トランスポート層３００がデータをバッファに入れる。オフロードが完了すると、オフロードデータの送信と同じ機構を使用してバッファ中のデータをＮＩＣ１７０に転送する。オフロードの移行中に着信パケットを受信すると、ＮＩＣ１７０は、トランスポート層の委託された状態がＮＩＣ１７０に渡されるまで層３００、３０２、３０４、３０６を通じてデータを上に移し続ける。
【００４４】
ＴＬＩスイッチ３０６は、トランスポート層３００にオフロード要求を送ることによりオフロードを開始する（ライン４００）。オフロード要求には、次の層のローカル状態へのポインタ（例えばトランスポート層３００のＴＣＰポインタ、ネットワーク層３０２のＲＣＥポインタ、フレーミング層３０４のＡＲＰテーブルポインタ、ＮＤＩＳミニドライバ３１０のＮＤＩＳミニポートポインタ）、オフロードのタイプ（例えばＴＬＩスイッチ３０６のＴＣＰ、ネットワーク層３０２のＩＰｖ６など）、及びＮＩＣ１７０がＴＣＰコネクションを正常にオフロードできるかどうかを判断するのを助けるリソース情報が含まれる。ＴＬＩスイッチ３０６は、ＮＩＣ１７０にディスパッチテーブルも提供することができる。トランスポート層３００はオフロード要求を拒絶するか、又はＴＬＩスイッチリソース情報にＴＣＰリソース情報を追加してオフロード要求をネットワーク層３０２に送る（ライン４０２）。
【００４５】
ネットワーク層３０２は、オフロード要求を受け取り、そのコネクションのオフロードを拒絶するか、又はＴＣＰリソース情報とＴＬＩスイッチリソース情報にネットワークリソース要件を追加してオフロード要求をフレーミング層３０４に送る（ライン４０４）。ネットワーク層３０２は、ＮＩＣ１７０にディスパッチテーブルも提供することができる。フレーミング層３０４はコネクションのオフロードを拒絶するか、又はネットワークリソース要件、ＴＣＰリソース情報、及びＴＬＩスイッチリソース情報にフレーミングのリソース要件を追加してオフロード要求をＮＩＣ１７０に送る（ライン４０６）。
【００４６】
ＮＩＣ１７０はオフロード要求を受け取り、ＴＣＰコネクションのオフロードに利用できるリソースを持っているかどうかを計算する。オフロードが可能でないと判断すると、ＮＩＣはそのオフロード要求を拒絶する。オフロードが可能であると判断すると、ＮＩＣはオフロード要求を受け入れ、コネクションのためのリソース（例えばＴＣＢ、ルートキャッシュエントリ（ＲＣＥ）、ＡＲＰテーブルエントリ（ＡＴＥ））を割り振る。ＮＩＣ１７０は、層３００、３０２、３０４及び３０６に渡すパラメータの連結リストとディスパッチテーブルを作成して、パラメータの連結リストを含む完了メッセージをフレーミング層３０４に送る（ライン４０８）ことによりオフロード要求を完了する。パラメータには、各層３００、３０２、３０４、３０６のオフロードハンドルとディスパッチテーブルが含まれる。本明細書で使用するオフロードハンドルとは、ソフトウェア層が周辺機器と通信することを可能にする機構を意味する。これらに限定しないが、例として、オフロードハンドルは、ポインタベースのハンドル、配列へのルックアップとして用いられる整数値、ハッシュテーブル（例えばハッシング関数）、ソフトウェア層（又はネットワークスタック）と周辺機器間の通信チャネル、又は周辺機器が状態オブジェクトをルックアップするのに使用する、ソフトウェア層によって渡されるパラメータセットなどである。
【００４７】
ディスパッチテーブルは、ＮＩＣ１７０に直接データを送る、又はＮＩＣ１７０から直接データを受け取るために用いられる。ディスパッチテーブルは診断を提供するためにも使用することができる。例えば、ソフトウェア層を追加してシステムを監視し、障害を投入して、システムが適正に機能していることを確かめることができる。さらに、必要な場合には、追加機能を追加できるソフトウェア層によってディスパッチテーブルをパッチすることができる。例えば、フィルタドライバの機能を提供するためにソフトウェア層を追加することができる。パッチングは、通例、追加機能を挿入しようとする元の機能へのポインタを捕捉し、それを追加機能にリダイレクトする（すなわちその機能をポイントさせる）ことによって行う。パッチが挿入されると、追加された機能はその機能を実行し、元の機能が呼び出されたときには元の機能を呼び出す。
【００４８】
フレーミング層３０４は、宛先のＭＡＣ（media access control）アドレスが変わるか、あるいはカプセル化のタイプが変わった場合に容易に更新できるように、フレーミング層のオフロードハンドルとディスパッチテーブルをそのＡＲＰテーブルエントリ（ＡＴＥ）に格納しておく。そしてフレーミング層３０４は、ＡＴＥと関連付けられたＮＩＣ１７０の状態を更新する（ライン４１０）。フレーミング層３０４は、連結リストから自身の状態を除去し、連結リスト中の残りの情報をネットワーク層３０２に転送する（ライン４１２）。
【００４９】
ネットワーク層３０２は、ネットワーク層３０２のオフロードハンドルとディスパッチテーブルを格納する。ネットワーク層３０２はまた、その状態をＮＩＣ１７０に送る（ライン４１４）。ネットワーク層３０２は、連結リストからネットワーク層の情報を除去し、パラメータの連結リストとディスパッチテーブルを含む完了メッセージをトランスポート層３００に送る（ライン４１６）。ネットワーク層３０２は、オフロードされた状態に対してそれが受け取るＩＰフラグメントを処理のためにＮＩＣ１７０に転送するか、又はネットワーク層でＩＰフラグメントを処理し、それをトランスポート層３００に転送することができる。
【００５０】
代替の実施形態では、オフロード要求とともに層の状態オブジェクトを送る。例えば、オフロード要求とともにフレーミング層の状態オブジェクトとネットワーク層の状態オブジェクトを送り、キャッシュされた状態がオフロード要求から完了イベントまでの間に変化した場合にのみ状態を更新する。層全体の状態オブジェクトは、委託された状態が存在しないか、又はオフロード要求からオフロード要求の完了までに変わる可能性がない場合に、オフロード要求とともに唯一送ることができる。ただし、ＣＯＮＳＴとして分類される状態変数は、委託された状態が存在し、オフロード要求からオフロード要求の完了までに変わる可能性がある場合であってもオフロード要求とともに送ることができる。
【００５１】
トランスポート層３００はトランスポート層のオフロードハンドルを格納し、その状態をＮＩＣ１７０に送る（ライン４１８）。保留になっている未処理の送信バッファ又は受信バッファがある場合は、トランスポート層３００はそのバッファをＴＬＩスイッチ３０６に戻す。トランスポート層３００がＴＬＩスイッチ３０６にバッファを戻し始めると、ＴＬＩスイッチ３０６はトランスポート層３００にバッファを送るのを止め、バッファをキューに入れ、パラメータの連結リストとディスパッチテーブルを含む完了メッセージをトランスポート層３００がＴＬＩスイッチ３０６に送るのを待つ。トランスポート層３００はすべてのバッファを戻し、完了メッセージを送る（ライン４２０）。ＴＬＩスイッチ３０６は完了メッセージを受け取ると、送信バッファ及び受信バッファをＮＩＣ１７０に転送する（ライン４２２）。ＴＬＩスイッチ３０６はディスパッチテーブルを使用してすべての未処理の受信バッファと以降の受信バッファをポストし、処理のためにＮＩＣ１７０に送る。オフロード要求が完了するのにかかる時間内に、各層３００、３０２、３０４はオフロードされた状態オブジェクト（ある層と関連付けられた状態オブジェクト）についての新たなオフロード要求は拒絶するか、又はオフロードが完了するまでキューに入れておく。
【００５２】
トランスポート層３００は、トランスポート状態がＮＩＣ１７０にオフロードされていない場合でも、入ってくるＴＣＢデータを処理し、そのデータをＴＬＩスイッチ３０６に渡す能力がある。オフロードの半ばにＴＣＢデータが到着した場合、トランスポート層３００はそのデータを保持しても、又はそのデータを処理してＴＬＩスイッチ３０６に渡してもよい。トランスポート層３００がその状態をＮＩＣ１７０に送った（ライン４１８）時から、ＴＬＩスイッチがバッファをＮＩＣ１７０に転送する（ライン４２２）時まで、ネットワークスタック２０２を通じて入ってくる着信ＴＣＢデータはＮＩＣ１７０に送られる。
【００５３】
その後のオフロード要求の際には、ネットワーク層３０２及びフレーミング層３０４は、それらがＮＩＣ１７０から受け取った前回のオフロードのオフロードハンドルをＮＩＣ１７０に渡す。これにより、ネットワーク層３０２及びフレーミング層３０４のためのリソースがすでに割り当てられていることがＮＩＣ１７０に通知され、ＮＩＣのリソースが節約され、オフロードの速度が上がる。
【００５４】
上述のように、層３００、３０２、３０４は各自の状態をＮＩＣ１７０に渡す。各状態には、ＣＯＮＳＴ、ＣＡＣＨＥＤ、及びＤＥＬＥＧＡＴＥＤの３タイプの変数がある。ＣＯＮＳＴ変数は、オフロードされたコネクションの寿命中に変化することのない定数である。ＣＯＮＳＴ変数は、コネクションが終了すると層に読み戻される。ホストプロセッサ１２０はＣＡＣＨＥＤ変数の所有権を保持し、ホストプロセッサ１２０におけるＣＡＣＨＥＤ変数の変更がいずれもＮＩＣ１７０で更新されることを保証する。この結果、ホストはＣＡＣＨＥＤ変数を書くが、（システム診断で必要とされない限り）読み戻すことはない。ホストプロセッサ１２０は、ＤＥＬＥＧＡＴＥＤ変数の所有権をＮＩＣ１７０に移す。ＤＥＬＥＧＡＴＥＤ変数は、オフロードが発生した時に１回書かれ、オフロードが終了すると読み戻される。ＤＥＬＥＧＡＴＥＤ変数を転送して戻すだけにすることにより、コネクションをホストに転送するオーバーヘッドが最小に抑えられる。ホストプロセッサ１２０は、（例えば統計のために）必要な際にはＮＩＣ１７０にＤＥＬＥＧＡＴＥＤ変数を照会する。
【００５５】
トランスポート層３００のＣＯＮＳＴ変数には、宛先ポート、送信元ポート、「気付（ｃａｒｅ−ｏｆ）」アドレスが変わる可能性のあるＭｏｂｉｌｅ  ＩＰの事例があることを示すフラグ、ＳＥＮＤ及びＲＥＣＶウィンドウのスケール係数、及びネットワーク層３０２のＮＩＣハンドルが含まれる。トランスポート層３００のＣＡＣＨＥＤ変数は、ＴＣＰ変数及びＩＰ変数である。ＴＣＰ変数には、有効ＭＳＳ、ＮＩＣ１７０により受信指示内にコピーすべきバイト数、Ｎａｇｌｉｎｇをオフにするフラグ、Ｋｅｅｐ−Ａｌｉｖｅが必要であることを示すフラグ、及びＫｅｅｐ−Ａｌｉｖｅの設定（すなわち間隔、プローブ回数、及びデルタ）が含まれる。ＩＰ変数は、ＴＯＳ及びＴＴＬを含む。ＤＥＬＥＧＡＴＥＤ変数には、現在のＴＣＰ状態、次のＲＥＣＶの通し番号（すなわちＲＣＶ．ＮＥＸＴ）、受信ウィンドウサイズ（ＲＣＶ．ＷＮＤ）、肯定応答のない最初のデータの通し番号（ＳＮＤ．ＵＮＡ）、次のＳＥＮＤの通し番号（ＳＮＤ．ＮＥＸＴ）、これまで送られた最大の通し番号（ＳＮＤ．ＭＡＸ）、最大の送信ウィンドウ（ＭＡＸ＿ＷＩＮ）、現在の輻輳ウィンドウ（ＣＷＩＮ）、スロースタートの閾値（ＳＳＴＨＲＥＳＨ）、平滑化したＲＴＴ（８＊Ａ）、Ｄｅｌｔａ（８＊Ｄ）、現在の再送回数、次回の再送の残り時間、及びエコーすべきタイムスタンプが含まれる。
【００５６】
ネットワーク層３０２のＣＯＮＳＴ変数には、宛先ＩＰアドレス（ＩＰｖ４あるいはＩＰｖ６）、及び送信元ＩＰアドレス（ＩＰｖ４あるいはＩＰｖ６）が含まれる。ネットワーク層３０２のＣＡＣＨＥＤ変数には、フレーミング層３０４のＮＩＣハンドルが含まれる。ネットワーク層３０２のＤＥＬＥＧＡＴＥＤ変数には、ＩＰ  Ｐａｃｋｅｔ  ＩＤの開始値が含まれる。フレーミング層３０４のＣＡＣＨＥＤ変数には、ＡＲＰアドレスと、ヘッダ形式（例えばＬＬＣ／ＳＮＡＰ［Ｌｏｇｉｃａｌ  Ｌｉｎｋ  Ｃｏｎｔｒｏｌ／Ｓｕｂ−Ｎｅｔｗｏｒｋ  Ａｃｃｅｓｓ  Ｐｒｏｔｏｃｏｌ］又はＤＩＸ［Ｄｉｇｉｔａｌ，Ｉｎｔｅｌ，Ｘｅｒｏｘ］）を示すフラグとが含まれる。
【００５７】
ネットワーク層の状態は複数のコネクションで共有することができ、フレーミング層の状態（例えばＩＰエイリアス）は複数のパスで共有することができるので、トランスポート層の状態はネットワーク層のハンドルを含み、ネットワーク層の状態はフレーミング状態のハンドルを含む。この階層はいくつかの理由から保持される。ＩＰ  ＩＤのネーム空間は、すべてのオフロードされたコネクションにわたってパス単位で管理しなければならないので、コネクションにはネットワーク層のＮＩＣハンドルが必要とされる。ルートの更新により次のホップアドレスが変わり、それにより新しいＭＡＣアドレスをポイントする可能性があるので、パスにはフレーミング層のＮＩＣハンドルが必要となる。この階層はまた、ＮＩＣによって保持する必要のある状態の量を圧縮する。例えば、ＩＰｖ４のＡＲＰの更新によりＩＰアドレスとＭＡＣアドレスのマッピングが変わる可能性がある（例えばサーバでインタフェースがフェールオーバーした場合など）。ホストはキャッシュされた変数としてＭＡＣアドレスを保持し、したがってキャッシュされた状態を１回更新するだけでよく、するとすべてのコネクションが新しいインタフェースにフェールオーバーされる。
【００５８】
ＴＣＰコネクションがオフロードされると、ＮＩＣ１７０は、それが送信するパケットにパケット識別子（例えばＩＰ  ＩＤ）を割り当てる役割を担う。ＩＰ  ＩＤは、インタフェースごとか、又は層の状態オブジェクトごとにオフロードされる。ＮＩＣ１７０には、ＩＰ  ＩＤネーム空間の一部が割り当てられる。一実施形態では、ＮＩＣ１７０には全ＩＰ  ＩＤネーム空間の半分が割り当てられ、ＮＩＣ１７０にネットワーク状態を渡す際に使用するＩＰパケットＩＤの開始値が与えられる。ＮＩＣ１７０は次の式を使用して、それが送るＩＰパケットにＩＰ  ＩＤを生成する。
【００５９】
Cur_IPID=[(Start_IPID_For_This_Path)+(Counter_For_This_Path)mod32K]mod64K
Counter_For_This_Path=Counter_For_This_Path+1
オフロードされたコネクションがアップロードされるか、あるいは無効になると、ＮＩＣ１７０は、それが使用することになっていた次のＩＰＩＤ値をネットワーク層に転送して、行われる次のオフロードのために格納し、ホストプロセッサ１２０はそれに割り当てられたＩＰ  ＩＤのネーム空間の部分を引き続き使用する。ホストプロセッサ１２０はＩＰ  ＩＤのネーム空間を完全に使用することができるが、オフロードが行われるたびにカウンタをセットしなれければならない。
【００６０】
ＮＩＣ１７０は、データをその受信順序で受信バッファに入れ、オフロードされたコネクションのためにポストした順序でアプリケーションバッファを埋める。多くのアプリケーションは、受信バッファをポストする前に受信指示を待つ。一実施形態では、ＮＩＣ１７０は、あるコネクションに対してデータが到着し、アプリケーション受信バッファがポストされていない場合に使用するグローバルなバッファプールを備える。このグローバルなバッファプールはオフロードされた複数のコネクションで使用され、次を実施するのに使用することができる。１）順序外れのＴＣＰ伝送の処理、２）ＩＰデータグラムのデフラグメント、３）アプリケーションがゼロコピーアルゴリズムには小さすぎるバッファにポストしている場合の、ゼロコピーアルゴリズムではなくバッファコピーアルゴリズム。あるいは、リソースの効率的な使用が問題とならない場合にはコネクションごとのバッファプールを使用することもできる。ただし、グローバルなバッファプールは、ＮＩＣがコネクションごとのバッファプールをサポートしない場合に、あるいはシステムリソースの不足（例えばメモリにアプリケーションバッファを留める（ｐｉｎ）だけのリソースがない場合）のために使用される。
【００６１】
次いで図５Ａ〜５Ｄを参照すると、ＮＩＣ１７０は、オフロードが発生するとそのオフロードを表す逆ツリー５００を有する。これらの図で、点線はＮＩＣ１７０によって割り当てられた新しい状態を表す。図５Ａで、ＮＩＣ１７０は、ＴＣＰエントリ５０６に結合されたルートキャッシュエントリ５０４に結合されたＡＰＲエントリ５０２を有する。例えばすべてのトラフィックがルータに向かう場合は、次のホップは常に同じＡＲＰエントリ５０２になる。次のＴＣＰコネクションのオフロードにルートキャッシュエントリ５０４を使用する場合は、唯一の新しいリソースは新しくオフロードされたＴＣＢになる。したがって、ネットワークスタック２０２の下方でオフロードが開始されると、すでにその状態をオフロードした中間ソフトウェア層（例えばネットワーク層３０２及びフレーミング層３０４）は、単に前回のオフロード要求時に割り当てられたＮＩＣで生成されたオフロードハンドルを挿入する。ＮＩＣ１７０は、新しいリソース（例えばＴＣＰエントリ５０８）を割り振り、新しいリソースのオフロードハンドルをネットワークスタック２０２の上方に送り返すだけでよい。この結果、逆ツリー５００は、ルートキャッシュエントリ５０４に結合されたＴＣＰエントリ５０８を有することになる（図５Ｂ参照）。この手法はＮＩＣリソースを節減し、オフロードの速度を上げる。さらに、キャッシュされた変数状態が変化した場合は単一の構造だけを更新すればよい。チムニー中の各種のソフトウェア層のすべての状態が単一のエントリとしてオフロードされた場合は、最上位のソフトウェア層より下にある状態の更新にはいずれも複数回の更新が必要となる。
【００６２】
図５Ｃは、より複雑な構成の逆ツリー５００を示す。ＡＲＰテーブルエントリ５０２を通る２つのルートキャッシュエントリ５０４及び５１０がある。ＴＣＰコネクション５０６及び５０８はルートキャッシュエントリ５０４を利用する。ＴＣＰコネクション５１２及び５１４はルートキャッシュエントリ５１０を参照する。ＡＲＰの更新が行われた場合（例えばマルチホームサーバのインタフェースがフェールオーバーした場合）は、エントリ５０２だけを更新すればよい。これにより、ＮＩＣ１７０に１回の更新を必要とするだけで、可能性としては何千又は何十万のコネクションを新しいインタフェースにフェールオーバーさせることができる。図５Ｄは、ルート更新が行われた後に単一の逆ツリー５００に併合した２つの別々の逆ツリー（エントリ５０２〜５０８及びエントリ５１０〜５１６）を示す。ルートの更新前には、ルートキャッシュエントリ５１０への次のホップＡＲＰエントリはＡＲＰテーブルエントリ５１６である。ルートの更新後は、次のホップＡＲＰテーブルエントリはＡＲＰテーブルエントリ５０２になる。このように逆ツリーを使用することにより、ネットワークスタックの状態を単一のエントリとしてオフロードした場合の何千又は何万回の更新ではなく、ＮＩＣ１７０に対する１回のトランザクションとしてルート更新を処理することが可能になる。
【００６３】
次いで図６を参照すると、コネクションがＮＩＣ１７０にオフロードされるとＮＩＣ１７０への２つのパスがある。第１のパスはＮＤＩＳミニドライバ３１０、フレーミング層３０４、ネットワーク層３０２、そしてトランスポート層３００を通るものである。第２のパスは、チムニーと称するオフロードされたコネクション６０８を通るものである。ホストコンピュータから見ると、通信に関しては２つのパスについてすべてが同じである。キャッシュされた状態変数は、２つのパスをプロセッサ１２０と同期して上述のようにＮＩＣ１７０中のキャッシュされた状態変数を更新する。キャッシュされた変数の更新を矢印６０２、６０４、６０６で示す。
【００６４】
着信データパケットが到着すると、ＮＩＣ１７０は、その着信データパケットがオフロードされたパスを通るか、又はオフロードされたのでないパスを通る（すなわちＮＤＩＳミニドライバ３１０と層３０４、３０２、３００のＮＤＩＳパスを通る）かを決定する。一実施形態では、ＮＩＣ１７０は、送信元及び宛先のＴＣＰポート番号、送信元及び宛先のＩＰアドレス、及びプロトコルタイプにハッシング関数を実行することにより、着信データパケットをどちらのパスに送るかを判定する。ハッシュがオフロードされたコネクションのパラメータと一致する（すなわちハッシュバケットのチェーンをウォーク（ｗａｌｋ）し、すべてのコネクションのタプルの正確な一致がある）場合は、チムニー６０８を使用する。ハッシュがハッシュインデックスと一致しない場合は、ネットワークスタック２０２を通るオフロードされたのでないパスを使用する。キャッシュされた状態を更新する制御メッセージはホストによって処理される。この結果、ＮＩＣ１７０は、ＩＣＭＰ、ＤＮＳ、及びＲＩＰメッセージなど、オフロードされたコネクションの外部にある制御メッセージのいずれも処理せずに済む。
【００６５】
本発明は、Ｎｅｔｓｔａｔなど既存のツールを使用して統計を得て、ホストにおけるすべてのコネクション、プロトコルタイプ、ローカル及びリモートのポートとＩＰアドレスのバインディング、コネクションの状態、プロセスＩＤなどのコネクションパラメータを含む各種の情報を取り出す能力をユーザに提供する。本発明では、統計は層単位、又は層の状態オブジェクト単位で収集される。層内ではその層の状態オブジェクトをグループ化して、複数の層状態オブジェクトにわたる統計を集めることができる。例えば、ネットワーク層の統計は、使用されるプロトコル（例えばＩＰｖ４やＩＰｖ６）ごとの統計となるように分割することができる。ＣＯＮＳＴ及びＣＡＣＨＥＤの状態変数と関連付けられた統計はホストによって提供され、ＤＥＬＥＧＡＴＥＤ状態変数と関連付けられた統計は周辺機器２０４によって提供される。照会を行う際は、ＤＥＬＥＧＡＴＥＤ状態変数と関連付けられた統計をＣＯＮＳＴ及びＣＡＣＨＥＤ状態変数と関連付けられた統計に追加する。
【００６６】
また、パケット数など、ホスト層の状態と周辺機器層の状態のグループ化全体にわたって総計される統計クラスもある。別のタイプの統計は、システム中の機能の状態の一覧（例えばシステム中のすべてのＴＣＢの状態の一覧）である。ＴＣＢの統計は、ホストによって追跡された統計と周辺機器によって追跡された統計を組み合わせたものである。同様に、パケット数の統計は、ホスト層の状態の統計と周辺機器層の状態の統計の合計である。
【００６７】
ＴＣＰ  ＭＩＢ（管理情報ベース）の場合のホストと周辺機器２０４の分割の一例を下の表１に示し、ＩＰｖ４  ＭＩＢの統計を下の表２に示す。２つの表中、１列目はフィールドであり、２列目はその統計を追跡する役割を担うのが周辺機器かホストネットワークスタックかを示し、３番目のフィールドはそのフィールドの追跡方式を示している。周辺機器が担当する統計は、層の状態オブジェクト単位か層単位で追跡される。ここで使用する層単位とは、層ごと、周辺機器ごと、プロトコルごとに統計を追跡することを意味する。ただし、ホストの状態と周辺機器の状態から統計を合成する際には、一般にはそれがプロトコル単位で提示されることに留意されたい。ホストネットワークスタックが周辺機器に照会せずに生成できる統計を「スタックが完全な情報を有する」又は「スタックだけによって実行」と分類する。「スタックが完全な情報を有する」カテゴリは、周辺機器がその統計について知っているがその統計を追跡しないことを意味する。「スタックだけによって実行」される統計は、周辺機器がその統計を知らないことを意味する。アダプタ統計は正規のＮＤＩＳインタフェースを通じて照会する。アダプタ統計には、送信バイト、受信バイトなどの変数が含まれる。
【００６８】
【表１】
2011018373.tif 000003
【００６９】
ｔｓ＿ＲｔｏＡｌｇｏｒｉｔｈｍは、応答のないオクテットの再送に使用されるタイムアウト値を決定するのに用いるアルゴリズムの値である。ｔｓ＿Ｒｔｏ＿Ｍｉｎは、ミリ秒単位で測定される再送のタイムアウトにＴＣＰ実装で許される最小値の値である。ｔｓ＿Ｒｔｏ＿Ｍａｘは、ミリ秒単位で測定される再送のタイムアウトにＴＣＰ実装で許される最大値である。ｔｓ＿ＭａｘＣｏｎｎは、サポートできるＴＣＰコネクションの総数である。ｔｓ＿ＡｃｔｉｖｅＯｐｅｎｓは、ＴＣＰコネクションがＣＬＯＳＥＤ状態からＳＹＮ＿ＳＥＮＴ状態に直接の遷移を行った回数である。ｔｓ＿ＰａｓｓｉｖｅＯｐｅｎｓは、ＴＣＰコネクションがＬＩＳＴＥＮ状態からＳＹＮ＿ＲＣＶＤ状態に直接の遷移を行った回数である。ｔｓ＿ＡｔｔｅｍｐｔＦａｉｌｓは、ＴＣＰコネクションがＳＹＮ＿ＳＥＮＴ状態又はＳＹＮ＿ＲＣＶＤ状態からＣＬＯＳＥＤ状態に直接の遷移を行った回数と、ＴＣＰコネクションがＳＹＮ＿ＲＣＶＤ状態からＬＩＳＴＥＮ状態に直接の遷移を行った回数の合計である。ｔｓ＿ＥｓｔａｂＲｅｓｅｔｓは、ＴＣＰコネクションがＥＳＴＡＢＬＩＳＨＥＤ状態又はＣＬＯＳＥ−ＷＡＩＴ状態からＣＬＯＳＥＤ状態に直接の遷移を行った回数である。ｔｓ＿ＣｕｒｒＥｓｔａｂは、現在の状態がＥＳＴＡＢＬＩＳＨＥＤかＣＬＯＳＥＤ−ＷＡＩＴであるＴＣＰコネクションの数である。ｔｓ＿ＩｎＳｅｇｓは、エラーとして受信したセグメントを含む受信セグメントの総数である。ｔｓ＿ＯｕｔＳｅｇｓは、現在のコネクションによるセグメントを含むが、再送されたオクテットだけを含むセグメントは除いた送信セグメントの総数である。ｔｓ＿ＲｅｔｒａｎｓＳｅｇｓは、再送されたセグメントの総数である。ｔｓ＿ＩｎＥｒｒｓは、エラーとして受信されたセグメント（例えば不良のＴＣＰチェックサム）の総数である。ｔｓ＿ＯｕｔＲｓｔｓは、ＲＳＴフラグを含む送信ＴＣＰセグメントの数である。ｔｓ＿ＮｕｍＣｏｎｓは、現在存在するＴＣＰコネクションの総数である。
【００７０】
【表２】
2011018373.tif 000004
【００７１】
ｉｐｓｉ＿Ｆｏｒｗａｒｄｉｎｇは、ホストによって受信されるがホストを宛先としないデータグラムの転送に関してホストがＩＰルータとして動作するかどうかの指示を提供する値である。ｉｐｓｉ＿ＤｅｆａｕｌｔＴＴＬは、トランスポート層プロトコルによってＴＴＬ値が供給されないときに、そのエンティティを送信元とするデータグラムのＩＰヘッダのＴＴＬ（Ｔｉｍｅ−Ｔｏ−Ｌｉｖｅ）フィールドに挿入されるデフォルト値である。ｉｐｓｉ＿ＩｎＲｅｃｅｉｖｅｓは、エラーで受信されたものを含む、インタフェースから受信した入力データグラムの総数である。ｉｐｓｉ＿ＩｎＨｄｒＥｒｒｏｒｓは、不良のチェックサム、バージョン番号の不一致、他のフォーマットエラー、ＴＴＬの超過、ＩＰオプションを処理する際に見つかったエラーなどを含む、ＩＰヘッダ中のエラーのために破棄された入力データグラムの数である。ｉｐｓｉ＿ＡｄｄｒＥｒｒｏｒｓは、ＩＰヘッダの宛先フィールド中のＩＰアドレスがホストで受信できる有効なアドレスでなかったために破棄された入力データグラムの数である。ｉｐｓｉ＿ＦｏｒｗＤａｔａｇｒａｍｓは、ホストが最終的なＩＰ宛先でなく、その結果その最終的な宛先に転送するルートを見つける試みが行われた入力データグラムの数である。ｉｐｓｉ＿ＵｎｋｎｏｗｎＰｒｏｔｏｓは、無事受信されたもののプロトコルが未知のものであるか、あるいはサポートされないプロトコルであるために破棄された、ローカルにアドレス指定されたデータグラムの数である。ｉｐｓｉ＿ＩｎＤｉｓｃａｒｄｓは、その処理の継続を妨げるような問題は生じなかったものの破棄された（例えばバッファ空間の不足のため）入力ＩＰデータグラムの数である。ｉｐｓｉ＿ＩｎＤｅｌｉｖｅｒｓは、無事ＩＰユーザプロトコルに送達された入力データグラムの総数である。ｉｐｓｉ＿ＯｕｔＲｅｑｕｅｓｔｓは、ローカルのＩＰユーザプロトコル（ＩＣＭＰを含む）が送信を求めてＩＰに供給したＩＰデータグラムの総数である。ｉｐｓｉ＿ＲｏｕｔｉｎｇＤｉｓｃａｒｄｓは、有効であるにも関わらず破棄することを選択されたルーティングエントリの数である。ｉｐｓｉ＿ＯｕｔＤｉｓｃａｒｄｓは、その宛先への送信を妨げるような問題は生じなかったものの破棄された（例えばバッファ空間の不足のために）出力ＩＰデータグラムの数である。ｉｐｓｉ＿ＯｕｔＮｏＲｏｕｔｅｓは、その宛先に送信するルートが見つからなかったために破棄されたＩＰデータグラムの数である。ｉｐｓｉ＿ＲｅａｓｍＴｉｍｅｏｕｔは、受信したフラグメントがホストでリアセンブリを待つ間にそのフラグメントを保持しておく最大秒数である。ｉｐｓｉ＿ＲｅａｓｍＲｅｑｄｓは、ホストでリアセンブリする必要があった受信ＩＰフラグメントの数である。ｉｐｓｉ＿ＲｅａｓｍＯＫは、リアセンブリが成功したＩＰデータグラムの数である。ｉｐｓｉ＿ＲｅａｓｍＦａｉｌｓは、ＩＰリアセンブリアルゴリズムによって検出された失敗（例えばタイムアウト、エラーなど）の数である。ｉｐｓｉ＿ＦｒａｇＯＫｓは、ホストでフラグメント化が成功したＩＰデータグラムの数である。ｉｐｓｉ＿ＦｒａｇＦａｉｌｓは、ホストでフラグメント化する必要があったものの、例えばそのＤｏｎ’ｔ  Ｆｒａｇｍｅｎｔフラグがセットされていたためにフラグメント化できなかったために破棄されたＩＰデータグラムの数である。ｉｐｓｉ＿ＦｒａｇＣｒｅａｔｅｓは、ホストにおけるフラグメント化の結果生成されたＩＰデータグラムフラグメントの数である。ｉｐｓｉ＿ＮｕｍＩｆは、使用可能なインタフェースの総数である。ｉｐｓｉ＿ＮｕｍＡｄｄｒは、システムにおける一意のＩＰアドレスの総数である。ｉｐｓｉ＿ＮｕｍＲｏｕｔｅｓは、現在アクティブなルートの総数である。
【００７２】
本発明は、オフロードされたネットワークコネクションを周辺機器からホストにアップロードする方法も提供する。アップロードは多くの理由で行われる。これらに限定しないが、例として理由のいくつかを以下に挙げる。ルートが変化し、トラフィックを別のインタフェースで送ることが必要となる場合がある。コネクショントラフィックの振る舞いが変化し、もはやオフロードに適さなくなる場合がある。例えば、不十分なトラフィック、アクティビティの不足などがある可能性があり、あるいはコネクションが設定時間よりも長い時間にわたってフロー制御されている場合がある（例えばウィンドウの更新が受信されないなど）。また、周辺機器が特定の機能をサポートできないことがあり、またＩＰフラグメントが多すぎる、順序外れのトラフィックが多すぎる、処理能力外のデータの使用がある、再送が多すぎる、ｋｅｅｐ−ａｌｉｖｅを経過した、セキュリティアソシエーションが無効になり更新されていない、周辺機器に転送中のデータが多すぎるなどの場合にトラフィックの振る舞いがオフロードに適さない場合がある。オフロードされたコネクションをアップロードする他の理由は、リソース問題によるものである。例えば、周辺機器でコネクションの処理を継続するためのリソースが不足する可能性がある。オフロードされたコネクションよりも別のコネクションの優先順位が高く、周辺機器のリソース可用性が閾値以下である際にコネクションをアップロードすることにより、優先順位がより高いコネクションが周辺機器のリソースを使用し続けることが可能になる場合がある。
【００７３】
システムリソースが変化し、オフロードされたコネクションを処理するリソースがホストプロセッサに生じる場合がある。チムニーが、元のオフロードとは異なるリソースを必要とする場合がある（例えばセキュリティフィルタの変更など）。ホストは、周辺機器のリソースが、ホストプロセッサでオフロードコネクションを処理する方が効率的であると思われる閾値レベルに近づいていることを判定することができる。この閾値には、例えばトラフィックサイズ（バイト数又はパケット数）、フラグメント数、ウィンドウサイズ、オフロードのタイプなどが含まれる。
【００７４】
次いで図７を参照すると、アップロードは周辺機器２０４（例えばＮＩＣ１７０）又はＴＬＩスイッチ３０６によって開始される。コネクションは様々な理由によりアップロードすることができる。この理由には、コネクションが別の周辺機器に移る、媒体の切断が生じる、順序外れのセグメントが多すぎる、周辺機器２０４に転送されるデータが多すぎる、アプリケーション２００がバッファを事前にポストしない、ＩＰフラグメントが多すぎる、低処理能力のコネクション、及び再送が多すぎる、などがある。
【００７５】
図７では、ＴＬＩスイッチ３０６によってアップロードが開始されている（ライン７００）。ＮＩＣ１７０がアップロードを開始する場合は、ライン７００がないことに留意されたい。アップロードが開始されると、ＮＩＣ１７０はすべての未処理の要求を適切な状態で完了し、委託されたトランスポート層の状態をスイッチ層に渡す（ライン７０２）。ＮＩＣ１７０は、送信を完了しない、あるいは受信バッファを完全に埋めないこともある。ＮＩＣ１７０は単に、すべての送信及び受信の状態が、トランスポート層３００に戻される委託状態と同期されることを保証する。ＴＬＩスイッチ３０６は、以降の送信要求をすべてキューに入れ、受信バッファのポストを停止する。ＴＬＩスイッチ３０６は、委託されたトランスポート状態を制御するようにトランスポート層に命令する（ライン７０４）。トランスポート層３００は、それが受信するセグメントをＮＩＣ１７０に転送するのをやめ、委託された状態を制御し、ＴＬＩスイッチ３０６に完了メッセージを送る（ライン７０６）。ＴＬＩスイッチ３０６は、トランスポート層３００が委託されたトランスポート状態を制御し始めた旨の確認を受け取ると、ＮＩＣ１７０へアップロードを確認し（ライン７０８）、それによりＮＩＣ１７０はリソースを解放することができる。トランスポート層３００はまた、ＴＬＩスイッチ３０６に完了メッセージを送る前又は後にネットワーク層３０２にコネクションのアップロードを通知する（ライン７１０）。
【００７６】
トランスポート層３００は、それが委託された状態の管理権を得るまで、オフロードされたコネクションに対する着信データパケットを処理のためにＮＩＣ１７０に転送することに留意されたい。ＮＩＣ１７０が委託された状態をＴＬＩスイッチ３０６に渡した（ライン７０２）時から、トランスポート層３００が委託された状態を管理し始める時（ライン７０６）までにデータパケットが到着する可能性がある。ＮＩＣ１７０は、委託された状態をＴＬＩスイッチ３０６に渡すと、もはや着信データパケットを処理することはできない。ＮＩＣ１７０は、アップロードするコネクションへの着信パケットを受信すると、トランスポート層３００にエラーメッセージを送ってアップロードが進行中であることを知らせ、着信パケットを破棄することができる。エラーメッセージは、トランスポート層３００に着信データの転送を止めるように通知する。一実施形態では、トランスポート層３００はそれが委託された状態を受け取るまで、以後のデータをバッファに入れる。
【００７７】
中間ソフトウェア層により複数のコネクションを周辺機器にオフロードすることができる。中間ソフトウェア層から周辺機器にオフロードされたコネクションの数の参照カウンタが、中間ソフトウェア層によって保持される。参照カウントがゼロになると、次の中間ソフトウェア層に対してアップロード要求が生成される。これにより次の層の参照カウントがデクリメントされる。次の層の参照カウントがゼロになると、アップロード要求はネットワークスタック２０２を下へと進む。このプロセスは、ある中間ソフトウェア層の参照カウントがゼロにならないか、又は周辺機器がアップロード要求を受け取るまで繰り返される。ネットワーク層３０２は、ＮＩＣ１７０と関連付けられたオフロードされた状態オブジェクトの数の参照カウントをデクリメントする。参照カウントがゼロになった場合、ネットワーク層３０２のためにＮＩＣ１７０で割り振られたリソースを使用しているＴＣＢはないことになる。参照カウントがゼロになると、ネットワーク層３０２はＮＩＣ１７０にメッセージを送って、ネットワーク層３０２の状態オブジェクトをアップロードさせ、委託されたネットワークの状態変数をネットワーク層３０２に送らせる（ライン７１２）。ＮＩＣ１７０は状態を削除し、委託されたネットワーク状態変数とＮＩＣ１７０が使うことになっていた次のＩＰＩＤ値とをネットワーク層３０２に送る（ライン７１４）。ネットワーク層３０２はこの情報を格納して、再びコネクションがオフロードされた場合に初期値として使用する。ネットワーク層３０２はフレーミング層３０４にもメッセージを送って、フレーミング層３０４にその参照カウントをデクリメントさせる（ライン７１６）。
【００７８】
フレーミング層３０４も参照カウントを保持し、ネットワーク層３０２からのメッセージを受け取るとその参照カウントをデクリメントする。フレーミング層３０４の参照カウントがゼロになると、フレーミング層はフレーミング層の状態を削除するようにＮＩＣ１７０にメッセージを送る（ライン７１８）。ＮＩＣ１７０はＮＩＣ１７０中の状態変数を削除し、委託された状態変数があればそれをフレーミング層に送る（ライン７２０）。フレーミング層３０４はネットワーク層３０２に完了メッセージを送り（ライン７２２）、ネットワーク層３０２はトランスポート層に完了メッセージを送る（ライン７２４）。
【００７９】
ＴＣＰコネクションでは、その寿命の任意の時点でＩＰＳＥＣなどのセキュリティプロトコルを使用したセキュアなコネクションを使用することが必要とされる場合がある。コネクションがＩＰセキュアであり、周辺機器２０４がセキュリティに対応することができない場合、そのコネクションはオフロードすることができない。セキュアなＩＰコネクションをオフロードする際には、セキュリティアソシエーションの状態をＣＯＮＳＴ、ＣＡＣＨＥＤ、及びＤＥＬＥＧＡＴＥＤ変数に分割し、上述のように処理する。ホストプロセッサ１２０は、鍵のネゴシエーションなどの制御メッセージを管理する。周辺機器２０４は、セキュリティアソシエーションの状態変数を使用してすべての必要なＩＰＳＥＣのデータ操作を行う。
【００８０】
次いで図８を参照すると、セキュアコネクションをオフロードするステップを示している。以下の説明では、ステップは上述の図４に示したステップと同じであり、繰り返して説明しない。説明のためにトランスポートモードで動作するＩＰＳＥＣコネクションを使用する。ＩＰＳＥＣ層のオフロードは、トランスポート層３００が、ＴＬＩスイッチのリソース情報にＴＣＰリソース情報を追加してオフロード要求をＩＰＳＥＣ層８００に送る（ライン４０２ａ）と開始する。ＩＰＳＥＣ層８００は、ＴＣＰリソース情報及びＴＬＩスイッチリソース情報にＩＰＳＥＣリソース要件を追加してネットワーク層３０２にオフロード要求を送る（ライン８０２）。リソース要件には、ＩＰＳＥＣ層がオフロードしたいセキュリティアソシエーションの数が含まれる。ＮＩＣがオフロード要求を受け入れる場合、ＮＩＣはセキュリティアソシエーションを処理するためのリソースを割り振る。ネットワーク層３０２は、パラメータの連結リストとディスパッチテーブルを含む完了メッセージをトランスポート層３００ではなくＩＰＳＥＣ層に送る（ライン８０４）。
【００８１】
ＩＰＳＥＣ層８００は完了メッセージを受け取ると、ＩＰＳＥＣ層の状態が以前にオフロードされていない場合は、インバウンド記述子及びアウトバウンド記述子の一部としてＩＰＳＥＣ層の状態をＮＩＣ１７０に送り、セキュリティアソシエーション中の委託された状態の所有権をＮＩＣ１７０に移す（ライン８０６）。状態がすでにオフロードされている場合、ＩＰＳＥＣ層は参照カウントをインクリメントする。所有権が移されると、ＮＩＣ１７０がすべてのパケットの解読及び暗号化を行う。ＩＰＳＥＣ層７００は、パラメータの連結リスト及びディスパッチテーブルを含む完了メッセージをトランスポート層に送る（ライン４１４ａ）。
【００８２】
ＩＰＳＥＣ層８００からＮＩＣ１７０に渡されるＣＯＮＳＴ状態変数は、パケットを特定のセキュリティアソシエーションに分類するのに必要な情報と、インバウンド及びアウトバウンドのセキュリティアソシエーションに固有の情報とからなる。ＣＯＮＳＴ変数には、送信元及び宛先のポート、プロトコルタイプ、及びセキュリティアソシエーション変数が含まれる。
【００８３】
ＣＡＣＨＥＤ状態変数は、セキュリティアソシエーションの寿命を決定する要素、及びインバウンド及びアウトバウンドのセキュリティアソシエーションに固有の情報からなる。ＣＡＣＨＥＤ変数は、暗号化されたバイトに基づくソフトリミット（例えばバイトカウントでリキー（rekey））及びハードリミット（例えばバイトカウントで停止）、セキュリティアソシエーションを使用できる最大回数についてのソフトリミット（例えば所定のティックにおけるリキー）及びハードリミット（例えば所定のティックにおける停止）、及びセキュリティアソシエーションの使用が可能な最大アイドル時間についてのハードリミット（例えば最大アイドルティック）を含む。ＮＩＣ１７０は、これらのソフトリミットとハードリミットに従う。ソフトリミットに達すると、ＮＩＣ１７０はホストプロセッサ１２０に通知する。ハードリミットに達すると、ＮＩＣ１７０はセキュリティアソシエーションを破棄する。
【００８４】
ＤＥＬＥＧＡＴＥＤ変数は、実行情報とインバウンド及びアウトバウンドのセキュリティアソシエーションに固有の情報を含む。ＤＥＬＥＧＡＴＥＤ変数は、セキュリティアソシエーションで暗号化又は解読されたバイト数、セキュリティアソシエーションの寿命、及びセキュリティアソシエーションのアイドル時間を含む。
【００８５】
次いで図９を参照すると、周辺機器からホストへのオフロードされたＩＰＳＥＣによるネットワークコネクションのアップロードを示している。以下の説明で、ステップは図７に示した上述のステップと同じであり、繰り返して説明しない。トランスポート層３００は、完了メッセージをスイッチ層３０６に送る前又は後にＩＰＳＥＣ層８００にコネクションのアップロードを通知する（ライン７１０ａ）。すべてのセキュリティアソシエーションと関連付けられた参照カウントをデクリメントする。ゼロになる参照カウントがない場合、ＩＰＳＥＣ層８００はトランスポート層３００に完了メッセージを送る（ライン７２４ａ）。オフロードされているコネクションが特定のセキュリティアソシエーションを使用した最後のコネクションである場合、ＩＰＳＥＣ層８００は、委託された状態変数をＩＰＳＥＣ層８００にアップロードするようにＮＩＣ１７０にメッセージを送る（ライン９００）。ＮＩＣ１７０は、委託された状態変数をＩＰＳＥＣ層８００に戻す（ライン９０２）。ＮＩＣ１７０は、そのセキュリティアソシエーションの使用をやめ、そのセキュリティアソシエーションに属するパケットをスタック２０２を通じてＩＰＳＥＣ層８００に送る。ＩＰＳＥＣ層８００はＮＩＣ１７０に完了メッセージを送り、ＮＩＣ１７０はそのセキュリティアソシエーションに割り振られたリソースを解放する（ライン９０４）。
【００８６】
セキュリティアソシエーションの参照カウントがゼロになる場合、ＩＰＳＥＣ層８００はネットワーク層３０２にもメッセージを送ってアップロードされる状態をネットワーク層３０２に通知する（ライン９０６）。フレーミング層３０４がネットワーク層３０２に完了メッセージを送ると（ライン７２２）、ネットワーク層３０２はＩＰＳＥＣ層に完了メッセージを送る（ライン９０８）。ＩＰＳＥＣ層８００は、トランスポート層に完了メッセージを送る（ライン７２４ａ）。
【００８７】
トランスポート層３００、ネットワーク層３０２、フレーミング層３０４、又はＩＰＳＥＣ層８００の状態がオフロードされている最中に、更新（例えばＡＲＰの更新やＲＩＰの更新）が到着する可能性がある。完了メッセージを受け取る前に更新が発生した場合は単にローカル状態を更新し、オフロード要求とともに状態オブジェクトが送信された場合はフラグをセットして状態が変化したことを知らせる。
【００８８】
キャッシュされた状態を更新するＮＩＣの更新ルーチンの呼び出し中に更新が発生した場合は、可能性のある競合が存在する。別個のメッセージが状態を更新し、ＮＩＣの更新ルーチンを呼び出した場合は、スケジューリングの問題のためにＮＩＣが２番目の呼び出しを最初に見、元の更新が到着した際に古いデータを使用することになる可能性がある。古いデータが使用されると、次の更新が到着するまで間違ったエントリが使用されることになり、その結果多量のデータが間違った場所に送られるか、又はドロップされる可能性がある。この競合状態には２つの可能な解決策がある。第１の可能な解決策は、常に完了メッセージで２番目の更新を行わせるものであるが、多数の更新が入ってくる場合には反復の問題が生じる可能性がある。第２の可能な解決策は、更新に通し番号をつけて常に最も新しい通し番号を使用することである。
【００８９】
ＩＰＳＥＣがサポートする別の動作モードはトンネリングであり、トンネリングではセキュアコネクションの一部としてデータパケットを新しいパケットの中にカプセル化する。トンネルは、ネットワークスタック２０２にとっては仮想のインタフェースとして見える。ＩＰＳＥＣトンネルをオフロードするステップは、トランスポートモードでＩＰＳＥＣコネクションをオフロードするステップと同様である。トランスポートモードでは、ＩＰＳＥＣヘッダはＩＰヘッダとＴＣＰヘッダの間に置かれる。トンネルモードではＵＤＰを使用してトンネルを提供する。ヘッダチェーンは、ＴＣＰヘッダ、ＩＰＳＥＣヘッダ、ＵＤＰヘッダ、ＩＰヘッダ、フレーミング層ヘッダの順である。トンネルを確立するために、ネゴシエートされたセキュリティコネクションを記述するインバウンド記述子及びアウトバウンド記述子を周辺機器に送る。この記述子は、コネクションの状態変数とコネクションを確立するのに必要なその他の情報を含んでいる。トンネルのＣＡＣＨＥＤ及びＤＥＬＥＧＡＴＥＤ状態変数は、トランスポートモードのＣＡＣＨＥＤ及びＤＥＬＥＧＡＴＥＤ状態変数と同じである。トンネルのＣＯＮＳＴ状態変数には、送信元及び宛先ポート、ローカルアドレス、リモートアドレス、プロトコルタイプ、及びセキュリティアソシエーション変数が含まれる。
【００９０】
ホストプロセッサとの緊密な同期を維持する、ネットワークスタックコネクションを周辺機器にオフロード及びアップロードする方法について説明した。この方法は多くのプロトコルに使用することができる。使用できるプロトコルには例えばＴＣＰ、ＳＣＴＰなどがある。
【００９１】
本発明の原理を適用できる多くの可能な実施形態に照らすと、図面との関係でここに説明した実施形態は例証的なものに過ぎず、本発明の範囲を制限するものと解釈すべきでないことが認識されよう。例えば、当業者は、ソフトウェアとして示した例証的な実施形態の要素はハードウェアに実装してもよく、その反対も可能であること、あるいは本発明の趣旨から逸脱することなくここに説明した実施形態の構成及び詳細を変更できることを理解されよう。したがって、ここに記載した本発明は、特許請求の範囲及びその均等物の範囲内に該当するすべての実施形態を企図する。
【符号の説明】
【００９２】
１００  コンピューティングシステム環境
１１０、１８０  コンピュータ
１２０  プロセッサ
１２１  システムバス
１３０  システムメモリ
１３１  ＲＯＭ
１３２  ＲＡＭ
１３３  ＢＩＯＳ
１３４、１４４  オペレーティングシステム
１３５、１４５、１８５、２００  アプリケーションプログラム
１３６、１４６  プログラムモジュール
１３７、１４７  プログラムデータ
１４０、１５０、１６０  インタフェース
１４１  ハードディスクドライブ
１５１  磁気ディスクドライブ
１５２  磁気ディスク
１５５  光ディスクドライブ
１５６  光ディスク
１６１  ポインティングデバイス
１６２  キーボード
１７０  ＮＩＣ
１７１  ＬＡＮ
１７２  モデム
１７３  ＷＡＮ
１８１  メモリ記憶装置
１９０  ビデオインタフェース
１９１  モニタ
１９５  出力周辺インタフェース
１９６  プリンタ
１９７  スピーカ
２０２  ネットワークスタック
２０４  周辺機器
２０６  中間ソフトウェア層
２０８、３０６  スイッチ
２１０、３０８  チムニー
３００  トランスポート層
３０２  ネットワーク層
３０４  フレーミング層
３１０  ＮＤＩＳミニドライバ
３１４  ハードウェア
５００  逆ツリー
５０２、５０４、５０６、５０８、５１０、５１２、５１４、５１６  エントリ
【図１】
2011018373.tif 000005
【図２】
2011018373.tif 000006
【図３】
2011018373.tif 000007
【図４】
2011018373.tif 000008
【図５Ａ】
2011018373.tif 000009
【図５Ｂ】
2011018373.tif 000010
【図５Ｃ】
2011018373.tif 000011
【図５Ｄ】
2011018373.tif 000012
【図６】
2011018373.tif 000013
【図７】
2011018373.tif 000014
【図８】
2011018373.tif 000015
【図９】
2011018373.tif 000016