web-dev-qa-db-ja.com

Recv-QおよびSend-Qの使用

Netstatの出力でのRecv-QおよびSend-Q列の使用は何ですか?現実的なシナリオでこれをどのように使用しますか?

私のシステムでは、両方の列が常にゼロとして表示されます。その意味は何ですか?

18
mrg

私のマニュアルページから:

Recv-Q

確立済み:このソケットに接続されているユーザープログラムによってコピーされなかったバイト数。

リスニング:カーネル2.6.18以降、この列には現在のsynバックログが含まれます。

Send-Q

確立済み:リモートホストによって確認されていないバイト数。

リスニング:カーネル2.6.18以降、この列にはsynバックログの最大サイズが含まれます。

これが0に固定されている場合、これは単に、接続の両側のアプリケーションとそれらの間のネットワークが正常に動作していることを意味します。実際のインスタント値は0とは異なる場合がありますが、一時的で逃亡的であり、実際にそれを観察する機会はありません。

これが0とは異なるかもしれない実際のシナリオの例(確立された接続についてですが、あなたはアイデアを得ると思います):

私は最近(貧弱に設計された)サードパーティのデバイスと通信するLinux組み込みデバイスで作業しました。このサードパーティのデバイスでは、アプリケーションは明らかにTCP接続で受信したデータを読み取らずに時々スタックし、TCPウィンドウが0になり、数十秒間スタックしたままになります(現象2つのホスト間のミラーリングされたポートで、wiresharkを介して観察されます)。このような場合には:

  • Recv-Q:実行中netstatサードパーティのデバイスで(私がやるつもりがなかった)は、Recv-Qの増加を示している可能性があります。アプリケーションがそのソケットで使用可能なデータを読み取らず、これらのデータがOSのTCP実装にバッファされたままであるため、ウィンドウが0になるため、反対側(私)がデータの送信を停止するルーフ値、行き詰まったアプリケーションには行かない-> 受信側から、アプリケーションの問題。

  • Send-Q:my側でnetstatを実行(1 /は問題がWiresharkから明らかであり、上記の最初のケースであったため、試しませんでした。 2 /これは100%再現可能ではありませんでした)mayはゼロ以外のSend-Qを示しました、if OSレベルでの反対側のTCP実装がスタックし、データの確認を停止しました-> 送信側から、TCP実装(通常はOSレベル)の問題を受け取ります。

上記のSend-Qシナリオも送信側の問題(私の側)である可能性があることに注意してくださいif my Linux TCP実装は誤動作し、TCPウィンドウの後もデータを送信し続けました0になりました:受信側にはこのデータ用のスペースがありません->確認しません。

Send-Qの問題は、受信側ではなく、送信側と受信側の間の何らかのルーティングの問題が原因で発生する可能性があることに注意してください。一部のパケットは2つのホスト間で「オンザフライ」ですが、まだACKnowledgeではありません。 一方、Recv-Qの問題はホストで明確に発生します:パケットを受信し、確認済みですが、アプリケーションからまだ読み取っていません。

EDIT:

現実的には、ごく普通のホストやアプリケーションでは、送信側と受信側の間のルーティングの問題やネットワークのパフォーマンスの低下が原因でSend-Qの問題が発生するのは間違いないでしょう。 。パケットの「オンザフライ」状態は決して忘れてはなりません:

  • パケットは、送信者と受信者の間のネットワーク上にある可能性があり、

  • (または受信したが、ACKはまだ送信していない、上記を参照)

  • または、ACKは受信者と送信者の間のネットワーク上にある場合があります。

パケットを送信してからACKを受け取るには、RTT(ラウンドタイムトリップ)が必要です。

21
jbm