アプリケーション レベルのメッセージは、受信側で組み立てられてアプリケーション レベルに渡される一連のパケットでネットワーク経由で送信されます。これらの個々のパケットのレベルでネットワーク プログラミングを行う
ことは可能ですか?
それとも、「アプリケーション」レベルのパケットしか見えませんか? つまり、これらすべてのネットワーク パケットによって組み立てられる「大きなパケット」でしょうか。
この件についてGoogleで調査しようとしましたが、結果は本当に混乱しています。Java
Java
混乱は、UDP に関する一部のリソースが操作がパケット上で行われていることを示しているように見えるという事実によるものであり、他のリソースは、Java が raw ソケットで動作できないと述べているため、より高いレベルの抽象化で動作することを意味します。私が探しているものへの正確な答えを見つけてください。はいの場合、どのパッケージがこれを行いますか?
3 に答える
Java で、これらの個々のパケットのレベルでネットワーク プログラミングを行うことは可能ですか?
はい。ただし、個別のパケットが必要になる可能性はほとんどありません。
それとも、Java では「アプリケーション」レベルのパケットしか見えないのでしょうか?
Pure Java は TCP ストリームと、パケットと 1 対 1 のマッピングを持つ UDP データグラムのみを表示できますが、UDP ヘッダーにはアクセスできません。
つまり、これらすべてのネットワーク パケットによって組み立てられる「大きなパケット」でしょうか。
パケットが大きくても小さくてもまったく得られません。データを読み取ると、利用可能なデータが読み取られます(バッファのサイズまで)
はいの場合、どのパッケージがこれを行いますか?
JPcap を使用して個々のパケットを表示できますが、各パケットの正確なタイム スタンプが必要な場合やドロップされたパケットを追跡する必要がある場合を除き、これはほとんど役に立ちません。
これは、JNI 経由で winpcap (Windows) または libpcap (Linux) を使用します。
これが使用されているのを見たこれらのケースのほとんどでは、ほとんど利益が得られずに多くの作業が行われました。
私の観点からすると、JNIに言及している回答は、Javaがそれをサポートしていないことを意味します(必要なもののために実際に別の言語でコーディングする必要があるため)
ソケット、ファイル、GUI コンポーネントはすべて最終的に JNI を使用します。この定義では、OS が Java で書かれていないため、Java でシステム コールを使用することはできません。
これは、Java で何ができるかを定義するのに役立つとは思いません。
1) Pure Java は TCP ストリームしか見ることができません。UDPはどうですか?
libPCap がないと、Java のプロトコルを使用してパケットのヘッダーにアクセスすることはできません。
この時点で、パケットアクセスがないことを意味すると思います
追加のライブラリがないわけではありません。
2)これが使用されているのを見たこれらのケースのほとんどで、それは大変な作業でしたか?どうして。
それは非常に低レベルであり、通常は気にする必要のない多くの詳細が公開されているためです。注: 記録しようとしているときにパケットがドロップされる可能性があるため、パケットを取得できない可能性があり、再度要求することができないため、それらを見逃す可能性があります。
ただの図書館ですよね?
正しい。
うまくいきませんか?
なぜそう言うのですか?
私がしなければならないことがJavaでできるかどうか、または他の言語を調べる必要があるかどうかを確認しようとしています.
私見、別の言語ではこれ以上簡単なことはありません。
jpcap のドキュメントで、パケットのドロップなど、トラフィックを再形成できないことを読みました。なぜそれができないのでしょうか?
ネットワークにパケットをドロップさせることはできませんし、カーネルをだましてパケットをドロップさせることもできません。ドロップされたパケットとは何かを考えれば、答えは明らかです。
UDP == raw と考えているようです。そうではありません。Raw == IP、またはイーサネット。UDP は、TCP と同様に IP 上のレイヤーです。Java の raw ソケットでは作業できませんが、UDP と TCP では作業できます。
他のデバイスが大きな UDP パケットを小さなパケットに分割した場合、パケット化されたセグメントは表示されません。
TCP を読み取るときは、バイトをストリームとして読み取ります。これらのバイトが実際にどのように送信されたかはわかりません。100 バイトを読み取ることができ、10 パケットを超えて送信された可能性があります。
JNI を使用せずに Java でこの情報にアクセスする方法はありません。もちろん、JNIを使えば何でもできます:)