今天客戶要求對他們的通過tcpdump抓取的鏡像數據進行分析,未發現有異常的行為,但是客戶通過日志監控設備發現有異常的登錄,根據時間去查找該時間段內的報文信息,發現該時間段內報文丟失,即tcpdump抓包有丟包現象。分析原因,啟用的命令是正常的tcpdump命令,tcpdump -i etho0 -w save.pcap;命令沒有錯誤,問什么會有丟包的現象內,上網查了好多資料,都沒有說清楚為什么,最后還是用google查詢后,發現有一個帖子解釋了這個現象:
造成這種丟包的原因是由於libcap抓到包后,tcpdump上層沒有及時的取出,導致libcap緩沖區溢出,從而覆蓋了未處理包。也就是說tcpdump使用libcap將在linux內核協議棧中的數據包文件提取出來,放到libcap的緩存區內,tcpdump處理ibcap緩存區內數據,而但tcpdump處理速度跟不上時,libcap緩沖區內容就會被覆蓋,從而產生丟包現象。
解決方法:
根據以上分析,可以通過改善tcpdump上層的處理效率來減少丟包率,下面的幾步根據需要選用,每一步都能減少一定的丟包率
1. 最小化抓取過濾范圍,即通過指定網卡,端口,包流向,包大小減少包數量
2. 添加-n參數,禁止反向域名解析
3. 添加-B參數,加大OS capture buffer size
4. 指定-s參數, 最好小於1000
5. 將數據包輸出到cap文件
6. 用sysctl修改SO_REVBUF參數,增加libcap緩沖區長度:/proc/sys/net/core/rmem_default和/proc/sys/net/core/rmem_max