1. 程式人生 > >tcpdump丟包問題解決方法

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緩衝區長度

這一步是絕招了,由於設計核心引數修改,儘量不要使用,要用了不行,那就沒辦法了 ^_^