プログラマのためのSDN基礎講座 1:SDNとは

# はじめに
約1年半ぶりの投稿となります。
前回Python記事を書いていた時にはプログラマのようなものとして働いていましたが、異動によりここ1年はネットワークに関わる仕事をしてきました。コンピュータの世界はレイヤがきちんと分かれているため、プログラマは自分の層の外の知識がなくても、ネットワーク上で動作するプログラムを書くことができます。しかし異動により家の・オフィスのLANコネクタの先にこれほどのインフラと機器があるとは思ってもいませんでした。異動前は
「この世のすべてのケーブルは”LANケーブル”なのでは？」
などちんぷんかんぷんな発言を繰り返していた私も勉強を続け、今秋のネットワークスペシャリスト試験は無事午後Iで足切りとなりました（涙）

今回は異動後に学んできたネットワークの知識と、自分のQiita記事で最も閲覧されているPythonを組み合わせたSDNの記事を書いていきたいと思います。
昨年末急にQiitaのContributionが増大し、内容の稚拙さに炎上でもしたのかとビビッてたじろいたのですが、Google製機械学習用フレームワークTensorFlowがPythonを利用するため、Pythonの基礎情報を知りたい人が増えた結果のようでした。実際書店でもPythonの本は棚の多くの領域を占め、ビックウェーブが来ていることを肌で感じます。東京では「みんなのPython勉強会」に何回か参加させていただきましたが、平日の夜間にもかかわらず大勢の人が席を並べ、Pythonを用いた様々なプレゼンテーションが行われているのを聞いて、驚かされました。
自分は仕事でSDNもPythonも使ったことがないため、説明不足な部分が多いかと思われます。自分の知識の再確認も含めているため、ネットワーク周りについては普段ネットワークに触れていないプログラマの方にも理解しやすい記事にしようと意識しました。逆に言うと、ネットワークに詳しい方にとっては簡単すぎる内容かもしれませんがせいいっぱい書きますのでよろしくお願いします。

# SDNとは
SDNとは"Software Defined Network"すなわち”ソフトウェアによって定義されたネットワーク"を意味します。
ネットワークを構成する機器は個々に経路の制御情報を持ち、機器同士が互いに情報を交換し合ってコンピュータ同士の接続のルールを決めていました。受け取ったデータの転送先を機器自身がルールにのっとって判断して転送していました。これらの機器は現場でPCをケーブルでつないだり、リモート接続したりして人の手により設定を確認、変更します。これに対して、

- 『ネットワーク全体を制御するソフトウェアを用意し、そのソフトウェアにより全ての装置を制御するという考え方である。ソフトウェアを利用してパケット転送を制御し、各装置を集めたネットワーク全体を一つの単位として、一括で制御する』[NTTコミュニケーションズ](http://www.o3project.org/ja/download/document/SDNguideline_ja_v0.1.pdf)

- 『ネットワーク制御機能とデータ転送機能が分離し、プログラムによりネットワークの制御が実現できる、新しいアプローチのネットワーク』[ONFによるOverview](https://www.opennetworking.org/ja/about-ja/onf-overview-ja)

そして僕の中では『コンピュータ間のデータの転送を制御するルーリングは別に用意した機器（コントローラ）でソフトウェアにより定義づけ、各ネットワーク接続機器はコントローラから受け取ったルールに従ってデータの転送のみを実施するようにする』がプログラミングの観点から見たSDNだと考えています。

# SDNの構成要素
SDNの研究は2008年にカリフォルニア大学バークレー校とスタンフォード大学で開始されました。現在、同じ考えを持つ企業や組織が集まった[Open Networking Foundation (ONF)](https://www.opennetworking.org/ja/)を設立し、SDNを推進しています。

SDNの構成要素は大きく3つに分けることができます。

- ネットワーク制御
- SDNコントローラ
- アプリケーションAPI

「ネットワーク制御」はデータを転送するスイッチが役割を担います。「SDNコントローラ」はその名のとおりデータの転送をコントロールする機器が役割を担います。
この両者間のやり取りを制御するAPIが後述するOpenFlowなど「Southbound API」と呼ばれるものになります。こちらの標準化は進んでいます。一方、実際にコントロールして受け取ったデータをアプリケーションに送る必要があり、アプリケーションとコントローラ間のやり取りを制御するAPIを「Northbound API」と呼称しますが、私自身がここについて疎いので説明はしません。こちら側はプログラミング、ネットワークはもちろんストレージや運用保守ツールなどすべてのレイヤに対して理解が必要になる魔境であります。

# SDNのメリット
- ネットワークが巨大化、複雑化した現代において、柔軟に素早く利用形態を提供できる
- ネットワーク全体を管理できる。例えば、トラフィックをリアルタイムでコントローラが把握することで、転送のルールを動的に変更することもできる
- プログラミングで自分に必要な機能を追加することができる
- パーツの組み合わせや再利用も容易になる。APIも用意されているので連携もスムーズに
- アジャイル開発、テスト駆動などソフトウェアの世界で作られてきた技法を使ってネットワークを構築することができる
- ネットワーク設定の自動化、無人化が進む。首が寒くなってきたな…

## 終わりに
「ネットワークのコントロールとデータを分けるという考え方がこれまでのネットワークエンジニアには理解しにくい」という文もネット上で見受けられましたが、逆にソフトウェアエンジニアにとっては「なぜそうしないのだ」くらいの感覚かもしれません。SDNはDevOps、その元のアジャイル開発などソフトウェア界で生まれてきた考え方をネットワーク、インフラにも使いないだろうか、という思想を感じます。
しかし、実際にケーブルが地中や電線を這い、機器が建物に設置されているネットワークの構成を変更することは、ソフトウェアのソースコードをリファクタリングする以上に難しいです。ネットワーク仮想化技術はSDNと相性が良いですが、究極的には機器と線がないとネットはつながりません（当たり前ですがAWSの雲の中には膨大な数の物理サーバとネットワークがあります）。AmazonやGoogleと違い、一般的な企業や研究室では既設のネットワークをすべて仮想化に置き換えるのは容易ではありません。SDNは既存の物理的なネットワークと組み合わせて利用できる機能も用意されていて、現状の問題を現実的なコストでそれなりに解決する手法も提示している点も魅力だと思います。

次回はSDNを実現する技術の1つであるOpenFlowを実現するコントローラとスイッチの基本的な動作を説明します。コントローラとスイッチが行うことは実際にはプログラマにとっては非常になじみ深い、条件分岐と処理の繰り返しになります。

----
[プログラマのためのSDN基礎講座 1:SDNとは](http://qiita.com/Usek/items/cac38a67659207620c19)
[プログラマのためのSDN基礎講座 2:OpenFlowコントローラとスイッチ](http://qiita.com/Usek/items/6c56ecac56ac8febebfa)
[プログラマのためのSDN基礎講座 3:Ryuでスイッチングハブを作ってみる](http://qiita.com/Usek/items/31010eac154d5831872d)