我应该使用套接字还是数据包捕获? perl的

时间:2013-07-31 16:59:54

标签: perl sockets sip pcap tcpdump

我正在尝试为服务器应用程序指定基础,其目的是...

1'接收'tcp和/或udp数据包
2解释内容(即标题值)

要添加更多详细信息,此服务器将收到“sip邀请”并以“302重定向”进行回复。

我有使用Net :: Pcap和perl的经验,并知道我可以通过循环过滤数据包,解码然后使用Net :: SIP之类的东西来实现这一点。

然而,在我不需要的这些模块/应用程序中存在很多膨胀。服务器负载很重,如果我自己运行TCPDUMP,它会因服务器负载而丢失内核中的数据包,所以担心它不合适:(

我是否可以通过'监听'套接字(例如使用IO :: Socket)和解码数据包来实现相同的功能?

不幸的是,通过调试,很难判断IO :: Socket是否会让我有机会看到原始数据包?相反,它会自动将消息解码为可读格式!

tl; dr:我想捕获大量的SIP邀请,分析头部值,并使用SIP 302重定向进行响应。有没有比使用tcpdump(通过Net :: Pcap)更好的方法来实现这个目标?

谢谢, 驼鹿

1 个答案:

答案 0 :(得分:1)

  

有没有比使用tcpdump(通过Net :: Pcap)更好的方法来实现这个目标?

是。使用libpcap(这就是你在那个问题中的意思而不是tcpdump)是实现基于TCP的服务的方式,因为你必须自己重新实现大部分TCP(libpcap为你提供原始网络 - 层数据包),您的程序获取的数据包将被传送到您计算机上的Internet协议栈,因此:

  • 如果您的计算机上没有任何内容正在侦听其他计算机尝试连接的TCP端口,则连接请求将从TCP代码获取RST,并认为连接尝试失败;
  • 如果 某台机器上的某些东西正在侦听该端口,它可能会接受该连接,并且它和您的程序将 尝试与其他人通信机器,它可能会混淆 TCP堆栈并导致各种不良和随机的事情发生。

对UDP来说并不是更好:

  • 如果您的计算机上没有任何内容正在侦听其他计算机尝试连接的UDP端口,则连接请求可能会从UDP代码中获取ICMP端口无法访问的消息,这可能会使其认为连接尝试失败;
  • 如果 某台机器上的某些东西正在侦听该端口,它可能会接受该连接,并且它和您的程序将 尝试与其他人通信机器,它可能会混淆 SIP堆栈并导致各种不良和随机的事情发生。

IO:Socket可能不会给你原始数据包,这是好东西;您不必实现自己的IP和TCP / UDP堆栈。如果您的目标是在您的计算机上实施redirect server,则无需接收原始数据包;您希望通过机器的IP / TCP / UDP堆栈为您完成所有较低级别处理的SIP INVITE。

如果您的计算机上已经有SIP实施,并且您希望充当它的“防火墙”,那么对于某些INVITE,您会发回302重定向并阻止您的计算机上的SIP实施看到有问题的INVITE,您将需要使用您的特定操作系统用于实现防火墙的相同机制。据我所知,这些机制没有类似libpcap的包装器。