web-dev-qa-db-ja.com

tcpdumpがパケットを返すまでの1秒の遅延

Ubuntuを使用して、tcpdumpスニッフィングをクライアントデバイスからの自己識別型「ping」と同期させようとしています。問題は、tcpdumpに組み込まれている遅延のように見えるため、正確な開始と停止を取得することが困難になることです。これが私のスクリプトの重要な行です。

Sudo timeout .5s tcpdump -i wlan0 -e

たとえば、0.5秒後にtcpdumpを停止するようにタイムアウトを設定すると(私の例のように)、パケットは返されません。実際、1.1s未満の値はパケットを返すことができません(1.1以上の値はうまく機能します)。

DNSを抑制するために-n引数を追加しようとしましたが、違いはありませんでした。また、2つのまったく異なるwifiカード(IntelCentrinoとTP-LinkN900)を使用してこれを試し、ハードウェアの「機能」だけではないことを確認しました。

私は開発者ではありませんが、「delay」、「latency」、「timeout」のtcpdumpソースコードをgrepしましたが、原因と思われるものは何もありませんでした。

何か案は?

6
dlanced

gnu coreutils timeout.cには、timer_settime()のないシステムのフォールバックがあります-それは1秒の解像度に戻ります:

/* timer_settime() provides potentially nanosecond resolution.
setitimer() is more portable (to Darwin for example),
but only provides microsecond resolution and thus is
a little more awkward to use with timespecs, as well as being
deprecated by POSIX.  Instead we fallback to single second
resolution provided by alarm().  */

おそらくそれはあなたの問題です。私はubuntuを実行していないので、直接確認することはできませんが、たとえば、私のopenbsdマシンにはsetitimer()しかないため、1秒のタイムアウトしか使用しません。

-編集:2回目の表示では、切り捨てがない限り、少なくとも1秒待つ必要があります...またはどういうわけかtcpdumpが初期のsigtermを取得しています...そして、間隔中にパケットがないだけですか?

2
pete

-lをtcpdumpオプションに追加することは役に立ちますか?これにより、tcpdump行の標準出力がバッファリングされるため、出力前により多くのデータをバッファリングするのではなく、受信するとすぐにすべての行が出力されます。

2
Tero Kilkanen

デフォルトでは、tcpdumpは通信しているIPアドレスに対してDNS逆引き参照を実行しようとします。 tcpdumpがそのようなDNSルックアップへの応答を取得しない場合、1秒の遅延は妥当なタイムアウトのように聞こえます。

Tcpdumpコマンドラインに-nを追加すると、DNSルックアップが無効になります。コマンドを次のように変更すると役立ちますか:Sudo timeout .5s tcpdump -ni wlan0 -e

1
kasperd

私はあなたの問題を再現することはできません。始めたらping -i 0.3 google.comそして実行timeout .5s tcpdump -i wlan0 -eトラフィックが表示されます。

Tshark 経過時間など、さまざまな条件下でのキャプチャの停止をサポートします。あなたは試すことができます

tshark -a duration:1 -i wlan0
tshark -a duration:2 -i wlan0

それらの両方がトラフィックを示している場合、問題はおそらくkasperdが示唆していることです。最初のトラフィックが表示されないのに2番目のトラフィックが表示される場合は、ネットワークハードウェアまたはそのドライバーに問題がある可能性があります。

0
sciurus