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