まず、不正なデータをテストするプロトコル層を決定します。
イーサネット
間違ったイーサネット チェックサムを持つ無効なイーサネット フレームを生成して受信したい場合、チェックサムはハードウェアで行われることが多く、そうでない場合は NIC のドライバーがチェックサムを実行するため、多かれ少なかれ不運です。少なくとも Windows ではそれを回避する方法はありません。ただし、NetBSD は、OS ドライバーでイーサネット チェックサムを実行するほとんどのドライバーにそのオプションを提供します。
別の方法は、特別なハードウェアを購入することです (Napatech のカードなど、より安いものを見つけることができます)。このハードウェアは、必要に応じて無効なイーサネット フレームを送受信するための API を提供します。
無効なイーサネット フレームを送信して送信すると、受信側またはその間のルーターがフレームを破棄するだけであり、アプリケーションや OS IP レイヤーに到達することはありません。受信側で NIC または NIC ドライバーをテストします。
知財
無効な IP パケットを送受信することだけが必要な場合は、winpcap を使用してこれを行うことができます。パケットを生成し、winpcap をセットアップしてパケットをキャプチャし、winpcap を使用して送信します。
無効な IP チェックサムを持つパケットは、他の無効なフィールドであることに注意してください。受信側アプリケーションが実行されている TCP/IP スタックは、送信者と受信者の間の IP/レイヤー 3 ルーターと同様に、IP パケットを破棄します。それらはアプリケーションに到達しません。有効な IP パケットを生成している場合は、有効な UDP を生成し、有効な TCP パケットを使用して TCP セッションを自分で実装して、アプリケーションがそれらを処理できるようにする必要があります。そうしないと、TCP/IP によって破棄されます。スタック
受信側の TCP/IP スタックの下部をテストします。
TCP/UDP
これは、無効な IP パケットの送受信とそれほど違いはありません。これはすべて winpcap で行うことができますが、イーサネット/IP ヘッダーが正常である限り、ルーターはそれらを破棄しません。ただし、アプリケーションはこれらのパケットを受信せず、TCP/IP スタックによって破棄されます。受信側の TCP/IP スタックの上部をテストします。
アプリケーション層
これは、アプリケーションを実際にテストする (正気の) 方法です (「アプリケーション」が実際に TCP/IP スタック以下でない限り)。ソケットを使用するアプリケーションと同じようにデータを送受信しますが、必要に応じて不正な形式のアプリケーション データを生成します。アプリケーションはこのデータを受け取りますが、下位のプロトコル レイヤーによって破棄されることはありません。
TCP を使用した特定の形式のテストは、テストが難しい場合があります。つまり、送信される TCP セグメントを変更することです。たとえば、アプリケーションが TCP データをストリームとして正しく解釈することをテストしたい場合です。(たとえば、文字列 "hello" を 5 つのセグメントで送信し、何らかの方法で受信アプリケーションに文字を 1 つずつ read() させたい)。速度が必要ない場合は、通常、送信に一時停止を挿入し、nagel のアルゴリズム (TCP_NDELAY) をオフにするか、NIC MTU を調整することで、その動作を得ることができます。
TCP ストリーム内の下位レベルのプロトコルを使用した不正行為 (たとえば、パケットの 1 つに無効な IP ソース アドレスが含まれる) は、下位レベルのレイヤーによって破棄されることに注意してください。
TCP/UDP (またはその他の IP プロトコル) 上で実行されるアプリケーションをテストします。
代替案
少なくとも最近のウィンドウの制限なしに生のソケットを使用できる別の OS に切り替えます。
上記の「イーサネット」または「IP」の代替に基づいて、透過的なドロップ挿入ソリューションを実装します。つまり、通常のクライアント アプリケーション、通常のサーバー アプリケーションがあります。それらの間のケーブルを切断し、2 つの NIC を備えたボックスを挿入して、受信したフレームのバイトをプログラムで変更し、もう一方の NIC に送り返します。これにより、システムにパケット遅延を簡単に導入することもできます. Linux の netfilter には既にこの機能があり、多くの場合、構成またはスクリプトを作成するだけで、その上に簡単に構築できます。
テストする受信アプリケーションを変更できる場合は、ファイルやパイプなどの他のものからデータを読み取り、必要に応じてランダムなバイト/パケットをフィードします。
主に TCP アプリケーションのテスト用のハイブリッド モデルですが、UDP ICMP 応答のテストなどにも役立ちます。ソケットを使用して TCP 接続をセットアップします。ソケットを使用して無効なアプリケーション データを送信します。ランダムな不正なパケットを導入します (TCP セッションをセットアップし、下位層のエラーを導入する raw ソケットを使用してプログラミングするよりもはるかに簡単です)。不正な IP または UDP/TCP パケット、またはおそらく WinPcap を使用して ICMP パケットを送信しますが、受信側アプリケーションが認識できるように、アドレス/ポートが正しいようにソケット コードと通信して winpcap コードに送信します。
NS/2を調べる