web-dev-qa-db-ja.com

WindowsでTCP送信および受信キューのサイズを表示するにはどうすればよいですか?

Linux netstatは、送信および受信キューのサイズを示します。

Windows、特にServer 2003でこの情報を取得するにはどうすればよいですか?

10
Brien

(これはちょっとした脳のダンプです)

Netstatソースのいくつかのバージョンを見ると、探している情報は、Windowsの同等機能を持つソケット関連の呼び出しではなく、カーネル(/ proc/net/...)から直接照会されているようです。これが本当に決まっている場合は、netstatでどのように取得されているかを調べ、同等のものを提供しているものを見つけます。

ドライバーレベルの情報については、おそらく ndis.com (ネットワークドライバーインターフェイス仕様)および PCAUSA.com を参照する必要があります。これは、この情報を取得するのに最適な場所であるためです。 Windowsの場合。

Getsockopt()またはほとんどのWinsockアリーナが役立つ場所になるとは思いませんが、その方向に進みたい場合は、MSDN Winsockの情報を確認してチェックしてください Winsock Programmer's FAQ =。

インバウンドの場合、FIONREADを使用してioctlsocket()関数から有用なものを取得して、ソケットの読み取り可能なデータの量を取得できる場合があります。プロセス間でこれを取得できない場合があり、データのタイプによっては、複数のアイテムがキューにある場合、キュー全体ではなく、データの最初のブロックの情報のみを返す場合があります。

このコンテキストで「バックログ」を掘り下げるかもしれませんが、私が見たもののほとんどは、実際のバックログの大きさを確認することではなく、SYNフラッドを処理するための最大サイズの設定に関連しているようです。

あなたが本当に決心しているなら、あなた自身の Layered Service Provider で何かをすることができるかもしれませんが、それは危険に満ちた奇妙で醜い道であり、私はそれから離れることをお勧めします。

更新:もう少し調べたら、NDIS OIDのクエリを確認する必要があると思います。あなたに最も関連する情報を見つけることは、MSDNとTechNetの間の演習として残されます。

3
fencepost

この質問は古いですが、いくつか情報を追加したいと思いました。これは、Googleでかなり高い検索結果です。

私が知る限り、これを行う方法はありませんが、誰かがもっと掘り下げて有効な代替案を見つけられれば、大歓迎です!

@Fencepostが彼の回答で指摘したように、NDIS OIDをクエリしてみることができます。最も関連性の高いNDIS OID私が見つけたものは OID_GEN_TRANSMIT_QUEUE_LENGTH

ほとんどのNDIS OIDはWMIクラスにマッピングされています。これらをPowerShellでリストすると、

Get-WmiObject -Namespace root\wmi -List  | Where-Object {$_.name -Match "MSNdis" } | Sort-Object

ただし、送信キューの長さはありません。

@Chris Jは、Network Interface\Output Queue Lengthについて言及しました。この値は、コマンドラインで typeperf を使用して取得できます。

typeperf "\Network Interface(*)\Output Queue Length" -sc 1

ただし、値は常に0です。 http://support.Microsoft.com/kb/822226

WindowsはNICドライバソフトウェアでこの情報を追跡するだけで、NICごとにキューに入れられたパケットのみであり、ソケットごとにキューに入れられたものを区別しません。

コマンドラインでネットワークデバッグを実行する場合は、 perfmon にあるカウンタを、 typeperf または logman を使用して照会できます。

3
hmatt1

私が見つけることができる最も近いものは、パフォーマンスカウンターNetwork Interface\Output Queue Length。ただし、これは接続ごとではなく、インターフェースごとであり、送信キューのみをカバーします(当然のことですが、その名前です)。

1
Chris J

現在、ウィンドウサイズはソケットごとに異なります!インターフェイスごとの設定は、デフォルト値のみを表します。

各ソケットのウィンドウサイズを表示する方法がわかりません。 Solarisでは、これは「netstat」で確認できます。

1
asd

WinSock API関数呼び出しgetsockoptの結果が必要な場合があります。

  • SO_RCVBUF受信用に予約されたソケットごとの合計バッファースペース。これはSO_MAX_MSG_SIZEとは無関係であり、必ずしもTCP受信ウィンドウのサイズに対応しているわけではありません。

  • SO_SNDBUF送信用に予約されたソケットごとの合計バッファースペース。これはSO_MAX_MSG_SIZEとは無関係であり、必ずしもTCP送信ウィンドウのサイズに対応しているわけではありません。

問題は、ハンドルがわかっているソケットを要求できることです。外部からのクエリは難しいようです。sysinternals TcpView ツールをご覧ください。マーク・ルシノビッチは本当に亀裂であり、彼も彼のツールで情報を提供していません。彼が値を簡単に取得する手段を持っていれば、彼は列を追加したと思います...

一部のカーネルドライバーはシステムのドリルダウンに役立つ可能性がありますが、使用可能なツールが見つかりませんでした。サイズはソケットごとに設定できるため、グローバル値は意味を持ちません...

1
jdehaan

こちらをご覧ください: http://support.Microsoft.com/kb/224829

0
Massimo