免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 9973 | 回复: 8
打印 上一主题 下一主题

linux组播问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-09-16 18:18 |只看该作者 |倒序浏览

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

如下图所示,网络中存在三种设备,组播服务器、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.x  dst/230.0.0.1,发送给linux内核协议栈;

3、linux内核接收src/192.168.1.x  dst/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替换是不可以的呢?

论坛徽章:
5
IT运维版块每日发帖之星
日期:2015-08-06 06:20:00IT运维版块每日发帖之星
日期:2015-08-10 06:20:00IT运维版块每日发帖之星
日期:2015-08-23 06:20:00IT运维版块每日发帖之星
日期:2015-08-24 06:20:00IT运维版块每日发帖之星
日期:2015-11-12 06:20:00
2 [报告]
发表于 2012-09-17 09:57 |只看该作者
存在问题:在局域网PC端,通过wireShark可以抓到组播数据包,但是应用程序确收不到该数据包;
你没比较过2种情况下数据包的异同吗?除了地址外都一样吗?

论坛徽章:
0
3 [报告]
发表于 2012-09-17 10:53 |只看该作者
回复 2# ssffzz1
我对比了两种情况下,IP头的内容,除了idefication之外,其他数据位是一样的;
在局域网PC端,使用原始套接字可以抓到组播数据,说明数据已经进入网络层处理了;
可能替换源IP,会影响网络层或传输层对组播数据的处理。

   

论坛徽章:
0
4 [报告]
发表于 2012-09-19 11:27 |只看该作者
本帖最后由 txgc_wm 于 2012-09-19 11:29 编辑

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

论坛徽章:
5
IT运维版块每日发帖之星
日期:2015-08-06 06:20:00IT运维版块每日发帖之星
日期:2015-08-10 06:20:00IT运维版块每日发帖之星
日期:2015-08-23 06:20:00IT运维版块每日发帖之星
日期:2015-08-24 06:20:00IT运维版块每日发帖之星
日期:2015-11-12 06:20:00
5 [报告]
发表于 2012-09-19 12:27 |只看该作者
按说只有IP地址和ID不同的话,不会影响组播接收的。

论坛徽章:
0
6 [报告]
发表于 2012-09-19 21:21 |只看该作者
回复 4# txgc_wm


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

论坛徽章:
0
7 [报告]
发表于 2012-09-19 21:22 |只看该作者
回复 5# ssffzz1

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

论坛徽章:
0
8 [报告]
发表于 2012-09-19 21:32 |只看该作者
本帖最后由 hxqhit 于 2012-09-19 21:33 编辑

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

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

论坛徽章:
0
9 [报告]
发表于 2015-07-30 16:26 |只看该作者
不知道您现在解决了这个问题没啊!我最近在调试组播时也遇到了这个问题,我看了哈内核的代码的。是在udp_v4_mcast_next函数的判断中sk返回空,即没有找到接收的套接字,所以内核把它给丢掉了。现在的问题是不知道怎么解决!因为我用两台虚拟机来做测试,一个收一个发是完全没有问题。但将相同的程序放到设备上就是不能收到组播数据。还请您多多指点啊,在此谢过了哟
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP