IPv6プログラミング
連休も終わりましたので、まじめモードに。
先日のオルタナミーティングでIPv6の話題になりましたが、プログラム側ではどのような対応が必要かということをさらりとご紹介してみます。
まず、開発言語がJavaなどのように直接IPアドレスを32ビット整数で扱うことがない言語であれば、言語側がIPv6対応していればそのままソースコードの修正なしにIPv6対応ができています。もちろんプログラムでアドレスのフォーマットチェックを行っていたりする部分があれば変更は必要です。
対応に手間がかかるのは、C言語など直接IPアドレスを32ビット整数で扱うような記述を行う言語の場合です。この場合はOSがIPv6対応していても、プログラムをIPv6対応に変更しないとIPv4しか扱えません。
IPv6は基本的にIPアドレスが違う点以外は従来のプログラミングと同様なソケットプログラミングが可能です。IPアドレス関連というと、ホスト名やIPアドレス文字列と内部表現形式への変換部分が影響します。IPv4ではinet_addr(),inet_aton(),inet_ntoa(),gethostbyname()などの関数を使っている部分と、IPアドレスを保持するstruct sockaddr型変数や、struct in_addr型変数のあたりです。これらをgetaddrinfo(),getnameinfo()というIPv6,IPv4両方で使える便利な関数に置き換え、さらにサーバプログラムであれば、IPv4用とIPv6用の2つのソケットを扱うように修正する感じになります。
文章で書くとわかりにくいのですが、getaddrinfo(),getnameinfo()という便利な関数のおかげでソースコードはかえってシンプルになると思います。一番やっかいなのが、内部でunsigned longなどの4バイト変数にアドレスを格納したりしているようなプログラミングをしている場合です。この場合、どこがIPアドレスに関係している部分かを探すのに手間取りますし、変更も慎重に行わないと間違えやすいのです。
IPv6プログラミングを非常に分かりやすく解説している本をご紹介しましょう。
著者はKAMEプロジェクトの中心人物であったitojunこと故萩野純一郎さんで、萩野さん自身が、多国語で世界中で出版して欲しいという希望で英語で執筆し、日本語版は別の方が翻訳して日本語にしたというすごい本なのですが、内容はIPv6を知り尽くしている萩野さんが、こうすれば間違いない、こうしては駄目、ということを的確に書いてくれているので間違いなく一番良い方法を使えるようになります。
私もこの本を読み、さらに直接萩野さんに会社で講習会をメンバー向けに開いてもらって、自社の製品をIPv6化してきました。IPv6関連の文献は概念的なものはWIDEプロジェクト関係者などからもいろいろ出ていますが、プログラミングに関してはそれほど多くなく、萩野さんのこの本がベストでしょう。私も昨年書いた「C言語による実践Linuxシステムプログラミング」でサンプルをIPv6対応にして紹介しておきました。
拙著「プログラミングでメシが食えるか!?」で萩野さんと知り合い、お会いした際にお互いの著書にサインしあった時にいただいたサインです。「Happy Hacking !」と書かれています。IPv6の普及に誰よりも真剣に取り組んでいた萩野さんでしたが、ようやく、IPv4アドレスが枯渇するということで関心が高まってきました(まだまだなのですが)。
プログラムを作る人も使う人も、是非IPv6移行のポイントをしっかり把握していただき、先入観や嘘の情報に流されたりしないように注意していただけたらと思います。プログラムの移行は基本的にIPアドレス部分だけですが、C言語などでは元のソースの書き方によっては意外と手間がかかる場合もある、という点がまずポイントでしょう。
多くの人がまず一度IPv6を使ってみたい、と考えると思います。現状ほとんどのプロバイダーがIPv6を提供してくれていません。個人レベルで手が出るのは、OCNのIPv6トンネリングサービスくらいでしょう。OCNを使っていれば月額300円で使えます。少々トンネルの張り方が面倒なのですが、少なくともプログラミングレベルでは十分実験ができる環境になります。