2013-08-22 13 views
8

私は、特定のファイル記述子または指定されたインタフェースのいずれかのTCPペイロードアクティビティ(受信バイト総数)のカウンタを検索したいと思います。好ましくは、与えられたファイル記述子であるが、インタフェースに対しては十分である。理想的には、私は本当に、まだユーザー空間に読み込まれていないバイトであっても(まだですか?)、確認済みのバイトについて知りたいと思っています。TCPペイロードアクティビティ/統計情報を確認する

私はgetsockopt()TCP_INFO機能を見たことがありますが、これまでのところ、「受信した合計バイト数」または「送信された合計バイト数(acked)」は表示されていません。

私もインターフェイスのためのnetlinkIFLA_STATS + RTNL_TC_BYTESSIOCETHTOOL + ETHTOOL_GSTATSioctl()rx_bytesフィールドを)見てきた、そしてそれらは素晴らしいですが、私は、彼らが頭上を区別することができるでしょうとは思いません/他のレイヤーのヘッダーと実際のペイロードバイト。

procfs/proc/net/tcpですが、これには私が探しているものは含まれていないようです。

この特定のデータを取得する方法はありますか?

EDIT:プロミスキャスモードはスループットに耐え難い影響を与えます。そのため、それを使用するものは何も活用できません。言うまでもなく、IPスタックの大部分を実装して、どのパケットが適切かを判断することは、このソリューションの意図した範囲外です。

私は、recvmsg()からどのような値を格納するのかを知る/信頼できない/第二に推測することを目標にしています。

Right Thing™を実行するには、これらの値を正しく記録することが重要ですが、単純な「Hey OS」を持つことは価値があります。実際にはがこのソケットで受信されましたか?

+0

'iptables'を使ってカウントを行うことができます。しかし、この回答は面白いです:http://superuser.com/a/264651 – alk

+0

libpcapを使用できますか? モニタインターフェイスを設定して、必要なパケットの種類を正確に取得し、それらのパケットが条件を満たす場合はカウンタを増分するだけです。 –

答えて

1

おそらく、/ proc/net/devの統計が役に立ちます。ペイロードとヘッダーを含む完全なパケットを数えることに慣れていないので、質問が難しくなります。

個々のファイル記述子に関する統計情報については、その情報を取得するための標準的な手段については認識していません。

統計情報が必要なプログラムの起動を制御できる場合は、独自のread()、write()、sendto()、およびrecvfrom()を実装する「インターセプタ」ライブラリを使用することができます。標準Cライブラリへの呼び出しをパススルーしたり、システムコールに直接渡したりして、アクティビティのカウンタを保持し、それらの値を公開する方法を見つけることができます。

2

診断用、または開発用にしますか?

診断の場合、tcpdumpはポートとホストの詳細でフィルタリングされたネットワーク上の状況を正確に伝えることができます。

開発の場合は、おそらくあなたが達成しようとしているかについて、もう少し情報が...

ifconfigコマンドは、RXとTXの合計を与える役立つだろう。

ifconfigは/ proc/net/devからこれらの詳細を取得します(strace ifconfigを参照)。

また、netstat -tによって送信/受信Q値が与えられています(希望通りの場合)。

+0

Devleopment:私は 'recvmsg()'からどのような値を格納しているのかを知る/信頼できない/第二の推測をしたいと思います。 'ifconfig'は、TCPの下のレイヤーからのオーバーヘッドを含みます。 'netstat -t'のReceive-Q値はサンプリングエラーの危険に悩まされています。信頼できる番号を取得するために、どのくらいの頻度でサンプリングすることができますか?値自体は 'procfs'にどのくらい公開されていますか? –

+0

私はprocfsの値が常に最新であると思っています。実際にはファイルではなく、即座に生成されます。 –

+0

おそらく、これが監査メカニズムとして意図されている場合は、recv'ingを実行するコードとデータを使用するコードの間に何かを置く必要があります。同じコード、またはデータをプロキシする完全に独立したプロセスのいずれかで、過去のデータ量をカウントします。監査用でない場合は、今までに読み込まれたバイト数を自分自身でカウントし続けるのではないでしょうか? –

4

SIOCINQでioctlコールを使用して、受信バッファ内の未読データのキューイング量を取得することもできます。 http://man7.org/linux/man-pages/man7/tcp.7.html

int value; 
error = ioctl(tcp_socket_fd, SIOCINQ, &value); 

インターフェースTCPの統計のために、我々はインターフェイスごとに統計情報を見つけること「は、netstat -i -p TCP」を使用することができます。ここではmanページからの使用量があります。あなただけ(ifconfigコマンド/ iproute2をツールですでに利用可能である)インターフェイスごとに合計RX/TXをカウントしたくない場合は

+0

これはかなり役に立ちます。私が望んでいたのはシバン全体ではなく、素晴らしい情報です。 –

+0

私たちが解決策を議論している限り、新しいIOCTL値を追加することによってTCP層のIOCTL呼び出しを拡張することも検討できます。ここでSIOCINQが定義されている場所を見つけることができます:http://lxr.free-electrons.com/source/net/ipv4/tcp.c#L535。基本的には、探しているすべてのカスタム統計を返す新しい構造体 を追加します。明らかに、これは無差別モードのソリューションよりも効率的です。明らかな注意点は、カーネルをコンパイルする必要があることです。おそらく、あなたのユースケースではできないことがあります。 –

+1

ええ、私はそれを範囲外と定義するつもりでした。しかし、おそらく私は上流にそれを提出するのに苦労する必要があります。 –

1

...

あなたはもう少しの/ procに見れば、することができますいくらか詳しい情報を得る。より具体的には、/proc/<pid>/net/dev

出力例:

Inter-| Receive            | Transmit 
face |bytes packets errs drop fifo frame compressed multicast|bytes packets errs drop fifo colls carrier compressed 
    eth0: 12106810846 8527175 0 15842 0  0   0 682866 198923814 1503063 0 0 0  0  0   0 
    lo: 270255057 3992930 0 0 0  0   0   0 270255057 3992930 0 0 0  0  0   0 
    sit0:  0  0 0 0 0  0   0   0  0  0 0 0 0  0  0   0 

あなたが探して起動した場合、情報は(procfsのは、ちょうどこの情報を使用しています)Linux kernelからnet/core/net-procfs.cから来ています。これはもちろん、追跡するための具体的なプロセスが必要なことを意味します。 で入手可能な情報を参照するか、より安定したものが必要な場合は、アプリケーション固有のnet-procfs機能を複製することが理にかなっています。

関連する問題