2011-09-26 50 views
0

同行的编码器。 我使用libnetfilter_queue模块监视我的传出流量和iptables规则 ipatbles -I OUTPUT 1 -p所有-j NFQUEUE --queue-NUM 11220Linux应用程序发送UDP无插座

有一定的应用,称为Jitsi(运行在Java的)是表现出以前没有遇到过这样奇怪的行为: 我处理NFQUEUE数据包的监视程序清楚地表明UDP数据包正在发出,但是当我查看时: “/ proc/net/udp”和“/ proc/net/udp6“它们是空的,而且”/ proc/net/protocols“有一个用于UDP的列”socket“,它是0. 但UDP数据包不断发送。 然后一分钟左右,“/ proc/net/udp”和“/ proc/net/protocols”开始显示关于UDP数据包的正确信息。 又过了一段时间,在发送UDP数据包时,它们中没有信息。

我唯一的结论是,某种程度上应用程序可以在不创建套接字的情况下发送UDP数据包,并且/或者可能创建一个套接字然后将其删除(以便内核认为没有)并仍然使用某些模糊的方法发送数据包到外面。

请问有人会有这种行为的想法吗?

+5

Jitsi可以打开/关闭它发送的每个数据包的套接字吗?我对套接字栏的理解是,它的套接字通过一个进程被主动保持打开。除非您在Jitsi发送内容时检查了协议数据,否则您将只看到0的套接字计数。 –

+0

你是对的,它们显示为活动进程。我的应用扫描/ proc/* 10毫秒后,它收到数据包,我检查了时间戳(但我已经找到了解决我的问题) – abirvalg

回答

0

谢谢保罗鲁贝尔给我的方向是正确的提示。 strace表明Java应用程序正在使用IPv6套接字。我仔细看过/ proc/net/udp6,那里有那些插座。主要是因为我甚至没有期望在那里找到他们,所以我可能第一次看到过于粗略的观点。这是我第一次通过IPv6套接字偶然发现IPv4数据包。但这正是Java所做的。 干杯。

+2

你应该考虑接受答案,如果它解决了你的问题。 –

4

两个想法:

尝试运行通过strace的应用程序,并看看该输出。

您也可以尝试通过systemtap运行它,并使用过滤器进行套接字操作。 从该链接:

probe kernel.function("*@net/socket.c").call { 
    printf ("%s -> %s\n", thread_indent(1), probefunc()) 
} 
probe kernel.function("*@net/socket.c").return { 
    printf ("%s <- %s\n", thread_indent(-1), probefunc()) 
}