tcpdump 抓包丢包现象
今天客户要求对他们的通过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
故吾自今始勉,朝闻道,夕可死。