hxqhit 发表于 2012-09-16 18:18

linux组播问题


我使用网络发送组播数据包时,碰到问题,请教各位。

如下图所示,网络中存在三种设备,组播服务器、linux网络设备和PC(组播客户端),数据流如下图所示:

1、组播服务器通过FPGA发送:src_IP/10.10.2.X/24,dst_IP/230.0.0.1的组播数据包;

2、linux网络设备sn0(虚拟网络设备)接收数据包后,将数据报src_IP/10.10.2.X/24替换成192.168.1.x(类似SNAT),数据包变为
   src/192.168.1.xdst/230.0.0.1,发送给linux内核协议栈;

3、linux内核接收src/192.168.1.xdst/230.0.0.1的数据包后,进行组播路由转发,发送给eth0;

4、通过eth0发送给加入组播组局域网PC;

存在问题:在局域网PC端,通过wireShark可以抓到组播数据包,但是应用程序确收不到该数据包;
原因分析:
            1、若将组播服务器设置为192.168.1.x/24网段,局域网客户端应用程序可以正确接收组播数据;
            2、目前,不太理解在sn0接收数据时进行src_ip替换,还有哪些地方需要修改,从而影响到局域网PC数据报的接收;
                (查看内核SNAT相关代码,也没找着原因)
            3、理论上进行src_ip替换(即SNAT)转换,是在数据报经POSTROUTING前进行;是否在数据报入口PREROUING时,进行src_ip替换是不可以的呢?

ssffzz1 发表于 2012-09-17 09:57

存在问题:在局域网PC端,通过wireShark可以抓到组播数据包,但是应用程序确收不到该数据包;
你没比较过2种情况下数据包的异同吗?除了地址外都一样吗?

hxqhit 发表于 2012-09-17 10:53

回复 2# ssffzz1
我对比了两种情况下,IP头的内容,除了idefication之外,其他数据位是一样的;
在局域网PC端,使用原始套接字可以抓到组播数据,说明数据已经进入网络层处理了;
可能替换源IP,会影响网络层或传输层对组播数据的处理。

   

txgc_wm 发表于 2012-09-19 11:27

本帖最后由 txgc_wm 于 2012-09-19 11:29 编辑

设置组播服务器的跳数,结果会如何?你的FPGA设备是不是也相当于一个网络设备了?

ssffzz1 发表于 2012-09-19 12:27

按说只有IP地址和ID不同的话,不会影响组播接收的。

hxqhit 发表于 2012-09-19 21:21

回复 4# txgc_wm


    FPGA相当于一个网络设备,sn0就是就是它的驱动。
    设置跳数是指? 发送组播数据时,已经设置IP包的TTL值为64,局域网计算机wireshark抓到的包TTL为63;即经过linux网络设备(相当于组播路由器),TTL减1.

hxqhit 发表于 2012-09-19 21:22

回复 5# ssffzz1

是啊,也挺奇怪的。ID只影响拆包组包。
   

hxqhit 发表于 2012-09-19 21:32

本帖最后由 hxqhit 于 2012-09-19 21:33 编辑

目前,想通过以下两种方案来替代已有的方案:
1、sn0驱动中替换src_IP; 使用原始套接字connect函数,在网络层抓到该组播包后,在应用层向局域网发送组播包;
2、sn0驱动中替换src_IP; 使用libpcap,在应用层设置过滤规则,数据链路层按照过滤条件抓包,应用层接收后在局域网发送组播包;

上述方案未验证,就看传输速率能达到多大了。

云之子1 发表于 2015-07-30 16:26

不知道您现在解决了这个问题没啊!我最近在调试组播时也遇到了这个问题,我看了哈内核的代码的。是在udp_v4_mcast_next函数的判断中sk返回空,即没有找到接收的套接字,所以内核把它给丢掉了。现在的问题是不知道怎么解决!因为我用两台虚拟机来做测试,一个收一个发是完全没有问题。但将相同的程序放到设备上就是不能收到组播数据。还请您多多指点啊,在此谢过了哟:lol
页: [1]
查看完整版本: linux组播问题