APP下载

基于银河麒麟环境指定源组播的研究与实现

2018-11-05崔永强白永强

电子技术与软件工程 2018年18期
关键词:麒麟网卡银河

崔永强 白永强

摘要:随着中兴通讯被美国“封杀”的中兴事件持续发酵愈演愈烈,在关键领域采用Wintel架构构建信息系统对国家信息安全带来潜在的隐患,需要我们强化基于自主可控技术的软硬件研发,营造自主可控技术应用生态。本文通过研究UDP广播、组播通信的局限性与指定源组播的通信原理和分析Windows与银河麒麟操作系统的差异的基础上,依托飞腾处理器+银河麒麟为操作系统生态环境,以开源Qt为开发软件,实现网络指定源的基本软件编程,为关键领域实现网络通信和自主可控提供了可借鉴的解决方案。

【关键词】银河麒麟

自主可控 Qt 指定源纽播

1 引言

2018年4月16日美国商务部宣布,中兴通讯被禁止7年内购买、出售或从事任何涉及受美国出口管制条例约束的物品、软件或技术等交易,并由此引发一系列连锁反应。这一事件警示我们要将核心技术研发提升到国家安全层面,强化基础软硬件研发,营造自主可控技术应用生态。因此在信息安全要求高的领域,采用自主可控的操作系统和开源软件进行信息系统建设为大势所趋。通过应用飞腾处理器+中标麒麟操作系统,以开源软件Qt为开发平台,研究组播原理特别是指定源组播,实现银河麒麟环境下的指定源组播基本编程,为关键领域实现基于自主可控操作系统的指定源组播提供了可靠的解决方案。

2 传统UDP通信模式状分析

传统的数据传输方式中,主要有单播、广播和组播三种通信模式。单播方式是只向特定目标传送数据,当多个主机客户需要同样的数据时,即使在共享链路上,该数据也需要传送多次,这样就会造成网络拥塞和网络资源浪费。在广播方式中,数据在整个IP子网内广播传送,在子网内部所有的主机用户不论是否需要该数据,都必须接收,这可能会造成主机资源和网络资源的浪费。组播可以跨过广播域实现一个数据源同时向多个站点发送数据,共享链路中相同信息只需要一个组播流,能够很好地控制流量,从而大大减轻了主机和网络的负载,因此组播方式更适合于企业网的实际环境情况。然而传统IP组播模型的开放性,导致传统组播容易出现以下问题:

(1)组播地址不是专用的。任何主机均能够加入组播会话,任何主机都可以成为发送方,并向组播组发送或接收数据。

(2)由于组播是一种传输方式,所以任何主机均可发送任意类型的数据到组播组。

(3)组播数据在全网传输需要穿过许多网络,这就为各种攻击提供了渠道。

(4)地址分配问题:由于组播地址不是专用的,所以在使用时有很大随意性,很容易造成地址冲突。

作为IP组播技术中的一项新兴技术,特定源组播SSM能够提供了更优化的网络性能,有效解决上述问题,得到了广泛应用。

3 自主可控环境与指定源组播关键技术

3.1 银河麒麟操作系统

银河麒麟作为中国完全拥有自主知识产权的服务器操作系统,由中国自主研发的基本内核层和基于FreeBSD改造的系统服务层组成,是一个拥有层次式内核、安全等级达到结构化保护级、能支持以x86/x86 64为代表的国际主流CPU和以飞腾为代表的国产CPU的操作系统,并能与Linux目标代码兼容。文中所用的软件版本为基于ARM架构的Kylin-4.02-juniper版本。目前银河麒麟系统安装支持图形化安装与文本安装,安装过程己实现全程傻瓜式安装。

3.2 Qt开发平台

Qt是一个用于桌面和嵌入式开发的跨平台应用程序框架,它包括一个直观的API和一个丰富类库以及国际化的集成工具,用于GUI开发和国际化的集成工具。使用Qt开发的软件,相同的代码可以在任何支持的平台上编译与执行,只需一次性开发应用程序就能实现跨操作系统部署,做到“一次编码到处编译”,完全契合了当前国内从Windows到银河麒麟做系统的过渡需求。

3.3 指定源组播的内涵

源特定组播是一种区别于传统组播的新的业务模型,它使用组播组地址和组播源地址同时来标识一个组播会话,而不是向传统的组播服务那样只使用组播组地址来标识一个组播会话。在传统PIM-SM模式中,共享树和RP规程使用(*,G)组对来表示一个组播会话,其中G表示一个特定的IP组播组,而*表示发向组播组G的任何一个源。SSM直接建立由(S,G)标识的一个组播最短路径树,其中G表示一个特定的IP组播组地址,而S表示发向组播组G的特定源的IP地址。SSM的一个(S,G)对也被称为一个频道,以区分传统PIM-SM组播中的任意源组播组。由于ASM支持点到多点和多点到多点两种组播业务模式,因此源的发现过程是ASM复杂性的原因。例如在PIM-SM模式中,用户点击浏览器中的组播内容,接收端设备只被通知到组播组的内容,而没有被通知到组播源的信息。而在SSM模式中,用户端将同时接收到组播源和组播组信息。SSM应用和服务需要使用IANA为SSM保留的232.0.0.0到232.255.255.255地址段。

4 基于银河麒麟环境下指定源组播的实现

在飞腾处理器+银河麒麟4.0.2的系统平台上,本文基于Qt5.9.2实现了多网卡环境下指定源组播的数据接收功能,有效解决了麒麟环境下多网卡无法同时接收组播数据、Qt开发平台无法实现指定源组播、同一端口多个组播数据流“窜线”等问题。

4.1 麒麟下多网卡运行環境的建立

为了保证系统能够接收多个数据流,系统通过配置多网卡进行通信。然而在系统实现过程中,在银河麒麟操作系统出现仅默认网卡能够接收组播数据,其他网卡收不到无任何反应。同样的程序运行在Windows7操作系统上不会出现这样的现象。通过分析,问题定位在银河麒麟操作系统开启了reverse-path filtering,即反向路径过滤技术。反向路径过滤使系统在接收到一个IP包后,检查该IP是不是合乎要求,不合要求的IP包会被系统丢弃,降低了数据通信的可能性,因此需要建立银河麒麟下多网卡的运行环境。通过修改麒麟系统下的/ect/sysctl.conf文件,关闭反向路径控制:

net.ipv4.confdefault.rp_filter=O

net.ipv4.confall.rp_filter=O.

4.2 麒麟下基于Qt的指定源组播的实现

为了实现系统兼容Windows与麒麟操作系统平台,系统采用Qt开发平台。然而Qt下的类QUdpSocket仅提供了加入组播的功能函数joinMulticastGroup,却没有提供加入SSM的功能。通过QUdpSocket的源码的分析,发现joinMulticastGroup仅是socket函数setsocketoption的一个简单封装,隐藏了不同系统下实现的不同,因此完全依靠Qt的QUdpSocket实现指定源组播是不可行的。利用C语言丰富的函数库设置套接字的特定源组播特性和QUdpSocket方便的信号槽机制,编程实现了麒麟操作系统下基于Qt的特定源组播接收功能。下而是实现过程的主要代码:

//在实现的文件中添加包含C语言库的socket与setsockpt函数的头文件

#include

#include

QUdpSocket *m_udpSocket=newQUdpSocket(this);//创建QT的UDP接收套接字

QHostAddress multiAddress,sourceAddr,localAddress;//定义组播地址、组播源地址、本地地址

quint16 multiPort;//組播端口号

//指定源初始化Socket

int socketfd;

int sock reuse=l;

ip_mrep_source mcast;

struct sockaddr_in recv_addr;

mcast imr interface.saddr=htonl(localAddress.toIPv4Address(》;

mcast imr multiaddr.saddr=htonl(multiAddress.toIPv4Address(》;

recv.addr.sin_family=AF_INET;

recv.addr.sin_port =htons(port);

recv.addr.sin_addr.s_addFhtonl(INADDR_ANY);

if《socketfd=socket(AF_INET,SOCKDGRAM,O))

if(bind(socketfd,(struct sockaddr*)&recvaddr;,sizeof(recv_addr))<0) return,∥绑定指定源组播

mcast.imr sourceaddr.saddFhtonl(sourceAddr.toIPv4Address(》;

setsockopt(socketfd,IPPROTO_IP,IP_ADDSOURCE_MEMBERSHIP,(char*)&mcast;,sizeof(mcast))=//加入组播组

if(m_udp Socket->setSocketDescriptor(socketfd)<0) retum;//把QUdpSocket对象关联C语言Socket

m_udpSocket->setSocketOption(QAbstractSocket::ReceiveBufferSizeSocketOption,1024*1024);//设置缓冲区大小

m_udpS ocket->setSocketOption(QAbstractSocket::MulticastLoopbackOption,0);

connect(m_udp Socket,&QUdp; Socket::readyRead,this,&on;_receiveUdpData);//建立信号槽的连接

有时我们可能需要在同一端口上接收多个组播数据流。但是在实现过程中,出现了在同一端口上接收数据时,套接字之问的数据会出现”窜线”现象。程序实现过程中,接收端加入232.25.12.10:25120和232.25.12.11:25120两个组播组,正常情况下,第一个套接字只能接收到网络中发往232.25.12.10和端口25120的数据,第二个套接字只能接收网络中发往232.25.12.11和端口25120的的数据。但在麒麟操作系统上,却没有看到期望的结果,此时两个套接字都可以互相接收到对方的数据,而Windows上不会出现此现象。通过分析,由于银河麒麟系统出现BUG,绑定INADDRANY:25120就是告诉系统只要链路层上收上数据,目的地址是25120,网络层的所有组播IP都应该收到。因此必须在IP层绑定固定组播地址IP层才会做进一步过虑,socket仅接收目的地址为绑定的地址的报文。因此要避免“窜线”现象的发生,需要对上述代码作如下变动:

将recv.addr.sin addr.saddr=htonl(INADDR_ANY);修 改 为:recv.addr.sin_addr.s_addr=htonl(multiA ddress.toIPAddress);

5 结束语

中兴事件的持续发酵警示我们必须将操作系统类的核心技术掌握在自己手中,构建自主可控应用生态环境,加大自主可控技术应用与推广。本文着眼于当前互联网中流媒体对UDP通信的业务需求,在深入研究了UDP广播、组播、指定源技术的基础上,应用飞腾处理器+银河麒麟操作系统等自主可控技术生态,实现了指定源组播的基本编程,为信息系统实现在银河麒麟系统基于跨平台的指定源组播提供了解决思路,对自主可控技术的应用与推广具有现实的借鉴意义。

参考文献

[1]银河麒麟主页:http://www.kylinos.cn/

[2]陆文周,Qt5开发及实例[M].北京:电子工业出版社,2014.

[3]包怀忠.IP组播关键技术研究[J].计算机技术与发展,2009,19 (04):138-142.

[4]林文,蒋泽军,基于IGMPv3和PIM-SSM协议的源特定组播技术的研究[J].科学技术工程,2007,7 (08):1671-1819.

猜你喜欢

麒麟网卡银河
在DDS 中间件上实现双冗余网卡切换的方法
麒麟“破冰”
对麒麟
银河
问银河
它就是麒麟
去银河洗澡
银河升起
Server 2016网卡组合模式
读编往来