5

現在、プログラミングの課題に取り組んでいます。割り当ては、クライアント、ネットワーク エミュレーター、およびサーバーを実装することです。クライアントはパケットをネットワーク エミュレーターに渡し、ネットワーク エミュレーターはサーバーに渡します。その逆も同様に適用されます。割り当ての前提条件は、生のソケットのみを使用できることです。そこで、独自の IP ヘッダーと UDP ヘッダーを作成します。Wireshark でパケットをテストしました。それらはすべて正しく、適切な形式です (正しく読み取ります)。

もう 1 つの要件は、エミュレーター、クライアント、およびサーバーのすべてに、バインドする必要がある特定のポートがあることです。現在、生のソケットを特定のポートにバインドする方法がわかりません。すべての raw ソケットは、バインドされているホスト アドレスですべてのトラフィックを受信します。man ページや、Richard Stevens による「Unix Network Programming」を含むインターネット上のあらゆる場所によると、これが本来の動作方法です。先生は私のメールに返事をくれていません。おそらく火曜日まで先生に質問することはできないでしょう。私の前に 2 つの選択肢があります。最初に、libpcap を使用して特定のデバイスからフィルタリングし、生のソケットに出力できます。しかし、これは私たちの任務の範囲外だと思います。または、ソケットから受け取った後にそれらをフィルタリングできます。すべてのパケットがカーネルを介してコピー/移動されるため、これには明らかに多くのオーバーヘッドがあります。少なくとも、それは私の理解です(間違っている場合はお気軽に修正してください)。

だから私の質問は:それらはオプションですか、それとも私が設定できるものですか?raw ソケットがポートにバインドされる場所は? 明らかな何かを見逃しましたか?

お時間をいただきありがとうございます。

--

4

2 に答える 2

3

raw(7)のman ページには次のように書かれています。

bind(2) 呼び出しを使用して、生のソケットを特定のローカル アドレスにバインドできます。バインドされていない場合、指定された IP プロトコルを持つすべてのパケットが受信されます。さらに、SO_BINDTODEVICE を使用して RAW ソケットを特定のネットワーク デバイスにバインドできます。socket(7) を参照してください。

編集:「ポート」はIPではなくTCPおよびUDPの概念であるため、生のソケットを特定のポートにバインドすることはできません。これら 3 つのプロトコルのヘッダー図を見ると、明らかになるはずです。つまり、ポートの概念が不明な下位レベルで作業していることがわかります。

于 2011-02-14T01:47:22.757 に答える
2

ソフトウェアでパケットをフィルタリングすることが期待されていると思います。演習は、IPスタックのさまざまなコンポーネントが、ユーザースペースで単純化された部分を再作成することによって何をするかを学ぶことのように思えます。通常、カーネルでは、IPコードはすべてのパケットを処理し、IPヘッダーを検証し、フラグメントを再構築し、プロトコルフィールドをチェックします。プロトコルフィールドが17(udp)の場合、UDPコード(すべてのUDPパケット)に渡されます。次に、UDPヘッダーを検証し、宛先ポートに基づいてそれらに関心のあるアプリケーションがあるかどうかを判断するのは、UDPコード次第です。

あなたのプロジェクトは多かれ少なかれこのプロセスを模倣することが期待されていると思います。明らかに、カーネルで行うほど効率的ではありませんが、割り当てはユーザースペースにIPスタック(の一部)を書き込むことであるため、効率は演習のポイントではないと思います。

于 2011-02-14T03:03:00.710 に答える