这是我在这里的第一个问题@*.
我正在为一些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捕获.一段时间后(或检查两者都收到相同的数据包)你可以停止原来的.