天天看點

一本SDN入門書籍讀書筆記——SDN 标準分析

交換機轉發面詳解:

OpenFlow交換機轉發面内部(即交換晶片)在邏輯上由兩部分組成:端口port和流表Flow Table。跟Controller通信的通道Controller channel可以認為是一個特殊的port,一個交換機可以有多種端口,也可以有很多級流表;

在OpenFlow協定中,Controller通過一套标準消息接口,告訴交換機,當報從哪些port進來,就要去查那張流表,比對到一條流表項(Flow Entry)之後,就要去執行這條流表項所規定的指令,然後要麼直接轉發出去要麼丢棄,要麼繼續去查找下一個指定的流表(由比對到的這條流表項來指定),然後重複這個過程,知道封包被轉發或者丢棄;

流(Flow):指在一段時間内,經過同一個網絡的一系列具有相同屬性的順序發送的封包集合;

流有老化時間,如果具有相同屬性的封包隔了足夠長時間發,假設這個時間已經超過了老化時間了,那對于交換機來說,這已經是一條新的流了;

流表(Flow Table):流表就是晶片中一張張的轉發表,每一張流表都由很多條流表項組成,比如一張流表有16K,就是說這張流表有16K條流表項;

流表項(Flow Entry):流表項是流表的最小機關,每條流表項對應了網絡中傳輸的一條流,流表項是OpenFlow中最核心的元素,根據OpenFlow的标準,每條流表項的組成部分如下:

Match Field 比對字段

Priority 優先級

Counter 計數器

Instruction 指令

Timeout 逾時時間

Cookie 附屬屬性

這裡的流表項的組成部分是指Controller 和交換機之間傳輸的資料結構,是對流表項的邏輯描述,并不是跟晶片轉發表中的實際字段一一對應;

Match Field 比對字段:

比對字段包括保溫本身的資訊(如MacDa,MacSa,Vlan,IPDA,IPSA等)以及跟封包關聯的字段(如封包進來的port,前一張流表傳過來的屬性資料),同一張流表中,裡面不同的流表項的比對字段可以是不同的,也可以相同;

Priority 優先級:

一個封包在流表進行比對查找的時候,是從上到下順序查找的,優先級就是用來标志流表項之間的順序關系的,優先級相同的流表項是平等的,沒有順序關系;Controller往交換機下發流表項的時候,用優先級告訴交換機該條流表項在流表中存放的相對位置;

Counter 計數器:

計數器是管理者用來觀察監控網絡負載情況的非常重要的工具,原則上每條流表項都應該對應一個計數器,來表示屬于這條流的封包已經收到了多少個以及各種其他統計資料(比如多少位元組,多少錯誤的包等)

Instruction 指令:

OpenFlow裡面定義的指令有以下幾種:

Meter:用于測量該Flow的速率并執行相應的動作。按照OpenFlow标準術語,每個Meter包含幾個Band,每個Band對應一個Rate(速率)和動作,Band的意思是如果所測量的Flow速率超過了指定的Rate,就執行相應的動作,動作可以是drop(丢包)或者dscp remark(改寫IP頭部中的dscp值);

Apply-Action:立即對封包執行一個Action List(動作清單)裡面指定的所有Action,這些Action執行的結果可能影響也可能不影響下一級流表查找;Apply-Action的一個例子是,每條流都出一個Counter(計數器),立即比對該流對應的封包數量進行統計;

Write-Action:并不立即對封包執行動作,而是把一個Action list裡面的多個action放到一個action set動作集合中,等到所有流表都出來完了,再一次性處理這個action set裡面所有action;如果不同的流所放的action有沖突,那麼後面的覆寫前面的;

Clear-Action:如果某條流想把前面的所有流表處理後産生的所有Action Set都清除掉,就要執行Clear-Action的指令;

Write-metadata(metedata可意譯為描述資訊):代表一條流獨一無二的特征ID;用來在多級流表之間傳遞以達到關聯多級流表的目的。

Goto-Table:繼續下一級指定流表的處理。唯一一個要求必須支援的指令;隻支援單級流表的時候,這個指令沒有意義;

Timeout 逾時時間:

每套流表項可以被老化,timeout就是表示該流的老化時間。OpenFlow定義了兩種老化時間,hard timeout和idle timeout 前者辨別從該流表項建立開始,到了這麼長時間後,無條件删除;後者表示,如果在這麼長時間内,沒有任何封包比對過該流表項,那就删除;前者可以靠軟體做,後者可以必須要靠硬體來做;

Cookie 附屬屬性:

Cookie是被Controller向Switch來傳遞流表項相關的操作資訊的,比如修改Flow,删除Flow等;這個屬性不會在封包轉發的時候被使用,僅僅用于Controller和交換機之間傳遞消息;

端口:OpenFlow中定義三大類端口:

實體端口(Physical Port):交換機面闆上所有對外可見的實體端口(帶外管理端口除外);邏輯端口:的一個例子就是,Tunnel;保留端口裡面有多種端口,Controller Channel(連接配接Controller的通道,可以是帶内業務口,也可以是獨立的帶外管理口)就是一種保留端口;

組group:

類似 Flow Table;

group中有一個詞bucket,bcket指一個action list;

ALL 意思是轉發到該group所包含的所有bucket中,可以使用多點傳播實作;

Select:意思是轉發到該group所包含的所有bucket中的一個;

Indirect:在多個Flow中共享Action,這種類型的Group隻包含一個Bucket

Fail-over:保護倒換,就是在正常狀态中,封包隻從這個group的一條路徑轉發出去,一旦這條路徑斷了,備份路徑馬上頂上;

Controller和交換機之間的消息:分為三類,分别是Controller-to-Switch消息,Asynchronous(異步消息)(就是Swich-To-Controller消息)、Symmetric(對稱消息)

1.Controller-To-Switch消息:

從Controller 發往Switch:

Features:Controller用這個消息類型詢問交換機能支援的類型

Configuration:Controller用這個消息類型配置交換機或者查詢交換機配置參數

Modify-State:Controller用這個消息類型來操作流表(add/delete/modify)和group表,以及Ports屬性等;

Read-State:Controller用這個消息類型來擷取交換機各種狀态消息,如Counter

Packed-out:Controller用這個消息類型向外發送比對某條流表項的資料封包;

Barrier:Controller用這個消息類型保證一些其他消息之間的順序;如B消息依賴與A,那麼Controller先朝交換機發送消息A,然後在發送一個Barrier消息,交換機等消息A被執行完後才發送一個對Barrier消息的回複,Controller收到回複後,才會繼續發送消息B;

Role-Request:當交換機連了多個Controller的時候,Controller用這個消息類型向交換機通告自己的角色;

Asynchronous-Configuration:用于Controller告訴交換機對交換機發來的哪些消息感興趣;

2.Asynchronous(異步)消息:

用于交換機想Controller發送,Switch-To-Controller

Packet-in:當有封包比對某條流表項,該流表項action是output to Controller-Port時,這個封包就被通過Packet-in的消息發送到Controller

Flow-removed:當某個流表項被删除的時候(老化或者Controller主動要求删除),一個Flow-removed的消息就會被發送到Controller;

Port-status:當端口狀态發生變化的時候,交換機用這個消息類型告訴Controller通告狀态變化,比如Link down/up;

Error:當交換機發生了一些錯誤的時候,發送這個消息到Controller;

3.Symmetric(對稱消息):

可以由任何一方發起:

Hello:Controller或者交換機啟動的時候,互發hello消息,通知對方啟動了;

Echo:通過發Echo以及得到reply,确認對方的連接配接沒有問題,也可以用來測量連接配接延時;

Experimenter:用來讓産家進行私有擴充。

Controller的三種角色:

Master:一台交換機所連接配接到的所有Controller中,隻能有一個Master,他對交換機擁有完全的操作權限;

Slave:一台交換機所連接配接到的所有Controlller中,可以有多個Slave,它們對交換機隻有讀取狀态和被動接受交換機消息的權限,不能對交換機進行配置;一旦Master死掉,其中一台Slave就會被選舉為Master,接替原來Master繼續工作,每個Slave可以接受不同的消息類型,進而在個Slave之間進行負載分擔;

Equal:有的網絡希望有多個Controller都能對交換機進行配置,以便負載分擔,這種情況,這些Controller可以被配置為Equal角色,一台交換機允許同時連接配接到多個Equal角色的Controller,這些Controller對交換機擁有跟Master一樣的功能;

OpenFlow系統性能名額:

交換機處理帶寬:晶片決定,無法優化

流表項數量:晶片決定,無法優化

流表項下發能力:即每秒能安裝多少條流表項;這個名額跟OpenFlow交換機收包/處理包能力、晶片SDN對流表項處理能力,Contoller軟體處理以及CPU主頻有很大關系;可以通過提高CPU主頻或者優化軟體來提高;

To-Controller封包轉發:有些封包在交換機裡面比對到某條流表項,這條流表項的動作把封包發送到Controller,Controller經過處理後可能會在把封包通過交換機轉發出去;這個轉發性能決定Controller和交換機兩個元素;

OF-Config:

配置OpenFlow Controller位址;

隊列(Queue)和實體端口(Physical Port)的配置管理;

邏輯端口(Tunnel)的建立和管理;

Controller和交換機之間通信通道的建立和配置,包括安全認證;

交換機的能力發現;

目前OF-Config市場接受度很低;要完成上面的工作有三種做法:

一、使用指令行來配置

二、使用廠商的私有方案

三、重新定義另一種協定,(最著名的是Nicira公司的OVSDB)