tcpdump丟包問題解決方法
轉載:http://blog.csdn.net/galaxy_fxstar/article/details/5290498
近日用tcpdump抓包,發現有大量的丟包出現("packets dropped by kernel"),
如下:
tcpdump -i eth0 dst port 1234 and udp -s 2048 -X -tt >a.pack
264 packets captured
3043 packets received by filter
2706 packets dropped by kernel
丟包原因:
經過google以及分析,造成這種丟包的原因是由於libcap抓到包後,tcpdump上層沒有及時的取出,導致libcap緩衝區溢位,從而覆蓋了未處理包,此處即顯示為dropped by kernel,注意,這裡的kernel並不是說是被linux核心拋棄的,而是被tcpdump的核心,即libcap拋棄掉的,上層監聽到
1234埠的server可以正常的獲取資料。
解決方法:
根據以上分析,可以通過改善tcpdump上層的處理效率來減少丟包率,下面的幾步根據需要選用,每一步都能減少一定的丟包率
1.最小化抓取過濾範圍,即通過指定網絡卡,埠,包流向,包大小減少包數量
2. 新增-n引數,禁止反向域名解析
tcpdump -i eth0 dst port 1234 and udp -s 2048 -n -X -tt >a.pack
大多數情況這樣就可以解決了
可以通過改善tcpdump上層的處理效率來減少丟包率
3. 將資料包輸出到cap檔案
tcpdump -i eth0 dst port 1234 and udp -s 2048 -n -X -tt -w a.cap
用了這一步,基本上所有的網路server都可以搞定了
4. 用sysctl修改SO_REVBUF引數,增加libcap緩衝區長度
這一步是絕招了,由於設計核心引數修改,儘量不要使用,要用了不行,那就沒辦法了 ^_^