linux udp组播接收问题及原理分析
2014-06-27 09:58
1211 查看
现象:
在某个网络环境下,同一个udp组播源(igmpv2),同样的收流代码,在windows上能收到,linux上收不到。排除网络拓扑结构、编程语言、硬件驱动等问题,我们就此问题来分析原理及解决方案。
环境:
交换机出,组播地址224.X.X.X,机器多网卡,eth0收流
配置静态IP地址,已关闭NetworkManager服务,iptables规则配置没有问题
实验:
1、在不同的LINUX发行版(opensuse、centos、ubuntu)上进行测试:均收不到。
2、直接tcpdump:收不到
3、配置一条路由 route add -net 224.0.0.1 netmask 255.0.0.0 dev eth0,重启网卡:能收到流,约1分钟以后断掉,重启收流程序没有反应
4、重复3测试,发现规律:每次重启网卡后,配置路由,大概能收流1分钟,就再也收不到流了
5、将路由配置成 route add -net 0.0.0.0 netmask 0.0.0.0 dev eth0,重启网卡:能稳定收流了
分析:
1、与LINUX发行版无关,而是LINUX内核统一的问题。
2、IGMP V2客户端不请求的时候,交换机不会将组播分配到网卡。
3、4、5: 这里需要结合一下IGMP V2协议的原理:
①交换机将询问所有的网内机器,谁需要加入组播组
②若一台主机需要加入组播组,需要发送入组报文
③交换机收到入组报文,给主机分发IP数据报文
④退组机制有两种:1、主机主动退出(发出退出报文) 2、交换机轮询存活主机没有响应(超时)
可以看到,问题大概就出在这里。
具体的我查阅了IGMP原理手册,IGMP各种信令报文走的无外乎224.0.0.1 或224.1.1.1(不知是否可配),怀疑255.0.0.0将主机对于IGMPV2的存活查询反馈报文给过滤了,而这种反馈报文每次未必走的一样的地址,包括入组报文,后续也发不出去了。
解决方法:
1、暴力流:直接将路由的全局出口均走收流网卡( route add -net 0.0.0.0 netmask 0.0.0.0 dev eth0),其他网卡若需要通信,单独配路由。
2、待研究:需要仔细研究IGMPV2的信令发送(不知是否和交换机配置相关),来配置合适的路由规则。
这里要说一下windows为什么不用关心这些,我理解windows自身有一个编写的比较好的NetworkManager服务,能够根据应用程序的请求灵活配置路由规则,这里不详细研究了。总之,若同样的网络环境,LINUX收组播流有各种奇葩问题,基本都是路由配置的问题。
在某个网络环境下,同一个udp组播源(igmpv2),同样的收流代码,在windows上能收到,linux上收不到。排除网络拓扑结构、编程语言、硬件驱动等问题,我们就此问题来分析原理及解决方案。
环境:
交换机出,组播地址224.X.X.X,机器多网卡,eth0收流
配置静态IP地址,已关闭NetworkManager服务,iptables规则配置没有问题
实验:
1、在不同的LINUX发行版(opensuse、centos、ubuntu)上进行测试:均收不到。
2、直接tcpdump:收不到
3、配置一条路由 route add -net 224.0.0.1 netmask 255.0.0.0 dev eth0,重启网卡:能收到流,约1分钟以后断掉,重启收流程序没有反应
4、重复3测试,发现规律:每次重启网卡后,配置路由,大概能收流1分钟,就再也收不到流了
5、将路由配置成 route add -net 0.0.0.0 netmask 0.0.0.0 dev eth0,重启网卡:能稳定收流了
分析:
1、与LINUX发行版无关,而是LINUX内核统一的问题。
2、IGMP V2客户端不请求的时候,交换机不会将组播分配到网卡。
3、4、5: 这里需要结合一下IGMP V2协议的原理:
①交换机将询问所有的网内机器,谁需要加入组播组
②若一台主机需要加入组播组,需要发送入组报文
③交换机收到入组报文,给主机分发IP数据报文
④退组机制有两种:1、主机主动退出(发出退出报文) 2、交换机轮询存活主机没有响应(超时)
可以看到,问题大概就出在这里。
具体的我查阅了IGMP原理手册,IGMP各种信令报文走的无外乎224.0.0.1 或224.1.1.1(不知是否可配),怀疑255.0.0.0将主机对于IGMPV2的存活查询反馈报文给过滤了,而这种反馈报文每次未必走的一样的地址,包括入组报文,后续也发不出去了。
解决方法:
1、暴力流:直接将路由的全局出口均走收流网卡( route add -net 0.0.0.0 netmask 0.0.0.0 dev eth0),其他网卡若需要通信,单独配路由。
2、待研究:需要仔细研究IGMPV2的信令发送(不知是否和交换机配置相关),来配置合适的路由规则。
这里要说一下windows为什么不用关心这些,我理解windows自身有一个编写的比较好的NetworkManager服务,能够根据应用程序的请求灵活配置路由规则,这里不详细研究了。总之,若同样的网络环境,LINUX收组播流有各种奇葩问题,基本都是路由配置的问题。
相关文章推荐
- linux udp组播接收问题及原理分析
- linux 组播接收和发送代码和组播问题总结
- linux 接收udp流花屏的问题
- linux 接收udp组播数据包后反馈链路层数据
- 关于linux下的udp/tcp通信设置发送sendto/接收recvfrom信息超时的参数。解决通道堵塞问题。
- 中标麒麟(linux)下QUdpSocket无法使用组播发送数据问题
- linux下使用C语言接收和发送udp组播数据分别怎么写?
- linux 系统 UDP 丢包问题分析思路
- Android模拟器接收UDP数据包的若干问题分析
- Linux下UDP的组播接收和发送的简单例子
- linux 在多网卡下的设备的UDP 组播问题总结
- UDP 接收问题
- Linux网络系统底层机制分析(3)----报文接收(续)
- JPEG 原理详细实例分析及其在嵌入式 Linux 中的应用
- linux下组播遇到的问题及解决办法
- linux平台下server运维问题分析与定位
- 最近分析数据库问题总结(linux+mysql)
- 计算机操作系统原理:Linux实例分析
- JPEG 原理详细实例分析及其在嵌入式 Linux 中的应用
- JPEG 原理详细实例分析及其在嵌入式 Linux 中的应用