0

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

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

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

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

但是,我不需要的这两个模块/应用程序都有很多膨胀。服务器将承受重负载,如果我自己运行 TCPDUMP,由于服务器负载,它会丢失内核中的数据包,所以担心它不合适:(

我是否可以通过在套接字上“侦听”(例如使用 IO::Socket)和解码数据包来实现相同的目的?

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

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

谢谢,驼鹿

4

1 回答 1

1

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

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

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

UDP 也好不到哪里去:

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

IO:Socket可能不会给你原始数据包,这是一件好事;您不必实现自己的 IP 和 TCP/UDP 堆栈。如果你的目标是在你的机器上实现一个重定向服务器,你就不需要接收原始数据包;您希望通过机器的 IP/TCP/UDP 堆栈为您完成所有较低级别的处理来接收 SIP INVITE。

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

于 2013-07-31T20:22:48.633 回答