Software Defined Network顧名思義軟件定義網絡,可以簡單地分為網絡和軟件兩個部分:軟件和網絡。此外,通過使用OpenFlow協議來實現SDN是一種較為普遍的 方式,所以本篇將從軟件和網絡以及OpenFlow三個方面進行介紹。在研究SDN的研究者之中,有相當大比例的網絡工程師,他們了解網絡,精通網絡,然 而卻并不了解軟件開發。除此之外,還有很大比例的研究者是軟件工程師,他們軟件開發能力出色,然而并不了解網絡運作的機制,在接觸SDN之前,他們的范圍 僅僅只是應用層,底層的東西交給全交給主機的協議棧了。還有一部分同學是像我這樣,通信工程出身,學的是物理層的編碼解碼,誤碼率,電磁波。不像計算機專 業那些學生一樣,學習各種語言,操弄各種編譯器,混跡于github這種全球最大的男性交友網站。剩下最后一種就是又懂網絡,又懂編程。這種人,我一般稱 之為老師,是用來請教問題的,比如地球-某某老師。一般的,他們不屑于看到這種文章,太low。
本篇主要的目標用戶是對網絡和軟件開發都不太了解,或者網絡和編程開發只擅長一種的研究者。由于我也是一個初學者,所以僅當做經驗分享吧。如有表達不對的地方,敬請指出,萬分感謝。
網絡
軟件定義網絡,如果不了解網絡,那如何去定義一個你不了解的東西?如果不知道網絡中存在的問題,如何使用SDN來改善?所以網絡知識至關重要。然而作為一個初學者,并不需要網絡各個方面都精通,也做不到,僅需學習基礎知識,并選擇一個研究場景即可。
計算機網絡
學習網絡的必修課是計算機網絡。計算機網絡講述的是計算機網絡的運作機制,都是極其基礎重要的知識。謝希仁前輩的《計算機網絡》是從底層往上層介 紹,從物理層的hub到數據層的網橋和交換機,到網絡層的路由器,最后講到TCP/UDP的傳輸層,止于應用層,適合有通信背景的學習者?!队嬎銠C網絡: 自頂向下方法》則是從另一個角度出發,從應用層向下介紹,擺脫了物理層的枯燥,這樣的思路更適合學習計算機出門的學習者?!禖CNA學習指南》也是推薦的 書籍之一,前部分內容講解計算機網絡非常簡單明了,更貼近于真實網絡規劃,可以當做計算機網絡的進階書籍閱讀。
學習完計算機網絡之后,學習者應該懂得二層交換、三層路由,了解到OSI七層協議棧,也了解了TCP/IP,ARP,ICMP,DNS, DHCP。作為檢驗標準,讀者可以嘗試介紹一個客戶端主機和跨網段的服務器進行通信的流程。
關于網絡協議,只需了解主要的一兩種,其他了解其作用即可,因為協議實在太多了,沒有必要學完。RIP、BGP、OSPF和IS-IS需要了解。如 果研究的課題與路由協議相關,則可詳細學習,初期不建議深入學習。學習成果檢驗是對比路由協議的差異,如RIP的廣播路由信息和OSPF的告知鄰居。
ARP,ICMP,DNS,DHCP這幾種功能型報文非常重要,均需了解其工作流程,具體的報文格式,可適當了解關鍵字段。項目需要時再深入研究。
TCP/UDP的差別需要牢記,適合的應用場景也許了解。關于TCP的狀態機,建議嘗試記憶,TCP的三次握手建立連接,四次握手釋放連接是面試高頻題。
應用層的僅需了解若干常用協議如SMTP,POP3,HTTP及其對應的傳輸層的端口號即可。
網絡場景
當學習了基礎的網絡知識,學習者已經具備了一定知識儲備,對網絡也有了基礎的了解。然而現網之復雜,并不是看了一本《計算機網絡》就可以了解的。網 路可以按照規模分為局域網,城域網,廣域網,也可以按照功能劃分成接入網,傳輸網和核心網。當然按照場景劃分就更多了。云計算網絡的典型場景數據中心網絡 是目前研究的熱門領域。以校園網為代表的園區網也是較為常見的SDN應用部署場景??鐢祿行牡幕ミB互通、WAN的研究則是研究的另一個大方向。
選擇一個自己喜歡的應用場景,進行深入研究,并根據需求學習相關知識,會大大提高學習的效率。比如我選擇學習數據中心網絡,所以我需要學習一些云計 算的知識,需要了解數據中心中的網絡架構。我推薦《騰云:云計算和大數據時代的網絡技術揭秘》作為云計算網絡知識的科普書籍。書中介紹了很多有用的知識, 包括云計算的起源,云計算和網絡的關系,網絡安全,以及數據中心網絡中的一些關鍵網絡技術。讀完你應該了解到什么是TOR和EOR,知道了刀片服務器,了 解到VN-TAG是用來標識虛擬機到TOR的流量的,了解到VXLAN和NVGRE的作用,了解到交換機還可以組裝的,除了OVS之外還有NEXUS 1000v等產品。讀完這本書,能對現網的一些技術,以及產品有一些科普性質的了解,對后續深入學習研究有很大幫助。
相信有了前面計算機網絡知識作為鋪墊,再選定一個特定的研究場景,網絡方面的學習已經不成問題。
軟件開發
軟件開發是SDN學習中另一個重要方面,這方面我同樣不是行家,我也是新手,所以以下言論僅當做自己的經驗介紹。
選擇一門語言,選擇一個控制器
根據自己的喜好,選擇一門語言,然后根據語言,選擇一個對應的控制器,這是開發的第一步。如我自己,在折騰了C/C++,Java,Python之 后,最終還是皈依到了Python大法的旗下。根據Python語言,我選擇了由Python語言寫的POX。POX無需安裝,直接可以運行。同 時,POX代碼簡單,初學者只需閱讀pox/forwarding文件夾下的代碼即可。
根據我們已有的網絡知識,我們基本可以看懂pox/forwarding文件夾下的程序邏輯。以l2_learning.py為例,該文件完成了一 個簡單的二層交換的應用,其邏輯為:記錄MAC地址和Port的對應關系,轉發時,查詢MactoPort表,若查詢成功,則轉發,若失敗則泛洪。后來 RYU出現了,封裝更好的,性能更好的RYU成為了我的首選。
在編程的過程中,需要進行程序設計,其中設計的算法以及數據結構的知識在這里不多介紹,有興趣的讀者可以自行學習。
以項目為導向,先寫起來
閱讀源碼需要有明確的目的性。最開始可以先嘗試讀一些簡單的如Simple switch之類的代碼,掌握一些簡單的API的使用,理解基礎的內容,然后再進行深入的源碼閱讀。
在進一步學習SDN開發時,建議以項目為導向,先寫起來,在嘗試中去解決問題。在寫的過程中遇到問題再去查看源碼找關鍵點,如此一來學習非常有效 率,且學到的東西很快就可以用上,學習效果好。特別是在OpenFlow協議已經經過多個版本的擴張,目前內容已經非常多的情況下,選擇性學習能幫助你降 低學習的壓力,提高學習的效率。
時間充裕的情況下,你可以選擇好好閱讀那些你認為重要的代碼。比我在經歷了多個APP開發之后,我覺得我需要好好了解一下RYU的內部機制了。所以我花了三天,把從底層socket到協議解析,到事件分發到handler注冊的代碼認真看了一遍,收益頗多。
學會Debug
寫程序容易,調程序難。掌握正確的調試方法能大大提高開發的效率。
為提高調試的效率,在程序設計的時候就需要非常注意。寫程序時需要注意程序的設計,比如成端的邏輯盡可能寫成函數;一個函數不得過長,最好別超過一 個屏幕的行數;盡可能模塊化地編程,可以提高代碼的重用率,將錯誤域縮小到某模塊,某函數,容易定位錯誤。在調試的過程中,控制變量的思維方式可以大大提 升效率。其他編碼風格方面的要求,建議按照google的PEP8風格進行代碼編寫。
對操作系統的熟悉和理解也將大大提高開發效率。熟悉Linux的基本操作是必須的,如果不清楚,你可能需要自學一下linux和shell。在調試 的過程中,錯誤顯示一般是英文,所以能讀懂錯誤信息,并學會谷歌是一項必備的技能。一般的問題谷歌都可以解決。另外,加幾個SDN的技術群也是提高 DEBUG效率的一個重要手段。
關于開發的建議還有,構建一套適合自己的、高效的開發環境,以及做好版本控制。比如我自己,我只用sublime編譯器,編譯運行和調試都直接在終端中進行。版本控制使用git。版本控制的重要性不許贅述,詳情谷歌。
OpenFlow
目前應用最廣泛的SDN實現協議:OpenFlow,是學習SDN中必須要學的核心內容。在設計一個SDN的應用時,需要以下的步驟:
明確網絡應用的邏輯
明確對應的操作所采用的OpenFlow報文
根據應用邏輯以及OpenFlow協議進行編程開發
比如一個簡單的二層交換機,首先我們明確了他的運作機理是MAC學習和轉發,然后明確轉發所需要使用的OpenFlow報文是:packet_out和Flow_mod,最后根據應用邏輯以及OpenFlow協議對應的報文,進行編程開發。
所以我們可以知道OpenFlow在SDN應用中的重要性。
OpenFlow經過這幾年的發展已經從1.0版本發展到了1.5版本,初學者在學習的時候需要注意順序。建議先學習OF1.0版本,再學習OF1.3版本,更高版本根據需要進行學習。
OpenFlow1.0版本是OpenFlow火起來時的第一個版本,其內容并不多,Match域僅有12個字段,動作種類也不多,同時也是單流 表。對于初學者而言,學習1.0版本可以大大降低學習壓力,掌握OpenFlow核心內容。在正確理解SDN,以及可以使用OpenFlow1.0協議開 發SDN應用之后,可嘗試學習1.3版本協議。1.3版本較1.0版本內容大幅增加。經過幾個版本的迭代,OpenFlow1.3版本協議已經有了三種 表:
flow table
group table
meter table
動作種類也得到了拓展,多流表的概念也變得成熟,Match匹配域已經多達幾十個,所以這時OpenFlow已經將Match域分成幾類,并以OXM的形式呈現出來。多控制器寫作的概念在1.3版本中也已經相當成熟。
OpenFlow1.3版本為SDN應用開發提供了很多便捷,開發人員可以利用多流表,設計更多復雜的應用邏輯。作為一個比較穩定的版本,1.3版本成為繼1.0版本之后控制器支持最多的版本,所以此版本是SDN學習者應該要學習的。
總結
SDN學習與其他研究方向相比,要求較高,需要了解軟件開發以及網絡,學習起來,并不太容易。同樣作為初學者,我從大三開始接觸,有幸有學長帶著入 門,再后來由于網絡知識的缺陷,一度陷入不知道做什么的狀態。惡補了網絡知識之后,才慢慢走上正軌。然后最近我又遇到了編程上的難題,急需惡補,急需努力 提升自己的開發能力。本篇學習筆記,是幾年來學習的粗略總結,希望對SDN初學者有幫助。最后,興趣是最好的老師,如果你喜歡SDN這個方向,就會學得很快。如果在學習的過程中沒有成就感,沒有樂趣,也可以試試別的方向,做自己喜歡的事最重要。