Data Link Layer

transmission error detection

  • checksum
  • CRC

Reliable Data Transfer

  • ARQ (Automatic Repeat reQuest)

協議

  • Go back N
  • SAW (Start and Wait)
  • Sliding Windows
  • Selective Repeat
  • Piggybacking
  • Selective Acknowledgement

PPP (Point-to-Point Protocol)

  • PPP 是基於 HDLC (High-Level DataLink Control) 設計, 主要用在 V.35 或 MODEM
  • ADSL 的 PPPoE 及 VPN 的 PPTP 皆採用 PPP 協議封裝

CRC

  • CRC-CCITT (x^16 + x^12 + x^5 + 1)
  • 可檢測出所有隨機雙奇數位錯誤
  • 可檢測出長度小於 16 位的錯誤達 100%
  • 可檢測出長度大於 17 位的錯誤達 99.9969%
  • 可檢測出長度大於 18 位的錯誤達 99.9985%

OpenvSwitch Debug$ Environment

OpenvSwitch debug 要分三個階段看

  1. OpenvSwitch Environment
  2. Trace Flow
  3. Controller App

大多數說網路不通的人在第一個階段就有問題了, 基本上只要知道 OpenvSwitch 架構和 Flow match 的行為, 就能(較)簡單的進行 Debug, 這篇從第一個階段開始講

OpenvSwitch 架構

透過上圖可以清楚知道 OpenvSwitch 主要分為三個 Componets: kmod_openvswitch, ovs-vswitchd, ovsdb-server

  • kmod_openvswitch 就是我們平時講的 datapath, 屬於在 kernel space 的層級, Packets 實際上轉發都是要透過這邊進行處理, 在這邊會有一個屬於這台 hosts 通用的 table, 可以透過

    show``` 做觀察
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    * ovs-vsswitchd 是整個 OpenvSwitch 的核心所在, 屬於在 user space 的層級, 可以實作不少 protocols 在上面, 而 OpenFlow 實作也是在此, 這邊會針對 ```不同的 ovs bridge 會分別有不同的 Flow table```, 可以透過 ```ovs-ofctl show ovs-br``` 做觀察
    * ovsdb-server 是儲存 OpenvSwitch 相關設定的地方, 基本上操作 ```ovs-vsctl``` 都是在與 ovsdb-server 溝通, 這點非常重要
    詳細一點可以參考小弟於 SDNDS-TW Meetup #2 分享的投影片
    <iframe src="//www.slideshare.net/slideshow/embed_code/40428437" width="425" height="355" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" style="border:1px solid #CCC; border-width:1px; margin-bottom:5px; max-width: 100%;" allowfullscreen> </iframe> <div style="margin-bottom:5px"> </div>
    亦或是 rajdeep , Director, Developer Relations VMware India at VMware India 於 slideshare 發表的投影片
    <iframe src="//www.slideshare.net/slideshow/embed_code/27768124" width="425" height="355" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" style="border:1px solid #CCC; border-width:1px; margin-bottom:5px; max-width: 100%;" allowfullscreen> </iframe> <div style="margin-bottom:5px"> </div>
    # OpenvSwitch 環境檢查
    ## Check daemon
    > ovs-ctl status
    ps aux | grep ovs
    * 確定有無 ovsdb-server 和 ovs-vswitchd
    * ovs-ctl 打哪來的? ```/usr/share/openvswitch/scripts/ovs-ctl``` 這個在安裝的時候並沒有被安裝在 /usr/bin 底下, 如果要用的話可以自行 link 至目錄底下
    ## Logging
    > ovsdb-tool show-log [-mmm]
    * 這個是專門去撈你 ovs-vsctl 操作的紀錄, 多下-m可以看到更詳細的行為, 這邊可以驗證你的 db 操作是有沒有問題
    > cat /var/log/openvswitch/{ovsdb-server,ovs-vswitchd}.log
    * 這邊要在啟動的時候後面要加 ```--log-file``` 才會有的資訊, 詳細可以看[安裝流程](http://roan.logdown.com/posts/220671-compile-openvswitch-v230-on-ubutnu-14041-lts)
    * 透過裡面資訊可以用時間來判斷各個 componets 發生了什麼事
    * log 資訊詳細與否需配合 ```ovs-appctl vlog/list``` 做設定
    ## Interface 配置
    > ovs-vsctl show
    這邊主要處理是由 ovsdb-server 負責
    <img class="center" src="https://lh6.googleusercontent.com/UZ_Nie_Pdj0qa2i88YcHDvrEUXVpp0PWWL-oU2jirKE=w1558-h1230-no" width="50%" height="50%">
    * Controller
    * is_connected: true 看到這個出現代表 ovs bridge 已經正常的連在 Controller 上面
    * port number 是 [6633 還是 6653](http://www.iana.org/assignments/service-names-port-numbers/service-names-port-numbers.xhtml?search=openflow)
    * connected method 是 tcp? ssl? ...?
    * OpenvSwitch 連到 controller 的方式一開始還是走 L2 Switching 出去的 (Hidden flow), 意思是在佈建 OpenFlow 環境時, Legacy network 要先搞定, 不然就免談
    * fail_mode
    * secure 一定要連上 controller 才處理封包
    * standalone 若沒有連上 controller 則自動轉換為 L2 Switching, 直到連上 Controller
    * Debug legacy network 是否有通, 則會開 standalone 來先進行檢查
    * Trace Flow 時會開 secure 來進行檢查
    * Port
    * 只是驗證 conf.db 是否確切存有 interface 的資訊在裡面, 以便重啟服務時還可以回復至現在環境
    > ovs-ofctl show ovs-br
    這邊主要處理是由 ovs-vswitchd 負責
    <img class="center" src="https://lh5.googleusercontent.com/-Tca6P8QOQm0/VEqviHZwBkI/AAAAAAAAFi8/byX-ycJKaB0/w1862-h1230-no/%E8%9E%A2%E5%B9%95%E5%BF%AB%E7%85%A7%2B2014-10-25%2B03.57.37.png" width="50%" height="50%">
    * OFPT_FEATURES_REPLY
    * xid 裡面的值代表你現在支援哪個版本的 Protocols (例如: 0x2 = OpenFlow1.1)
    * OpenvSwitch 從 2.3.0 後, 預設採用 OpenFlow 1.1+, 如果要使用 OpenFlow 1.0 請使用 ```ovs-vsctl set bridge ovs-br protocols=OpenFlow10

  • dpid

    • ovs bridge id, Openflow controller 透過不同 dpid 來分別辨識不同 ovs bridge
  • 1(wlan0)
    • 1 是代表 ofport, 你進行 ACTIONS 指定一些如 in_port=1,actions=output:2 裡面所述的數字, 都是從這邊對應的, Controller 能控制的 ofport 也是在 ovs-vswitchd 處理
    • ofport 的數字可以更換, 請搜尋 ofport_request
    • wlan0 是 ofport 所綁定的 interface, 無論哪個 interface 至多只能被歸納至某一個 ovs bridge 底下, 而不能同時加入多個 ovs bridge

ovs-dpctl show

這邊主要處理是由 datapath 負責

  • lookups
    • hit 表示 packet 進來後, match datapath flow table 成功次數
    • missed 表示 packet 進來後, 有 unmatched datapath flow table 情形, 則會透過 upcall 將封包送至 ovs-vswitchd 的次數
    • lost 表示在 ovs-vswitchd 回應前, datapath 就把封包 drop 掉的次數
  • flows
    • 現存在 datapath flow 的個數
  • port 1: wlan0
    • port 1 這邊是專門給 datapth 辨識的 port number, 跟上述 ovs-ofctl show ovs-br 所看到的 ofport 無相關, 但後續在 datapath 中 trace flow 時會需要他

各位觀察一下 ovs-ofctl show ovs-brovs-dpctl show 兩者 interface 及 port number 的關係, 可以發現 ovs-vswitchd 針對綁定的 interface 有自己的 ofport number, 然而相同 interface 在 datapath 又有不同的 number, 所以在 trace flow 要特別注意這類 mapping 問題, 千萬不要弄混

接下來還會有 OpenvSwitch Debug$ Trace flow 的文章, 請讓我繼續拖搞, 謝謝各位

OpenvSwitch Lab 7$ Setting OpenWrt

在看本篇之前, 我預設你已經把 OpenWrt 刷好, 也把 OpenvSwitch 安裝好了, 那從現在開始我們就要開始設定 OpenWrt 讓他變成一個 OpenFlow switch, 那如果沒刷過的也別難過, 可以參考 編譯 OpenWrt 來完成編譯, 那如果有需要 .config 的話, 可以參考我的 config

環境

  • DLink DIR-835
    • 5 LAN Port
    • 2 WLAN Port
  • 這邊要稱讚一下他的 recovery mode 做得還不錯, 有 web 上傳介面, 節省很多時間

切出 5 個 interface

將原先 eth0.{1,2} 切成 5 個 interface eth0.{1,2,3,4,5}, 供 OpenvSwitch 針對 Port 做控制

network 設定檔 (contributor : nosignal,CliffLin)

裡面的 eth0.4 為什麼要特別設定呢? 在先舊的 config 我們都是透過 OpenWrt 替我們建好的 bridge ‘lan’ (192.168.1.1)來進行連線, 新的設定檔因為把 lan 拿掉, 所以要特別針對某個 interface (例如: eth0.4) 上一個 ip, 好方便連線設定

而這個 interface 之後也不會將它 ovs-vsctl add-port, 理由是避免你設定錯誤導致整台 AP 進不去的防制手段, 可以視為 Console port

由於wlan設定中, 我們把wifi network 接到名為 lan 的介面上,故我們需要在network設定檔中新增一個介面

然而我們希望在開一個vlan來處理wlan,因此我們開了一個eth0.6的vlan

  • eth0.6 <->(bridge)<->lan<->wlan

開啟 WLAN

將 /etc/config/wireless 裡面的兩行option disabled 0 remove 之後, 再下 wifi 啟動 wireless

wireless 設定檔

設定 OpenvSwitch

  • 新增 interface 至 ovs-br 做管理

    ovs-vsctl add-br ovs-br
    ovs-vsctl add-port ovs-br eth0.1
    ovs-vsctl add-port ovs-br eth0.2
    ovs-vsctl add-port ovs-br eth0.3
    ovs-vsctl add-port ovs-br eth0.5
    ovs-vsctl add-port ovs-br eth0.6

    • eth0.4 不加進去的理由已經寫在上面
    • eth0.6 是wlan的port
  • 檢查 service

    ovs-vsctl show
    ovs-ofctl show ovs-br

    • 這邊要注意所有的 interface 都應該要被正確的顯示, 尤其是 ovs-ofctl 這裡面的資訊, 大家最常遇到的問題是 ovs-vsctl show 明明有相關資訊, 但是卻不會動, 有過半的可能是因為你的 ovs-vswitchd 沒有啟動, 你下 ovs-ofctl show ovs-br 會毫無反應

設定網路

設定網路是非常重要的事情 “網路不會通, 就不會有 SDN”

讓 ovs-br 連上網路 (Network: 192.168.77.0/24, GW: 192.168.77.1), 這邊採用 in-band 作法, out-of-band 作法之後再另外說

  • 上 ip (例: 192.168.77.111)

    ifconfig ovs-br 192.168.77.111
    route add default gw 192.168.77.1 ovs-br

  • 檢查 route table

    route -n

  • 檢查網路狀況

    ping 192.168.77.1
    ping 8.8.8.8

  • 設定 controller 連線

    ovs-vsctl set-controller ovs-br tcp:x.x.x.x:6633

    • 應該要可以看到 is_connected: true, 若無的話, 你上面一定有個步驟弄錯, 再仔細檢查看看

到這邊應該大家都可以順利地建立 OpenFlow switch, 那如果有問題的話, 歡迎加入 SDNDS-TW 討論, 我們有很多志同道合的人都在這邊一起努力, 希望大家都能一起加入討論或研究