補充:
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