如何诊断您的Java IP多播应用程序?

时间:2011-12-06 00:11:41

标签: java linux sockets networking multicast

出于某种原因,我运行的每个组播示例(计算机运行OpenSUSE Linux)都可以。客户都只是静静地坐着。如何找出阻止/忽略多播的原因?

一些例子:

示例1

http://www.roseindia.net/java/example/java/net/udp/UDPMulticastServer.java

示例2

http://docs.oracle.com/javase/tutorial/networking/datagrams/broadcasting.html (使用这些文件:) http://docs.oracle.com/javase/tutorial/networking/datagrams/examples/MulticastServer.java http://docs.oracle.com/javase/tutorial/networking/datagrams/examples/MulticastServerThread.java http://docs.oracle.com/javase/tutorial/networking/datagrams/examples/MulticastClient.java http://docs.oracle.com/javase/tutorial/networking/datagrams/examples/one-liners.txt

3 个答案:

答案 0 :(得分:10)

在对IP多播进行故障排除时,您可以采取一些重要措施来确定这是主机问题,软件问题还是网络问题:

  • 步骤1:确保接收方正在正确的接口上发送IGMP组连接。在接收者的接口上查找组播源的流量。
  • 步骤2:确保服务器正在通过正确的接口在正确的组播组上发送流量
  • 步骤3:对IP多播进行ping测试(使用linux的socat工具)

每个步骤的详细信息概述如下......

第1步

首先,确保linux多播接收器正确地宣传他们的组成员报告;请记住,多播中的很多东西都是从单播中倒退的。例如,多播要求您发送包含要接收的多播组的IGMP加入数据包。

使用tcpdumptshark检查相关界面...在下面的示例中,我在192.168.12.238上发布了一台宣布的计算机(通过igmp)它希望从239.255.0.1

接收多播流量
[mpenning@Finger ~]$ sudo tshark -n -V -i eth0 igmp
Running as user "root" and group "root". This could be dangerous.
Capturing on eth0
Frame 1 (54 bytes on wire, 54 bytes captured)
    Arrival Time: Dec  6, 2011 09:08:45.156782000
    ... >snip< ...
Internet Protocol, Src: 192.168.12.238 (192.168.12.238), Dst: 224.0.0.22 (224.0.0.22)
    Version: 4
    Header length: 24 bytes
    Differentiated Services Field: 0xc0 (DSCP 0x30: Class Selector 6; ECN: 0x00)
        1100 00.. = Differentiated Services Codepoint: Class Selector 6 (0x30)
        .... ..0. = ECN-Capable Transport (ECT): 0
        .... ...0 = ECN-CE: 0
    Total Length: 40
    Identification: 0x0000 (0)
    Flags: 0x02 (Don't Fragment)
        0.. = Reserved bit: Not Set
        .1. = Don't fragment: Set
        ..0 = More fragments: Not Set
    Fragment offset: 0
    Time to live: 1
    Protocol: IGMP (0x02)
    Header checksum: 0x3663 [correct]
        [Good: True]
        [Bad : False]
    Source: 192.168.12.238 (192.168.12.238)
    Destination: 224.0.0.22 (224.0.0.22)
    Options: (4 bytes)
        Router Alert: Every router examines packet
Internet Group Management Protocol
    [IGMP Version: 3]
    Type: Membership Report (0x22)
    Header checksum: 0xe9fd [correct]
    Num Group Records: 1
    Group Record : 239.255.0.1  Change To Exclude Mode
        Record Type: Change To Exclude Mode (4)
        Aux Data Len: 0
        Num Src: 0
        Multicast Address: 239.255.0.1 (239.255.0.1)

^C1 packet captured

现在检查并查看组播源的流量是否到达此接口(我假设它是eth0,如下所示):

sudo tshark -n -i eth0 ip and host 239.255.0.1

如果您看到流量发送到正确的组播组,则直接进入步骤3;否则转到第2步。

第2步

接下来,确保您的多播服务器正在将流量发送到正确的组。在下面的示例中,我运行一个命令来嗅探发送到eth0的流量239.255.0.1

[mpenning@hotcoffee Models]$ sudo tshark -n -i eth0 ip and host 239.255.0.1

1.466991 192.168.12.236 -> 239.255.0.1  UDP Source port: 11111  Destination port: 11111

如果组播源在步骤2中向右侧组发送流量,则在步骤1中看到IGMP组加入,并且步骤1未在组播接收器的接口上看到流量,然后与网络管理员联系以解决此问题。

第3步

假设所有这些都有效,并且您仍然需要进行酸性测试,以防您的多播接收器软件以某种方式丢弃从IP堆栈收到的多播...请确保您的计算机上已安装socat并执行以下...

在组播发送方(服务器)上,使用此命令将测试组播数据包发送到239.255.0.1

perl -e '$ii=0; while (1) { print "hi number $ii\n"; $ii++; }' | socat - UDP-SENDTO:239.255.0.1:11111,sp=11111

在多播接收器(客户端)上,使用此命令侦听在239.255.0.1上发送到eth0的测试多播数据包:

socat - UDP-DATAGRAM:239.255.0.1:11111,bind=:11111,ip-add-membership=239.255.0.1:eth0

假设您的网络管理员允许在239.255.0.1上进行多播,您将在多播接收器的终端窗口中看到大量此类流量:

hi number 212289
hi number 212290
hi number 212291
hi number 212292
hi number 212293
hi number 212294
hi number 212295
hi number 212296
hi number 212297
hi number 212298

注意:不要尝试使用已在网络上正在使用的多播组地址。

第4步

如果步骤1,2和3显示通过您的网络发送和接收多播流量,则调用软件开发人员并告诉他们您认为应用程序存在问题并解释您已采取的步骤远。

如果步骤1,2或3不起作用,请重新配置您的软件/主机/网络,直到它们为止。警告,IP网络中的多播比IP单播更难实现3倍。

祝你好运......

答案 1 :(得分:2)

如何检查多播?

当群集中断时,可能是由于多种原因。其中之一是多播(应用程序订阅某个IP地址并监听消息)。如果用户发现自己间歇性地退出,这可能表明存在这样的问题。

组播IP地址的范围是224.0.0.0到239.255.255.255。 这篇文章只是提醒我在linux级别做什么检查:

运行netstat -g以获取此主机订阅的多播地址。

[root@bruatwls001 ~]$ netstat -g
IPv6/IPv4 Group Memberships
Interface       RefCnt Group
--------------- ------ ---------------------
lo              1      all-systems.mcast.net
eth0            2      239.128.4.0
eth0            1      all-systems.mcast.net

请注意,在RefCnt列中,它显示2个成员属于组239.128.4.0

Ping此多播地址会显示哪些成员订阅了该组(或群集):

[root@bruatwls001 ~]$ ping 239.128.4.0
PING 239.128.4.0 (239.128.4.0) 56(84) bytes of data.
64 bytes from 10.35.8.12: icmp_seq=0 ttl=64 time=0.032 ms
64 bytes from 10.35.8.13: icmp_seq=0 ttl=64 time=0.207 ms (DUP!)
64 bytes from 10.35.8.12: icmp_seq=1 ttl=64 time=0.029 ms
64 bytes from 10.35.8.13: icmp_seq=1 ttl=64 time=0.193 ms (DUP!)
64 bytes from 10.35.8.12: icmp_seq=2 ttl=64 time=0.028 ms
64 bytes from 10.35.8.13: icmp_seq=2 ttl=64 time=0.241 ms (DUP!)

的JGroups

测试多播的好方法是使用jgroup。见http://www.jgroups.org/manual/html/ch02.html#ItDoesntWork 下载jgroups-3.3.3.Final.jar

  • 启动接收器:

[quick@laptop]$ java -cp jgroups-3.3.3.Final.jar org.jgroups.tests.McastReceiverTest -mcast_addr 231.12.21.132 -port 45566
Socket=0.0.0.0/0.0.0.0:45566, bind interface=/fe80:0:0:0:201:4aff:fe5e:5331%2
Socket=0.0.0.0/0.0.0.0:45566, bind interface=/192.168.1.5
Socket=0.0.0.0/0.0.0.0:45566, bind interface=/0:0:0:0:0:0:0:1%1
Socket=0.0.0.0/0.0.0.0:45566, bind interface=/127.0.0.1

  • 启动发件人并输入内容:

 [quick@centos ~]$ java -cp jgroups-3.3.3.Final.jar org.jgroups.tests.McastSenderTest -mcast_addr 231.12.21.132 -port 45566
Socket #1=0.0.0.0/0.0.0.0:45566, ttl=32, bind interface=/fe80:0:0:0:fc54:ff:fedc:d6da%7  
Socket #2=0.0.0.0/0.0.0.0:45566, ttl=32, bind interface=/fe80:0:0:0:21d:7dff:fe03:4cf5%2  
Socket #7=0.0.0.0/0.0.0.0:45566, ttl=32, bind interface=/192.168.122.1  
Socket #8=0.0.0.0/0.0.0.0:45566, ttl=32, bind interface=/fe80:0:0:0:21d:7dff:fe03:4cf5%2  
Socket #9=0.0.0.0/0.0.0.0:45566, ttl=32, bind interface=/fe80:0:0:0:21d:7dff:fe03:4cf5%3  
Socket #10=0.0.0.0/0.0.0.0:45566, ttl=32, bind interface=/0:0:0:0:0:0:0:1%1  
Socket #11=0.0.0.0/0.0.0.0:45566, ttl=32, bind interface=/127.0.0.1  
> helloworld  
> quit

消息显示在接收器窗口中并显示发件人:

helloworld [sender=192.168.1.20:45566]  
helloworld [sender=192.168.1.20:45566]  
helloworld [sender=192.168.1.20:45566]  
helloworld [sender=192.168.1.20:45566]  
helloworld [sender=192.168.1.20:45566]  

答案 2 :(得分:1)

有防火墙阻止多播。打开一个端口就行了!