組込TCP/IPネットワーク：イントロダクション

<h3>■はじめに</h3>
前シーズンでは組込機器のファームウエアを構成するソフトウエア部品について解説しました。今シーズンでは「組込機器にTCP/IPネットワーク通信機能を持たせる」という目的にフォーカスします。OSとしてFreeRTOSなどクラウド系OS、Linux、Windowsを使用する場合は、それぞれTCP/IPネットワーク通信ソフトウエアが含まれていますので他から入手する必要はありません。それでも多くの組込機器開発会社がITRON OS系のTCP/IPネットワーク機能を別途購入している理由として、「サポートの必要性」が大きいように思います。ネットワークの世界では、「実際の通信相手」や「途中経路」という出荷前試験では100%担保できない不確定要素がどうしても存在するため、市場で通信トラブルが発生したときの調査は簡単ではありません。そんなとき「組込機器の通信ミドルウエアからはどう見えているのか？」「原因として考えられることはあるか？」「どう調査すると良いか？」をサポートしてくれる先が必要という判断がなされているのではないでしょうか。<br>
ここでは、ITRON OS系でTCP/IPネットワーク機能を実現する流れについて解説していきます。


<h3>■ネットワークの階層構造</h3>
ネットワークを理解するために一番大きなところから入ろうとした場合、たいてい最初は「機器同士のつながり方」（ネットワークトポロジ）からお話するのが正しいように思いますが、今回そこは思いっきり割愛します。「組込機器にTCP/IPネットワーク通信機能を持たせる」という目的においてはその点は重要ではない（誰か他の人が考えること）ためです。そして次に出てくる話題が「ネットワークの階層構造」で、これは我々の目的上理解しておく必要があります。ここから始めましょう。

ネットワークと一言で言っても、有線や無線と言ったハードウエアの話題もありますし、IP、TCPのような通信手順の話題、更にWebや電子メールといったサービスの話題もあります。それを一緒に議論するのはあまりにも効率が悪いため、要素ごとに分けて階層として考えるのが普通です。どう並べるかを考えると、以下の図のようにハードウエアに近い話題が下、人間に近い話題を上にして積み上げて並べるのが良いです。

![ネットワーク階層.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3032022/a98be75d-72bc-0342-e91d-d78efe0035b8.png)

そして、このプロトコル部分も、以下のような階層図をよく見ると思います（＊注）。これはISOで決められた通信機能の階層分け（OSI参照モデル）にTCP/IPの各プロトコルをあてはめたもので、案外我々にとっても重要な考え方です。ネットワークデバイスによって、第2層に必要なプロトコルが変わってきますし、組込機器間で独自の通信をさせる、そのためのプロトコルは自社で設計する、となったとき、第4層のプロトコルは何を使うかを考える必要があります。このようにプロトコルを積み上げて使うのでプロトコルスタック、と呼んでいるわけです。

![プロトコルスタック階層.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3032022/ad993f66-b0c5-dd89-9749-72626f888d2f.png)

また、開発以外でも階層構造の考え方は出てきます。たとえば「レイヤ2スイッチ」は第2層の情報（MACアドレス）を使ってスイッチする機器、「レイヤ3スイッチ」は第3層の情報（IPアドレス）を使ってスイッチする機器だ、ということです。VPNの方式の一つ「L2TP」も「Layer2 Tunneling Protocol」の略で、パケットの第2層以上をトンネリングさせるプロトコルです。

＊注意
「OSI プロトコルスタック」あたりで画像検索すると、いろいろなバリエーションが出てきます。どれが正しいとか間違っているということではなく、この視点から見るとこうなる、のようなことかと思います。たとえばICMPはIPヘッダの上のプロトコルなので第4層に入れたくなるのですが、第4層の目的から見ると違います。第3層IPの制御用のプロトコルなので第3層に置くべきなのでしょう。同様に、ARPは第2層802.3の上のプロトコルなので第3層に入れたくなるのですが、やはり第3層の目的から見ると違います。そのため、上記の階層図も私の解釈では、ということで参照していただければと思います。


<h3>■組込機器でのTCP/IPネットワーク機能</h3>
組込機器にTCP/IPネットワーク機能を入れる際においても、ソフトウエアとして何が必要かは階層的に考えると整理できます。

![ソフト階層.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3032022/d4580917-a852-5238-589d-b21d767436e5.png)

それぞれどんなものかと、入手先は以下の通りです。

<b>アプリケーション</b> ... TCP/IPネットワークで何をやりたいか、という部分です。クラウドにデータを上げたい、LAN上のPCにファイルを送りたい、組込機器の設定ページを構築したい、など。ここは組込機器固有の機能なので、外部から入手できるものではなく自社で実装することになるでしょう。

<b>TCP/IPプロトコルスタック</b> ... これをゼロから自分で実装する会社はないでしょう。入手先としては以下が考えられます。
A) OSとは別に有償のTCP/IPプロトコルスタックを使用
　例）Cente TCP/IPv4（https://www.cente.jp/product/cente-middle/tcpip/tcp-ipv4/tcpipv4/ ）

B) OSに同梱されている専用のTCP/IPプロトコルスタックを使用
　例） MiSPO社 NORTi Professional（http://www.mispo.co.jp/products/NORTi/Pro/ ）

C) GPLやBSDライセンスにて公開されている無償のオープンソースを使用
　例）lwIP（http://savannah.nongnu.org/projects/lwip/ ）

<b>ネットワークデバイスドライバ</b> ... Ethernet、WiFi、シリアル（PPP）など、ネットワークのハードウエアを制御するソフトウエアです。こちらの入手先については第一シーズンの「組込ソフトウエア開発概説：デバイスドライバの入手」（https://qiita.com/Cente_mw/items/07b847d776da298e0b53 ） で解説しているとおりです。


第一シーズンではハードウエアに近いところから解説を進めましたが、今回はアプリケーションからお話していこうと思います。これまで「組込機器にTCP/IPネットワーク機能を入れる」ということをやってこなかったエンジニアの方々にとっては、まず実現したいことがあって、それに必要なものは...の順にお話して、そこから一番遠くにあるデバイスの話が最後に来た方がよかろうと考えた次第です。


<h3>■今日の閑話</h3>
私が入社当時はWWWという仕組みが利用できるようになり始めた頃でした。TCP/IPなんて何のことかさっぱりわかってませんでしたが、先輩社員がMac上でMosaic（NCSAがつくった世界最初のWebブラウザ）を使って、NASAのサイトを開いて見せてくれました。たしか1ページ全部表示するのに数十秒はかかったと思いますが、それでも手元のMacから外国にある最新のデータにいとも簡単にアクセスできることに<b>「インターネットすげぇ！」</b>と思ったことを覚えています。でも私のプロトコルスタックデビューは、TCP/IPではなくAppleTalkでした。TCP/IPも知識がゼロでしたが、Apple社が規定したプロトコルスタックAppleTalkだって初対面です。効率の良い勉強方法が思いつかなかったので、まずは辞書ほどの厚さがあるAppleTalkの解説書「Inside AppleTalk」を最初から最後まで繰り返し読んで頭に叩き込むところから始めました。AppleTalkもちゃんとOSI参照モデルに則って定義されていたので、仕事がTCP/IPに移ったときの理解が早く、やっぱり階層構造って大事だなぁと感じました。<br>
<br>


Cente：
https://www.cente.jp/

お問合せはこちら：
https://www.cente.jp/otoiawase/