18

私はここ数日、マニュアル ページ、ドキュメント、その他 Google が持ち出したあらゆるものを読んで過ごしましたが、最初よりもさらに混乱していると思います。

私がやりたいことは次のとおりです。C/C++ を使用した Linux システムでワイヤレス インターフェイス (802.11) を介して、独自のレイヤー 3-x プロトコルでデータ パケットを送受信したいと考えています。ここまでは順調ですね。ビーコン、関連付け、または AP/SSID 関連のものは必要ありません。ただし、データ送信については、MAC レイヤーが「通常どおり」に動作するようにしたいと考えています。つまり、ユニキャスト パケットが ACK され、再送信され、バックオフされます。また、拡張 QoS 機能 (802.11e と 4 つのキューと異なるアクセス カテゴリ)。一方、プロミスキャス モードは問題ではありません。ブロードキャスト パケットと特定のステーションに送信されるパケットのみが必要です。

それについて行く正しい方法は何ですか?raw ソケット アクセスに関するドキュメントのほとんどは、ネットワーク スニッフィングに焦点を当てているようで、役に立ちません。私はしばらくの間モニターモードをいじっていましたが、これまでに読んだことから、受信したパケットはモニターモードなどでACKされません.モニターモードがなければ、代替手段は何ですか? アドホック モードと unix raw ソケットを使用していますか? それとも、ドライバーをいじる必要がありますか?

私は完全な解決策を探しているのではなく、どこから始めるべきか、いくつかの良いアイデアを探しています。socket(2)、socket(7)、および packet(7) の man ページを読みましたが、さまざまなモードでの MAC 層の動作に関しては役に立ちませんでした。

前もって感謝します。

4

5 に答える 5

7

802.11 は、レイヤー 2 (および 1) プロトコル仕様です。これは、上位層のプロトコルがイーサネット ネットワークとして扱うことができるように設計されています。アドレッシングと動作は一般的に同じです。したがって、レイヤ 3 プロトコルの場合、802.11 についてまったく気にする必要はなく、イーサネット ネットワークで実行されることを期待しているかのようにコードを記述する必要があります。

これを機能させるには、まず何らかのワイヤレス ネットワークに接続する必要があります (概念的には、イーサネット カードにワイヤを差し込むのと同じです)。ここでは、アドホック (別名 IBSS) またはインフラストラクチャ (別名 BSS) ネットワーク (または 802.11ad が承認されたら PBSS ;) を選択できます。

ネットワークとの関連付けを一切行わずにカードを操作する (単にパケットを送信するだけである) ことは、いくつかの理由からお勧めできません。最も重要なことは、ハードウェアに大きく依存し、信頼性が低いことです。一方では RF mon (AKA モニター モード) インターフェイスを使用し、もう一方ではパケット インジェクション (radiotap ヘッダーを使用) を使用してこれを行うことはできますが、お勧めしません。同じカードのセットを持っていたとしても、ある時点で説明が難しく、ランダムな動作に遭遇する可能性が最も高い. 802.11 NIC はこの種の操作用に設計されておらず、ファームウェア内で異なる状態のマウントを保持します (FullMAC と SoftMAC カードについて読んでください)。SoftMAC カードでさえ、かなり異なります。たとえば、理論的には、あなたが言ったように、カードは受信パケットにACKを送信しないでください。カードもありますがいずれにせよ、ACK はフレームを受信しました。これは、フレームが自分宛てであるという事実のみに基づいて決定を行うためです。一部のカードは、確認したすべてのフレームに ACK を試行することさえあります。再送信でも同様のことが起こります。一部のカードは、注入されたパケットを 1 回だけ送信します (これが機能するはずです)。他の NIC では、再送信はハードウェア (およびファームウェア) によって処理され、ドライバーはそれをオフにすることができないため、データが挿入されていても自動再送信が行われます。

レイヤー 3 に固執し、既存のモード (アドホックなど) を使用すると、必要なすべての機能とそれ以上の機能 (QoS など) が得られます。インターフェイスに送信するイーサネット フレームは、カーネルによって、QoS マッピングなどを使用して 802.11 形式に「変換」されます。

さまざまなモードでの MAC の動作について知りたい場合は、mac80211コードまたは 802.11 標準そのものを読む必要があります。http://linuxwireless.org wiki 私はいくつかのことであなたを助けますが、カーネルハッカーは通常、コード内のコメント以外のドキュメントを書くのに忙しいです;)

L3 プロトコルの実装自体も、カーネル モードまたはユーザー モード (raw ソケットを使用) のいずれかで実行できます。いつものように、カーネル側は実行が難しくなりますが、より強力になります。

于 2012-05-13T14:52:00.283 に答える
2

独自のネットワーク層プロトコル (IP の代わり) を作成したいので、キーワードは「生のイーサネット ソケット」です。したがって、「Raw IP ソケット」は無視してください。

ここから始めましょう:

int sockfd = socket( PF_PACKET, SOCK_RAW, htons(XXX) ); 

正しいマニュアル ページは次のとおりです: packet(7)

キーワードでググると詳しい情報が見つかります。完全な例を 1 つここに示します。

編集:例へのリンクは現在壊れているようです:別の例

于 2012-05-12T13:47:33.730 に答える
1

おそらく、 libpcapのようなものが必要です。

Libpcap を使用すると、ネットワーク インターフェイスから生のパケットを読み込んだり、ネットワーク インターフェイスに挿入したりできます。

于 2012-05-07T03:54:09.327 に答える
0

メディア層とトランスポート層が混同されているようです。

802.11 は、一般に「リンク」、「物理」、または「メディア」レイヤーと呼ばれるもので、未加工のデータグラムの送信のみを処理することを意味します。

ACK、再送信、バックオフ (フロー制御) などの概念は「トランスポート」層に適用され、これらの特定の用語は TCP/IP と強く関連しています。

独自の完全なトランスポート層をゼロから実装することは非常に困難であり、ほとんどの場合、やりたいことではありません。代わりに、802.11 の独自のカスタム解釈の上に既存の TCP/IP スタックを使用する場合は、仮想ネットワーク インターフェイスを作成することをお勧めします。これは、TCP/IP とメディア層の間の仲介者として機能します。

これにより、より適切なコンテキストと検索キーワードが得られることを願っています。

于 2012-05-07T02:11:11.750 に答える