我與SDN的緣分:一名初學(xué)者的學(xué)習(xí)之路與心得
去年十一月,我在大三的計(jì)算機(jī)網(wǎng)絡(luò)課程上與SDN初識(shí)。今年三月中旬,我有幸得到老鄉(xiāng)學(xué)長北郵– 李呈的指引,真正地與SDN結(jié)緣,悄然走上學(xué)習(xí)之路。
SDN,Software Defined Network,是對(duì)傳統(tǒng)網(wǎng)絡(luò)架構(gòu)的一次革新。經(jīng)過短短三四個(gè)月的學(xué)習(xí)和實(shí)踐,我本著授人以漁的理念,輔以我的一些理解,將我的學(xué)習(xí)歷程和心得敘寫出來,送給各位想要入門的或跟我一樣剛剛?cè)腴T的朋友們。文中有理解不到位的地方,還望各位朋友不吝賜教,非常感謝!SDN,軟件定義網(wǎng)絡(luò),我們關(guān)鍵就是弄清楚三件事:網(wǎng)絡(luò)、軟件、軟件與網(wǎng)絡(luò)怎么結(jié)合。
一、 走進(jìn)網(wǎng)絡(luò)
既然我們要用SDN來改造網(wǎng)絡(luò),當(dāng)然得先了解一下網(wǎng)絡(luò)是何物,磨刀不誤砍柴工。
我對(duì)網(wǎng)絡(luò)的了解,是從高中開始的。從OSI七層模型,到五層模型;從家庭組網(wǎng),再到Socket編程實(shí)踐,我對(duì)網(wǎng)絡(luò)的興趣不斷增長。直到大二學(xué)了《計(jì)算機(jī)通信與網(wǎng)絡(luò)》這門課,才算是對(duì)過往三四年積累的零星知識(shí)的一次大梳理,讓我對(duì)網(wǎng)絡(luò)有了一個(gè)系統(tǒng)性的了解。
(1)傳統(tǒng)網(wǎng)絡(luò)
傳統(tǒng)網(wǎng)絡(luò),我的老師用它代指我們一直以來都在使用的網(wǎng)絡(luò),用以跟SDN網(wǎng)絡(luò)區(qū)別。我是跟隨著謝希仁前輩的《計(jì)算機(jī)網(wǎng)絡(luò)》這本書學(xué)習(xí)的,也推薦給各位朋友。
跟隨著大二的課程,我把五層模型的低四層學(xué)了個(gè)遍,主要是從物理層的拓?fù)洹⒓€器,到數(shù)據(jù)鏈路層的網(wǎng)橋、MAC、CSMA/CD、CSMA/CA,再到網(wǎng)絡(luò)層的路由器、最長前綴匹配、IP、ARP、OSPF、RIP、BGP,***到傳輸層的UDP、TCP,掌握了這些,對(duì)我們網(wǎng)絡(luò)的理解大有裨益。
根據(jù)我的SDN實(shí)踐經(jīng)驗(yàn),深入理解一下最長前綴匹配,TCP的反饋重傳、滑動(dòng)窗口、三次握手、四次揮手,是非常有好處的。
(2)SDN網(wǎng)絡(luò)
在這里,我們需要弄清楚三個(gè)問題:
① SDN是什么?
② 我們?yōu)槭裁葱枰猄DN?
③ SDN可以用在何處?
學(xué)習(xí)SDN伊始,我閱讀了一些介紹SDN的文獻(xiàn)資料,還有一些控制器的白皮書。比較推薦大家從Open Network Fundation(ONF)組織的SDN白皮書入手,再輔以其他的介紹資料,了解SDN的架構(gòu)是什么樣,數(shù)據(jù)、控制、管理面,南向、北向、東西向,以及傳統(tǒng)網(wǎng)絡(luò)存在哪些不能適應(yīng)新需求的問題、SDN針對(duì)這些問題有什么樣的特性去應(yīng)對(duì)。
對(duì)于控制器的白皮書,我看了ONOS的白皮書,還有一些OpenDayLight和Floodlight的介紹。通過這些,我們可以了解SDN網(wǎng)絡(luò)的工作模式是什么,以及不同的應(yīng)用場(chǎng)景對(duì)SDN網(wǎng)絡(luò)有什么不同的要求。
二、 編程實(shí)踐
通過上面階段的學(xué)習(xí),我們已經(jīng)知道我們面前的SDN能做些什么,我們?yōu)槭裁匆ビ盟?,這兩個(gè)要點(diǎn)將支撐著我們繼續(xù)深入鉆研。
(1)Openflow
Openflow,是南向協(xié)議的一種,當(dāng)下比較主流。通過對(duì)它的學(xué)習(xí),我們可以搞清楚文章開頭提到的“軟件與網(wǎng)絡(luò)怎么結(jié)合”這個(gè)問題。
Openflow以“flow”(“流”)去看待網(wǎng)絡(luò)中的連接,它只負(fù)責(zé)對(duì)流的管理,不涉及交換設(shè)備屬性的管理,比如給每個(gè)端口配置多少條隊(duì)列等等,這些由其伴侶協(xié)議OF-Config去做。
對(duì)協(xié)議的學(xué)習(xí),是很讓人興奮的一件事,可以先通過Openflow白皮書對(duì)其工作模式、流和流表、優(yōu)點(diǎn)和性能局限有個(gè)理解,然后在SDNLAB、ONF等網(wǎng)站上下載到協(xié)議的細(xì)則說明書,具體學(xué)習(xí)。先從1.0版本入手,然后可以進(jìn)行一些編程實(shí)踐以加深理解,在掌握1.0的基礎(chǔ)上,再去學(xué)習(xí)1.3版本。協(xié)議細(xì)則在我們后續(xù)的編程實(shí)踐中也很有參考價(jià)值。
(2)控制器
控制器有RYU、NOX、POX、Floodlight(FL)、OpenDayLight(ODL)、ONOS等等,不同的控制器設(shè)計(jì)思路不同、消息/事件機(jī)制不同、性能不同、編程語言不同,以致于適用的場(chǎng)景場(chǎng)合不同、學(xué)習(xí)難度不同。大家可以多方面權(quán)衡之后,選一個(gè)作為SDN入門學(xué)習(xí)。
我一開始接觸的是Floodlight,也嘗試使用過ODL,***,我選擇了RYU這個(gè)小巧精干的控制器作為科研階段的使用。對(duì)于學(xué)習(xí)者來說,控制器只是一個(gè)實(shí)現(xiàn)SDN的工具,關(guān)鍵在于跑在控制器上的模塊,也就是需要我們根據(jù)應(yīng)用需求去設(shè)計(jì)、編寫的東西。
選好控制器之后,先通過官方的介紹或者編程手冊(cè)了解控制器自身的代碼文件組織,再花一點(diǎn)時(shí)間了解相應(yīng)的編程語言,然后再看一下控制器編程手冊(cè)里官方給的一個(gè)最簡(jiǎn)單模塊的示例代碼,了解一下一個(gè)模塊在代碼上有什么固定結(jié)構(gòu)。如果官方的控制器代碼包中含有已經(jīng)寫好可以直接使用的模塊,也可以拿它們的代碼來學(xué)習(xí),這些在后續(xù)的實(shí)踐中也很有參考價(jià)值。
(3)Mininet
在跟一些小伙伴的交流中,我發(fā)現(xiàn)有些童鞋還不是很了解Mininet這個(gè)東西,我在這里簡(jiǎn)單地說一下我的理解吧。Mininet是一個(gè)拓?fù)浞抡婀ぞ撸瑢?duì)我們來說,它就是幫我們虛擬地搭建了一個(gè)硬件網(wǎng)絡(luò),網(wǎng)絡(luò)中有交換機(jī),有主機(jī),有相互之間的線路連接,通過它我們就得到了一張網(wǎng),能了解到這里就差不多夠了。
更深入一點(diǎn)的話,可以把Mininet看成一個(gè)助手或者腳本,我們用參數(shù)的形式,輸入所要拓?fù)浜途W(wǎng)絡(luò)的參數(shù),它就幫我們調(diào)用起安裝在Linux中的OVS,使用Linux提供的虛擬化技術(shù)KVM虛擬出主機(jī)host,然后再把它們連了起來,當(dāng)然目前host之間的隔離性做得還不是很好。更進(jìn)階一步,還可以通過Mininet的Intf類或者直接使用OVS的命令,實(shí)現(xiàn)Mininet中交換機(jī)網(wǎng)口與Linux網(wǎng)口的對(duì)接,從而使我們這張網(wǎng)可以跟外部通信。
具體的學(xué)習(xí)過程,可以跟著mininet.org官網(wǎng)的WalkThrough頁面做一遍,就算基本掌握Mininet這個(gè)工具了。
(4)Need &Design& Coding
本文假設(shè)大家都具有編程、調(diào)試方面的基本功,如果這方面還有待加強(qiáng)的話,可以找一些編程語言的書籍和調(diào)試技巧的文章看一看,然后做一些類似文件存取、網(wǎng)絡(luò)聊天、數(shù)據(jù)庫管理這樣的小項(xiàng)目來練練手,編程能力自然會(huì)提高。
一個(gè)好的程序,比編碼更關(guān)鍵的是設(shè)計(jì),比設(shè)計(jì)更關(guān)鍵的是需求分析,這是我多年編程實(shí)踐的感悟。SDN的編程實(shí)踐和開發(fā)一款軟件的軟件工程實(shí)踐是相通的。
首先,是對(duì)應(yīng)用場(chǎng)景的需求分析,需要實(shí)現(xiàn)什么效果,需要支撐多大的規(guī)模,需要適應(yīng)什么樣的拓?fù)浣Y(jié)構(gòu)等等。這個(gè)階段,***盡可能地詳細(xì),特別是不能遺漏那些最基本的需求,否則可能會(huì)導(dǎo)致后續(xù)程序架構(gòu)的大改。小的需求可以在后續(xù)進(jìn)行快速迭代。
然后,就是設(shè)計(jì)。面對(duì)這些需求,首先要想,我用什么樣的管理策略去實(shí)現(xiàn)這些需求。然后根據(jù)制定好的策略去想,我作為控制器中的模塊,需要得到網(wǎng)絡(luò)中的什么信息,包括topology、switch、link、host等的信息;需要處理哪些協(xié)議、地址、端口、字段的數(shù)據(jù)包。再接著,我需要什么樣的數(shù)據(jù)結(jié)構(gòu)去存儲(chǔ)這些信息,需要設(shè)計(jì)什么樣的輔助算法。設(shè)計(jì)過程中可能需要參考OpenFlow協(xié)議和控制器編程手冊(cè),看看自己是否能獲取到所需的信息。
設(shè)計(jì)的過程是一個(gè)閉環(huán)反饋的過程。
***,就是Coding實(shí)現(xiàn)。好的代碼風(fēng)格可以改善我們Coding的心情,也能提高我們Debug和Upgrade的效率。
(5)抓包分析
Wireshark,想必做網(wǎng)絡(luò)的朋友都聽過它的大名。它通過監(jiān)聽網(wǎng)卡,把收發(fā)的數(shù)據(jù)包全部列出來供我們查看。如果程序模塊Debug確定沒問題,但是功能效果就是不理想,甚至無法實(shí)現(xiàn),那么就要祭出我們這張王牌了。
最近正值大三的期末,我的SDN課程的期末作業(yè)就好好地用了一把wireshark,通過添加過濾條目,可以細(xì)粒度地看到TCP三次握手、四次揮手的全過程,還有ACK、重傳包、RST報(bào)文。它還可以解析應(yīng)用層HTTP、Openflow等協(xié)議的數(shù)據(jù)包。
我在另一個(gè)SDN智能組播樹的項(xiàng)目中,通過對(duì)IGMP的過濾查看,找到了能被利用的協(xié)議包,驗(yàn)證了組播協(xié)議的工作流程。
有時(shí)候,并不是我們的模塊做得不好,而是我們對(duì)協(xié)議的了解不夠。
新手上路,一是很難透徹理解通信協(xié)議和兼顧通信的各個(gè)環(huán)節(jié),二是可能遇到網(wǎng)絡(luò)應(yīng)用中一些不可預(yù)知的工程問題。
對(duì)于***條,我們可以通過抓包,找出是哪個(gè)環(huán)節(jié)出了問題,進(jìn)而可以發(fā)現(xiàn)是我們?cè)贠penflow上的操作不對(duì),還是我們對(duì)傳統(tǒng)協(xié)議的兼容出了問題,亦或是我們?cè)趥鹘y(tǒng)的通信環(huán)節(jié)上出了岔子。
我的期末作業(yè)就遇到一個(gè)典型問題例子:功能測(cè)試過程中,不同網(wǎng)段的兩個(gè)主機(jī)互ping,明明已經(jīng)收到了ICMP響應(yīng)包(wireshark解析包后會(huì)有所指示),但還是報(bào)告“主機(jī)不可達(dá)”,結(jié)果發(fā)現(xiàn)是主機(jī)上的默認(rèn)網(wǎng)關(guān)沒有設(shè)置好。正常情況下,收到的ping包應(yīng)該是(IPa->IPb),但是不同網(wǎng)段下,當(dāng)網(wǎng)關(guān)沒有設(shè)置成自己時(shí),收到的ping包也許應(yīng)該是(IPgateway->IPb)。
我的一點(diǎn)理解是,Openflow是對(duì)流的控制,如果一條流已經(jīng)被我們成功引過去了,應(yīng)該就表明我們的模塊沒有問題了。供大家參考。
而對(duì)于第二條,還是舉我期末作業(yè)遇到的例子吧,訪問HTTP時(shí),用wget命令只會(huì)產(chǎn)生一個(gè)TCP連接,但是用Firefox則會(huì)產(chǎn)生兩個(gè)TCP連接,神奇吧?如果這時(shí)候我們是對(duì)訪問次數(shù)或者訪問間隔做限制的話,那wget就會(huì)成功,而Firefox就會(huì)說網(wǎng)頁打不開。這時(shí)候就不得不抓包分析了。對(duì)于這一點(diǎn),我們可以設(shè)置相應(yīng)的控制時(shí)延或者更高級(jí)的辦法來解決。
對(duì)于這個(gè)例子,我還遇到了這一種情況,緣起于TCP的反饋重傳機(jī)制。網(wǎng)絡(luò)情況是多變的,即使是非常通暢的情況,通過抓包我發(fā)現(xiàn),也會(huì)有各種原因?qū)е耇CP的意外重傳,同理,一發(fā)生重傳,就會(huì)導(dǎo)致上述訪問失敗的情況。
三、 總結(jié)
阿里巴巴的曹捷前輩在今年的DCD大會(huì)上宣布愿意率先跨出SDN的***步,華為也在ONOS和ODL方面雙管齊下,其IP部門今年的宣傳片中也新加入了SDN的部分。相信SDN這個(gè)朝氣蓬勃的新架構(gòu),會(huì)在未來向世人展示它的巨大威力。SDN現(xiàn)在大體還處于實(shí)驗(yàn)室和業(yè)界的研究階段,很多東西也還沒有定論,雖然已經(jīng)有Google B4這樣強(qiáng)大的成功案例,以及華為和阿里這樣的高度熱情,但也許一年、兩年、五年、十年都無法看到它的遍地開花。所以說,學(xué)習(xí)SDN,沒有足夠的興趣和毅力是無法深入下去的。
我有幸得到老鄉(xiāng)學(xué)長北郵–李呈的指引,他帶我走進(jìn)了這一片新天地,真的是非常的感謝!同時(shí)也要感謝學(xué)習(xí)路上跟我一起交流的小伙伴們,相互學(xué)習(xí),共同進(jìn)步,相信美好的未來就在不遠(yuǎn)的前方!