tcpdump丟包問題解決方法

補充:

tcpdump -B buffer_size

-B Set the operating system capture buffer size to buffer_size


/******************************************************************************
 * Copyright 1998-2008 Davidfan
 * 2010-0205, Davidfan written
 * --------------------
 ******************************************************************************/

 

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

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


原文:http://blog.csdn.net/galaxy_fxstar/article/details/5290498

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章