UIP (マイクロIP)

uIPは、小規模な8ビットまたは16ビットのマイクロコントローラーで使用することを想定したTCP/IPのプロトコルスタックのオープンソースの実装である。
当初Swedish Institute of Computer Scienceにおける"Network Embedded System"グループのAdam Dunkelsによって開発され、BSDスタイルのライセンスでライセンスされた。

uIPは非常に小容量のコードとRAMしか使用しないため、組み込みシステムにとても有用である。
uIPはDSPプラットフォームを含むいくつかのプラットフォームに移植されている。

2008年10月に、シスコ、Atmel、SICSは、完全に規格に準拠したuIPのIPv6拡張をアナウンスした。これは、uIPv6と呼ばれている。

 実装 
uIPは、必要とするリソースを削減するために、多くの一般的ではない設計上の選択をしている。
uIPのネイティブなソフトウェアインターフェイスは、オペレーティングシステムを持たない小規模なコンピューターシステムのために設計されている。
uIPはタイミングループの中で呼び出され、この呼び出しが全てのリトライと他のネットワークの挙動を管理している。
ハードウェアドライバーはuIPが呼び出された後に呼び出される。
uIPはパケットを作り、ドライバーがそれを送信し、場合によってはレスポンスを受信する。

uIPプロトコルスタックソフトウェアでは、送信、受信、再送信のために通常は異なるパケットのコピーが数多く作成される。
uIPはメモリーの使用を少なく抑えるため、パケットバッファーはただ1つのみである。
まず、uIPはパケットバッファーを半二重的に使用する。つまり、送信用と受信用の両方に使用する。
また、uIPがパケットを再送信する必要が生じた時は、アプリケーションコードを呼び出し、再送信させるデータを再生成してもらうことになる。

もう1つの変わった点は、uIPのコネクションの管理方法である。
多くのIP実装は1つのコネクションにつき1つのタスクを持っている。そして、そのタスクが通信の相手であるコンピューターのタスクと通信する。
uIPでは、マルチタスク可能なオペレーティングシステムは想定されていない。
コネクションは配列に保持される。
そして、呼び出される度に、uIPはコネクションを作り返信または送信するアプリケーションコードをサブルーチンとして呼び出す。
コネクションの配列のサイズは、uIPを再コンパイルすることで調整できる。

uIPは、TCP、UDP、IPを定義するRFCに準拠している。
また、ICMPも実装されている。

 バージョン 
uIP 0.9は、最小限のオペレーティングシステムの依存、最小のリソースの使用、完全なイベントループAPIを持つ唯一のバージョンであるが、オリジナルではIPv6を使用しておらず、IPv4のみをサポートしている。
このバージョンは、非常にリソースが限定された組み込みシステムで使用できる。

バージョン0.9は、イベントループシステムで動く、HTTP(簡単なウェブサーバー)、SMTP(Simple Mail Transfer Protocol)、FTP(File Transfer Protocol)、telnet(ターミナルエミュレーション)などの例とその小さなサイズにも関わらず、ソケットAPIを一切持たないため、uIP 0.9を使用するのは難しい。See Dunkel's original web site, above, on the wayback machine.

uIPは広く使われているが、広く知られた弱さも持っている。
uIPの設計では32ビットの演算は最小限に抑えられ分離されている。8ビットと16ビットのCPUに最適なように調整されているからである。
また、16ビットのソフトウェアタイマー(小規模なマイクロコントローラーでは一般的である)は、オーバーフローしてシステムが停止することがあり得る。
これは、タイマーシステムがオーバーフローしないように修正することで可能である(例えば、タイマーをカウントダウンするか、合同算術を利用するなど)

もう1つの問題は、1つしかパケットバッファーがないことでスループットに問題が発生することである。PCが通信相手だった場合に"ACK"パケットが遅れることで、パケットを待ってしまうことになる。
動作の遅いシリアルポートでの実装においては、ACKのスループットは、uIPを修正し、全てのパケットを2つの半分のパケットの断片として送信することで解決できる。
早いイーサネットやWi-Fiで使用する場合には、全てのパケットを2回送信するようにハードウェアドライバーを修正すれば良い。

PCでは高速なuIPシステムとローカルイーサネットで通信できないことがある。uIPシステムがPCが受信する準備ができる前にパケットを送信し始めてしまうからである。
解決策としては、メインループでuIPシステムを呼び出す頻度を少なくすることである(WIndows PCは1ミリ秒くらいの応答速度で設計されている)。

典型的なuIPの実装では、IPアドレスは固定されている。
しかし、現実のネットワークでは実用的ではない。
そのためDHCPを実装したバージョンも存在する。See Code-Red sample code for the RDB4078 PCB, 2012.Dunkel provided sample code for DHCP.

uIPの以降のバージョンではuIPv6のレファレンスバージョンを含めContikiに統合されている。Contikiは協調的マルチタスクを実現するためにコルーチンを使用するオペレーティングシステムである。
ContikiはuIPの利用を単純化する単純化されたソケットAPIによって必要とされるマルチタスク機能を提供する。
これらのバージョンは、0.9よりも一般的ではなく、多くの組み込みコードの例は、これらを使用していない。Metzinger, aboveFreeRTOS web site examples, 2013Code-Red examples, above.

 関連項目 
 TCP/IP
 インターネット・プロトコル・スイート
 Internet Engineering Task Force
 TCPやUDPにおけるポート番号の一覧
 lwIP

 参考文献 

 外部リンク 
 uIPのソース
 AVRマイクロコントローラーへの移植
 uIPベースのOpenRISC組み込みSoCを使ったウェブサーバー

Category:組み込みシステム
Category:ネットワークソフト
Category:オープンソースソフトウェア