Ip

tcpdump:“擷取的數據包”與“過濾器接收的數據包”

  • March 9, 2019

我們有一個腳本呼叫

tcpdump -v src host <IP address> and port <port number> >>out.txt 2>>err.txt -w capture.cap

在多個 IP 上,而腳本的其他部分在後台啟動一些流量。我們想檢查數據包是否返回給我們,並且僅在我們收到包裹時手動檢查那些情況。起初,tcpdump 的錯誤輸出似乎很好,但是。

問題是,正如主題所暗示的那樣,“擷取的數據包”和“過濾器接收的數據包”之間有什麼區別?有擷取,它沒有記錄任何數據包,但是輸出“擷取了0個數據包,過濾器接收了2個數據包”這聽起來很矛盾,因為如果沒有擷取數據包,其中2個是如何過濾的?起初,我們一直在尋找“過濾器收到 0 個數據包”,但當沒有收到數據包時,它並不總是寫入錯誤輸出。那麼這些數字說明了什麼?

如果我們想在沒有收到回複數據包的情況下過濾這些情況,我需要知道要尋找什麼。

我希望這能對這個問題有所啟發。從手冊頁

當 tcpdump 完成擷取數據包時,它將報告以下計數:

擷取的數據包(這是 tcpdump 已接收和處理的數據包數);

過濾器接收的數據包(其含義取決於您執行 tcpdump 的作業系統,並且可能取決於配置作業系統的方式 - 如果在命令行上指定了過濾器,則在某些作業系統上,無論是否它們被過濾器表達式匹配,即使它們被過濾器表達式匹配,無論 tcpdump 是否已讀取並處理它們,在其他作業系統上,它只計算過濾器表達式匹配的數據包,而不管 tcpdump 是否已讀取並處理它們,而在其他作業系統上,它只計算與過濾器表達式匹配並由 tcpdump 處理的數據包);

核心丟棄的數據包數(這是由於缺少緩衝區空間而被執行 tcpdump 的作業系統中的數據包擷取機制丟棄的數據包數,如果作業系統將該資訊報告給應用程序;如果沒有,它將報告為 0)。

還有一個 2009 年的郵件列表條目解釋說:

“過濾器收到的數據包”號碼是ps_recv來自呼叫的號碼pcap_stats();使用BPF,這是bs_recv來自BIOCGSTATS ioctl. 該計數包括所有交給 BPF 的數據包;這些數據包可能仍在一個尚未被 libpcap 讀取的緩衝區中(因此未交給 tcpdump),或者可能在一個已被 libpcap 讀取但尚未交給 tcpdump 的緩衝區中,因此它可以計算不報告為“擷取”。

也許這個過程被殺死得太快了?還有一個標誌告訴 tcpdump在擷取數據包-c N時退出。N

由於您的問題似乎非常專業,您也可以libpcap直接使用或通過數百種語言綁定之一使用。

對於你的問題,由於你得到的只是文件中擷取的包capture.cap,你可以只查看它不為空的執行並檢查這些,即,嗯,計算行數?

tcpdump -r capture.cap | wc -l

可能有更好的方法使用 libpcap 返回擷取文件中的條目數……

引用自:https://unix.stackexchange.com/questions/29367