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しましたが、原因と思われるものは何もありませんでした。
何か案は?
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を取得しています...そして、間隔中にパケットがないだけですか?
-l
をtcpdumpオプションに追加することは役に立ちますか?これにより、tcpdump行の標準出力がバッファリングされるため、出力前により多くのデータをバッファリングするのではなく、受信するとすぐにすべての行が出力されます。
デフォルトでは、tcpdumpは通信しているIPアドレスに対してDNS逆引き参照を実行しようとします。 tcpdumpがそのようなDNSルックアップへの応答を取得しない場合、1秒の遅延は妥当なタイムアウトのように聞こえます。
Tcpdumpコマンドラインに-n
を追加すると、DNSルックアップが無効になります。コマンドを次のように変更すると役立ちますか:Sudo timeout .5s tcpdump -ni wlan0 -e
私はあなたの問題を再現することはできません。始めたら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番目のトラフィックが表示される場合は、ネットワークハードウェアまたはそのドライバーに問題がある可能性があります。