[0030] 例の方法、デバイス、およびシステムを、本明細書で説明する。単語「例」および「例示的」が、本明細書では「例、実例、または例証として働く」を意味するのに使用されることを理解されたい。「例」または「例示的」として本明細書で説明されるすべての実施形態または特徴が、そのように述べられない限り、必ずしも他の実施形態または特徴より好ましいまたは有利と解釈されるべきではない。したがって、本明細書で提示される主題の範囲から逸脱せずに、他の実施形態を利用することができ、他の変更を行うことができる。
[0031] したがって、本明細書で説明される例の実施形態は、限定的であることを意図されたものではない。本明細書で全般的に説明され、図面に示された本開示の諸態様を、様々な異なる構成で配置し、置換し、組み合わせ、分離し、設計することができることが、たやすく理解されよう。たとえば、「クライアント」構成要素および「サーバー」構成要素への特徴の分離を、複数の形で行うことができる。
[0032] さらに、文脈がそうではないことを暗示しない限り、図面のそれぞれに示された特徴を、お互いと組み合わせて使用することができる。したがって、すべての図示された特徴が各実施形態に必要とは限らないことを理解しての上で、図面は、全般的に、1つまたは複数の全体的な実施形態の構成要素態様と見なされなければならない。
[0033] さらに、本明細書または特許請求の範囲での要素、ブロック、またはステップのすべての列挙は、明瞭さのためのものである。したがって、これらの要素、ブロック、またはステップが特定の配置を厳守しまたは特定の順序で実行されることをそのような列挙が要求しまたは意味すると解釈してはならない。
I.例のコンピューティング・デバイスおよびその上でのパケット・キャプチャ
[0034] 上で注記したように、従来のコンピューティング・デバイス上でのパケット・キャプチャは、これらのデバイスが着信パケットの高い持続的レートの処理に最適化されていないことに起因して制限されている。このセクションは、これらのデバイスのボトルネックに焦点を合わせて、比較のためにこれらのデバイスを再検討する。このセクションは、キャプチャされたパケットを記憶するための人気のあるファイル・フォーマットをも紹介する。
A.例のコンピューティング・デバイス
[0035] 図1は、コンピューティング・デバイス100を例示し、そのようなコンピューティング・デバイス内に含まれ得る構成要素の一部を示す、単純化されたブロック図である。コンピューティング・デバイス100は、クライアント・デバイス(たとえば、ユーザによって能動的に操作されるデバイス)、サーバー・デバイス(たとえば、クライアント・デバイスに計算サービスを提供するデバイス)、またはなんらかの他のタイプの計算プラットフォームとすることができる。
[0036] この例では、コンピューティング・デバイス100は、プロセッサ102、メモリ104、ネットワーク・インターフェース106、および入出力ユニット108を含み、これらのすべてが、システム・バス110または同様の機構によって結合され得る。いくつかの実施形態では、コンピューティング・デバイス100は、他の構成要素および/または周辺デバイス(たとえば、取り外し可能なストレージ、プリンタなど)を含むことができる。
[0037] プロセッサ102は、中央処理装置(CPU)、コプロセッサ(たとえば、数学コプロセッサ、グラフィックス・コプロセッサ、または暗号コプロセッサ)、デジタル信号プロセッサ(DSP)、ネットワーク・プロセッサ、および/またはプロセッサ動作を実行する、ある形の集積回路またはコントローラなど、任意のタイプのコンピュータ処理ユニットのうちの1つまたは複数を表すことができる。いくつかの場合に、プロセッサ102は、シングルコア・プロセッサとすることができ、他の場合に、プロセッサ102は、複数の独立な処理ユニットを有するマルチコア・プロセッサとすることができる。プロセッサ102は、実行される命令および関連データを一時的に記憶するレジスタ・メモリならびに最近使用された命令およびデータを一時的に記憶するキャッシュ・メモリをも含むことができる。
[0038] メモリ104は、レジスタ・メモリおよびキャッシュ・メモリ(プロセッサ102内に組み込まれる場合がある)ならびにランダム・アクセス・メモリ(RAM)、読取専用メモリ(ROM)、および不揮発性メモリ(たとえば、フラッシュ・メモリ、ハード・ディスク・ドライブ(HDD)、ソリッド・ステート・ドライブ(SSD)、コンパクト・ディスク(CD)、デジタル・ビデオ・ディスク(DVD)、および/またはテープ・ストレージ)を含むがこれらに限定されない、任意の形のコンピュータ使用可能メモリとすることができる。他のタイプのメモリを使用することができる。いくつかの実施形態で、メモリ104は、Internet Small Computer Systems Interface(iSCSI)などのリモート・メモリを含むことができる。
[0039] メモリ104は、プログラム命令および/またはプログラム命令が作用することのできるデータを記憶することができる。図1に示されているように、メモリは、ファームウェア104A、カーネル104B、および/またはアプリケーション104Cを含むことができる。ファームウェア104Aは、コンピューティング・デバイス100の一部またはすべてをブートしまたは他の形で開始するのに使用されるプログラム・コードとすることができる。カーネル104Bは、メモリ管理、プロセスのスケジューリングおよび管理、入出力、ならびに通信のためのモジュールを含む、オペレーティング・システムとすることができる。カーネル104Bは、オペレーティング・システムがコンピューティング・デバイス100のハードウェア・モジュール(たとえば、メモリ・ユニット、ネットワーキング・インターフェース、ポート、およびバス)と通信することを可能にするデバイス・ドライバをも含むことができる。アプリケーション104Cは、ウェブ・ブラウザまたは電子メール・クライアントなどの1つまたは複数のユーザ空間ソフトウェア・プログラムならびにこれらのプログラムによって使用される任意のソフトウェア・ライブラリとすることができる。ファームウェア104A、カーネル104B、およびアプリケーション104Cのそれぞれは、関連するデータ(図示せず)をメモリ104内に記憶することができる。
[0040] ネットワーク・インターフェース106は、イーサネット(たとえば、Fast Ethernet、Gigabit Ethernetなど)などの1つまたは複数の有線インターフェースを含むことができる。ネットワーク・インターフェース106は、同軸ケーブルもしくは電力線などの非イーサネット媒体またはSynchronous Optical Networking(SONET)もしくはデジタル加入者線(DSL)技術などの広域媒体を介する通信をサポートすることもできる。ネットワーク・インターフェース106は、IEEE 802.11(Wifi)、BLUETOOTH(登録商標)、全地球測位システム(GPS)、または広域無線インターフェースなど、1つまたは複数の無線インターフェースをさらに含むことができる。しかし、他の形態の物理層インターフェースおよび他のタイプの標準的なまたはプロプライエタリな通信プロトコルを、ネットワーク・インターフェース(1つまたは複数)106を介して使用することができる。一例として、コンピューティング・デバイス100のいくつかの実施形態は、イーサネット・インターフェース、BLUETOOTH(登録商標)インターフェース、およびWifiインターフェースを含むことができる。
[0041] 入出力ユニット108は、コンピューティング・デバイス100とのユーザおよび周辺デバイスの相互作用を容易にすることができる。入出力ユニット108は、キーボード、マウス、タッチ・スクリーン、その他など、1つまたは複数のタイプの入力デバイスを含むことができる。同様に、入出力ユニット108は、スクリーン、モニタ、プリンタ、および/または1つもしくは複数の発光ダイオード(LED)など、1つまたは複数のタイプの出力デバイスを含むことができる。それに加えてまたはその代わりに、コンピューティング・デバイス100は、たとえばuniversal serial bus(USB)ポート・インターフェースまたはhigh−definition multimedia interface(HDMI)ポート・インターフェースを使用して他のデバイスと通信することができる。
[0042] コンピューティング・デバイス100を、パケット・キャプチャに使用することができる。具体的には、カーネル104Bおよびアプリケーション104Cに対する変更が、そのようなキャプチャを容易にすることができる。コンピューティング・デバイス100は、ネットワーク・インターフェース106によってパケットを受信し、任意選択でこれらのパケットをカーネル104B内でフィルタリングし、その後、フィルタリングされたパケットをパケット・キャプチャ・アプリケーションに供給することができる。後者は、アプリケーション104Cのうちの1つとすることができる。いくつかの場合に、フィルタリングは、パケット・キャプチャ・アプリケーション自体で行われ得る。いずれにせよ、パケット・キャプチャ・アプリケーションは、記憶および/または表示のために一連のパケットを入手することができる。
B.例のプロトコル・スタック
[0043] 図2は、コンピューティング・デバイス100などの汎用コンピュータのプロトコル・スタックを示す。キャプチャされたパケットは、プロトコル・スタック200の少なくとも一部をトラバースすることができる。
[0044] プロトコル・スタック200は、2つの全般的なセクションすなわちカーネル空間およびユーザ空間に分割される。カーネル空間モジュールは、オペレーティング・システム機能を実行し、ユーザ空間モジュールは、特定のタイプのカーネルをサポートするコンピューティング・デバイス上で実行するように設計され得るエンドユーザ・アプリケーションまたはエンドユーザ・サービスである。したがって、ユーザ空間モジュールは、カーネルによって提供されるメモリ管理サービス、通信サービス、および入出力サービスに頼ることができる。図2のカーネル空間は、図1のカーネル104B一部を参照することができ、図2のユーザ空間は、図1のアプリケーション104Cの一部を参照することができる。
[0045] 一般に、プロトコル・スタック200は、より多数またはより少数のソフトウェア・モジュールを含む可能性がある。具体的には、カーネル空間は、オペレーティング・システム動作を実行する追加のカーネル空間ソフトウェア・モジュールを含む可能性があり、ユーザ空間は、アプリケーション動作を実行する追加のユーザ空間ソフトウェア・モジュールを含む可能性がある。
[0046] Wifiドライバ・モジュール202は、1つまたは複数の物理Wifiハードウェア構成要素を動作させ、かつ/または制御する、カーネル空間ソフトウェア・モジュールとすることができる。いくつかの実施形態で、Wifiドライバ・モジュール202は、Wifiハードウェアへのソフトウェア・インターフェースを提供し、コンピューティング・デバイス100のカーネル104Bが、使用されるWifiハードウェアの正確な制御機構を知る必要なしにWifiハードウェア機能にアクセスすることを可能にする。データ・パケットがWifiハードウェアによって送信されまたは受信される時に、これらのパケットは、Wifiドライバ・モジュール202を通過することができる。
[0047] 同様に、イーサネット・ドライバ・モジュール204は、1つまたは複数の物理イーサネット・ハードウェア構成要素を動作させ、かつ/または制御する、カーネル空間ソフトウェア・モジュールである。いくつかの実施形態で、イーサネット・ドライバ・モジュール204は、イーサネット・ハードウェアへのソフトウェア・インターフェースを提供し、コンピューティング・デバイス100のカーネル104Bが、使用されるイーサネット・ハードウェアの正確な制御機構を知る必要なしにイーサネット・ハードウェア機能にアクセスすることを可能にする。データ・パケットがイーサネット・ハードウェアによって送信されまたは受信される時に、これらのパケットは、イーサネット・ドライバ・モジュール204を通過することができる。
[0048] プロトコル・スタック200は、図2に示されていない他のドライバ・モジュールをも含む場合がある。たとえば、BLUETOOTH(登録商標)ドライバ・モジュール、セルラ・ドライバ・モジュール、および/またはGPSドライバ・モジュールが、プロトコル・スタック200に組み込まれる場合がある。さらに、Wifiドライバ・モジュール202およびイーサネット・ドライバ・モジュール204のいずれかまたは両方が省略される場合がある。
[0049] 低水準ネットワーキング・モジュール206は、ドライバ・ソフトウェア・モジュールとネットワーク層ソフトウェア・モジュール(たとえば、IPv6モジュール210およびIPv4モジュール212)との間でインバウンド・データ・パケットおよびアウトバウンド・データ・パケットをルーティングする。したがって、低水準ネットワーキング・モジュール206は、ソフトウェア・バスまたはスイッチング機構として働くことができ、おそらく、ドライバ・ソフトウェア・モジュールとネットワーク層ソフトウェア・モジュールとの間のアプリケーション・プログラミング・インターフェースを提供することができる。たとえば、低水準ネットワーキング・モジュール206は、インバウンド・データ・パケットがIPv6モジュール210およびIPv4モジュール212のうちの1つにルーティングされ得るようにするためにインバウンド・データ・パケットがその中に配置される1つまたは複数のキューと、アウトバウンド・データ・パケットがWifiドライバ・モジュール202およびイーサネット・ドライバ・モジュール204のうちの1つにルーティングされ得るようにするためにアウトバウンド・データ・パケットがその中に配置される1つまたは複数のキューとを含むことができる。いくつかの実施形態で、低水準ネットワーキング・モジュール206は、別々のカーネル空間ソフトウェア・モジュールとしては存在しない場合があり、その機能性は、その代わりに、ドライバ・モジュールおよび/またはネットワーク層(たとえば、IPv6および/またはIPv4)ソフトウェア・モジュールに組み込まれ得る。
[0050] IPv6モジュール210は、インターネット・プロトコル・バージョン6(IPv6)を動作させる。IPv6は、拡張されたアドレス空間、デバイス自動構成、単純化されたヘッダ、統合されたセキュリティおよびモビリティ・サポート、ならびに改善されたマルチキャスト能力を特徴とするインターネット・プロトコルのバージョンである。IPv6モジュール210は、上位層モジュール(TCPモジュール214およびUDPモジュール216のモジュールを含む)から受信したアウトバウンド・データ・パケットをIPv6ヘッダ内でカプセル化する。逆に、IPv6モジュール210は、低水準ネットワーキング・モジュール206から受信したインバウンドIPv6データ・パケットをカプセル化解除もする。図2には示されていないが、IPv6モジュール210は、IPv6に関連するエラー・メッセージおよび情報メッセージのサポートならびにマルチキャストおよびアドレス解決を提供するICMPv6モジュールに関連付けられ得る。
[0051] IPv4モジュール212は、インターネット・プロトコル・バージョン4(IPv4)を動作させる。IPv4は、IPv6より狭いアドレス空間を特徴とするインターネット・プロトコルのバージョンである。IPv6モジュール210と同様に、IPv4モジュール212は、上位層モジュール(TCPモジュール214およびUDPモジュール216のモジュールを含む)から受信したアウトバウンド・データ・パケットをIPv4ヘッダ内でカプセル化する。逆に、IPv4モジュール212は、低水準ネットワーキング・モジュール206から受信したインバウンド・データ・パケットをカプセル化解除もする。図2には示されていないが、IPv4モジュール212は、単純なエラー報告、診断、およびデバイスの制限された構成、ならびに宛先が到達不能である時、パケットがあるルーターから別のルーターにリダイレクトされた時、または多すぎる転送ホップを経験したことに起因してパケットが破棄された時を報告するメッセージを提供するICMPv4モジュールに関連付けられ得る。
[0052] 本明細書で使用される時に、用語「インターネット・プロトコル」および「IP」は、IPv6およびIPv4の一方または両方を指す可能性がある。
[0053] TCPモジュール214は、伝送制御プロトコル(TCP)を動作させる。TCPは、ネットワーキング・プロトコル・スタックのトランスポート層で動作する、信頼性のあるエンドツーエンド・プロトコルである。TCPは、TCP接続が明示的に確立され、破壊されるという意味で、コネクション指向である。TCPは、送信側と受信側との間のありそうなパケット消失を検出し、潜在的に失われたパケットを再送することのできる機構を含む。TCPは、送信側が受信側からデータの少なくとも一部の肯定応答を受信する前に、制限された量のデータのみが、送信側によって送信され得、送信側が、過剰な量のデータで中間ネットワークを氾濫させるのを防ぐために輻輳制御機構を動作させることができるという点で、変更されたスライディング・ウィンドウ・プロトコルでもある。
[0054] UDPモジュール216は、ユーザ・データグラム・プロトコル(UDP)を動作させる。UDPは、コネクションレスの、信頼性のないトランスポート層プロトコルである。TCPとは異なって、UDPは、UDPセッションに関する状態をほとんど維持せず、UDPパケット内に含まれるアプリケーション・データの配送を保証しない。
[0055] 高水準ネットワーキング・モジュール218は、(i)ユーザ空間ソフトウェア・モジュールと(ii)ネットワーク層またはトランスポート層のソフトウェア・モジュール(たとえば、TCPモジュール214およびUDPモジュール216)との間でインバウンド・データ・パケットおよびアウトバウンド・データ・パケットをルーティングする。したがって、高水準ネットワーキング・モジュール218は、ソフトウェア・バスまたはスイッチング機構として働くことができ、おそらく、ユーザ空間ソフトウェア・モジュールとトランスポート層ソフトウェア・モジュールとの間のアプリケーション・プログラミング・インターフェースを提供することができる。たとえば、高水準ネットワーキング・モジュール218は、インバウンド・データ・パケットがユーザ空間ソフトウェア・モジュールにルーティングされ得るようにするためにインバウンド・データ・パケットがその中に配置される1つまたは複数のキューと、アウトバウンド・データ・パケットがTCPモジュール214およびUDPモジュール216のうちの1つにルーティングされ得るようにするためにアウトバウンド・データ・パケットがその中に配置される1つまたは複数のキューとを含むことができる。いくつかの実施形態で、高水準ネットワーキング・モジュール218は、ユーザ空間ソフトウェア・モジュールがデータを送信し、受信するのに使用できる明確に定義された機能呼出しを提供するTCP/IPソケット・インターフェースとして実施され得る。
[0056] 上で注記したように、アプリケーション220およびアプリケーション222などのユーザ空間プログラムは、コンピューティング・デバイス100のユーザ空間内で動作することができる。これらのアプリケーションは、たとえば、電子メール・アプリケーション、ソーシャル・ネットワーキング・アプリケーション、メッセージング・アプリケーション、ゲーミング・アプリケーション、またはなんらかの他のタイプのアプリケーションとすることができる。カーネル空間へのインターフェース(たとえば、高水準ネットワーキング・モジュール218および/または他のインターフェース)を介して、これらのアプリケーションは、入出力動作を実行できる可能性がある。
[0057] これまでに説明された図2のモジュールは、着信(受信)および発信(送信)のパケットベース通信に使用されるソフトウェアを表す。着信パケットおよび発信パケットの処理の例を続ける。
[0058] イーサネット・ハードウェアは、コンピューティング・デバイス100にアドレッシングされたパケットを受信する時に、そのパケットをハードウェア・バッファ内にキューイングし、イーサネット・ドライバ・モジュール204に割込みを送ることができる。割込みに応答して、イーサネット・ドライバ・モジュール204は、ハードウェア・バッファからパケットを読み取り、パケットを妥当性検査し(たとえば、チェックサム動作を実行し)、パケットが配送されるべき上位層プロトコル(たとえば、IPv6モジュール210またはIPv4モジュール212)を判定し、イーサネット・ヘッダおよびトレイラ・バイトをはぎ取り、上位層プロトコルの指示と共にパケットを低水準ネットワーキング・モジュール206に渡すことができる。
[0059] 低水準ネットワーキング・モジュール206は、判定された上位層プロトコルのキューにパケットを配置することができる。さしあたり、このプロトコルがIPv4であると仮定すると、低水準ネットワーキング・モジュール206は、パケットをキューに配置することができ、そのキューから、パケットはIPv4モジュール212によって読み取られる。
[0060] IPv4モジュール212は、キューからパケットを読み取り、パケットを妥当性検査し(たとえば、チェックサム動作を実行し、パケットが所定の回数を超えて転送されなかったことを検証し)、パケットがフラグメントである場合には他のパケットと組み合わせ、パケットが配送されるべき上位層プロトコル(たとえば、TCPモジュール214またはUDPモジュール216)を判定し、IPv4ヘッダ・バイトをはぎ取り、判定された上位層プロトコルにパケットを渡すことができる。さしあたり、このプロトコルがTCPであると仮定すると、IPv4モジュール212は、パケットをTCPモジュール214に供給することができる。いくつかの場合に、これは、パケットをキューに配置することを伴う場合があり、あるいは、IPv4モジュール212が、パケットにアクセスできるメモリ・アドレスをTCPモジュール214に供給する場合がある。
[0061] TCPモジュール214は、キューからパケットを読み取り、パケットを妥当性検査し、すべての必要なTCP輻輳制御および/またはスライディング・ウィンドウ動作を実行し、パケットが配送されるべきアプリケーション「ソケット」を判定し、TCPヘッダ・バイトをはぎ取り、判定されたアプリケーションの指示と共にパケットのペイロードを高水準ネットワーキング・モジュール218に渡すことができる。この点で、「パケット」は、ヘッダを全く含まず、ほとんどの場合に、アプリケーション・データのブロックのみである。
[0062] 高水準ネットワーキング・モジュール218は、ソケット通信アプリケーション・プログラミング・インターフェースに関連するキューを含むことができる。各「ソケット」は、通信セッションを表すことができ、1つまたは複数のアプリケーションに関連付けられ得る。あるソケットに関してキューイングされた着信データは、最終的に、適当なアプリケーションによって読み取られ得る。さしあたり、パケットからのアプリケーション・データがアプリケーション220用であると仮定すると、高水準ネットワーキング・モジュール218は、アプリケーション220のソケットのキュー内にアプリケーション・データを保持することができる。
[0063] アプリケーション220は、ソケットからアプリケーション・データを読み取り、その後、このデータを処理することができる。この点で、着信パケット処理は終了している。
[0064] 発信パケット処理は、アプリケーション220などのアプリケーションが、ソケットにアプリケーション・データを書き込む時に始まるものとすることができる。ソケットは、たとえば、TCPソケットまたはUDPソケットとすることができる。アプリケーション・データがTCPソケットに関するものであると仮定すると、アプリケーション220は、高水準ネットワーキング・モジュール218にアプリケーション・データを供給することができ、高水準ネットワーキング・モジュール218は、TCPモジュール214のためにアプリケーション・データをキューイングすることができる。
[0065] TCPモジュール214は、キューからアプリケーション・データを読み取り、アプリケーション・データのTCPヘッダの内容を判定し、パケットを形成するためにTCPヘッダ内にアプリケーション・データをカプセル化することができる。TCPヘッダ内のフィールドの値は、関連するTCPセッションの状況ならびにアプリケーション・データの内容によって決定され得る。TCPモジュール214は、IPv6モジュール210またはIPv4モジュール212のいずれかにパケットを供給することができる。この判定は、アプリケーション・データがそこから読み取られたソケットのタイプに基づいて行うことができる。さしあたり、ソケット・タイプがIPv4を示すと仮定すると、TCPモジュール214は、パケットをIPv4モジュール212に供給することができる。いくつかの場合に、これは、パケットをキューに配置することを含む場合があり、あるいは、TCPモジュール214が、そこでパケットにアクセスできるメモリ・アドレスをIPv4モジュール212に供給する場合がある。
[0066] IPv4モジュール212は、パケットのIPv4ヘッダの内容を判定し、IPv4ヘッダ内にパケットをカプセル化することができる。IPv4ヘッダ内のフィールドの値は、アプリケーション・データがそこから読み取られたソケットならびにアプリケーション・データの内容によって決定され得る。IPv4モジュール212は、アウトバウンド・ハードウェア・インターフェースを判定するために、フォワーディング・テーブル内でパケットの宛先(たとえば、その宛先IPアドレス)をルック・アップすることができる。さしあたり、このインターフェースがイーサネット・ハードウェアであると仮定すると、IPv4モジュール212は、パケットがイーサネット・ドライバ・モジュール204のためにキューイングされなければならないことの指示と共に、パケットを低水準ネットワーキング・モジュール206に供給することができる。
[0067] 低水準ネットワーキング・モジュール206は、パケットを受信し、これをイーサネット・ドライバ・モジュール204のキュー内に配置することができる。代替案では、IPv4モジュール212は、パケットをイーサネット・ドライバ・モジュール204に直接に供給することができる。
[0068] いずれにせよ、イーサネット・ドライバ・モジュールは、パケットをイーサネット・ヘッダおよびトレイラ内にカプセル化し、そのパケットをイーサネット・ハードウェアに供給することができる。イーサネット・ハードウェアは、パケットを送信することができる。
[0069] いくつかの環境では、用語「フレーム」は、データリンク層でフレーム化されたデータ(すなわち、少なくともいくつかのヘッダ・バイトまたはトレイラ・バイトを付加されたアプリケーション・データ)を指すのに使用され、用語「パケット」は、ネットワーク(IP)層でフレーム化されたデータを指すのに使用され、用語「セグメント」は、トランスポート(TCPまたはUDP)層でフレーム化されたデータを指すのに使用される。単純さのために、術語「パケット」が、層に関わりなくフレーム化されたアプリケーション・データを表すのに使用される。
C.パケット・キャプチャ
[0070] プロトコル・スタック200およびそのモジュールのそれぞれによって実行される動作を考慮すると、パケット・キャプチャ・アーキテクチャが、着信(受信)パケットと発信(送信)パケットとの両方を傍受し、そのコピーをキャプチャできることが望ましい。パケット・キャプチャ・モジュール208は、この機能性を容易にするためにカーネル空間内に存在する。
[0071] Wifiドライバ・モジュール202、イーサネット・ドライバ・モジュール204、および低水準ネットワーキング・モジュール206のうちの1つまたは複数が、パケット・キャプチャ・モジュール208へのインターフェースを有することができる。このインターフェースは、これらのモジュールが、コンピューティング・デバイス100によって送信され、受信されるパケットのコピーをパケット・キャプチャ・モジュール208に供給することを可能にする。たとえば、Wifiドライバ・モジュール202およびイーサネット・ドライバ・モジュール204は、それらが受信するすべてのパケットのコピー(Wifiヘッダおよびイーサネット・ヘッダを含む)を、これらのパケットが最終的にコンピューティング・デバイス100にアドレッシングされない場合であっても、パケット・キャプチャ・モジュール208に供給することができる。さらに、Wifiドライバ・モジュール202およびイーサネット・ドライバ・モジュール204は、それらが送信するすべてのパケットのコピーを供給することができる。これは、コンピューティング・デバイス100によって生成されたパケットをもキャプチャすることを可能にする。
[0072] 受信されたパケットのキャプチャに関して、Wifiハードウェアおよび/またはイーサネット・ハードウェアなどのネットワーク・インターフェース・ハードウェア構成要素は、通常、コンピューティング・デバイス100によって使用されるアドレスと一致する宛先Wifiアドレスまたは宛先イーサネット・アドレスを有しないすべての着信パケットを破棄する。したがって、Wifiドライバ・モジュール202およびイーサネット・ドライバ・モジュール204は、コンピューティング・デバイス100によって使用されるアドレスと一致するWifi宛先アドレスまたはイーサネット宛先アドレスを有する着信パケットならびにマルチキャストまたはブロードキャストのWifi宛先アドレスまたはイーサネット宛先アドレスを有するすべての着信パケットだけを受信することができる。しかし、Wifiハードウェアおよび/またはイーサネット・ハードウェアを、「プロミスキャス・モード」にすることができ、その結果、これらの構成要素は、着信パケットを全く破棄しなくなる。その代わりに、通常はハードウェアによって破棄されるはずの着信パケットが、Wifiドライバ・モジュール202およびイーサネット・ドライバ・モジュール204に供給される。これらのモジュールは、パケットのコピーをパケット・キャプチャ・モジュール208に供給する。
[0073] いくつかの実施形態で、Wifiドライバ・モジュール202およびイーサネット・ドライバ・モジュール204は、着信パケットを低水準ネットワーキング・モジュール206に供給することができ、低水準ネットワーキング・モジュール206は、これらのパケットのコピーをパケット・キャプチャ・モジュール208に供給することができる。発信方向では、低水準ネットワーキング・モジュール206が、パケットのコピーをパケット・キャプチャ・モジュール208に供給することもできる。これらの発信パケット内のWifiおよびイーサネットのヘッダおよびトレイラ情報を供給するために、低水準ネットワーキング・モジュール206は、パケットをパケット・キャプチャ・モジュール208に供給する前に、パケットのWifiカプセル化およびイーサネット・カプセル化を実行することができる。低水準ネットワーキング・モジュール206は、これらのカプセル化されたパケットのコピーをWifiドライバ・モジュール202および/またはイーサネット・ドライバ・モジュール204に供給することもでき、Wifiドライバ・モジュール202および/またはイーサネット・ドライバ・モジュール204は、さらなるカプセル化の追加を控えることができ、その代わりに、受信されたままのパケットをそれらのそれぞれのハードウェア・インターフェースに供給することができる。
[0074] パケット・キャプチャ・モジュール208は、パケットをキャプチャするために、パケット・キャプチャ・アプリケーション224に従って動作することができる。具体的には、パケット・キャプチャ・アプリケーション224は、それを介して1つまたは複数のパケット・フィルタ式を入力できるユーザ・インターフェースを提供することができる。このユーザ・インターフェースは、グラフィカル・ユーザ・インターフェース、コマンド・ライン、またはファイルを含むことができる。
[0075] パケット・フィルタ式は、パケット・キャプチャ・アプリケーション224に配送されなければならないパケットを指定することができる。たとえば、パケット・フィルタ式「host 10.0.0.2 and tcp」は、IPアドレス10.0.0.2を有するコンピューティング・デバイスへおよびそのコンピューティング・デバイスからのすべてのTCPパケットをキャプチャすることができる。追加の例として、パケット・フィルタ式「port 67 or port 68」は、すべての動的ホスト構成プロトコル(DHCP)トラフィックをキャプチャすることができ、パケット・フィルタ式「not broadcast and not multicast」は、ユニキャスト・トラフィックだけをキャプチャすることができる。
[0076] パケット・フィルタ式は、上で示したように、「and」、「or」、および「not」などの論理的な結合を含むことができる。これらの結合を用いると、複雑なパケット・フィルタを定義することができる。それでも、上で示したパケット・フィルタ式は、例であり、異なるパケット・フィルタリング構文を使用することができる。たとえば、いくつかのフィルタは、ビット列およびオフセットを含むことができ、パケットへのオフセット・バイト数の位置にビット列を含むすべてのパケットと一致することができる。
[0077] パケット・フィルタ式を入手した後に、パケット・キャプチャ・アプリケーション224は、この式の表現をパケット・キャプチャ・モジュール208に供給することができる。パケット・キャプチャ・アプリケーション224およびパケット・キャプチャ・モジュール208は、たとえば、raw socketを使用して通信することができる。raw socketは、プロトコル(たとえば、IPv4、IPv6、TCP、またはUDP)処理なしでアプリケーションとカーネル・モジュールとの間のパケットおよびコマンドの通信を可能にする、特殊なタイプのソケットである。しかし、他のタイプのソケットおよびAPIが、raw socketの代わりにパケット・キャプチャに使用され得る。
[0078] いくつかの実施形態では、パケット・キャプチャ・モジュール208は、パケット・フィルタ式の表現をバイトコードまたは別のフォーマットにコンパイルすることができる。その後、パケット・キャプチャ・モジュール208は、それが受信するパケットごとにこのバイトコードを実行して、パケットが指定されたフィルタと一致するかどうかを判定することができる。パケットがフィルタと一致しない場合には、そのパケットを破棄することができる。パケットがフィルタと一致する場合には、パケット・キャプチャ・モジュール208は、そのパケットをパケット・キャプチャ・アプリケーション224に供給することができる。したがって、パケット・キャプチャ・アプリケーション224は、パケット・キャプチャ・セッションの始めにパケット・キャプチャ・モジュール208にパケット・フィルタ式を供給することができ、このフィルタと一致するパケットのストリームを受信することができる。
D.パケット・キャプチャ・フォーマット
[0079] パケット・キャプチャ・アプリケーションは、複数の可能なフォーマットのうちの1つで、受信されたパケットを記憶することができる。1つのそのようなフォーマットが、図3Aに示されたPCAP(パケット・キャプチャ)フォーマットである。ファイル300は、パケットがキャプチャされた時刻の順で記憶される、PCAPフォーマットの一連のN+1個のキャプチャされたパケットを表す。PCAPヘッダ302は、図3Bで定義されるデータ構造である。N+1個のキャプチャされたパケットのそれぞれには、毎パケット・ヘッダならびにすべてのプロトコル・ヘッダおよびペイロード・バイトが先行する場合がある。例の毎パケット・ヘッダ303が、図3Cに示されている。
[0080] ファイル300は、コンピューティング・デバイス100の短期ストレージ(たとえば、メイン・メモリ)または長期ストレージ(たとえば、ディスク・ドライブ)内に記憶され得る2進ファイルとすることができる。いくつかの場合に、パケット・キャプチャが発生する時にコンピューティング・デバイス100上でリアル・タイムに表示されるキャプチャされたパケットの表現。したがって、より後にキャプチャされたパケットが、より以前にキャプチャされたパケットが表示のためにファイル300から読み取られている間にファイル300に追加される場合がある。他の実施形態では、ファイル300は、後の処理のために長期ストレージに書き込まれ得る。
[0081] 上で注記したように、図3Bは、PCAPヘッダ302の内容を示す。先頭ファイル300に配置されたPCAPヘッダ302の1つのインスタンスがある場合がある。
[0082] マジック・ナンバ304は、PCAPヘッダ302を有するファイルの先頭の事前定義のマーカーとすることができ、キャプチャを実行したコンピューティング・デバイスのバイト順序付けを示すように働く。たとえば、マジック・ナンバ304は、キャプチャするデバイスのネイティブ・バイト順序付けで0xa1b2c3d4の16進数値を必ず有すると定義され得る。ファイル300を読み取るデバイスが、マジック・ナンバ304がこの値を有することを見出す場合には、このデバイスとキャプチャするデバイスのバイト順序付けは同一である。ファイル300を読み取るデバイスが、マジック・ナンバ304が0xd4c3b2a1の値を有することを見出す場合には、このデバイスは、マジック・ナンバ304に従うフィールドのバイト順序付けをスワップしなければならない可能性がある。
[0083] メジャー・バージョン306およびマイナ・バージョン308は、ファイル300内で使用されるPCAPフォーマットのバージョンを定義することができる。ほとんどの場合に、メジャー・バージョン306は2であり、マイナ・バージョン308は4であり、これは、バージョン番号が2.4であることを示す。
[0084] タイム・ゾーン・オフセット310は、キャプチャするデバイスのローカル・タイム・ゾーンと協定世界時(UTC)との間の秒単位の差を指定することができる。いくつかの場合に、キャプチャするデバイスは、そのローカル・タイム・ゾーンに関わりなく、このフィールドに0をセットする。
[0085] タイムスタンプ精度312は、ファイル300内のすべてのタイムスタンプの精度を指定することができる。実際には、このフィールドには、しばしば0がセットされる。
[0086] キャプチャ長314は、キャプチャできる最大パケット・サイズをバイト単位で指定することができる。いくつかの実施形態で、この値には65536がセットされるが、たとえばユーザが大ペイロード・パケットに関心がない場合には、より小さい値をセットすることができる。このフィールドで指定されるものより大きいパケットがキャプチャされる場合には、そのパケットは、最大パケット・サイズに従うために切り詰められる場合がある。
[0087] データリンク・プロトコル316は、キャプチャが行われたデータリンク・インターフェースのタイプを指定することができる。たとえば、このフィールドは、イーサネットの場合に1、Wifiの場合に105などの値を有することができる。
[0088] 図3Cは、毎パケット・ヘッダ303の内容を示す。図3Aに示されているように、ファイル300内で表されるパケットごとに、毎パケット・ヘッダ303の1つのインスタンスがあるものとすることができる。毎パケット・ヘッダ303の各インスタンスは、それに関連するパケットに先行することができる。
[0089] タイムスタンプ秒320およびタイムスタンプ・マイクロ秒322は、関連するパケットがキャプチャされた時刻を表すことができる。上で注記したように、これは、キャプチャするデバイスのローカル時刻またはUTC時刻とすることができる。
[0090] キャプチャされたパケット長324は、実際にキャプチャされ、ファイル300内に保存されたパケット・データのバイト数を指定することができる。オリジナル・パケット長326は、パケットが、それがその上でキャプチャされたネットワークに現れた時のパケットのバイト数を指定することができる。
[0091] 一般に、キャプチャされたパケット長324は、オリジナル・パケット長326以下になると期待される。たとえば、キャプチャ長314が1000バイトであり、パケットが500バイトである場合に、キャプチャされたパケット長324およびオリジナル・パケット長326は、両方とも500とすることができる。しかし、パケットが1500バイトである場合には、キャプチャされたパケット長324は1000とすることができ、オリジナル・パケット長326は1500とすることができる。
[0092] 図1および図2の文脈で説明した伝統的なシステムは、制限されたシナリオでは良好に実行する可能性があるが、高速パケット・キャプチャを頑健な形ではサポートしない可能性がある。たとえば、近代イーサネット・インターフェース・ハードウェアは、10ギガビット毎秒、40ギガビット毎秒、および100ギガビット毎秒のデータ・レートをサポートする。伝統的なシステムは、パケット・キャプチャおよびフィルタリングをソフトウェアで実行するので、これらのシステムの最高速度は、通常はプロセッサ102の速度によって制限される。ハードウェア・インターフェースが、回線速度でパケットを受信している場合に、プロセッサ102は、着信パケットを十分に素早く処理できない可能性がある。さらに、プロセッサ102は、様々なオペレーティング・システム・タスクおよび他のアプリケーションに関連するタスクなど、他のタスクを並列に実行している場合がある。
[0093] その点までに、1パケットあたりのプロセッサ・サイクル数は、高速プロセッサに関しても不十分である可能性がある。たとえば、16コアを有する3.0ギガヘルツ・マルチプロセッサは、64バイト・パケットを100ギガビット毎秒で処理する時に、1パケットあたり約322サイクルを有するにすぎない。より詳細には、プロセッサは、48,000,000,000サイクル/毎秒の集計速度で動作する。インターフェースの100ギガビット毎秒は、最大12,500,000,000バイト毎秒を提供する。最小の可能なイーサネット・パケット(12バイトのパケット間ギャップおよび8バイト・プリアンブルを伴う、それぞれ64バイト)のワースト・ケース・シナリオを仮定すると、約148,809,523パケット毎秒が到着する。したがって、プロセッサは、多くとも322.56サイクル毎パケットを使用することができる。これは、持続的な処理には不十分である。
[0094] その結果、一部のパケットは、フィルタリングされ得る前に、またはファイルに書き込まれ得る前に、捨てられる可能性がある。具体的には、パケットは、(i)ネットワーク・インターフェース・ハードウェア・バッファが、それに関連するドライバ・モジュールがそこからパケットを除去できる速度より速い速度で満杯になるか、(ii)パケット・キャプチャ・モジュール208に関連するいずれかのキューが、パケット・キャプチャ・モジュール208がパケット・フィルタリング動作を実行できる速度より速い速度で満杯になるか、(iii)パケット・キャプチャ・アプリケーション224に関連するいずれかのキューが、パケット・キャプチャ・アプリケーション224が関連するパケットをファイル・システムに書き込むかこれらのパケットの表現を表示できる速度より速い速度で満杯になる場合に、捨てられる可能性がある。特筆すべきことに、HDDまたはSDD上のファイル・システムへの書込は、システムの持続可能なパケット・キャプチャ速度を低速化する、重大なオーバーヘッドを伴う場合がある。
[0095] これは、正確で完全なパケット・キャプチャに頼るアプリケーションに関する問題を引き起こす。たとえば、パケット・キャプチャ・アプリケーション224が、ネットワーク・プロトコル解析ツールである場合に、欠けているパケットは、ネットワーク・プロトコルのデバッグを、不可能でないとしても困難にする可能性がある。さらに、パケット・キャプチャ・アプリケーション224が、侵入検知システムである場合に、欠けているパケットは、効果的に、このシステムがネットワーク攻撃を頑健で時宜を得た形で検出することを不可能にする可能性がある。
[0096] 次のセクションは、例の高速パケット・キャプチャ・システムのキャプチャ方向手順を説明する。この説明は、キャプチャされたパケットがネットワーク・インターフェース上で受信される時からそれらが不揮発性メモリ(たとえば、伝統的なファイル・システムなしのSSD)に記憶されるまでのキャプチャされたパケットの経路に従う。後続のセクションは、記憶されたパケットがさらなる処理および/または表示のために不揮発性メモリからどのように読み取られるのかを説明する。
II.例の改善された高速パケット・キャプチャ・システム−キャプチャ方向
[0097] 図4は、高速パケット・キャプチャのためにカスタマイズされた例のコンピューティング・デバイス400を示す。いくつかの実施形態では、コンピューティング・デバイス400は、異なる構成要素を含むことができ、かつ/または、その構成要素は、異なる形で配置され得る。
[0098] ホスト・プロセッサおよび専用システム・メモリ402は、1つまたは複数のプロセッサを含むことができ、そのそれぞれは、メモリの専用ユニット(たとえば、数ギガバイトのRAM)に結合され、またはこれに関連付けられ得る。たとえば、各プロセッサおよびそれに関連するメモリのユニットは、それ自体のメモリおよび他のnon−uniform memory access(NUMA)ノード内のメモリならびに長期パケット・ストレージ404Aおよびホスト・オペレーティング・システム・ストレージ404BのメモリにアクセスできるNUMAノードとすることができる。NUMAノードの特定の配置が、図7の実施形態に示されている。
[0099] 特筆すべきことに、ホスト・プロセッサおよび専用システム・メモリ402は、システム・バス414およびシステム・バス416への接続を有することができる。システム・バス414および416は、それぞれ、たとえばperipheral component interconnect express(PCIe)バスとすることができる。図4では、システム・バス414は、FPGAベースのネットワーク・インターフェース406、管理ネットワーク・インターフェース410、および入出力ユニット412にホスト・プロセッサおよび専用システム・メモリ402を通信可能に結合する。同様に、システム・バス416は、長期パケット・ストレージ404Aおよびホスト・オペレーティング・システム・ストレージ404Bにホスト・プロセッサおよび専用システム・メモリ402を通信可能に結合する。それでも、これらの構成要素のすべてが1つのシステム・バスによって接続される配置を含む他の配置が可能である。
[0100] 長期パケット・ストレージ404Aは、1つまたは複数のSSDなどの不揮発性ストレージを含むことができる。特筆すべきことに、長期パケット・ストレージ404Aは、キャプチャされたパケットをそのチャンク内で記憶することができる。
[0101] ホスト・オペレーティング・システム・ストレージ404Bも、1つまたは複数のソリッド・ステート・ドライブなどの不揮発性ストレージを含むことができる。長期パケット・ストレージ404Aとは異なって、ホスト・オペレーティング・システム・ストレージ404Bは、ホスト・プロセッサおよび専用システム・メモリ402のプロセッサによって使用されるオペレーティング・システムおよびファイル・システムを記憶することができる。
[0102] FPGAベースのネットワーク・インターフェース406は、100メガビット毎秒、1ギガビット毎秒、10ギガビット毎秒、25ギガビット毎秒、40ギガビット毎秒、または100ギガビット毎秒のトランシーバを1つまたは複数収容できるカスタム・ハードウェア・モジュールとすることができる。FPGAベースのネットワーク・インターフェース406は、これらのインターフェースによってパケットを受信し、その後、記憶のためにこれらのパケットをキャプチャし、処理することができる。名前から暗示されるとおり、FPGAベースのネットワーク・インターフェース406は、フィールドプログラマブル・ゲート・アレイまたは他のデジタル・ハードウェア論理に基づくものとすることができる(すなわち、実際のFPGAがすべての実施形態で使用されるとは限らない)。イーサネットが、本明細書で提供される例においてパケット・キャプチャ用のインターフェース・タイプとして使用されるが、他のインターフェース・タイプが可能である場合がある。
[0103] 一時パケット・ストレージ・メモリ408は、FPGAベースのネットワーク・インターフェース406によってキャプチャされたパケットがホスト・プロセッサおよび専用システム・メモリ402に最終的に書き込まれ得るようになるまでこれらのパケットを保持するように構成されたRAMの1つまたは複数のユニットを含むことができる。FPGAベースのネットワーク・インターフェース406は、1つまたは複数のメモリ・コントローラによって一時パケット・ストレージ・メモリ408に接続することができる。
[0104] ネットワーク管理インターフェース410は、接続性およびデータ転送に使用される1つまたは複数のネットワーク・インターフェースとすることができる。たとえば、FPGAベースのネットワーク・インターフェース406は、そこからパケットがキャプチャされる1つまたは複数の高速イーサネット・インターフェースを収容することができるが、ネットワーク管理インターフェース410は、リモート・アクセス、リモート構成、およびキャプチャされたパケットを含むファイルの転送に使用され得る1つまたは複数のネットワーク・インターフェースを収容することができる。たとえば、ユーザは、ネットワーク管理インターフェース410によってコンピューティング・デバイス400にログ・オンし、パケット・キャプチャ・セッションをリモートに開始しまたは停止することができる可能性がある。
[0105] 入出力ユニット412は、コンピューティング・デバイス400とのユーザおよび周辺デバイスの相互作用を容易にすることができるという点で、入出力ユニット108に類似するものとすることができる。したがって、入出力ユニット412は、1つまたは複数のタイプの入力デバイスおよび1つまたは複数のタイプの出力デバイスを含むことができる。
[0106] いくつかの実施形態で、コンピューティング・デバイス400は、他の構成要素、周辺デバイス、および/または接続性を含むことができる。したがって、図4の図示は、例のためのものであって限定的であることは意図されていない。
A.例のFPGAベースのネットワーク・インターフェース
[0107] 図5は、FPGAベースのネットワーク・インターフェース406および一時パケット・ストレージ・メモリ408のより詳細な図を示す。具体的には、FPGAベースのネットワーク・インターフェース406は、トランシーバ・モジュール500、物理ポート・モジュール502、論理ポート・モジュール504、パッカー・モジュール506、外部メモリ・インターフェース・モジュール508、および直接メモリ・アクセス(DMA)エンジン・モジュール510を含む。一時パケット・ストレージ・メモリ408は、メモリ・バンク512を含むことができ、1つまたは複数のメモリ・コントローラによって外部メモリ・インターフェース・モジュール508に結合され得る。DMAエンジン・モジュール510は、システム・バス414に結合され得、このバスへのパケット(たとえば、1つまたは複数のパケットのチャンクの形の)の書込を制御することができる。図5では、キャプチャされたパケットは、一時パケット・ストレージ・メモリ408での可能な一時的な記憶を伴って、全般的に左から右へ流れる。
[0108] 図6Aは、トランシーバ・モジュール500、物理ポート・モジュール502、および論理ポート・モジュール504の間の接続性ならびに物理ポート・モジュール502の構成要素を示す。
[0109] トランシーバ・モジュール500の各トランシーバ600は、組み合わされ、共通の回路網または単一のハウジングを共有する送信器と受信器との両方を含むことができる。前に注記したように、トランシーバ600は、たとえば10ギガビット毎秒、40ギガビット毎秒、または100ギガビット毎秒のイーサネット・トランシーバとすることができる。トランシーバ600のそれぞれは、物理ポート502のポート602にも結合され得る。この結合は、イーサネットの媒体アクセス制御(MAC)機能、前方誤り訂正(FEC)機能、およびphysical coding sublayer(PCS)機能(図示せず)を実行するユニットを含むことができる。
[0110] ポート602は、デリミタ604、サイクル・アライナ606、エクスパンダ608、リクロッカ610、NOPジェネレータ612、および先入れ先出し(FIFO)バッファ614という構成要素を含むことができる。いくつかの実施形態では、ポート602は、より多数またはより少数の構成要素を含むことができ、各ポートは、一意の番号を付けられ得る(たとえば、0からnまで)。いずれにせよ、パケット(およびその処理)の流れは、全般的に左から右である。
[0111] デリミタ604は、イーサネットのプリアンブル・ビットおよびエピローグ・デリミタ・ビットを検出することによって着信イーサネット・パケットの先頭ビットおよび終了ビットを識別することができる。このシーケンスは、16進数で0xFB 0x55 0x55 0x55 0x55 0x55 0x55 0xD5(最下位ビットが先の順序付けを使用)と表すことができる。このシーケンスの直後に受信されたビットを、イーサネット・パケットの最初とすることができる。デリミタ604は、各パケットの最初のバイトが受信された時のナノ秒タイムスタンプを高精度クロック・ソースから記録することもできる。このタイムスタンプは、伝搬遅延に関して、固定されたオフセットだけ調整され得る。
[0112] サイクル・アライナ606は、バス・サイクルあたり最大で1つのパケットがあるように着信パケットを整列させ配置することができる(すなわち、より大きいパケットは、複数のサイクルを必要とする場合がある)。一例として、100ギガビット・イーサネットは、MACインターフェースからの4つの128ビット・バスを使用することができる。これらのバスは、レーン0、1、2、および3と呼ばれる場合がある。いくつかの場合に、単一のバス・サイクルにMACインターフェースから出力される2つのパケット(より正確には、2つのパケットの一部)がある場合がある。たとえば、レーン0〜2が、パケットnからのビットを含み、レーン3がパケットn+1からのビットを含む場合がある。サイクル・アライナ606は、2つのサイクルにまたがってこれらのビットを配置する。第1のサイクルには、レーン0〜2はパケットnからのビットを含み、レーン3はヌルである。第2のサイクルには、レーン0〜2はヌルであり、レーン3はパケットn+1からのビットを含む。
[0113] エクスパンダ608は、サイクル・アライナ606によって整列されたビットを集計し、より幅広いバス(たとえば2048ビット・バス)にパックする。エクスパンダ608は、各パケットの最初のビットが同一レーン内で始まるようにするためにこれを行う。各パケットの先頭の固定位置を有することは、ダウンストリーム処理をより複雑でないものにする。いくつかの実施形態で、エクスパンダ608は、パケットの最初のビットがレーン0の最初のビット位置に配置されるように、16個の128ビット・レーンにまたがって各パケットを配置することができる。
[0114] リクロッカ610は、パケット処理のタイミングをトランシーバ600のタイミングからポート602のタイミングに調整することができる。100ギガビット・イーサネットの場合に、リクロッキングは、322メガヘルツ(イーサネット速度)から250メガヘルツ(ポート速度)へのものである。10ギガビット・イーサネットの場合に、リクロッキングは、156メガヘルツ(イーサネット速度)から250メガヘルツ(ポート速度)へのものである。
[0115] NOPジェネレータ612は、長期パケット・ストレージ404AまでのFPGAベースのネットワーク・インターフェース406のキャプチャ・パイプラインをフラッシュするのに使用され得る0x00バイトのペイロード(たとえば、256バイトの転送サイズに関して16バイト・ヘッダを伴う240バイトの人工的なヌル・パケット)を有する、単一サイクル全幅パケットのバーストを生成することができる。NOPジェネレータ612は、インアクティビティ(たとえば、所定の長さの時間にわたって受信されるパケットがないこと)によってまたはソフトウェア(図6Aに示されていないインターフェースなど)を介する明示的な要求によってのいずれかで、それを行うようにトリガされ得る。
[0116] FIFOバッファ614は、受信されたパケットが論理ポート・モジュール504によってポート602から読み取られ得るようになるまで、複数の受信されたパケットをキュー内に保持することができる。
[0117] 図6Bは、論理ポート504の構成要素を示す。これらの構成要素は、例として提示される。より多数またはより少数の構成要素が、そのような論理ポート・モジュール内に存在してもよい。以前の図と同様に、パケットの流れ(およびその処理)は、全般的に左から右である。
[0118] ポート・アービタ620は、ポート602のそれぞれに関してFIFOバッファ614に接続される。各クロック・サイクルに、ポート・アービタ620は、ポート602のそれぞれから、より正確にはFIFOバッファ614のそれぞれのインスタンスから、1つまたは複数のパケットを取り出す。複数のポート602がこの形で準備のできているパケットを有する場合には、ポート・アービタは、これらのパケットを事前に定義された順序で(たとえば、最小のポート番号から最大のポート番号へ)取り出す。
[0119] パケット・クラシファイヤ622は、事前定義のルールに基づいて各着信パケットを分類する。分類は、2つの指定すなわち捨てるおよびスライスする(下で説明する)を含むことができる。このルールは、たとえばパケットの最初の64バイト、128バイト、256バイト、または512バイトに対するビット単位の論理「積」動作および論理「比較」動作を含むことができる。合計16〜512個のルールをサポートすることができ、これらのルールは、ソフトウェア・プログラム可能とすることができる。1つのパケットが、複数のルールに一致する場合がある。一例として、あるパケットが、ルールのうちの1つまたは複数に一致する場合に、そのパケットは、スライスに関して分類され得るが、パケットがどのルールにも一致しない場合には、そのパケットは、捨てるに関して分類される。
[0120] パケット・ドロッパ/スライサ624は、パケットの分類に基づいてパケットを捨てるまたはスライスするのいずれかを行うことができる。捨てられたパケットは、効果的に削除され、もはや処理されなくなる。スライスされたパケットは、サイズを減らされ、たとえば、パケットの最初の64バイト、128バイト、256バイト、または512バイトを超えるバイトが、除去され得る。それを行うことで、パケット・ペイロード全体に関心が持たれていない時に、パケットの記憶がより効率的に行われる。
[0121] パケット・コンプレッサ626は、パケットのヘッダ(たとえば、イーサネット・ヘッダ、IPヘッダ、TCPヘッダ、UDPヘッダ)および/またはペイロードを圧縮し、これを圧縮されたバージョンに置換することのできる任意選択の構成要素である。これが行われる時に、パケット・コンプレッサ626は、圧縮が実行されたことを示すフラグ・ビットをパケットのキャプチャ・ヘッダのうちの1つの中でセットすることもできる。いくつかの実施形態で、パケット・コンプレッサ626は、圧縮辞書628を使用することができる。後者は、圧縮されたパケット内でより短い一意の符号化によって表現される共通のバイト列のリストを含むことができる。
[0122] 背圧スロットル630は、下流のモジュールおよび/または構成要素がパケットの着信フローについていけない時に、これらのモジュールおよび/または構成要素から背圧を適用することができる。たとえば、背圧は、システム・バス414が一時的に輻輳し、要求された速度でデータを送信できない時に適用され得る。この背圧は、1つまたは複数のクロック・サイクルの間に着信パケットの処理をスキップするための、背圧スロットル630からポート・アービタ620またはFIFOバッファ614のうちの1つもしくは複数への信号とすることができる。パケットが捨てられる、まれな場合に、背圧スロットル630は、捨てられたパケットの総数と背圧信号ごとの捨てられたパケットあたりのカウントとを維持することができる。これらの背圧信号は、それぞれ、DMAエンジン510(バス414での輻輳に起因して)、チャンク・アライナ632、およびパダー636から受信される。
[0123] チャンク・アライナ632は、キャプチャされたパケットのセットをパックできるように整列させる。各チャンクは、サイズにおいて128キロバイトから32メガバイトであり、パケットがチャンク境界をまたがず、チャンクの最初のパケットがチャンク内で0のオフセットから始まるように、キャプチャされたパケットのそのようなセットを保持する。チャンク・アライナ632は、チャンク内の最後のパケットがそのチャンク内のすべての残り空間を充填するように、必要なパディングの量を判定することができる。
[0124] チャンク統計634は、チャンク内のデータに関する統計をまとめる。この統計は、チャンク内の最初のパケットおよび最後のパケットのタイムスタンプ、チャンク内のパケットの総数(おそらくはチャンク内のTCPパケットの総数とUDPパケットの総数との別々のカウントを含む)、チャンク内のバイトの総数(パディングを含まない)、チャンク内の圧縮されたバイトの総数、パケット・クラシファイヤ622によって捨てられると分類されたパケットの個数、および様々な他の内部性能メトリックを含む。これらの統計は、コンプレッサ統計644(図6C参照)に渡される。
[0125] パダー636は、チャンク・アライナ632によって指定された個数のパディング・バイトをチャンクの最後のパケットに追加する。パディング・バイトは、すべて0とすることができ、このパディングは、受信されたパケットの最後のバイトの後に適用され得る。
[0126] ヘッダ追加638は、各パケットの先頭にカスタム・ヘッダを付加する。カスタム・ヘッダの内容は、PCAP毎パケット・ヘッダ303の内容に類似し、またはこれと同一とすることができる。代替実施形態では、ヘッダは、長さ16バイトとすることができ、パケットがNOPジェネレータ612からのNOPデータを含む時にセットされ得るNOPフィールド、フレーム・チェック・シーケンス(FCS)パケットのイーサネット・ヘッダが破壊されたパケットを示す時にセットされ得るFCS失敗フラグ、チャンクがパダー636からのパディングを含む時にセットされ得るパッド・フラグ、パケットがキャプチャされた時の時刻(ナノ秒単位、デリミタ604から供給される)を含むことができるタイムスタンプ・フィールド、実際にキャプチャされたパケットのバイト数を示すことができるパケット・キャプチャ・サイズ・フィールド、キャプチャの前のパケットの実際のサイズを示すことができるパケット・ワイヤ・サイズ・フィールド、およびパケットが受信された物理ポートを識別することができるポートIDフィールドというフィールドのうちの1つまたは複数からなることができる。他のフィールドが可能であり、より多数またはより少数のフィールドが存在する場合がある。パケット・キャプチャ・サイズは、パケット・ドロッパ/スライサ624および/またはコンプレッサ626が、キャプチャされたパケットのサイズを縮小するように構成されている時に、パケット・ワイヤ・サイズより小さくなる可能性がある。
[0127] 図6Cは、パッカー506の構成要素を示す。これらの構成要素は、例として提示される。より多数またはより少数の構成要素が、そのような論理ポート・モジュール内に存在する場合がある。以前の図面と同様に、パケットの流れ(およびその処理)は、全般的に左から右である。
[0128] ストリーム・パッカー640は、ヘッダ追加638からパケットを受け取ることができる。ストリーム・パッカー640は、これらのパケットを、たとえばバス幅に基づいて512ビット幅、1024ビット幅、2048ビット幅、または4096ビット幅とすることのできるパックされたバイト・ストリームに配置することができる。たとえば、バスが、2048ビット(256バイト)幅であると仮定する。データは、多くとも1パケット毎サイクルの速度でストリーム・パッカー640に入る。80バイト・パケットnが、サイクル0中に到着し、80バイト・パケットn+1が、サイクル1中に到着し、128バイト・パケットn+2が、サイクル2中に到着すると仮定する。このシーケンスは、各サイクル中に、2048ビット・バスの少なくとも半分を未使用のままにする。
[0129] ストリーム・パッカー640は、可能な場合に各サイクル中にバス全体が使用されるように、これらのパケットを配置する。したがって、ストリーム・パッカー640の最初の出力サイクルは、パケットnのすべて、パケットn+1のすべて、およびパケットn+2の最初の96バイト、総計2048ビットを含むはずである。ストリーム・パッカー640の第2の出力サイクルは、パケットn+2の残りの32バイトと、それに続く任意のさらなるパケットとを含むはずである。ストリーム・パッカー640は、パケットを、サイズにおいて128キロバイトから32メガバイトであるチャンクに形成する。したがって、各チャンクは、複数のパケット、おそらくは数百個または数千個のパケットを含む可能性がある。
[0130] コンプレッサ642は、ストリーム・パッカー640からのパックされたバイト・ストリームを圧縮することができる。これらの圧縮動作は、任意選択であり、コンプレッサ642が着信データ・レートでパケットをチャンクに圧縮できない場合には省略され得る。その代わりに、コンプレッサ642は、過負荷である時に、回線速度性能を維持するために、パススルー・モードでパケットを書き込むことができる。
[0131] いくつかの実施形態で、Lempel−Ziv−Welch(LZW)などの一般的な圧縮方式を使用することができる。この方式は、2または3の倍率で長期パケット・ストレージ内に記憶されるパケットの有効な個数を増やすことができるが、高速インターフェース(たとえば、40メガビット毎秒または100メガビット毎秒)から着信するデータの回線レート圧縮には遅すぎる可能性がある。パススルー・モードのトリガは、入力キューが満杯になる(または高潮線を超える)時とすることができ、その後、チャンクは、入力キューが低潮線に達するまでコンプレッサを迂回する。
[0132] コンプレッサ統計644は、チャンク統計634から情報を受け取り、コンプレッサ642からのさらなる情報を提供する。この情報は、圧縮されたペイロードのサイズと、チャンクごとの巡回冗長検査(CRC)とを含むことができる。
[0133] 図6Dは、外部メモリ・インターフェース508の構成要素を示す。これらの構成要素は、例として提示される。より多数またはより少数の構成要素が、そのようなメモリ・インターフェース内に存在する場合がある。以前の図面と同様に、パケットの流れ(およびその処理)は、全般的に左から右である(メモリ・バンク512を通る迂回路を伴う)。
[0134] 外部メモリ・インターフェース508は、メモリ・バンク512内で着信チャンクをバッファリングするように働くことができる。それを行うことは、そうでなければこれらのチャンクを捨てさせる可能性があるシステム・バス414上の輻輳を回避するのを助ける。システム・バス414は、ホスト・プロセッサおよび専用システム・メモリ402、入出力ユニット412、または他の周辺機器による使用に起因して、チャンクを転送するには忙しすぎる場合がある。この輻輳は、10マイクロ秒から数ミリ秒以上のいずれかで存続する可能性がある。
[0135] 外部メモリ・インターフェース508は、パケットがキャプチャされているインターフェース(1つまたは複数)の全二重回線速度で動作することができる。たとえば、100ギガビット毎秒イーサネット・インターフェースが、パケットをキャプチャするのに使用されている場合に、外部メモリ・インターフェース508とメモリ・バンク512との間での読取および書込は、200ギガビット毎秒までで行われる可能性がある(たとえば、100ギガビット毎秒の読取と100ギガビット毎秒の書込)。
[0136] メモリ書込モジュール650は、コンプレッサ642からチャンクを受け取り、これらのチャンクをメモリ・コントローラ652A、652B、および652Cによってメモリ・バンク512に書き込むことができる。チャンクは、別個のブロックでメモリに書き込まれ得、そのサイズは、メモリ・コントローラ652A、652B、および652Cと外部メモリ654A、654B、および654Cとの間のバス幅に基づくものとすることができる。これらのブロックのそれぞれについて、メモリ書込モジュール650は、CRCを計算し、ブロックと共にそれぞれのCRCを記憶することができる。いくつかの実施形態では、メモリ書込モジュール650は、外部メモリ654A、654B、および654Cにまたがって、ラウンド・ロビンの形または外部メモリ654A、654B、および654Cのそれぞれへの負荷のバランスを粗くとるなんらかの他の形でこれらのブロックを書き込むことができる。
[0137] メモリ読取モジュール656は、メモリ・コントローラ652A、652B、および652Cによって、メモリ・バンク512からブロックを取り出し、これらのブロックをチャンクに再アセンブルすることができる。それを行う際に、メモリ読取モジュール656は、各ブロックのCRCを再計算し、これをブロックの記憶されたCRCと比較して、ブロックが記憶中に破壊されたかどうかを判定することができる。
[0138] 3つのメモリ・コントローラおよび3つの外部メモリが図6Dに示されているが、より多数またはより少数のメモリ・コントローラおよび外部メモリを使用することができる。各メモリ・コントローラは、すべての外部メモリ・リフレッシュ・サイクルが同時に発生するように、そのリフレッシュ・サイクルを同期させることができる。これは、複数の別々のメモリ・バンクが一致して使用される時のメモリ・スループットを改善することができる。
[0139] 図6Eは、DMAエンジン510の構成要素を示す。これらの構成要素は、例として提示される。より多数またはより少数の構成要素が、DMAエンジン内に存在する場合がある。以前の図面と同様に、パケットの流れ(およびその処理)は、全般的に左から右である。
[0140] チャンクFIFO 660は、メモリ読取モジュール656からチャンクを受け取り、DMAエンジン510によるさらなる処理のためにこれらのチャンクを一時的に記憶するバッファである。同様に、統計FIFO 662は、特定のチャンクに関してFPGAベースのネットワーク・インターフェース406の様々なユニットから統計を受け取る別のバッファである。これらの統計は、チャンク統計634およびコンプレッサ統計644からのデータを含むことができるが、これに限定はされない。このデータは、たとえば、チャンク内のパケットの最初のタイムスタンプおよび最後のタイムスタンプ、チャンク内の複数のパケット、チャンクの圧縮されたサイズ、ならびに現在のクロック・サイクルでの様々なFIFOレベルおよび/またはハードウェア性能メトリックを含む。チャンクFIFO 660および統計FIFO 662は、独立に動作するが、実際には(設計により)チャンクFIFO 660および統計FIFO 662内のデータは、通常は同一のチャンクを参照する。
[0141] チャンクFIFO 660と統計FIFO 662との両方からのデータは、DMAアービタ664によって読み取られる。DMAアービタ664は、両方のFIFOからのこのデータならびにキャプチャ・リング800(図8A参照)からの状況更新を多重化する。これらの状況更新は、チャンク記憶に使用可能な、キャプチャ・リング800内の次のメモリ位置を示す。DMAアービタ664は、キャプチャ・リング800からの状況更新の処理に最高優先順位を、統計FIFO 662から出力に2番目に高い優先順位を、チャンクFIFO 660からのチャンクに最低優先順位を割り当てる。
[0142] システム・バス414は、複数の独立のバス414A、414B、および414Cからなることができる。3つのバスが図6Eに示されているが、より多数またはより少数のバスを使用することができる。DMA出力666は、それぞれPCIeインターフェース668A、668B、および668Cによってバス414A、414B、および414Cに書き込まれる、チャンクFIFO 660および統計FIFO 662からのデータをスケジューリングする。たとえば、DMA出力666は、公平なラウンドロビン・スケジューラに従って、このデータを最大サイズのバス・パケット(たとえば、256バイト)として多重化し、バス414A、414B、および414Cに書き込むことができる。
[0143] DMA性能モニタ(図示せず)が、DMAアービタ664またはDMA出力666のいずれかに組み込まれ得る。たとえば、バス414A、414B、および414CがPCIeバスである場合に、このモジュールは、各バスの最小creditの個数、最大credit、occupancy、stall durationなどを判定することによって、その性能を監視することができる。 これは、各バス上でのPCIe creditの割振り(これらのバスでのフロー制御のための)およびNUMAノードのキャプチャ・リング・バッファ800に関するフロー制御のためのDMA creditの割振り(下の図8A参照)を含む。
[0144] 後者の機構は、credit tokenシステムに基づくものとすることができる。たとえば、1つのtokenは、キャプチャ・リング・バッファ800への256バイト書込動作(最大サイズのPCIe書込動作)に匹敵するものとすることができる。DMAアービタ664は、複数のDMA creditを維持する。これは、キャプチャ・リング・バッファ800内のエントリ数に初期化される。フル・サイズのPCIe書込動作が行われるたびに、DMA creditカウントは減分される。DMA creditの総数が0である場合には、背圧がシグナリングされ、これは、最終的に背圧スロットル630がパケットを捨てることにつながる。またDMA creditが0である時には、PCIe書込動作は発行されない。NUMAノードのうちの1つで動作するソフトウェアは、チャンクが処理され、キャプチャ・リング・バッファ800から除去され、本質的にそのメモリ・エリアを解放し、したがってハードウェアが新しいチャンクを書き込めるようになった後に、DMA creditを追加する。
B.例のホスト・プロセッサおよび専用メモリのアーキテクチャ
[0145] 図7は、FPGAベースのネットワーク・インターフェース406と長期パケット・ストレージ404Aとの間の接続性を提供するホスト・プロセッサおよび専用メモリ402を示す。具体的には、ホスト・プロセッサおよび専用メモリ402は、プロセッサ700、メモリ702、プロセッサ704、およびメモリ706を含むことができる。プロセッサ700とプロセッサ704との両方が、複数(たとえば、2つ、4つ、または8つ)の個々のプロセッサを表すことができる。
[0146] FPGAベースのネットワーク・インターフェース406は、システム・バス414によってプロセッサ700に接続する。プロセッサ700およびメモリ702は、第1のNUMAノードの構成要素である。同様に、プロセッサ704およびメモリ706は、quick path interconnect(QPI)インターフェースまたはなんらかの他のタイプのプロセッサ相互接続によって第1のNUMAノードに接続され得る第2のNUMAノードの構成要素とすることができる。
[0147] 第2のNUMAノードは、システム・バス416によってストレージ・コントローラ708にも接続され得る。システム・バス414と同様に、システム・バス416は、複数の独立のバスを含むことができる。NUMAノード通信のこの分離は、FPGAベースのネットワーク・インターフェース406からメモリ702への書込とメモリ706から長期パケット・ストレージ404Aへの書込とのスループット特性および待ち時間特性を分離することによって、パケット・キャプチャ性能をさらに改善する。
[0148] ストレージ・コントローラ708は、たとえばホスト・バス・アダプタ(HBA)コントローラとすることができる。ストレージ・コントローラ708は、第2のNUMAノードに長期パケット・ストレージ404Aへのアクセスを提供することができる。長期パケット・ストレージ404Aは、n個のソリッド・ステート・ドライブのアレイまたはなんらかの他の形の不揮発性ストレージを含むことができる。いくつかの実施形態で、複数のストレージ・コントローラが、100ギガビット毎秒のパケット・ストレージ速度をサポートするのに使用され得る。第1および/または第2のNUMAノードは、ホスト・オペレーティング・システム・ストレージ404Bにさらに接続され得る。
[0149] 要約すると、パケットのチャンクは、FPGAベースのネットワーク・インターフェース406からメモリ702に直接に書き込まれる。プロセッサ700は、メモリ702からこれらのチャンクを読み取り、CRCの生成および/またはチャンク統計の計算など、なんらかの追加処理を適用する。その後、プロセッサ700は、メモリ706にチャンクを書き込む。プロセッサ700および/またはプロセッサ704は、入出力スケジューラを走行させ、この入出力スケジューラは、メモリ706から長期パケット・ストレージ404A内のストレージのユニットのうちの1つの指定された位置にチャンクを書き込むようにストレージ・コントローラ708に指示する。ストレージ・コントローラ708は、これに応答して、これらの書込を実行する。動作のこのシーケンスは、図8A〜図8Dにさらに示されている。
[0150] 図8Aは、メモリ702内のパケット記憶および管理のための例のデータ構造を示す。キャプチャ・リング・バッファ800は、DMA出力666によって転送されたチャンクを保持し、従来のリング・バッファとして動作する。キャプチャ・リング・バッファは、いくつかの実施形態ではサイズにおいて4ギガバイトとすることができるが、任意のサイズ(たとえば、1ギガバイト、2ギガバイト、8ギガバイト、16ギガバイトなど)とすることができる。
[0151] キャプチャ・リング・バッファ800など、本明細書のリング・バッファは、通常はb個のエントリの固定サイズ・アレイとして実施され、ポインタが、現在の頭部位置および尾部位置を参照する。プロデューサは、新しいエントリを尾部の現在位置に書き込み、コンシューマは、頭部から最も古いエントリを除去する。これらの頭部ポインタおよび尾部ポインタは、読取および書込ごとにmodulo bだけ増分され、その結果、バッファは、それ自体の回りで論理的にラップするようになる。
[0152] チャンク・インデックス・バッファ802は、キャプチャ・リング・バッファ800内のチャンクごとに、統計FIFO 662からの情報(最終的に、他の可能なソースの中でもチャンク統計634およびコンプレッサ統計644から発する)を記憶することができる。したがって、この情報は、チャンク内の最初のパケットおよび最後のパケットのタイムスタンプ、チャンク内のパケットの総数、チャンク内のバイトの総数(パディングを含まない)、チャンク内の圧縮されたバイトの総数などを含むことができる。
[0153] キャプチャ・リングDMA状況804A、804B、および804Cは、それぞれバス414A、414B、および414Cに関連するメモリ位置を記憶する。その内容は、下で説明するように、キャプチャ・リング・バッファ800への書込アクセスを制御するのに使用され得る。
[0154] チャンク処理キュー806は、メモリ706への書込の準備ができているキャプチャ・リング・バッファ800内のチャンクへの参照を含む。この構造の使用も、下で説明する。
[0155] 図8Bは、メモリ706内のパケット記憶および管理のための例のデータ構造ならびにストレージ・コントローラ708および長期パケット・ストレージ404Aに対するその関係を示す。キャプチャ書込バッファ810は、キャプチャ・リング・バッファ800から転送されたチャンクを一時的に記憶する。その後、これらのチャンクは、不揮発性ストレージのn個のユニット(SSD0〜SSDn)にまたがって分散される。それを行うために、各チャンクは、これらのユニットのうちの1つへの書込のためにキューイングされる。この情報は、入出力キュー814に記憶される。不揮発性ストレージのn個のユニットのそれぞれについて、入出力キュー814は、エントリのリストを含む。これらのエントリは、連続するチャンクを使用可能なユニットに分散させるために投入される。便宜上、3つのユニット(SSD)だけが図8Bに示されているが、より多数のユニットを使用することができる。チャンク・パリティ書込バッファ812は、チャンクに関する冗長性データをキューイングする。
[0156] たとえば、SSD0書込バッファ816内のSSD0エントリ0は、キャプチャ書込バッファ810内の第1のチャンク(チャンク0)を参照することができ、SSD1書込バッファ818内のSSD1エントリ0は、キャプチャ書込バッファ810内の第2のチャンク(チャンク1)を参照することができ、SSD2書込バッファ820内のSSD2エントリ0は、キャプチャ書込バッファ810内の第3のチャンク(チャンク2)を参照することができる。同様に、SSD0書込バッファ816内のSSD0エントリ1は、キャプチャ書込バッファ810内の第4のチャンク(チャンク3)を参照することができ、SSD1書込バッファ818内のSSD1エントリ1は、キャプチャ書込バッファ810内の第5のチャンク(チャンク4)を参照することができ、SSD2書込バッファ820内のSSD2エントリ1は、キャプチャ書込バッファ810内の第6のチャンク(チャンク5)を参照することができる。1SSDあたりのより多数のエントリを使用することができる。SSDへのチャンクのこのマッピングによれば、d個のSSDを有するシステムに関して、チャンクcは、SSD sエントリeにマッピングされ、ここで、s=c mod dであり、
またはSSD0書込バッファ816/SSD1書込バッファ818/SSD2書込バッファ820のFIFOプロデューサ・インデックスである。
[0157] チャンクおよび関連データの処理は、次の説明に従って行うことができる。DMA出力666は、チャンクFIFO660からキャプチャ・リング・バッファ800内のそれぞれの位置にチャンクを書き込むことができ、統計FIFO662からのデータは、チャンク・インデックス・バッファ802内のそれぞれの位置に書き込まれ得る。DMA出力666は、バス414A、414B、および414Cによってキャプチャ・リングDMA状況804A、804B、および804Cに更新をブロードキャストすることもできる。書き込まれるデータは、キャプチャ・リング・バッファ800内の次に使用可能な位置へのポインタとすることができる。したがって、キャプチャ・リングDMA状況804A、804B、および804Cの内容は、バス414A、414B、および414Cのうちの少なくとも1つが他のバスより低速に動作している(たとえば、輻輳しているかストールしている)時に、同一の値をとらない場合がある。この機構は、メモリ・ロックを使用せずにキャプチャ・リング・バッファ800およびチャンク・インデックス・バッファ802への複数の同時書込を可能にするようにも働く。
[0158] プロセッサ700は、最も古い転送されたチャンクの位置に関してキャプチャ・リングDMA状況804A、804B、および804Cを繰り返して読み取る可能性がある。最も古い転送されたチャンクは、キャプチャ・リングDMA状況804A、804B、および804Cのいずれかの「最小値」によってポイントされるキャプチャ・リング・バッファ800の位置にあるチャンクとすることができる(これらの値が、リング・バッファが前進する時にリング・バッファの末尾から先頭にラップ・アラウンドすることを考慮に入れて)。これは、システムの輻輳およびストールに起因するDMA出力666またはシステム・バス414A、414B、および414Cの分割または再順序付けに関わりなく、特定のチャンクに関するキャプチャ・リング・バッファ800へのすべての書込の完了を維持する。
[0159] このチャンクが識別された後に、プロセッサ700は、上で説明したSSDへのチャンクのマッピングに従って、入出力キュー814内にエントリ(たとえば、SSD0エントリ1、SSD1エントリ0など)を割り振ることができる。さらに、プロセッサ700は、選択されたSSD上で、チャンクを記憶すべき新しい位置を割り振ることができる。プロセッサ700は、チャンク処理キュー806内に、チャンクのメモリ位置、関連するチャンク・インデックスのメモリ位置、および入出力キュー814内のエントリの指示を配置することもできる。
[0160] この形で処理されるj個の連続するチャンクのすべてのセットに関して(jは、2から100までのいずれかである)、r個のパリティ・チャンク(rは、1から5までのいずれかである)が、冗長性のために生成され得る。たとえば、j個の連続するチャンクのオーバーラップしないセットが、チャンク処理キュー806内での表現のために処理され終えた時に、プロセッサ700またはプロセッサ704のうちの1つが、これらのチャンクに基づいて1つまたは複数のリードソロモン符号(または他の誤り訂正符号)を計算することができる。これらの符号は、パリティ・チャンクを形成し、1つまたは複数のパリティSSD(図示せず)内に記憶され得る。パリティSSDは、図8Bおよび下で説明されるものに似た形で書き込まれ得る。この冗長性手順は、RAID5またはRAID6の冗長性手順に似ているが、より高いレベルの回復をサポートする。原理的に、このシステムは、より多数のSSDの障害から回復することができる。
[0161] チャンク・パリティ書込バッファ812は、パリティSSDへの書込動作のためにパリティ・データが記憶され、キューイングされる場所である。このプロセスは、パリティ・データがプロセッサによって処理され、キャプチャ・リング・バッファ800またはキャプチャ書込バッファ810と共には使用されないことを除いて、SSDへのチャンクの書込のプロセスに類似する。
[0162] いずれにせよ、プロセッサ700、プロセッサ704、またはその両方は、メモリ702のキャプチャ・リング・バッファ800内のチャンクをメモリ704内のキャプチャ書込バッファ810に転送するために動作の以下のセットを実行することができる。いくつかの場合に、複数のプロセッサが、異なるチャンクに対して並列に動作することができる。
[0163] まず、プロセッサは、キャプチャ・リング・バッファ800内の次のチャンクの位置、チャンク・インデックス・バッファ802内のそれに関連するインデックス、および入出力キュー814内のそのターゲット・エントリを入手するために、チャンク処理キュー806の頭部を読み取る。ターゲット・エントリに基づいて、プロセッサは、キャプチャ書込バッファ810内の指定されたメモリ位置にこのチャンクを書き込む。
[0164] 次に、入出力キュー814内のターゲット・エントリから、プロセッサは、チャンクが記憶されるSSDおよびその中の位置を判定する。プロセッサは、キャプチャ書込バッファ810内のメモリ位置から指定されたSSD内のこの位置にチャンクを書き込むようにストレージ・コントローラ708に指示するコマンドを発行する。たとえば、チャンクが、SSD0書込バッファ816のSSD0エントリ1によって参照される場合に、そのチャンクは、SSD0に書き込まれる。
[0165] 次に、CRCが、チャンク全体に対して計算される。このCRCは、不揮発性メモリ内のチャンクのデータの完全性が、将来の任意の時に妥当性検査されることを可能にする。CRCの値、指定されたSSD上に記憶されたチャンクの位置、ならびにチャンク・インデックス・バッファ802内のチャンクに関するエントリが、ホスト・オペレーティング・システム・ストレージ404Bに書き込まれる。特筆すべきことに、これは、チャンクをSSDから検索する必要があるのではなく、チャンクが、ホスト・オペレーティング・システム・ストレージ404B内の単一のルック・アップを介して見つけられることを可能にする。チャンク・インデックス・バッファ802内のエントリは、それに関連するチャンクよりはるかに小さいので、これは、特定のチャンクを見つけることを安価な手順にする。他のチャンク統計も、ホスト・オペレーティング・システム・ストレージ404Bに書き込まれ得る。
[0166] ストレージ・コントローラ708が、SSDへのチャンク(ならびにおそらくは書込のためにキューイングされている他のチャンク)の書込を完了する時に、ストレージ・コントローラ708は、入出力キュー814に関連する入出力キュー完了バッファ(図示せず)にその旨の指示を書き込む。プロセッサ700または704の一方は、書込が完了する時を判定するために入出力キュー完了バッファを監視することができる。書込完了が検出された後に、プロセッサは、チャンクがストレージにコミットされたことを示すために、ホスト・オペレーティング・システム・ストレージ404B内のチャンクに関連するエントリを更新することができる。
[0167] 図8Cは、図8Aおよび図8Bのデータ構造の間の関係を示す。具体的には、図8Cは、例のチャンク822および例のチャンク・インデックス824を含む。チャンク822は、最も以前にキャプチャされたもの(パケット0)から最も最近にキャプチャされたもの(パケットT)へ順序付けられた、T+1個のキャプチャされたパケットを含む。チャンク・インデックス824は、チャンク822に関連付けられ、パケット0がキャプチャされた時を表すタイムスタンプ、パケットTがキャプチャされた時を表すタイムスタンプ、およびチャンク822内のパケットの個数(T+1)を含む(他の情報の中でも)。
[0168] 上で説明したように、チャンク822およびチャンク・インデックス824は、DMAによってそれぞれキャプチャ・リング・バッファ800およびキャプチャ・インデックス・バッファ802に転送され得る。データの転送またはコピーは、図8Cでは実線を用いて表現され得る。その一方で、データの間の関係は、点線を用いて表現され得る。
[0169] エントリ826が、チャンク処理キュー806に追加される。このエントリは、キャプチャ・リング・バッファ800内のチャンク822とキャプチャ・インデックス・バッファ802内のチャンク・インデックス824との両方の位置ならびにSSDxのキュー内のエントリyである入出力キュー814内の位置を参照する。プロセッサは、チャンク822を、キャプチャ・リング・バッファ800からSSDxのキュー内のエントリyに関連するキャプチャ書込バッファ810内の位置にコピーする。SSDxの書込キューの処理の一部として、プロセッサは、チャンク822をSSDxに書き込むようにストレージ・コントローラにも指示する。SSDなどの長期ストレージ内にチャンクを記憶するのに使用されるフォーマットは、図3を参照して説明したPCAPフォーマットから変化することができる。
[0170] プロセッサは、チャンク・インデックス824とチャンク822のCRCおよびSSD記憶位置とをホスト・オペレーティング・システム・ストレージ404Bにさらにコピーする。この手順のステップが完了する時に、キャプチャ・リング・バッファ800、キャプチャ・インデックス・バッファ802、およびキャプチャ書込バッファ810内の、チャンク822およびチャンク・インデックス824を一時的に記憶するのに使用された位置は、他の使用のために解放され得る。
[0171] この配置は、データ・パケットの高速キャプチャおよび記憶を提供する。具体的には、100ギガバイト毎秒の持続的レートをサポートすることができる。本明細書で説明されるエンド・ツー・エンド・ストレージ・システムは、個々のパケットではなくチャンクに作用することと、処理のしやすさのためにチャンクならびにチャンク内のパケットを注意深く整列することと、複数のチャンクを並列に処理できるようにするためにチャンク処理をパイプライン化することと、各チャンクを1回だけ(メモリ702からメモリ706に)コピーすることと、同一のSSDへの順次書込を超えて順次書込性能を高めるためにSSD(または他のストレージ・ユニット)のアレイにまたがってチャンクを順次書き込むことと、他の動作よりチャンク書込動作を優先することとによってそれを行う。
[0172] 特筆すべきことに、特定のSSDに書き込む時に、各チャンクは、順次増加する位置に書き込まれる。これは、内部ガーベジ・コレクションおよびウェアレベリング論理に起因するSSDストールを制限する。
C.例のパケット・キャプチャ動作
[0173] 図8Dは、例の実施形態を示す流れ図である。図8Dによって示されるプロセスは、ネットワーク・インターフェースおよびストレージ・コントローラに結合された1つまたは複数のプロセッサおよびメモリによって実行され得る。ストレージ・コントローラは、次いで長期パケット・ストレージに結合され得る。ネットワーク・インターフェースは、パケットを受信し、これらのパケットをチャンクに配置する。
[0174] 図8Dの実施形態は、この図に示された特徴のうちの任意の1つまたは複数の除去によって単純化され得る。さらに、これらの実施形態は、以前の図面のいずれかのまたは本明細書の他所で説明される特徴、態様、および/または実施態様と組み合わされ得る。
[0175] ブロック830は、第1のメモリによってネットワーク・インターフェースからパケットのチャンクおよびチャンク・インデックスを受信することを含むことができる。チャンクは、ネットワーク・インターフェースによってキャプチャされた複数のパケットを含むことができ、チャンク・インデックスは、チャンク内の最初のパケットおよび最後のパケットのタイムスタンプならびにチャンク内のパケットのカウントを含むことができる。ネットワーク・インターフェース・ユニットは、それぞれが少なくとも10ギガビット毎秒の回線速度を有する1つまたは複数のイーサネット・インターフェースを含むことができる。
[0176] 関連するチャンク・インデックス内のパケットのカウントは、関連するチャンク内のTCPパケットのカウントおよび/または関連するチャンク内のUDPパケットのカウントを含むことができる。より一般的な場合に、関連するチャンク・インデックス内のパケットのカウントは、関連するチャンク内のユーザ・プログラム可能なパケット分類に関する複数の独立なカウンタを含むことができる。
[0177] いくつかの実施形態では、チャンクのそれぞれのサイズは、固定され、同一である。チャンクのそれぞれは、整数個のパケットを含むことができ、チャンクのいずれかの未使用空間は、パディング・バイトによって充填され得る。
[0178] ブロック832は、第1のメモリの第1のリング・バッファ内にチャンクを記憶し、第1のメモリのインデックス・バッファ内にチャンク・インデックスを記憶することを含むことができる。
[0179] ブロック834は、第1のメモリに結合された第1のプロセッサによって、第2のメモリの入出力キュー内のチャンクのエントリと第1のメモリのチャンク処理キュー内のチャンクのエントリとを割り振ることを含むことができる。
[0180] ブロック836は、チャンクを識別するために、第1のプロセッサによって、チャンク処理キューを読み取ることを含むことができる。
[0181] ブロック838は、第1のプロセッサによって、チャンクを第1のリング・バッファから第2のメモリの第2のリング・バッファ内の位置にコピーすることを含むことができる。位置は、入出力キュー内の割り振られたエントリに関連することができる。
[0182] ブロック840は、第1のプロセッサ、第2のメモリ、およびストレージ・コントローラに結合された第2のプロセッサによって、ストレージ・コントローラに結合された複数の不揮発性パケット・ストレージ・メモリ・ユニットのうちの1つにチャンクを書き込むようにストレージ・コントローラに指示することを含むことができる。第1のプロセッサおよび第1のメモリは、第1のNUMAノードの一部とすることができ、第2のプロセッサおよび第2のメモリは、第2のNUMAノードの一部とすることができる。複数の不揮発性パケット・ストレージ・メモリ・ユニットは、複数のSSDを含むことができる。
[0183] いくつかの実施形態で、第1のプロセッサおよび第1のメモリは、第1のシステム・バスによってネットワーク・インターフェース・ユニットに通信可能に結合され、第2のプロセッサおよび第2のメモリは、第2のシステム・バスによって複数の不揮発性パケット・ストレージ・メモリ・ユニットに通信可能に結合される。ネットワーク・インターフェース・ユニットは、第1のシステム・バスによって第1のメモリにチャンクを書き込むDMAエンジンを含むことができる。ネットワーク・インターフェース・ユニットは、DMAエンジンが第1のシステム・バス上での輻輳を検出する時に遅延または受信されたパケットを捨てさせる背圧スロットルをも含むことができる。
[0184] ブロック842は、第1のプロセッサまたは第2のプロセッサによって、複数の不揮発性パケット・ストレージ・メモリ・ユニットとは別々のファイル・システムにチャンク・インデックスを書き込むことを含むことができる。
[0185] いくつかの実施形態では、第1のプロセッサまたは第2のプロセッサは、チャンク処理キュー内に連続して配置されるチャンクのグループに関して、チャンクのグループに誤り訂正符号を適用することによって1つまたは複数のパリティ・チャンクを計算し、1つまたは複数のパリティ・チャンクを第2のメモリのチャンク・パリティ書込バッファ内に記憶し、複数の不揮発性パケット・ストレージ・メモリ・ユニットとは別々の1つまたは複数の不揮発性パリティ・ストレージ・メモリ・ユニットにまたがって1つまたは複数のパリティ・チャンクを書き込むようにも構成され得る。
III.例の改善された高速パケット・キャプチャ・システム 読取方向
[0186] パケットのチャンクの記憶に加えて、コンピューティング・デバイス400は、パケットの特定の記憶されたチャンクから特定のパケットを取り出すこともできる場合がある。これらの取り出されたパケットは、その後、使用可能なパケット解析ツールとの互換性のある、PCAPフォーマットなどのフォーマットに変換され得る。
[0187] たとえば、パケットの複数のチャンクが、長期パケット・ストレージ404A内に記憶され得、関連するチャンク・インデックスが、ホスト・オペレーティング・システム・ストレージ404B内に記憶され得る。フィルタ式が受け取られ得る。たとえば、フィルタ式は、ユーザによって供給されまたはファイルから読み取られ得る。フィルタ式は、時間期間を指定することができる。
[0188] プロセッサ700または704のいずれか1つが、ホスト・オペレーティング・システム・ストレージ404B内に記憶されたチャンク・インデックス内でこのフィルタへの一致をルック・アップすることができる。たとえば、フィルタが、特定の時間期間(たとえば、開始タイムスタンプおよび終了タイムスタンプによって定義される)を指定する場合に、一致するチャンク・インデックスは、その特定の時間期間内にキャプチャされたパケットを含むチャンクに関連するチャンク・インデックスである。チャンク・インデックス内の順序付けられたタイムスタンプに対する二分探索が、特定のチャンクを突き止めるのに使用され得る。
[0189] 各一致するチャンク・インデックスは、それに関連するチャンクの、長期パケット・ストレージ404A内の記憶位置への参照を含む。これらの位置に基づいて、プロセッサは、これらのチャンクを取り出すようにストレージ・コントローラ708に指示することができる。CRC計算が、各チャンクに対して走行され、関連するチャンク・インデックス内のCRC計算と比較され得る。これらの値が一致しない場合には、チャンクは、破棄され得、チャンク・データ全体が、誤り訂正パリティ情報を使用して再計算され得る。
[0190] CRCが妥当性検査された後に、チャンクは、圧縮解除され得(圧縮が適用された場合に)、フィルタと一致するチャンク内の個々のパケットが、識別され得る。これらのパケットは、チャンクから抽出され、パケット解析ツールによってサポートされるフォーマット(たとえば、PCAPフォーマット)で記憶され得る。
[0191] 図9は、例の実施形態を示す流れ図である。図9によって示されるプロセスは、ネットワーク・インターフェースおよびストレージ・コントローラに結合された1つまたは複数のプロセッサおよびメモリによって実行され得る。ストレージ・コントローラは、次いで長期パケット・ストレージに結合され得る。ネットワーク・インターフェースは、パケットを受信し、これらのパケットをチャンクに配置する。
[0192] 図9の実施形態は、この図に示された特徴のうちの任意の1つまたは複数の除去によって単純化され得る。さらに、これらの実施形態は、以前の図面のいずれかのまたは本明細書で説明される特徴、態様、および/または実施態様と組み合わされ得る。
[0193] ブロック900は、パケット・フィルタ指定を入手することを含むことができ、パケット・フィルタ指定は、時間期間およびプロトコルの表現を含む。
[0194] ブロック902は、ファイル・システムに記憶された複数のチャンク・インデックスにパケット・フィルタ指定を適用することを含むことができる。複数のチャンク・インデックスは、ファイル・システムとは別々の複数の不揮発性パケット・ストレージ・メモリ・ユニット内に記憶されたキャプチャされたパケットのチャンクにそれぞれ関連することができる。複数のチャンク・インデックスは、チャンク内のキャプチャされたパケットのそれぞれのキャプチャ・タイムスタンプおよびプロトコルの表現を含むことができる。パケット・フィルタ指定の適用は、パケット・フィルタ指定と一致するパケットを含む複数のチャンク・インデックスからのチャンク・インデックスのサブセットを識別することができる。
[0195] ブロック904は、チャンク・インデックスのサブセットに関して、複数の不揮発性パケット・ストレージ・メモリ・ユニットから関連するチャンクを取り出すことを含むことができる。
[0196] ブロック906は、関連するチャンク内の各パケットにパケット・フィルタ指定を適用することを含むことができる。パケット・フィルタ指定の適用は、パケット・フィルタ指定に一致するパケットのサブセットを識別することができる。
[0197] ブロック908は、パケットのサブセットをファイル・システムに書き込むことを含むことができる。このファイル・システムは、ローカルまたはリモートとすることができる。
IV.結論
[0198] 本開示は、本願で説明された特定の実施形態に関して限定されてはならず、これらの実施形態は、様々な態様の例示であることを意図されている。当業者に明白であるとおり、その範囲から逸脱することなく、多数の変更および変形を行うことができる。本明細書で説明された方法および装置に加えて、本開示の範囲内の機能的に同等の方法および装置が、前述の説明から当業者に明白になろう。そのような変更および変形は、添付の特許請求の範囲の範囲内に含まれることが意図されている。
[0199] 上の発明を実施するための形態は、添付図面を参照して、開示されるシステム、デバイス、および方法の様々な特徴および動作を説明する。本明細書および図面で説明される例の実施形態は、限定的であることを意図されたものではない。本明細書で提示される主題の範囲から逸脱せずに、他の実施形態を利用することができ、他の変更を行うことができる。本明細書で全般的に説明され、図面に示された本開示の諸態様は、様々な異なる構成で配置され、置換され、組み合わされ、分離され、設計され得ることが容易に理解されよう。
[0200] 図に示され、本明細書で議論されるメッセージ・フロー図、シナリオ、および流れ図のいずれかまたはすべてに関して、各ステップ、ブロック、および/または通信は、例の実施形態による情報の処理および/または情報の伝送を表すことができる。代替実施形態は、これらの例の実施形態の範囲内に含まれる。これらの代替実施形態では、たとえば、ステップ、ブロック、伝送、通信、要求、応答、および/またはメッセージとして説明された動作が、用いられる機能性に依存して、実質的に同時または逆順を含めて、図示されまたは議論された順序から外れて実行され得る。さらに、より多数またはより少数のブロックおよび/または動作が、本明細書で議論されるはしご図、シナリオ、および流れ図のいずれかと共に使用され得、これらのはしご図、シナリオ、および流れ図は、部分的にまたは全体的に、互いに組み合わされ得る。
[0201] 情報の処理を表すステップまたはブロックは、本明細書で説明される方法または技法の特定の論理機能を実行するように構成され得る回路網に対応することができる。その代わりにまたはそれに加えて、情報の処理を表すステップまたはブロックは、モジュール、セグメント、またはプログラム・コードの一部(関連データを含む)に対応することができる。プログラム・コードは、方法または技法の特定の論理動作またはアクションを実施するためにプロセッサによって実行可能な1つまたは複数の命令を含むことができる。プログラム・コードおよび/または関連データは、RAM、ディスク・ドライブ、または別の記憶媒体を含むストレージ・デバイスなど、任意のタイプのコンピュータ可読媒体上に記憶され得る。
[0202] コンピュータ可読媒体は、レジスタ・メモリおよびプロセッサ・キャッシュなど、短い時間期間の間にデータを記憶するコンピュータ可読媒体などの非一時的コンピュータ可読媒体をも含むことができる。コンピュータ可読媒体は、より長い時間期間の間にプログラム・コードおよび/またはデータを記憶する非一時的コンピュータ可読媒体をさらに含むことができる。したがって、コンピュータ可読媒体は、たとえばROM、光ディスク、磁気ディスク、コンパクト・ディスク読取専用メモリ(CD−ROM)など、二次のまたは永続的な長期ストレージを含むことができる。コンピュータ可読媒体は、任意の他の揮発性または不揮発性のストレージ・システムをも含むことができる。コンピュータ可読媒体は、たとえば、コンピュータ可読記憶媒体または有形のストレージ・デバイスと考えることができる。
[0203] さらに、1つまたは複数の情報伝送を表すステップまたはブロックは、同一の物理デバイス内のソフトウェア・モジュールおよび/またはハードウェア・モジュールの間での情報伝送に対応することができる。しかし、他の情報伝送は、異なる物理デバイス内のソフトウェア・モジュールおよび/またはハードウェア・モジュールの間とすることができる。
[0204] 図面に示された特定の配置を、限定的とみなしてはならない。他の実施形態が、所与の図内に示された各要素をより多数またはより少数含むことができることを理解すべきである。さらに、図示された要素の一部を組み合わせるまたは省略することができる。さらに、例の実施形態は、図面に示されていない要素を含むことができる。
[0205] 様々な態様および実施形態を本明細書で開示したが、他の態様および実施形態が、当業者に明白になろう。本明細書で開示された様々な態様および実施形態は、例示のためのものであって、限定的であることは意図されておらず、真の範囲は、以下の特許請求の範囲によって示される。