崔永強(qiáng) 白永強(qiáng)
摘要:隨著中興通訊被美國(guó)“封殺”的中興事件持續(xù)發(fā)酵愈演愈烈,在關(guān)鍵領(lǐng)域采用Wintel架構(gòu)構(gòu)建信息系統(tǒng)對(duì)國(guó)家信息安全帶來(lái)潛在的隱患,需要我們強(qiáng)化基于自主可控技術(shù)的軟硬件研發(fā),營(yíng)造自主可控技術(shù)應(yīng)用生態(tài)。本文通過(guò)研究UDP廣播、組播通信的局限性與指定源組播的通信原理和分析Windows與銀河麒麟操作系統(tǒng)的差異的基礎(chǔ)上,依托飛騰處理器+銀河麒麟為操作系統(tǒng)生態(tài)環(huán)境,以開(kāi)源Qt為開(kāi)發(fā)軟件,實(shí)現(xiàn)網(wǎng)絡(luò)指定源的基本軟件編程,為關(guān)鍵領(lǐng)域?qū)崿F(xiàn)網(wǎng)絡(luò)通信和自主可控提供了可借鑒的解決方案。
【關(guān)鍵詞】銀河麒麟
自主可控 Qt 指定源紐播
1 引言
2018年4月16日美國(guó)商務(wù)部宣布,中興通訊被禁止7年內(nèi)購(gòu)買(mǎi)、出售或從事任何涉及受美國(guó)出口管制條例約束的物品、軟件或技術(shù)等交易,并由此引發(fā)一系列連鎖反應(yīng)。這一事件警示我們要將核心技術(shù)研發(fā)提升到國(guó)家安全層面,強(qiáng)化基礎(chǔ)軟硬件研發(fā),營(yíng)造自主可控技術(shù)應(yīng)用生態(tài)。因此在信息安全要求高的領(lǐng)域,采用自主可控的操作系統(tǒng)和開(kāi)源軟件進(jìn)行信息系統(tǒng)建設(shè)為大勢(shì)所趨。通過(guò)應(yīng)用飛騰處理器+中標(biāo)麒麟操作系統(tǒng),以開(kāi)源軟件Qt為開(kāi)發(fā)平臺(tái),研究組播原理特別是指定源組播,實(shí)現(xiàn)銀河麒麟環(huán)境下的指定源組播基本編程,為關(guān)鍵領(lǐng)域?qū)崿F(xiàn)基于自主可控操作系統(tǒng)的指定源組播提供了可靠的解決方案。
2 傳統(tǒng)UDP通信模式狀分析
傳統(tǒng)的數(shù)據(jù)傳輸方式中,主要有單播、廣播和組播三種通信模式。單播方式是只向特定目標(biāo)傳送數(shù)據(jù),當(dāng)多個(gè)主機(jī)客戶(hù)需要同樣的數(shù)據(jù)時(shí),即使在共享鏈路上,該數(shù)據(jù)也需要傳送多次,這樣就會(huì)造成網(wǎng)絡(luò)擁塞和網(wǎng)絡(luò)資源浪費(fèi)。在廣播方式中,數(shù)據(jù)在整個(gè)IP子網(wǎng)內(nèi)廣播傳送,在子網(wǎng)內(nèi)部所有的主機(jī)用戶(hù)不論是否需要該數(shù)據(jù),都必須接收,這可能會(huì)造成主機(jī)資源和網(wǎng)絡(luò)資源的浪費(fèi)。組播可以跨過(guò)廣播域?qū)崿F(xiàn)一個(gè)數(shù)據(jù)源同時(shí)向多個(gè)站點(diǎn)發(fā)送數(shù)據(jù),共享鏈路中相同信息只需要一個(gè)組播流,能夠很好地控制流量,從而大大減輕了主機(jī)和網(wǎng)絡(luò)的負(fù)載,因此組播方式更適合于企業(yè)網(wǎng)的實(shí)際環(huán)境情況。然而傳統(tǒng)IP組播模型的開(kāi)放性,導(dǎo)致傳統(tǒng)組播容易出現(xiàn)以下問(wèn)題:
(1)組播地址不是專(zhuān)用的。任何主機(jī)均能夠加入組播會(huì)話(huà),任何主機(jī)都可以成為發(fā)送方,并向組播組發(fā)送或接收數(shù)據(jù)。
(2)由于組播是一種傳輸方式,所以任何主機(jī)均可發(fā)送任意類(lèi)型的數(shù)據(jù)到組播組。
(3)組播數(shù)據(jù)在全網(wǎng)傳輸需要穿過(guò)許多網(wǎng)絡(luò),這就為各種攻擊提供了渠道。
(4)地址分配問(wèn)題:由于組播地址不是專(zhuān)用的,所以在使用時(shí)有很大隨意性,很容易造成地址沖突。
作為IP組播技術(shù)中的一項(xiàng)新興技術(shù),特定源組播SSM能夠提供了更優(yōu)化的網(wǎng)絡(luò)性能,有效解決上述問(wèn)題,得到了廣泛應(yīng)用。
3 自主可控環(huán)境與指定源組播關(guān)鍵技術(shù)
3.1 銀河麒麟操作系統(tǒng)
銀河麒麟作為中國(guó)完全擁有自主知識(shí)產(chǎn)權(quán)的服務(wù)器操作系統(tǒng),由中國(guó)自主研發(fā)的基本內(nèi)核層和基于FreeBSD改造的系統(tǒng)服務(wù)層組成,是一個(gè)擁有層次式內(nèi)核、安全等級(jí)達(dá)到結(jié)構(gòu)化保護(hù)級(jí)、能支持以x86/x86 64為代表的國(guó)際主流CPU和以飛騰為代表的國(guó)產(chǎn)CPU的操作系統(tǒng),并能與Linux目標(biāo)代碼兼容。文中所用的軟件版本為基于A(yíng)RM架構(gòu)的Kylin-4.02-juniper版本。目前銀河麒麟系統(tǒng)安裝支持圖形化安裝與文本安裝,安裝過(guò)程己實(shí)現(xiàn)全程傻瓜式安裝。
3.2 Qt開(kāi)發(fā)平臺(tái)
Qt是一個(gè)用于桌面和嵌入式開(kāi)發(fā)的跨平臺(tái)應(yīng)用程序框架,它包括一個(gè)直觀(guān)的API和一個(gè)豐富類(lèi)庫(kù)以及國(guó)際化的集成工具,用于GUI開(kāi)發(fā)和國(guó)際化的集成工具。使用Qt開(kāi)發(fā)的軟件,相同的代碼可以在任何支持的平臺(tái)上編譯與執(zhí)行,只需一次性開(kāi)發(fā)應(yīng)用程序就能實(shí)現(xiàn)跨操作系統(tǒng)部署,做到“一次編碼到處編譯”,完全契合了當(dāng)前國(guó)內(nèi)從Windows到銀河麒麟做系統(tǒng)的過(guò)渡需求。
3.3 指定源組播的內(nèi)涵
源特定組播是一種區(qū)別于傳統(tǒng)組播的新的業(yè)務(wù)模型,它使用組播組地址和組播源地址同時(shí)來(lái)標(biāo)識(shí)一個(gè)組播會(huì)話(huà),而不是向傳統(tǒng)的組播服務(wù)那樣只使用組播組地址來(lái)標(biāo)識(shí)一個(gè)組播會(huì)話(huà)。在傳統(tǒng)PIM-SM模式中,共享樹(shù)和RP規(guī)程使用(*,G)組對(duì)來(lái)表示一個(gè)組播會(huì)話(huà),其中G表示一個(gè)特定的IP組播組,而*表示發(fā)向組播組G的任何一個(gè)源。SSM直接建立由(S,G)標(biāo)識(shí)的一個(gè)組播最短路徑樹(shù),其中G表示一個(gè)特定的IP組播組地址,而S表示發(fā)向組播組G的特定源的IP地址。SSM的一個(gè)(S,G)對(duì)也被稱(chēng)為一個(gè)頻道,以區(qū)分傳統(tǒng)PIM-SM組播中的任意源組播組。由于A(yíng)SM支持點(diǎn)到多點(diǎn)和多點(diǎn)到多點(diǎn)兩種組播業(yè)務(wù)模式,因此源的發(fā)現(xiàn)過(guò)程是ASM復(fù)雜性的原因。例如在PIM-SM模式中,用戶(hù)點(diǎn)擊瀏覽器中的組播內(nèi)容,接收端設(shè)備只被通知到組播組的內(nèi)容,而沒(méi)有被通知到組播源的信息。而在SSM模式中,用戶(hù)端將同時(shí)接收到組播源和組播組信息。SSM應(yīng)用和服務(wù)需要使用IANA為SSM保留的232.0.0.0到232.255.255.255地址段。
4 基于銀河麒麟環(huán)境下指定源組播的實(shí)現(xiàn)
在飛騰處理器+銀河麒麟4.0.2的系統(tǒng)平臺(tái)上,本文基于Qt5.9.2實(shí)現(xiàn)了多網(wǎng)卡環(huán)境下指定源組播的數(shù)據(jù)接收功能,有效解決了麒麟環(huán)境下多網(wǎng)卡無(wú)法同時(shí)接收組播數(shù)據(jù)、Qt開(kāi)發(fā)平臺(tái)無(wú)法實(shí)現(xiàn)指定源組播、同一端口多個(gè)組播數(shù)據(jù)流“竄線(xiàn)”等問(wèn)題。
4.1 麒麟下多網(wǎng)卡運(yùn)行環(huán)境的建立
為了保證系統(tǒng)能夠接收多個(gè)數(shù)據(jù)流,系統(tǒng)通過(guò)配置多網(wǎng)卡進(jìn)行通信。然而在系統(tǒng)實(shí)現(xiàn)過(guò)程中,在銀河麒麟操作系統(tǒng)出現(xiàn)僅默認(rèn)網(wǎng)卡能夠接收組播數(shù)據(jù),其他網(wǎng)卡收不到無(wú)任何反應(yīng)。同樣的程序運(yùn)行在Windows7操作系統(tǒng)上不會(huì)出現(xiàn)這樣的現(xiàn)象。通過(guò)分析,問(wèn)題定位在銀河麒麟操作系統(tǒng)開(kāi)啟了reverse-path filtering,即反向路徑過(guò)濾技術(shù)。反向路徑過(guò)濾使系統(tǒng)在接收到一個(gè)IP包后,檢查該IP是不是合乎要求,不合要求的IP包會(huì)被系統(tǒng)丟棄,降低了數(shù)據(jù)通信的可能性,因此需要建立銀河麒麟下多網(wǎng)卡的運(yùn)行環(huán)境。通過(guò)修改麒麟系統(tǒng)下的/ect/sysctl.conf文件,關(guān)閉反向路徑控制:
net.ipv4.confdefault.rp_filter=O
net.ipv4.confall.rp_filter=O.
4.2 麒麟下基于Qt的指定源組播的實(shí)現(xiàn)
為了實(shí)現(xiàn)系統(tǒng)兼容Windows與麒麟操作系統(tǒng)平臺(tái),系統(tǒng)采用Qt開(kāi)發(fā)平臺(tái)。然而Qt下的類(lèi)QUdpSocket僅提供了加入組播的功能函數(shù)joinMulticastGroup,卻沒(méi)有提供加入SSM的功能。通過(guò)QUdpSocket的源碼的分析,發(fā)現(xiàn)joinMulticastGroup僅是socket函數(shù)setsocketoption的一個(gè)簡(jiǎn)單封裝,隱藏了不同系統(tǒng)下實(shí)現(xiàn)的不同,因此完全依靠Qt的QUdpSocket實(shí)現(xiàn)指定源組播是不可行的。利用C語(yǔ)言豐富的函數(shù)庫(kù)設(shè)置套接字的特定源組播特性和QUdpSocket方便的信號(hào)槽機(jī)制,編程實(shí)現(xiàn)了麒麟操作系統(tǒng)下基于Qt的特定源組播接收功能。下而是實(shí)現(xiàn)過(guò)程的主要代碼:
//在實(shí)現(xiàn)的文件中添加包含C語(yǔ)言庫(kù)的socket與setsockpt函數(shù)的頭文件
#include
#include
QUdpSocket *m_udpSocket=newQUdpSocket(this);//創(chuàng)建QT的UDP接收套接字
QHostAddress multiAddress,sourceAddr,localAddress;//定義組播地址、組播源地址、本地地址
quint16 multiPort;//組播端口號(hào)
//指定源初始化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對(duì)象關(guān)聯(lián)C語(yǔ)言Socket m_udpSocket->setSocketOption(QAbstractSocket::ReceiveBufferSizeSocketOption,1024*1024);//設(shè)置緩沖區(qū)大小 m_udpS ocket->setSocketOption(QAbstractSocket::MulticastLoopbackOption,0); connect(m_udp Socket,&QUdp; Socket::readyRead,this,&on;_receiveUdpData);//建立信號(hào)槽的連接 有時(shí)我們可能需要在同一端口上接收多個(gè)組播數(shù)據(jù)流。但是在實(shí)現(xiàn)過(guò)程中,出現(xiàn)了在同一端口上接收數(shù)據(jù)時(shí),套接字之問(wèn)的數(shù)據(jù)會(huì)出現(xiàn)”竄線(xiàn)”現(xiàn)象。程序?qū)崿F(xiàn)過(guò)程中,接收端加入232.25.12.10:25120和232.25.12.11:25120兩個(gè)組播組,正常情況下,第一個(gè)套接字只能接收到網(wǎng)絡(luò)中發(fā)往232.25.12.10和端口25120的數(shù)據(jù),第二個(gè)套接字只能接收網(wǎng)絡(luò)中發(fā)往232.25.12.11和端口25120的的數(shù)據(jù)。但在麒麟操作系統(tǒng)上,卻沒(méi)有看到期望的結(jié)果,此時(shí)兩個(gè)套接字都可以互相接收到對(duì)方的數(shù)據(jù),而Windows上不會(huì)出現(xiàn)此現(xiàn)象。通過(guò)分析,由于銀河麒麟系統(tǒng)出現(xiàn)BUG,綁定INADDRANY:25120就是告訴系統(tǒng)只要鏈路層上收上數(shù)據(jù),目的地址是25120,網(wǎng)絡(luò)層的所有組播IP都應(yīng)該收到。因此必須在IP層綁定固定組播地址IP層才會(huì)做進(jìn)一步過(guò)慮,socket僅接收目的地址為綁定的地址的報(bào)文。因此要避免“竄線(xiàn)”現(xiàn)象的發(fā)生,需要對(duì)上述代碼作如下變動(dòng): 將recv.addr.sin addr.saddr=htonl(INADDR_ANY);修 改 為:recv.addr.sin_addr.s_addr=htonl(multiA ddress.toIPAddress); 5 結(jié)束語(yǔ) 中興事件的持續(xù)發(fā)酵警示我們必須將操作系統(tǒng)類(lèi)的核心技術(shù)掌握在自己手中,構(gòu)建自主可控應(yīng)用生態(tài)環(huán)境,加大自主可控技術(shù)應(yīng)用與推廣。本文著眼于當(dāng)前互聯(lián)網(wǎng)中流媒體對(duì)UDP通信的業(yè)務(wù)需求,在深入研究了UDP廣播、組播、指定源技術(shù)的基礎(chǔ)上,應(yīng)用飛騰處理器+銀河麒麟操作系統(tǒng)等自主可控技術(shù)生態(tài),實(shí)現(xiàn)了指定源組播的基本編程,為信息系統(tǒng)實(shí)現(xiàn)在銀河麒麟系統(tǒng)基于跨平臺(tái)的指定源組播提供了解決思路,對(duì)自主可控技術(shù)的應(yīng)用與推廣具有現(xiàn)實(shí)的借鑒意義。 參考文獻(xiàn) [1]銀河麒麟主頁(yè):http://www.kylinos.cn/ [2]陸文周,Qt5開(kāi)發(fā)及實(shí)例[M].北京:電子工業(yè)出版社,2014. [3]包懷忠.IP組播關(guān)鍵技術(shù)研究[J].計(jì)算機(jī)技術(shù)與發(fā)展,2009,19 (04):138-142. [4]林文,蔣澤軍,基于IGMPv3和PIM-SSM協(xié)議的源特定組播技術(shù)的研究[J].科學(xué)技術(shù)工程,2007,7 (08):1671-1819.