Linux libpcap 内核函数,linux – libpcap setfilter()函数和丢包

这是我在这里的第一个问题@stackoverflow.

我正在为一些VoIP生产服务器编写一个监控工具,特别是一个允许使用Perl中的pcap库捕获与给定模式匹配的所有流量(VoIP调用)的嗅探工具.

我不能使用差的选择性过滤器,例如“udp”,然后在我的应用程序的代码中进行所有过滤,因为这将涉及太多的流量,内核无法应对报告数据包丢失.

我所做的就是在捕获过程中迭代地构建更具选择性的滤波器.在开始时我只捕获(所有)SIP信令流量和IP片段(模式匹配必须在应用程序级别完成)然后当我发现有关RTP的一些信息到SIP数据包时,我添加’或’子句到具有特定IP和PORT的实际filter-string,并使用setfilter()重置过滤器.

所以基本上是这样的:

>初始过滤器:“(udp和端口5060)或(udp和ip [6:2]& 0x1fff!= 0)” – >捕获所有SIP流量和IP片段

>更新过滤器:“(udp和端口5060)或(udp和ip [6:2]& 0x1fff!= 0)或(主机IP和端口PORT)” – >捕获特定IP上的RTP,PORT

>更新过滤器:“(udp和端口5060)或(udp和ip [6:2]& 0x1fff!= 0)或(主机IP和端口PORT)或(主机IP2和端口PORT2)” – >也捕获第二个RTP流

等等.

这非常有效,因为我能够获得RTP流的“真实”丢包以用于监视目的,而对于我的工具的选择性过滤器版本较差,RTP数据包丢失百分比不可靠,因为有一些数据包因内核丢包而丢失

但是让我们来看看这种方法的缺点.

在捕获时调用setfilter()涉及这样的事实:libpcap将“在更改过滤器时”收到的数据包丢弃,如函数set_kernel_filter()的代码注释中所述,进入pcap-linux.c(检查了libpcap版本0.9和1.1).

所以当我调用setfilter()并且一些数据包到达IP片段时,我确实会丢失一些片段,最后libpcap统计数据不会报告这一点:我发现它正在挖掘痕迹.

现在,我理解为什么这个动作是由libpcap完成的,但在我的情况下,我绝对不需要丢弃任何数据包(我不关心获得一些不相关的流量).

您是否知道如何解决这个不修改libpcap代码的问题?

解决方法:

如何使用更具体的过滤器启动新流程.你可以同时进行两次并行的pcap捕获.一段时间后(或检查两者都收到相同的数据包)你可以停止原来的.

标签:linux,sip,pcap,rtp,libpcap

来源: https://codeday.me/bug/20190630/1340915.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值