7

TCP ストリームを介してデータを送信するときに使用される全帯域幅の測定値をプログラムで取得する方法があるかどうか疑問に思っています。ネットワーク スタックがどのようにストリームをパケットに分割するか、TCP SYN や ACK を送信するか、またはバックグラウンドで行う多くのことをいつ送信するかがわからないため、これについては大まかな見積もりしか取得できません。

私が考えることができる唯一の解決策は、実際にインターフェイスをスニッフィングすることですが、スタックがすでにこの統計を収集できると考えたいと思います。

これは、Windows または Linux のいずれかで Java で実行されます (もちろん、移植可能なソリューションが望ましいでしょう) が、C/C++ の回答を JNI 化できるため、(および OS API 呼び出しも) 適切な回答になります。ありがとうございました!

4

7 に答える 7

2

[Windows固有の回答]

Windowsでは、ETW(Windowsのイベントトレース)を検討することができます。一般に、ETWは、Windowsでトレース/ログ情報を提供するために使用されるテクノロジであり、ほとんどのMicrosoftソフトウェアには、使用可能なETWプロバイダーが既に組み込まれています。あなたの場合、Microsoft-Windows-TCPIPプロバイダーには、役立つ情報(ローカル/リモートのアドレスとポート、操作、送受信されたバイト数など)があると思います。

たとえば、次のコマンドを使用して、TCPIPイベントのファイルへの収集を開始できました。

logman start MyTcpipLog -p Microsoft-Windows-TCPIP -ets

そして、で停止します

logman stop MyTcpipLog -ets

次に、MyTcipipLog.etlファイルをさまざまなツール(xperfなど)を使用して開くことができますが、このファイルを自分で解析するために使用できるAPIがあります。

実行時にこれを実行したい場合は、「リアルタイム」ETWセッションを作成して、イベントが発生したときにそれを処理できます。

ETWを初めて使用する場合は、私が使用したMSDNに関する役立つ記事をご覧ください。

于 2011-04-12T02:00:47.687 に答える
1

Windows については言えませんが、Linux カーネルは 2.6.37 の時点で、探している統計を収集していません。ソケットごとの統計はstruct sockまたはその子孫にある必要があり、そこに送信/受信カウンターが表示されません。

http://lxr.linux.no/linux+v2.6.37.3/include/net/sock.h#L224

于 2011-03-08T07:01:42.610 に答える
0

conntrackアカウンティングを使用して、接続ごとにパケットとバイトを測定できるはずです。次に、netlinkソケットを使用して情報を照会する必要があります。getocknameとgetpeernameを使用してソケットに関する情報を取得し、この情報を使用して接続追跡エントリを検索します。

これには、最近の十分なカーネル、ロードされたconntrackモジュール、およびlibnetfilter_conntrackが必要です。

また、同じ情報が/ proc / net / nf_conntrackにありますが、そのファイルはあまり頻繁に解析されるべきではありません。

また、コマンドラインからこの情報にアクセスできる「conntrack」という名前のツールがあります。

于 2011-04-26T11:45:44.027 に答える
0

Linux では、これは root が取得するのはかなり些細な情報です (トラフィックに一致する netfilter チェーンを作成するだけです。たとえば、後でチェーンに関連付けられたカウンターを読み取るなど、プロセス ID の一致を使用できます)。限られた権限でそれを行うことは、おそらく不可能です。

Windowsについてはわかりません。

于 2011-04-12T02:14:39.150 に答える
0

Perfmon カウンターの消費を調べることができます。Network Interface/Current Bandwidth カウンターが必要な場合があります。.NET コードからパフォーマンス カウンターを作成して使用できます。

于 2011-04-26T23:56:33.287 に答える
-1

この TCP ストリームがインターフェイスを通過する唯一のものである場合は、インターフェイスの統計情報 (送受信されたバイト数) を照会し、自分で時間を測定する (+ 計算を行う) ことができます。

于 2010-10-21T22:53:37.120 に答える
-1

TCP は、MTU によって指定される固定データグラムです。MTU がわかっている場合は、送信する必要があるデータ グラム数を把握でき、TCP は確認応答の標準モデルに従います。

これは、イーサネットとスタックの他のレイヤーのオーバーヘッドを含む、データ伝送のオーバーヘッドを把握するのに役立つ優れた記事です。

于 2010-02-03T16:11:59.080 に答える